iptablesによるNAT
NATの設定についてのメモ
Linux での iptables を使った NAT の設定についての覚え書きを幾つか。
1.) IP masquerade するには
IP masquerade させるルーターサーバには 2枚の NIC が刺さっており、eth0 にグローバル IP アドレス${g_ipaddress} が、eth1 にローカル IP アドレス 192.168.0.1 が割り当てられているものとする。 IP masquerade するには、以下のようにする。
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
そしてローカルネットワーク側24bitマスク PC 群の default gateway を 192.168.0.1 とすれば 、IP masquerade で外に出られる。 IP masquerade ですから、外から見れば全て ${g_ipaddress} からのアクセスに見えます。
なお念のために追記しておくが、
echo 1 > /proc/sys/net/ipv4/ip_forward
しておくことを忘れないように。
2.) 1対1 NAT (ローカルからグローバル - その1)
IP masquerade は IP address 資源を有効に使えるのでとても便利です。しかしながら、管理上の理由(ローカルPCのアクセス記録を取りたいとか)などで、ローカルネットワークとグローバルネットワークの IP address を 1対1で対応付けしたいことも発生します。この場合には、IP masquerade ではなく、SNAT や DNAT を使えば良いようです。
ここでは、次のようなシチュエーションを考えます。
- ルーターサーバのグローバル側 NIC (eth0)は ${g_ipaddress}
- ルーターサーバのローカル側 NIC (eth1)は 192.168.0.1
- ローカルネットワーク側には 192.168.0.11 〜 192.168.10.20 のPC群
- これらのPC群は、${g_ipaddress1} 〜 ${g_ipaddress10} の IP address で外部ネットワークに
まず、グローバル側のNIC(eth0) に $g_ipaddress1 〜 $g_ipaddress10 を追加する。
ifconfig eth0:1 ${g_ipaddress1} ifconfig eth0:2 ${g_ipaddress2} ...... ifconfig eth0:10 ${g_ipaddress10}
ifconfig をすれば、eth0:x が加わっているのを確認できるはず。
1対1nat 設定をする前に、注意。既に IP masquerade など nat の設定をしているかもしれませんね。 1対1 nat では masquerade 設定は不要なので、nat の設定を 一旦flush (ちゃらに)しましょう。ちゃらにするには、次のコマンド。
iptables -t nat -F
ついでに、nat の設定を確認するには、次のコマンドを。
iptables -t nat -L
話を戻して、、、あとは以下のように iptables コマンドで 1対1 に対応させれば完了。
iptables -t nat -A POSTROUTING -s 192.168.0.11 -j SNAT --to ${g_ipaddress1} iptables -t nat -A POSTROUTING -s 192.168.0.12 -j SNAT --to ${g_ipaddress2} ...... iptables -t nat -A POSTROUTING -s 192.168.0.20 -j SNAT --to ${g_ipaddress10}
これで(例えば) 192.168.0.11 のローカル側 PC は、${g_ipaddre1} という名前で外部ネットワークに出ることができます。
3.) 1対1 NAT (ローカルからグローバル - その2)
ローカルネットワーク側(192.168.0.0/24)のPCから、外部の特定のサーバ($ldap_ipaddress:389port)に接続するときに、ある外部アドレス($g_ipaddress_ex)を割り振る方法を説明します。(ldapにアクセス可能なのが $g_ipaddress_ex のみである状況を想定)
まず下準備です。外部 NIC (eth0) に、IP address を付加します。2行目は、NAT設定の flush です。
ifconfig eth0:ex $g_ipaddress_ex iptables -t nat -F
次に、$ldap_ipaddress の 389 ポートに接続する際に、$g_ipaddress_ex という IP address で接続できるように設定します。
iptables -t nat -A POSTROUTING -d $ldap_ipaddress -p tcp --dport 389 -j SNAT --to $g_ipaddress_ex
それ以外での接続は通常の IP masquerade で良い場合には、以下の1行を加えます。(それ以外の外部への接続が不許可なら不要ですし、masquerade ではなく 2.) の設定を加えることも可能です。)
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
4.) 1対1 NAT (グローバルからローカル)
ローカルネットワークの中に外部からアクセス可能なサーバ(192.168.0.50)を置くための NAT 設定について。
iptables -t nat -A PREROUTING -d $g_ipaddress_ex -p tcp --dport 80 -j DNAT --to 192.168.0.50:8080
これでグローバルネットワークから $g_ipaddress_ex の port 80 にアクセスすると、ローカル側の 192.168.0.50 の 8080 port に接続されます。
ftp について
ftp は制御ポートとデータ転送ポートが別なので、以下の module を load しておくとよいはず。
modprobe nf_nat_ftp modprobe nf_conntrack_ftp
Keyword(s):[Linux] [iptables] [NAT] [IP masquerade]
References:[アクセスポイント設定のメモ] [Linux関連その他]