雑記 - 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 を追加する。
ifconfigeth0 add ${g_ipaddress1} netmask 255.255.255.0eth0:1 ${g_ipaddress1}
ifconfigeth0 add ${g_ipaddress2} netmask 255.255.255.0eth0:2 ${g_ipaddress2}
......
ifconfigeth0 add ${g_ipaddress10} netmask 255.255.255.0eth0:10 ${g_ipaddress10}
ifconfigeth0 をすれば、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 です。
ifconfigeth0 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 チェイン ルール番号
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
ifconfig
......
ifconfig
ifconfig
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
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 チェイン ルール番号