よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
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アドレスがきちんと変換されているのがわかるのでおもしろい。

ただ、実はこれだけだとFTPは使えないので、FTPを使う場合は以下のモジュールをロードしておく必要がある。

# 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の略かと思ってた。ダメすぎ(^^;)。


編集