質問
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
テーブルチェーンを通過するときにOUTPUT
fwmark 1として表示され、コマンドlo
によってデバイス(デフォルトのインターネット接続デバイスではなく)にルーティングされます。デバイスは、テーブルチェーンで定義されたターゲットと残りのプロキシプロセスを介してプロキシサーバーにリダイレクトされます。一方、Dockerコンテナから送信されたパケットの場合、最初に(デフォルトのDockerブリッジネットワークデバイス)で受信され、宛先によってリダイレクトされると、パケットはeth0
ip route
ip rule
lo
tproxy
mangle
PREROUTING
docker0
tproxy
歩くnat
テーブルチェーンでは、INPUT
AFAIKはプロキシサーバープロセスに渡される直前です。プロキシサーバーから何のログメッセージも見ることができないため、これらのパケットが何とか削除されていると推測されます。また、以下をテストしました。
- バインドされたプロキシサーバーを実行します。
0.0.0.0
net.ipv4.ip_forward
カーネルオプションの有効化docker0
パケットが最初にmangle
テーブルチェーンを通過し、PREROUTING
fwmark 1としてマークされ(ジャンプせずにtproxy
)ip route
再ルーティングされ、次にlo
(ローカルで生成されたパケットと同様)、そのパケットにtproxyリダイレクトデバイスが適用されます。後で受信した相関パケットlo
。期待どおりに動作します。渡されたlo
ただし、デバイスから受信したパケットはmangle
監視チェーンの後ろにあり、続行されPREROUTING
ません。
しかし、結果はありません...
助けてくれてありがとう。
私はLinuxでiptablesを使った高度なネットワーキングに初めて触れました(3日前に完全に始めました)、より多くの情報が必要な場合は教えてください。
乾杯