雑記 - iptablesによるNAT Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

!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 add ${g_ipaddress1} netmask 255.255.255.0eth0:1 ${g_ipaddress1}
ifconfig eth0 add ${g_ipaddress2} netmask 255.255.255.0eth0:2 ${g_ipaddress2}
               ......
ifconfig eth0 add ${g_ipaddress10} netmask 255.255.255.0eth0:10 ${g_ipaddress10}
ifconfig eth0 をすれば、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 add $g_ipaddress_ex netmask 255.255.255.0eth0: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


!注
上記ははメモ書きなので不足している部分がいろいろあります。間違いもあるかもしれないけど、昔書いた文章なのでそのままにしておきます。

!リンク
このサイトを参照してくださっている kero さんが、 Global ネットワークから Local ネットワーク内の server に接続する際の NAT 設定についてきちんと書いておられるので、そのリンクを追記しておきます。:-)

[[iptablesで特定のポートを別のホストへ転送する方法(kerosoft さんのページ)|https://mo.kerosoft.com/0203]]

!特定の iptables ルールを手で消したいとき(おまけ)
iptable -D で消すことができるのだけど、そのルール番号をまず調べる
iptables -L -t nat --line-numbers
チェインと得られたルール番号を指定して削除
iptables -D チェイン ルール番号