iptables NAT 转发 443 端口 DNAT、SNAT 失败

iptables NAT 转发 443 端口 DNAT、SNAT 失败

我正在尝试设置一个

处理 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 三次握手似乎工作正常(我将把转储翻译成人类英语):

  1. 客户端同步
  2. 代理发送 syn 到网络服务器
  3. Web 服务器回复 syn+ack
  4. 代理发送回客户端 syn+ack
  5. 客户端发送 ACK 建立连接
  6. 代理将 ACK 发送到 Web 服务器。
  7. 然后一切都出错了,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 目标以强制出站流量使用代理。

相关内容