我的 iptables 有问题。我想将 https 流量路由到其他服务器。我创建了一些 iptables 规则,以便它从我的角度来看应该可以工作,但事实并非如此。所以一定是哪里出了问题。
我有 3 个系统,1. 我的 Windows PC,我尝试通过 Linux 服务器连接到设备服务器。
Linux 服务器是 10.10.11.5 设备服务器是 10.10.11.17
我制定了一些规则:
iptables -t nat -A PREROUTING -i ens192 -p tcp --dport 443 -j DNAT --to 10.10.11.17:443
iptables -A FORWARD -i ens192 -p tcp --dport 443 -d 10.10.11.5 -j ACCEPT
iptables -t nat -A POSTROUTING -o ens192 -p tcp -d 10.10.11.17 -j SNAT --to-source 10.10.11.5
并尝试打开该网站https://10.10.11.5 但什么也没发生。10.10.11.17 正在运行并在 https 上响应。
为了进一步测试我创建了以下规则:
iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 10.10.11.17:443
当我使用 telnet 时,我连接到了另一个系统。如果没有该规则,则没有连接,这是正确的,因为在本地系统上没有任何东西在端口 443 上监听。
为了查看是否使用了预路由规则,我重置了 iptables 上的计数器并尝试通过浏览器进行连接。规则中的计数器计算了一些包。
我不明白为什么该规则没有发挥正确作用。
在设备上,我无法使用 tcpdump 查看是否有任何数据包传入。我尝试捕获 Linux 服务器上发出的数据包,并且每次刷新浏览器时,我都会在 Linux 服务器上获得一些数据包。
tcpdump -i ens192 -n port 443 -vvv
tcpdump: listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes
08:17:18.381377 IP (tos 0x0, ttl 128, id 17760, offset 0, flags [DF], proto TCP (6), length 52)
10.10.10.212.50261 > 10.10.11.5.https: Flags [S], cksum 0x3d12 (correct), seq 1461645297, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
08:17:18.381464 IP (tos 0x0, ttl 128, id 17761, offset 0, flags [DF], proto TCP (6), length 52)
10.10.10.212.50262 > 10.10.11.5.https: Flags [S], cksum 0xe2cf (correct), seq 3258310427, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
所以我认为我的预路由规则没有将正确的 IP 设置到包中。
谢谢大家。
希望我没有忘记任何事情。
莎莎
以下是我的 IPTables NAT 表:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
PREROUTING_direct all -- anywhere anywhere
PREROUTING_ZONES_SOURCE all -- anywhere anywhere
PREROUTING_ZONES all -- anywhere anywhere
DNAT tcp -- anywhere anywhere tcp dpt:https to:10.10.11.17:443
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
OUTPUT_direct all -- anywhere anywhere
DNAT tcp -- anywhere anywhere tcp dpt:https to:10.10.11.17:443
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
POSTROUTING_direct all -- anywhere anywhere
POSTROUTING_ZONES_SOURCE all -- anywhere anywhere
POSTROUTING_ZONES all -- anywhere anywhere
SNAT tcp -- anywhere 10.10.11.17 to:10.10.11.5
Chain OUTPUT_direct (1 references)
target prot opt source destination
Chain POSTROUTING_ZONES (1 references)
target prot opt source destination
POST_public all -- anywhere anywhere [goto]
POST_public all -- anywhere anywhere [goto]
Chain POSTROUTING_ZONES_SOURCE (1 references)
target prot opt source destination
Chain POSTROUTING_direct (1 references)
target prot opt source destination
Chain POST_public (2 references)
target prot opt source destination
POST_public_log all -- anywhere anywhere
POST_public_deny all -- anywhere anywhere
POST_public_allow all -- anywhere anywhere
Chain POST_public_allow (1 references)
target prot opt source destination
Chain POST_public_deny (1 references)
target prot opt source destination
Chain POST_public_log (1 references)
target prot opt source destination
Chain PREROUTING_ZONES (1 references)
target prot opt source destination
PRE_public all -- anywhere anywhere [goto]
PRE_public all -- anywhere anywhere [goto]
Chain PREROUTING_ZONES_SOURCE (1 references)
target prot opt source destination
Chain PREROUTING_direct (1 references)
target prot opt source destination
Chain PRE_public (2 references)
target prot opt source destination
PRE_public_log all -- anywhere anywhere
PRE_public_deny all -- anywhere anywhere
PRE_public_allow all -- anywhere anywhere
Chain PRE_public_allow (1 references)
target prot opt source destination
Chain PRE_public_deny (1 references)
target prot opt source destination
Chain PRE_public_log (1 references)
target prot opt source destination
答案1
此规则:
iptables -A FORWARD -i ens192 -p tcp --dport 443 -d 10.10.11.5 -j ACCEPT
不正确,因为它是在 PREROUTING 表之后处理的,而 FORWARD 表将看到 CHANGED 目标地址。将此规则更改为:
iptables -A FORWARD -i ens192 -p tcp --dport 443 -d 10.10.11.17 -j ACCEPT
上述规则不会涵盖返回数据包,您需要另一条规则:
iptables -A FORWARD -i ens192 -p tcp --sport 443 -s 10.10.11.17 -j ACCEPT
您还可以将这两条规则简化为:
iptables -A FORWARD -i ens192 -p tcp -m conntrack --ctstate ESTABLISHED,DNAT -j ACCEPT