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


41

127.0.0.1でポート2222で実行されているサービスがあります。すべての要求をサブネット192.168.1.0/24から127.0.0.1:2222にのみ 192.168.2.2:2222(外部IP)に転送する必要があります。

これを使用しようとしていますが、機能していません。

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


明確化が必要です。トラフィックはどこから来ますか?トラフィックは元々どこに向かっていますか?トラフィックはどこに行くべきですか?私が読んだように、192.168.1.0 / 24から127.0.0.1:2222へのトラフィックを12.23.34.45:2222にリダイレクトする必要があります。しかし、ウォーレンの答えはあなたが192.168.1.0/24から12.23.34.45:2222へのトラフィックが127.0.0.1:222にリダイレクトされるようにしたいと仮定し
パトリック

1
トラフィックは192.168.1.0/24サブネットから192.168.2.2:2222に到達し、127.0.0.1:2222のサービスに変換される必要があります。住所スキームを修正しました。
SimWhite

1
2222サブネットからループバックインターフェイスのポートへのトラフィックを許可するルールが必要192.168.1.0/24ですか?これは、単一のルールタイプのセットアップではありません。ここを参照してください:debuntu.org/...
SLM

はい。私は理解しているように、私はmasqルールを追加する必要がありますか もちろん、IP転送はすでに有効になっています。
SimWhite 14年

「実際の」IPで実行し、不要なソースからのトラフィックを除外してみませんか?これは、ファイアウォールは、本質的に、のためのものです...何である
vonbrand

回答:


60

使用しているiptablesルールは機能しますが、追加の変更が必要です。

sysctl -w net.ipv4.conf.eth0.route_localnet=1

eth0nicとの置き換えは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が何でも)する必要があります。


8
この情報を見つけるのは驚くほど難しいです。
レンT.

はい、非常に貴重な入手困難な情報です!ありがとうございました!しかし、私は持っていませんroute_localnet。他の名前はありましたか?(Linuxの2.6.30で)ls /proc/sys/net/ipv4/conf/lan/:accept_redirects arp_accept arp_filter arp_notify DISABLE_POLICY force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm転送mc_forwarding promote_secondaries rp_filter send_redirectsタグ
IMZ -イワンZakharyaschev

私が見る、のためのパッチroute_localnet私のカーネル(2.6.30-STD-DEF-alt15#1 SMP月12月14日午前8時45分48秒UTC 2009)よりも新しい(2012年6月7日)。OK、netcatncxinetd、、またはポート転送オプションssh(後者はもちろん無効で愚かですが、私はそれについて言及します)のような転送プロセスを使用して、必要なポート転送(外部から内部)を単に達成しますなぜなら、この可能性はそこにあるからです)。
imz-イヴァンザカリヤシェフ

2
私の2セント:すべてのインターフェイスでこのパラメーターを有効にできますsysctl -w net.ipv4.conf.all.route_localnet=1
Dmitriusan

他の人と同様に、この情報を入手するのは困難でした。おかげで、もしこれをもっと早く見つけたら、私はたくさんの労力を節約できたでしょう。
スティーブンシンプソン

3

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

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


これはおそらく、sysctlのvoodoのない最良の答えです...
レスター・チャン

ポート222のみ(規則が宛先アドレスを変更しません)ローカルホスト上で聴かされている場合はまだ、助けにはならない
sanmai

その場合には、使用-j DNAT --to-destination w.x.y.z:222
dresende

2

との正解がroute_localnet機能しない場合はどうなりますか?..

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

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

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

そして確かに、接続は通過します!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.