Dockerコンテナ内のアウトバウンドトラフィックを別のポートに再マッピングしたいと思います。例:curl 1.2.3.4:8080
実際に要求したいと思いますcurl 1.2.3.4:8181
。 (これは、クーバーネティスでkube-proxyが実行するのと似ています。)
私はドッカーコンテナで以下を実行できることを知っています。
iptables -t nat -A OUTPUT -p tcp -d 1.2.3.4 --dport 8080 -j DNAT --to-destination 1.2.3.4:8181
これにより、要求が期待どおりに実行されます。しかし、同じ機能を得るためにホストでiptablesルールを編集したいと思います。
IDを持つドッカーネットワークがあり、それをホストで実行する8e8799c36e69
と、次の規則が得られます。iptables-save | grep 8e8799c36e69
-A POSTROUTING -s 172.18.0.0/16 ! -o br-8e8799c36e69 -j MASQUERADE
-A DOCKER -i br-8e8799c36e69 -j RETURN
-A FORWARD -o br-8e8799c36e69 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-8e8799c36e69 -j DOCKER
-A FORWARD -i br-8e8799c36e69 ! -o br-8e8799c36e69 -j ACCEPT
-A FORWARD -i br-8e8799c36e69 -o br-8e8799c36e69 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i br-8e8799c36e69 ! -o br-8e8799c36e69 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-2 -o br-8e8799c36e69 -j DROP
このネットワーク内でポートの書き換えを設定できるように、これらのルールを追加できますか? (このイベントは正しいことでしたか?)
たぶんこれだけではないでしょうか?
iptables -t nat -I OUTPUT -o br-8e8799c36ec9 --src 0/0 --dst 1.2.3.4 -p tcp --dport 8080 -j REDIRECT --to-ports 8181
それともドッカーブリッジネットワーキングを必要とせずに、どういうわけかコンテナ内のトラフィックをフィルタリングできますか?
編集する:
Dockerコンテナを起動すると、次のルールが作成されます。
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 8080 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:8080
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8080 -j ACCEPT
コンテナには、マイコンピュータ172.17.0.2
にIPアドレスがあります。だから、次のルールを追加しました。
sudo iptables -t nat -A OUTPUT -s 172.17.0.2/32 -p tcp -d 172.217.3.110 --dport 8080 -j DNAT --to-destination 172.217.3.110:80
172.217.3.110:8080
リクエストのテストリクエストを送信しようとしましたが、うまく172.217.3.110:80
いかないようです。
編集2:
ローカルリスニングサービスのポートを書き換えようとすると、次のコマンドを使用できます。
LOCAL_IP=192.168.86.30
REQUESTED_PORT=80
DESTINATION_PORT=8080
CONTAINER_IP=172.17.0.2
sudo iptables -t nat -A OUTPUT -p tcp -d $LOCAL_IP --dport $REQUESTED_PORT -j DNAT --to-destination :$DESTINATIO_PORT
sudo iptables -t nat -I PREROUTING -s $CONTAINER_IP -d $LOCAL_IP -p tcp --dport $REQUESTED_PORT -j REDIRECT --to-ports $DESTINATION_PORT
これはローカルIPでのみ機能するようです。
編集3: kube-proxyソースには、アプローチとさまざまな落とし穴に関する追加情報があります。
https://github.com/kubernetes/kubernetes/blob/84dc704/pkg/proxy/userspace/proxier.go#L1133-L1165
答え1
わかりました。
IPアドレスを持つコンテナのトラフィックを192.168.86.30:80
リダイレクトするには、次のルールを追加します。192.168.86.30:8084
172.17.0.2
sudo iptables -t nat -A PREROUTING --protocol tcp --destination 192.168.86.30 \
--dport 80 --source 172.17.0.2 \
--jump DNAT --to-destination 192.168.86.30:8084
これはパブリック外部IPアドレスにも当てはまるようです。
REDIRECT
なぜならうまくいかないようです。[源泉]:
宛先IPを着信インターフェイスのベースアドレスに変更して、パケットをシステム自体にリダイレクトします(ローカルで生成されたパケットは127.0.0.1アドレスにマッピングされます)。
それでも何が起こっているのか完全にはわかりませんが、これがREDIRECTがローカルサービス(特に0.0.0.0で受信するすべての項目)の一部の操作を処理できるが外部IPは処理できない理由だと思います。