iptablesでポートフォワーディングを設定する方法の紹介です。なお設定はCentOSで試しました。

まずは、通常Linuxのデフォルトはパケットのフォワーディングが無効になっているので有効にします。

# echo 1 > /proc/sys/net/ip_forward

これはOSを再起動すると戻ってしまうため、恒久的に有効にするには/etc/sysctl.confに以下を追記します。

 net.ipv4.ip_forward=1

ここでは、SSHのフォワーディングを例に説明します。以下のようなサーバ・ネットワーク構成だとします。

接続元端末     10.1.1.200
    ↓
設定対象サーバ  10.1.1.1
               192.168.0.1
    ↓
SSHサーバ      192.168.0.2

まずは端末から対象サーバに入ってくるパケットをSSHサーバにDNATでフォワーディングします。待ち受けポートは5555とします。

# iptables -t nat -A PREROUTING -p tcp --dst 10.1.1.1 --dport 5555 -j DNAT --to-destination 192.168.0.2:22

上記では、パケットの宛先が設定対象サーバ(--dst 10.1.1.1)で、宛先ポートが5555 (--dport 5555)ならば、パケットの宛先を 192.168.0.2:22 に書き換えろという意味になります。

この時、パケットの送信元IP(ソースIP)は、10.1.1.200 のままです。そのためSSHサーバがこのパケット受け取ったら、10.1.1.200へ応答を返そうとします。SSHサーバは10.1.1.xx のネットワークに繋がっていないため、10.1.1.xx に直接応答を返すことができません。そのためSSHサーバに設定されているデフォルトゲートウェイに応答パケットの転送を依頼することになります。つまりSSHサーバのデフォルトゲートウェイが設定対象サーバになっていれば、応答パケットは設定対象サーバ経由で流れていきます。

SSHサーバのデフォルトゲートウェイが設定対象サーバになっていない場合や、接続元端末とSSHサーバが同一のセグメントにある場合、応答パケットが設定対象サーバを経由しないためうまく動きません。この場合以下の設定をiptablesに追加し、SSHサーバに出て行くパケットの送信元IPを設定対象サーバのIPに書き換えます。

# iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.2 --dport 22 -j SNAT --to-source 192.168.0.2

設定対象サーバに戻ってきたパケットは自動的に逆DNATされるため、以上で正常に動くはずです。

参考 : http://www.asahi-net.or.jp/~AA4T-NNGK/ipttut/output/dnattarget.html