質問

質問

質問

Dockerコンテナネットワークは、ホストTPROXYによって設定されたトンネルを通過しません。

設定

マイコンピュータでTPROXY対応プロキシサーバーが実行されています(127.0.0.1:8080でリッスン)。TPROXY次のように、ターゲットを使用してこのプロキシサーバーにトラフィックをリダイレクトするようにiptablesを設定しました。

ip route add local default dev lo table 100
ip rule add fwmark 1 table 100

iptables -t mangle -N PROXY
# Ignore private IPs
iptables -t mangle -A PROXY -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A PROXY -d 100.64.0.0/10 -j RETURN
iptables -t mangle -A PROXY -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A PROXY -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A PROXY -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A PROXY -d 192.0.0.0/24 -j RETURN
iptables -t mangle -A PROXY -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A PROXY -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A PROXY -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A PROXY -d 192.168.0.0/16 -j RETURN

iptables -t mangle -A PROXY -p tcp -j TPROXY --on-port 8080 --on-ip 127.0.0.1 --tproxy-mark 1
iptables -t mangle -A PROXY -p udp -j TPROXY --on-port 8080 --on-ip 127.0.0.1 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j PROXY


iptables -t mangle -N PROXY_SELF
# Ignore private IPs
iptables -t mangle -A PROXY_SELF -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A PROXY_SELF -d 100.64.0.0/10 -j RETURN
iptables -t mangle -A PROXY_SELF -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A PROXY_SELF -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A PROXY_SELF -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A PROXY_SELF -d 192.0.0.0/24 -j RETURN
iptables -t mangle -A PROXY_SELF -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A PROXY_SELF -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A PROXY_SELF -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A PROXY_SELF -d 192.168.0.0/16 -j RETURN

iptables -t mangle -A PROXY_SELF -m mark --mark 2 -j RETURN
iptables -t mangle -A PROXY_SELF -p tcp -j MARK --set-mark 1
iptables -t mangle -A PROXY_SELF -p udp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -j PROXY_SELF

ローカルに生成されたパケットは期待どおりに機能します。しかし、ホストを通過するDockerコンテナパケットに問題があります。 Dockerのデフォルトネットワーク/ iptables設定を変更していないため、ホストインターネット接続デバイス(eth0)をゲートウェイとして使用して発信ネットワークを転送します。トラフィックをプロキシサーバーにリダイレクトするためにiptables tproxy(上記のコマンド)を有効にすると、Dockerコンテナ内で発生したトラフィックがプロキシサーバーに到達できず、インターネットにアクセスできなくなります。どうすれば解決できますか?

デバッグ

各テーブルの各チェーンに対してiptablesターゲットを使用LOGしてパケットがどのように通過したかを確認し、問題のある場所をデバッグ(または推測)しました。私が理解したのは、ローカルで生成されたパケットの場合、mangleテーブルチェーンを通過するときにOUTPUTfwmark 1として表示され、コマンドloによってデバイス(デフォルトのインターネット接続デバイスではなく)にルーティングされます。デバイスは、テーブルチェーンで定義されたターゲットと残りのプロキシプロセスを介してプロキシサーバーにリダイレクトされます。一方、Dockerコンテナから送信されたパケットの場合、最初に(デフォルトのDockerブリッジネットワークデバイス)で受信され、宛先によってリダイレクトされると、パケットはeth0ip routeip rulelotproxymanglePREROUTINGdocker0tproxy歩くnatテーブルチェーンでは、INPUTAFAIKはプロキシサーバープロセスに渡される直前です。プロキシサーバーから何のログメッセージも見ることができないため、これらのパケットが何とか削除されていると推測されます。また、以下をテストしました。

  • バインドされたプロキシサーバーを実行します。0.0.0.0
  • net.ipv4.ip_forwardカーネルオプションの有効化
  • docker0パケットが最初にmangleテーブルチェーンを通過し、PREROUTINGfwmark 1としてマークされ(ジャンプせずにtproxyip route再ルーティングされ、次にlo(ローカルで生成されたパケットと同様)、そのパケットにtproxyリダイレクトデバイスが適用されます。後で受信した相関パケットlo。期待どおりに動作します。渡されたloただし、デバイスから受信したパケットはmangle監視チェーンの後ろにあり、続行されPREROUTINGません。

しかし、結果はありません...

助けてくれてありがとう。

私はLinuxでiptablesを使った高度なネットワーキングに初めて触れました(3日前に完全に始めました)、より多くの情報が必要な場合は教えてください。

乾杯

関連情報