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プラットフォームイメージで行われます。
これを機能させるにはどうすればよいですか?
応答パケットがポート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を使用する必要があります。