我正在尝试设置一个
处理 http 并将 https 转发到 Web 服务器的代理服务器。
客户端 > 代理 > httpd
我添加了规则:
iptables -t nat -I PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j DNAT --to 172.16.0.webserver:443
iptables -t nat -I POSTROUTING -o eth2 -p tcp -m tcp --dport 443 -j SNAT --to 172.16.0.proxyserver
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -d 172.16.0.proxyserver/32 -p tcp -m tcp --dport 443 -j ACCEPT
TCP/IP 三次握手似乎工作正常(我将把转储翻译成人类英语):
- 客户端同步
- 代理发送 syn 到网络服务器
- Web 服务器回复 syn+ack
- 代理发送回客户端 syn+ack
- 客户端发送 ACK 建立连接
- 代理将 ACK 发送到 Web 服务器。
- 然后一切都出错了,Web服务器仍然发送syn+ack(在点3)。
倾倒:
187.remote_client_ip.35331 > 172.30.prox01.443: Flags [S], cksum 0xdc43 (correct), seq 4120294192, win 14600, options [mss 1380,sackOK,TS val 2823788935 ecr 0,nop,wscale 7,nop,Unknown Option 1403], length 0
172.16.prox02.35331 > 172.16.0.websrvr.443: Flags [S], cksum 0x2c28 (correct), seq 4120294192, win 14600, options [mss 1380,sackOK,TS val 2823788935 ecr 0,nop,wscale 7,nop,Unknown Option 1403], length 0
172.16.0.websrvr.443 > 172.16.prox02.35331: Flags [S.], cksum 0xfc5a (correct), seq 284179605, ack 4120294193, win 14480, options [mss 1460,sackOK,TS val 592958236 ecr 2823788935,nop,wscale 7], length 0
172.30.prox01.443 > 187.remote_client_ip.35331: Flags [S.], cksum 0xac76 (correct), seq 284179605, ack 4120294193, win 14480, options [mss 1460,sackOK,TS val 592958236 ecr 2823788935,nop,wscale 7], length 0
187.remote_client_ip.35331 > 172.30.prox01.443: Flags [.], cksum 0x1350 (correct), seq 1, ack 1, win 115, options [nop,nop,TS val 2823788951 ecr 592958236], length 0
172.16.prox02.35331 > 172.16.0.websrvr.443: Flags [.], cksum 0x6334 (correct), seq 1, ack 1, win 115, options [nop,nop,TS val 2823788951 ecr 592958236], length 0
172.16.0.websrvr.443 > 172.16.prox02.35331: Flags [S.], cksum 0xfbbe (correct), seq 284179605, ack 4120294193, win 14480, options [mss 1460,sackOK,TS val 592958376 ecr 2823788951,nop,wscale 7], length 0
172.30.prox01.443 > 187.remote_client_ip.35331: Flags [S.], cksum 0xabda (correct), seq 284179605, ack 4120294193, win 14480, options [mss 1460,sackOK,TS val 592958376 ecr 2823788951,nop,wscale 7], length 0
172.16.0.websrvr.443 > 172.16.prox02.35331: Flags [S.], cksum 0xfaf6 (correct), seq 284179605, ack 4120294193, win 14480, options [mss 1460,sackOK,TS val 592958576 ecr 2823788951,nop,wscale 7], length 0
172.30.prox01.443 > 187.remote_client_ip.35331: Flags [S.], cksum 0xab12 (correct), seq 284179605, ack 4120294193, win 14480, options [mss 1460,sackOK,TS val 592958576 ecr 2823788951,nop,wscale 7], length 0
非常感谢您的帮助!提前谢谢您
答案1
由于您注意到 SYN/ACK 被重放,这可能意味着 Web 服务器从未收到来自代理的 ACK。为什么?conntrack 上确实有一个 ESTABLISHED 接受,SYN/ACK 应该使 NAT 正确注册连接...
我猜是因为你的两条 NAT 规则实际上是不正确的-- 因为您默认将规则添加到 FILTER 表中,而 DNAT 和 SNAT 目标则应该位于 NAT 表中(显然如此)。添加规则时,在命令行中使用“-t nat”表示。
此外,如果最后一条规则的目的是允许代理服务器访问外部网络服务器,那么您可能需要按源 (-s) 而不是目标 (-d) 进行过滤。您可能还需要查看 REDIRECT 目标以强制出站流量使用代理。