web-dev-qa-db-ja.com

ポートフォワーディングが機能しないこのiptablesルールはなぜですか?

localhost:7060にバインドされたサーバーがあります。 ipv4の代わりにipv6ソケットを使用しています。以下はnetstatの出力です。

# netstat -an
Proto Recv-Q Send-Q Local Address          Foreign Address        State
 tcp       0      0 10.200.32.98:1720      0.0.0.0:*              LISTEN
 tcp       0      0 0.0.0.0:4122           0.0.0.0:*              LISTEN
 tcp       0      0 0.0.0.0:4123           0.0.0.0:*              LISTEN
 tcp       0      0 127.0.0.1:4123         127.0.0.1:43051        ESTABLISHED
 tcp       0      0 10.200.32.98:5555      10.200.32.44:53162     ESTABLISHED
tcp6       0      0 :::5060                :::*                   LISTEN
tcp6       0      0 ::ffff:127.0.0.1:7060  :::*                   LISTEN
tcp6       0      0 :::23                  :::*                   LISTEN
tcp6       0      0 ::ffff:10.200.32.98:23 ::ffff:10.200.32.142:43505 ESTABLISHED
tcp6       0      0 ::ffff:127.0.0.1:43051 ::ffff:127.0.0.1:4123  ESTABLISHED
tcp6       0      0 ::ffff:10.200.32.98:23 ::ffff:10.200.32.44:53195 ESTABLISHED
udp6       0      0 :::5060                :::*                   CLOSE
# 

ポート24(すべてのインターフェイスのループバックとeth0)で接続を受け入れ、データをlocalhost:7060に転送するポート転送ルールを設定したいと思います。

これが私がiptablesルールを設定する方法です:

iptables -t nat -A PREROUTING -p tcp --dport 24 -j DNAT --to 127.0.0.1:7060 **

動作していません。別のボックスからtelnetを実行すると、次のように表示されます。

$ telnet 10.200.32.98 24
10.200.32.98を試す...

サーバーを*:7060にバインドするように変更し、次のルールを設定すると、正常に機能しているようです。

iptables -t nat -A PREROUTING -p tcp --dport 24 -j REDIRECT --to-port 7060

しかし、それは私のサーバーを私が好きではないWANインターフェースで利用できるようにします。

Ipv6ソケット(netstat出力のtcp6行)と関係があると思います。このすべては、カスタムビルドされたAndroidデバイスとカスタムビルドAndroidプラットフォームイメージで行われます。

これを機能させるにはどうすればよいですか?

6
videoguy

応答パケットがポート7060から戻ってきてルーターに送信される場合、これらのパケットの送信元アドレスをルーターのアドレス(127.0.0.1)にマスクし、ポートを24としてマスクするために、これらのパケットには送信者マスク操作も必要です。 SNATiptablesルールを追加して機能させます。

iptables -t nat -A POSTROUTING -p tcp --sport 7060 -j MASQUERADE --to-ports 24

パケットはローカルホストによって生成されますが、POSTROUTERチェーンにも入ります。 REDIRECT操作は、これら2つのことを自動的に実行しますが、サービスがローカルネット内の別のサーバー上にある場合は、SNATとDNATを使用する必要があります。

1
Frio