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

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

リンク

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

iptablesで特定のポートを別のホストへ転送する方法(kerosoft さんのページ)

特定の iptables ルールを手で消したいとき(おまけ)

iptable -D で消すことができるのだけど、そのルール番号をまず調べる

iptables -L -t nat --line-numbers

チェインと得られたルール番号を指定して削除

iptables -D チェイン ルール番号
Last modified:2006/02/21 17:20:35
Keyword(s):[Linux] [iptables] [NAT] [IP masquerade]
References:[アクセスポイント設定のメモ] [Linux関連その他]