ポートのドッカーコンテナ内でノードサーバーを実行している(コンテナIP)を介してアクセス8080
できるようになりました。172.17.0.2:8080
localhost:9099
localhost:9099
このトラフィックをリダイレクトするためにiptablesを試してみましたが、172.17.0.2:8080
すべての努力は無駄です。
これが私が使用するコマンドです。私が間違った部分を修正してください。よろしくお願いします。
sudo iptables -t nat -A PREROUTING -p tcp --dport 9099 -j DNAT --to-destination 172.17.0.2:8080
私は助けられましたこれ答えたけど役に立たなかった。
答え1
試みにいくつかの問題があります。
- 使用は、
localhost
接続がホストで開始され、他のホストからルーティングされないことを示します。したがって、最初はルーティングは含まれていないため、チェーンではOUTPUT
なくチェーンが必要です。PREROUTING
- 送信元IPは、
127.0.0.1
宛先が変更されると送信元IPも変更する必要があります。これには追加のPOSTROUTING
ルールが必要です。-m conntrack --ctstate DNAT
オプションの一致は、最初の一致が最初に一致したことを確認しますが、OUTPUT
これは一種のなりすましの試みではありません。 - 少なくともLinuxでは、
127.0.0.0/8
これはルーティングスタックで特別に処理され、POSTROUTING
ルールが実行される前にパケットが破棄されます。特別な処理を排除し、ブロック「外部」ルーティングを許可するには、127.0.0.0/8
リダイレクトが発生するインターフェイスにフラグが必要です。route_localnet
1に設定してください。それ以外の場合、上記のいずれも十分ではありません。
質問でインターフェイスがわからないので、パスからインターフェイス名を検索して変数に入れます。必要に応じて調整してください。all
擬似インターフェイスを使用して設定することもできます。バナー世界的な。
結局、これは(ルートまたは使用sudo
)に帰結します。
iptables -t nat -A OUTPUT -p tcp --dport 9099 -j DNAT --to-destination 172.17.0.2:8080
iptables -t nat -A POSTROUTING -s 127.0.0.0/8 -d 172.17.0.2 -m conntrack --ctstate DNAT -j MASQUERADE
interface=$(ip -o route get 172.17.0.2 | grep -o 'dev [^ ][^ ]*'|sed 's/^dev //')
echo 1 > /proc/sys/net/ipv4/conf/$(interface)/route_localnet
つまり、127.0.0.0/8
まだホストにローカルな非アドレスを試してみる必要があります。これは作業を簡素化し、追加の規則を必要としませんroute_localnet
(時には必要ないかもしれません)POSTROUTING
。