Ruby言語やLinuxのネタが多いです。
July 11, 2002 [おもひで]
■ [OpenBlockSS] NATルータ化
今度はNATルータ化だ〜。テスト環境はこんな感じ。
会社サーバ(A) ---- (B)OBSS(C) ---- (D)テストPC(クロスケーブルで直つなぎ)
- (A)はグローバルアドレス。うちの会社は贅沢なことに社内のNetworkにグローバルIPを使っているんだよね。
- (B)はOBSSの(A)側のインタフェイス(eth0)。IPアドレス等はDHCPで(A)側にあるDHCPサーバから取得する。
- (C),(D)はプライベートアドレスを使ったセグメント(192.168.1.0/24)。
- (C)はOBSSのテスト環境側のインタフェイス(eth1)。IPアドレスは192.168.1.1。
- (D)はテストPCのインタフェイス(eth0)。192.168.1.2でデフォルトゲートウェイは192.168.1.1。
目標としては、(D)から(A)へ向けた通信ができ、かつ、(D)からのパケットが(B)のところで全て(B)のIPアドレスに変換されて(A)に届き、(A)から戻ってきた際にまた(D)のIPアドレスに変換される(IPマスカレード)ようにすることだ。ちなみに逆方向は考えない。
■ では、まずはNetworkの設定から。/etc/network/interfacesを設定する。
auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp auto eth1 iface eth1 inet static address 192.168.1.1 netmask 255.255.255.0
これだけだとeth1が有効にならない(eth1のドライバが自動的にロードされないため)。
/etc/modules.confにeth1のドライバのaliasを追記すれば良いのだけど、Debianの場合は/etc/modules.confを直接編集せずに/etc/modutils/をいじるみたい。
そんなわけで、/etc/modutils/aliasに以下を追記。
alias eth1 8139too
■ 続いて以下のコマンドを実行すると/etc/modules.confが自動的に書き換わる。
# update-modules
これでインタフェイスの初期化の準備は整ったはずなので/etc/init.d/networkingを再起動してifconfigで設定内容を確認。
# /etc/init.d/networking stop # /etc/init.d/networking start # ifconfig
※ここは、/etc/init.d/networking restartでも良いかもしれないけど、うちの環境だとうまくいかなかった。
■ 一応、動作確認してみる。OBSSから(A),(D)にpingする。
# ping xxx.xxx.xxx.xxx (A)のIPアドレス # ping 192.168.1.2 (B)のIPアドレス
■ ここまででネットワークインタフェイスの設定は完了。
■ 続いて、NAT HOWTOを参考にしながら作業を進める。
ちなみに、カーネルの再コンパイルが必要になる場合があるんだけど、前回コンパイルしたときに適当に指定しておいたヤツがそのまま動いたからヨシとしよう。つーか、何設定したのか忘れちゃった。ネットワーク周りのオプションをいろいろと指定する必要があるんだよね。こちらが参考になるかも。というわけで、ここではカーネルのコンパイルの後からの話ね。
まず、OBSSがルータとして動作するようにIPフォワードの指定をONにする。
# echo 1 > /proc/sys/net/ipv4/ip_forward
次にNAT(IPマスカレード)の指定。eth0がポイント。
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ちなみに、設定した内容を見るには以下のようにする。
# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
これでOK。(D)から(A)にpingしてみる。この際、tcpdumpでOBSSのインタフェイス毎に確認するとIPアドレスがきちんと変換されているのがわかるのでおもしろい。
# modprobe ip_conntrack_ftp # modprobe ip_nat_ftp
オレは特に必要なかったが、IRCを使う場合も同様にモジュールをロードする必要があるみたい。
# modprobe ip_conntrack_irc # modprobe ip_nat_irc
んでもって(D)から(A)のサーバに対してFTPの確認。これもOK。
■ ところで、これだけだとリブートしたら設定した情報が消えてしまうので設定ファイルに保存する必要がある。
Debianの場合は/etc/default/iptablesのコメントを参考にして以下のコマンドを実行する。
余談だけど、ここんところは微妙に他のディストリビューションと違うのね。見つけるのにすげー時間かかっちった(^^;)。
# /etc/init.d/iptables save active # /etc/init.d/iptables save inactive #こっちは不要かも
それから、ip_forwardは/etc/network/options ファイルを直接編集する。実は最初からこちらだけしておけば良いんだよね。
ip_forward=yes #-> これ spoofprotect=yes #-> IP Spoof(IPアドレス偽装)対策(defaultのまま) syncookies=yes #-> ついでにSYN flood対策
あと、FTP通信のためのモジュールをブート時にロードする指定を/etc/modulesに書く。
modprobe ip_conntrack_ftp modprobe ip_nat_ftp
これでリブートしても大丈夫。すばらしい。
■ [Misc] そういえばSNAT/DNATって
Source NATとDestination NATなのね。Static NATとDynamic NATの略かと思ってた。ダメすぎ(^^;)。
