私が達成したいこと
CentOS(6.8)ボックス1.1.1.1とリモートイカプロキシサーバー2.2.2.2があります。
curl http://google.com -x 2.2.2.2:3128
http_proxy
HTTPプロキシオプションなしで変数(telegrafなど)を考慮せずにアプリケーションの結果をシミュレートしようとしています。
今まで試したこと
トラフィックをプロキシに転送するためにiptablesルールを設定してみました。
iptables -t nat -A PREROUTING -i eth0 ! -s 2.2.2.2 -p tcp --dport 80 -j DNAT --to 2.2.2.2:3128
iptables -t nat -A POSTROUTING -o eth0 -s 1.1.1.1 -d 2.2.2.2 -j SNAT --to 1.1.1.1
iptables -A FORWARD -s 1.1.1.1 -d 2.2.2.2 -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT
その後、リモートデバイスにトラフィックを送信すると、戻りトラフィックが正しくルーティングされないため、DNATが正しく機能しないことがわかりました。これに基づいて、アプリケーションをCentOSシステム(172.17.0.9)のdockerコンテナに移動し、ホストシステムでiptables設定を維持することによってiptables設定を変更することを計画しました。
iptables -t nat -A PREROUTING -i eth0 ! -s 2.2.2.2 -p tcp --dport 80 -j DNAT --to 2.2.2.2:3128
iptables -t nat -A POSTROUTING -o eth0 -s 172.17.0.0/16 -d 2.2.2.2 -j SNAT --to 1.1.1.1
iptables -A FORWARD -s 172.17.0.0/16 -d 2.2.2.2 -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT
また、次のルールセットを試しました。
iptables -t nat -A PREROUTING -i eth0 -s 172.17.0.0/16 -p tcp --dport 80 -j DNAT --to-destination 2.2.2.2:3128
iptables -t nat -A POSTROUTING -o eth0 -d 2.2.2.2/32 -j MASQUERADE
これら2つのルールセットの結果は、httpトラフィックがまだプロキシを介さずに宛先に直接到達しようとすることです。
[root@host ~]# tcpdump -nnn host 216.58.201.35
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
15:26:24.536668 IP 1.1.1.1.38566 > 216.58.201.35.80: Flags [S], seq 3885286223, win 14600, options [mss 1460,sackOK,TS val 2161333858 ecr 0,nop,wscale 9], length 0
Dockerコンテナのデフォルトゲートウェイがホストとして正しく設定され、ホストでIP転送が有効になっています。
[root@docker /]# ip route
default via 172.17.0.1 dev eth0
[root@host ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
ここで明らかなものを見逃していますか?
ベストアンサー1
解決する
iptables ルールセットを使用します。
-A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 2.2.2.2:3128
-A POSTROUTING -s 172.17.0.0/16 -j SNAT --to-source 1.1.1.1
これは、インターフェイスが正しく設定されていないためです(docker0である必要があります)。 iptablesルールからインターフェイスフラグを削除し、正常に動作します。