Linuxマシンをルータにする方法
Linuxでフィルタリングも何もしないただのルータを作成する事ができる。ルーティングにおけるポイントを解説する。
ルータは、自分自身に来たパケットの宛先IPアドレスを見て、自分宛ではなければ、保持しているルーティングテーブルに照らし合わせ、適合するものがあればその先に転送(IPフォワード)する。もしなければデフォルトゲートウェイに転送する、といった動作をする機器である。
Linuxの初期設定では、IPフォワードされないようになっている。Linuxマシンをルータとして使用するなら、まずIPフォワードするように設定を何箇所か変更する必要がある。
■IPフォワードのための設定
@/proc/sys/net/ipv4/ip_forward
次のコマンドでip_forwardファイルを見ると、初期設定では0となっている。
# cat /proc/sys/net/ipv4/ip_forward 0 |
これを1に変えてやる必要があるため、次のコマンドでip_forwardファイルを1で上書き。
# echo 1 >/proc/sys/net/ipv4/ip_forward |
もう一度確認して1になっていればOK。
# cat /proc/sys/net/ipv4/ip_forward 1 |
再起動すると元にもどってしまうらしいので、/etc/rc.d/rc.localファイルに
echo 1 >/proc/sys/net/ipv4/ip_forward |
の一行を書き加える。
A/etc/sysconfig/network
次に、/etc/sysconfig/networkファイルを書き変える。
NETWORKING=yes HOSTNAME=’localhost.localdomain’ FORWARD_IPV4=yes GATEWAY= VATEWAYDEV= |
緑色で表した下三行を書き加える。GATEWAY=の後にIPアドレスが書かれていたら上のように消去しておいた方がよいらしい。
B/etc/sysctl.conf
次に、/etc/sysctl.confファイルを編集し、
net.ipv4.ip_forward = 0 |
の部分を
net.ipv4.ip_forward = 1 |
に変更する。
以上でルータ構築のためのベース設定は終了である。
念のため再起動しておいた方がよい。
■ルーティング
ルーティングはきちんと考えないとPINGの通らないルーティングになってしまう。特に、パケットを送る設定はよいが、パケットの戻り先のルーティングを忘れてしまったりするので注意が必要である。以下に今回のサンプル設定のネットワーク図を載せる。
まずは、NICを認識させ、IPアドレスまで設定する。設定した状態でのルーティングテーブルを見てみよう。
ルータマシン1(初期)(デフォルトゲートウェイを192.168.4.1としている)
Destionation Gateway Genmask Iface 192.168.4.0 0.0.0.0 255.255.255.0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 eth1 127.0.0.0 0.0.0.0 255.0.0.0 lo 0.0.0.0 192.168.4.1 0.0.0.0 eth0 |
ルータマシン1には10.10.10.0/24のセグメントに対するルーティングテーブルが書かれていないのでそれを追加する。
# /sbin/route add –net 10.10.10.0 netmask 255.255.255.0 gw 10.0.0.2 eth1 |
10.0.0.2へのフォワードをeth1(10.0.0.2と繋がっている側)のNICを使用して行なうので上記のような指定になる。この設定は、10.10.10.2のIPアドレスを持つ一番右側のコンピュータからpingを打った時の帰り道の設定でもある。
192.168.4.0/24と10.0.0.0/24と10.10.10.0/24のセグメント以外へのパケットは全てデフォルトゲートウェイに行く設定となっているので問題は無い。
ルータマシン2(初期)(デフォルトゲートウェイは10.0.0.1)
Destination Gateway Genmask Iface 10.0.0.0 0.0.0.0 255.255.255.0 eth0 10.10.10.0 0.0.0.0 255.255.255.0 eth1 127.0.0.0 0.0.0.0 255.0.0.0 lo 0.0.0.0 10.0.0.1 0.0.0.0 eth0 |
この設定では10.0.0.0/24と10.10.10.0/24のセグメント以外のパケットは全て10.0.0.1に送られる状態となっている。その中には192.168.4.0/24も含まれているため、この状態では特に書き加えるルーティングテーブルはない。
さて、これで設定が終了した(実際には一行しかルーティングテーブルを増やしていない)わけだが、うまくpingが通るのだろうか。
ルータマシン1、ルータマシン2、クライアントマシンの計3台から全てのIPアドレス(合計6個)に対してpingを打ってみよう。そうすると、問題がある事に気付く。
ルータマシン1から192.168.4.1にpingを打つと応答があるが、ルータマシン2、クライアントマシンから192.168.4.1にpingを打った場合、応答がない。これは192.168.4.1のルータに、戻りの経路情報(ルーティングテーブル)が書き込まれていないからである。10.0.0.0/24や10.10.10.0/24のセグメントに行くパケットは192.168.4.140に送るように指定しないと、パケットの戻り先が分からず、パケットがその場で一定時間後、消えてしまうのである。
これを避けるためには、192.168.4.1のIPアドレスを持つデフォルトゲートウェイに、10.0.0.0/24と10.10.10.0/24セグメントの経路情報を書き加えてやればよい。
もしそれができないなら、ルータマシン1上で10.0.0.0/24と10.10.10.0/24セグメントを送信元とするパケットに対し、IPマスカレードしてやればよい。
実際に、ルータマシン1にはipchainsを使用して、次のような設定を行なっている。
# /sbin/ipchains –A forward –s 10.10.10.0/24 –j MASQ 送信元を10.10.10.0/24とするパケットをマスカレード # /sbin/ipchains –A forward –s 10.0.0.0/24 –j MASQ 送信元を10.0.0.0/24とするパケットをマスカレード |
ipchains設定を参照してみる。
# /sbin/ipchains –nL Chain input (policy ACCEPT): target prot opt source destination ports ACCEPT all ------ 0.0.0.0/0 0.0.0.0/0 n/a ACCEPT all ------ 0.0.0.0/0 0.0.0.0/0 n/a ACCEPT all ------ 0.0.0.0/0 0.0.0.0/0 n/a ACCEPT udp ------ 192.168.0.10 0.0.0.0/0 53 -> * ACCEPT udp ------ 192.168.0.15 0.0.0.0/0 53 -> * REJECT tcp -y---- 0.0.0.0/0 0.0.0.0/0 * -> * REJECT udp ------ 0.0.0.0/0 0.0.0.0/0 * -> * Chain forward (policy ACCEPT): target prot opt source destination ports MASQ all ------ 10.0.0.0/24 0.0.0.0/0 n/a MASQ all ------ 10.10.10.0/24 0.0.0.0/0 n/a Chain output (policy ACCEPT): # |
これで、3台のどれからも192.168.4.1及び外部ネットワークに繋がるようになる。