web-dev-qa-db-ja.com

iptablesは外部リクエストを127.0.0.1にリダイレクトします

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:アドレススキームを編集します。

46
SimWhite

使用している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が何であれ)を追加する必要があります。

65
Patrick

Localhostにリダイレクトできますが、ループバック(127.0.0.0/8)にはリダイレクトできません。ループバックは抜け穴です。実際のインターフェースの1つにリダイレクトする必要があります。 REDIRECTを使用してみてください。

iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222

3
dresende

route_localnetを使用した正解が機能しない場合はどうなりますか?.

カーネルに route_localnetのパッチ が含まれていない場合、カーネルをアップグレードしてください!

または、外部インターフェイスをリッスンしてトラフィックを転送するプロセスを実行することにより、あるインターフェイスに着信するトラフィックを別のインターフェイスの別のポート(特にlocalhost)に転送する他の方法があります。

netcatnc)、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)
# 

そして確かに、接続は通り抜けます!