web-dev-qa-db-ja.com

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

SSHを使用して、Windowsマシンのローカルポート3389を任意のポート(非特権領域内)のredhatサーバーにポート転送しようとしています。ファイアウォールの背後で保護してから、redhatサーバーの非特権ポートをユーザーのリモートデスクトップに転送します。基本的に、1つのタスクのみを処理する高度にスペシャライズされたVPNを作成します。ユーザーが制御できる暗号化されたトンネルを使用して、ファイアウォールの背後にあるシステムにユーザーを誘導します。

私は何年も前に、これが次のコマンドを使用して可能だったことを知っています。

iptables -A OUTPUT -t nat --dport ${LOCAL UNPRIV PORT} \
           -j DNAT ${ANOTHER SYSTEM}:${REMOTE PORT}

しかし、私が読んだところ、その機能は削除されたようで、/ var/log/messagesにメッセージが表示されます

      kernel: NAT: no longer support implicit source local NAT 

カーネル2.6.X-2.6.10以降、IP_NF_NAT_LOCALを使用してカーネルでこれを有効にする方法があったことを示唆するリソースを見つけましたが、最近のカーネルでは削除されたようです。すべてのローカルトラフィックを転送して、PREROUTINGチェーンに入るようにしましたが、成功は限られており、サーバーの非特権ポートを開いて、 eth0インターフェイス。ある種の奇妙なクラッジ、または回避策を見つけることができる時間がもっとあると確信していますが、ファイアウォールスクリプトをそれほどハックアップしたくありません。私にはわからない、もっと簡単な方法があるはずです。コミュニティが提供できる支援やガイダンスは非常に役立ちます。前もって感謝します

7
dynamphorous

私が理解したかどうかは完全にはわかりませんが、あなたは間違ったチェーンにいると思います。 :-) iptablesを初めて使用したときも混乱しました。しかし転送ローカルポート$ {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

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

正確にこれが問題である可能性があります:NATルーター以外で使用しようとするため、デーモンを転送するか、この追加のポート転送を完全にスキップして、次のようにします。

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

Special-vpn-boxでは、iptablesを使用して、ルーターからの着信接続と$ {ANOTHER SYSTEM}:$ {REMOTE PORT}への発信接続のみを許可できます。そうすることで、special-vpn-boxのユーザーは$ {ANOTHER SYSTEM}:$ {REMOTE PORT}にのみアクセスでき、信頼されていない場合は他のことはできなくなります。

11
Ganwell

これが私がローカルホスト転送のために特に行うことです:

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

4
Areeb Soo Yasir
# 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}
2
osterik