127.0.0.1でポート2222を使用してサービスを実行しています。すべての要求を192.168.2.2:2222(外部IP)に転送する必要がありますからのみサブネット192.168.1.0/24から127.0.0.1:2222 。
これを使用しようとしていますが、機能しません。
$ iptables -t nat -I PREROUTING -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0.1:2222
これを機能させるにはどうすればよいですか?
UPD:アドレススキームを編集します。
使用しているiptablesルールは機能しますが、追加の変更が1つ必要です。
sysctl -w net.ipv4.conf.eth0.route_localnet=1
(eth0
をnicに置き換える192.168.2.2
は常駐します)
デフォルトでは、この値は0
であり、127.0.0.0/8
宛ての外部トラフィックをルーティングしないようにカーネルに指示します。このようなトラフィックは正常ではないため、これはセキュリティのためです。
追記:現在のiptablesルールは広すぎます。ルールでは、宛先の一致として-d 192.168.1.0/24 --dport 2222
を指定しています。つまり、マシンがポート2222で別のホスト(つまり、送信トラフィック)と通信しようとした場合もリダイレクトされます。 -d
の一致を-d 192.168.2.2
に変更するか、-i eth0
(またはNICが何であれ)を追加する必要があります。
Localhostにリダイレクトできますが、ループバック(127.0.0.0/8)にはリダイレクトできません。ループバックは抜け穴です。実際のインターフェースの1つにリダイレクトする必要があります。 REDIRECTを使用してみてください。
iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222
route_localnet
を使用した正解が機能しない場合はどうなりますか?.
カーネルに route_localnet
のパッチ が含まれていない場合、カーネルをアップグレードしてください!
または、外部インターフェイスをリッスンしてトラフィックを転送するプロセスを実行することにより、あるインターフェイスに着信するトラフィックを別のインターフェイスの別のポート(特にlocalhost)に転送する他の方法があります。
netcat
(nc
)、xinetd
、およびssh
(およびおそらくそれ以上)は、これを実行できるプログラムのすべての例です(ただし、ssh
は奇妙で効果がありません)。
このためのxinetd
の設定を書きました。これで、このサービスは自動的に起動します。
# cat /etc/xinetd.d/z-from-outside
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
disable = no
socket_type = stream
type = UNLISTED
wait = no
user = nobody
bind = vaio.ob
port = 7070
redirect = localhost 7070
}
#
(vaio.ob
は、外部ネットワークインターフェイス上のこのホストの名前です。)
service xinetd reload
の後、それがリッスンしていることを確認しましょう:
# lsof -i -P | fgrep 7070
xinetd 556 root 6u IPv4 1797906 0t0 TCP vaio.ob:7070 (LISTEN)
sshd 27438 tun_zzoom 4u IPv4 1059100 0t0 TCP localhost.localdomain:7070 (LISTEN)
#
そして確かに、接続は通り抜けます!