ポートフォワードをしないでiptablesのNATテーブルに設定をしてみた


  • 環境
    • Amazon Linux AMI release 2017.09
    • iptables v1.4.18

プライベートIPアドレスとパブリックIPアドレスを組合せで変換してくれるNATテーブルに設定を入れる。
そうすれば、毎回ポートフォワードしなくてすむ。

iptablesの記述方法

参考 : iptables まとめ - Qiita

DNAT

インターネットからLAN内にアクセスする時に送信先のパブリックIPアドレスをプライベートIPアドレスに変換してくれるのがデスティネーションNAT

iptables
-A PREROUTING -p tcp -m tcp --dport {経由地のポート} -j DNAT --to-destination {目的地のプライベートIP}:{目的地のポート}

DNATの記述方法

LAN内からインターネットへ出ていく時に送信元のプライベートIPアドレスをパブリックIPアドレスに変換してくれるのがソースNAT

iptables
-A POSTROUTING -d {目的地のプライベートIP}/32 -p tcp -m tcp --dport {目的地のポート} -j SNAT --to-source {経由地のプライベートIP}

iptablesのNATテーブルに設定する

サーバ パブリックIP プライベートIP 使うポート番号
経由地 12.34.56.78 10.0.0.10 28090
目的地 なし 10.0.0.20 8090

こんな状態の場合、以下のような設定をすれば目的地サーバに「12.34.56.78:28090」でアクセスできる。

# 1. 設定しようと思っているポート番号が使われていないか確認する
$ sudo cat /etc/sysconfig/iptables | grep 28090

# 2. iptablesのNATテーブルに設定する
$ sudo vi /etc/sysconfig/iptables
$ sudo cat /etc/sysconfig/iptables
#...省略..
*nat
-A PREROUTING -p tcp -m tcp --dport 28090 -j DNAT --to-destination 10.0.0.20:8090
-A POSTROUTING -d 10.0.0.20/32 -p tcp -m tcp --dport 8090 -j SNAT --to-source 10.0.0.10
COMMIT
#...省略..

# 3. iptablesを再起動する
$ sudo service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter nat      [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]