GNU/Linux >> Linux の 問題 >  >> Linux

iptablesはローカル接続をリモートシステム/ポートにリダイレクトします

理解できたかどうかは完全にはわかりませんが、あなたは間違った連鎖の中にいるだけだと思います。 :-) 私も最初に iptables を使ったときは戸惑いました。しかし、前進への道 ローカル port ${LOCAL UNPRIV PORT} は以下のステートメントです:

$IPT -t nat -A PREROUTING -i eth0 -p tcp --dport ${LOCAL UNPRIV PORT} 
     -j DNAT --to ${ANOTHER SYSTEM}:${REMOTE PORT}

これは、セマンティックの問題と netfilter の動作方法の混合です。昔は、ローカル ポートの転送には、転送先のボックスへの接続と、宛先への 2 番目の接続が含まれていました。 iptables はこれを 1 ステップで行います。したがって、2 つの接続の代わりに、そのポートへのトラフィックを宛先に直接転送します。 Netfilter はすべてのサニティ チェックとブックキーピングを行います。有効な接続に属するパケットのみが NAT 変換され、転送可能になります。

DNAT を有効にすると、パケットの転送が許可されなくなります。ルールも追加する必要があります:

$IPT -N INET-PRIV
$IPT -A FORWARD -i eth0 -o eth1 -j INET-PRIV
$IPT -A FORWARD -j DROP

$IPT -A INET-PRIV -p tcp -d ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j ACCEPT

$IPT -A INET-PRIV -j DROP

もちろん、転送を有効にする必要があります。

echo "1" > /proc/sys/net/ipv4/ip_forward

Pro iptables :より安全で柔軟性が高く、接続ごとに使用されるメモリと CPU が少ない

Contraiptables :内部マシンから内部マシンへの接続の転送 (eth0 にフィードバックする) は、iptables では意味がありません (もちろん、いつでも直接接続できます)。ローカルで生成されたトラフィックの転送は機能しません (ポート転送デーモンが役立つかもしれませんが、通常は意味がありません)

まさにこれが問題かもしれません :ルーター以外で NAT を使用しようとしている場合は、転送デーモンを使用するか、この余分なポート転送を完全にスキップして、次のことを行う必要があります:

ssh -L 1234:${ANOTHER SYSTEM}:${REMOTE PORT} special-vpn-box

special-vpn-box では、ルーターからの着信接続と、iptables を使用した ${ANOTHER SYSTEM}:${REMOTE PORT} への発信接続のみを許可できます。そうすれば、特別な VPN ボックスのユーザーは ${ANOTHER SYSTEM}:${REMOTE PORT} にしかアクセスできず、信頼されていなければ他のことはできません。


ローカルホスト転送のために私が具体的に行っていることは次のとおりです:

iptables -t nat -A OUTPUT -m addrtype --src-type LOCAL --dst-type LOCAL -p tcp --dport 3306 -j DNAT --to-destination ip.ip.ip.ip
iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE

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

ip.ip.ip.ip を必ず置き換えてください 実際のパブリック IP と --dport 3306 について 転送したいポートの.

最後に sysctl コマンドを実行し、 /etc/sysctl.conf も更新します

sysctl.ctl を更新できます 次のコマンドで localhost のルーティングを許可します:

echo "net.ipv4.conf.all.route_localnet=1" >> /etc/sysctl.conf

これはすべて単純で良いように思えますが、調査と追跡が必要でした。 localhost/127.0.0.1 の転送にはこのメソッドが必要であり、他の典型的な例は機能しないことに注意してください。 localhost で機能しないソリューションの例:

iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to ip.ip.ip.ip:3306
iptables -t nat -A POSTROUTING -d ip.ip.ip.ip -j MASQUERADE

http://realtechtalk.com/iptables_how_to_forward_localhost_port_to_remote_public_IP-1788-articles


# Enable IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A PREROUTING  -p tcp \
--dport ${LOCAL UNPRIV PORT} -j DNAT --to-destination ${ANOTHER SYSTEM}:${REMOTE PORT}

iptables -t nat -A POSTROUTING -p tcp \
--dst ${ANOTHER SYSTEM} --dport ${REMOTE PORT} -j SNAT --to-source ${LOCAL SYSTEM}

Linux
  1. csfを使用したIP/ポートリダイレクト

  2. Linux で MongoDB を取得してリモート接続をリッスンする

  3. system() の出力をファイルにリダイレクトする方法は?

  1. Linuxでポートを開く方法

  2. iptables とのすべての着信接続を拒否しますか?

  3. リモート システムのポートが到達可能かどうかをテストします (telnet を使用しない場合)。

  1. コンソールをシリアル ポートにリダイレクトする

  2. IPTables を使用した FTP の許可

  3. iptables 使用時の REJECT と DROP