![iptables 端口转发从负载均衡器到内部 Web 服务器](https://linux22.com/image/563871/iptables%20%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E4%BB%8E%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%E5%88%B0%E5%86%85%E9%83%A8%20Web%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我无法将 8000 端口从负载均衡器(具有外部 IP 地址的唯一入口点)转发到具有内部 IP 的 Web 服务器(端口 8000)。
所以我需要 XX.XX.XX.XX:8000 -> YY.YY.YY.YY:8000,其中 XX.XX.XX.XX 是外部 IP,YY.YY.YY.YY 是内部 IP。
当通过 ssh 登录到 XX.XX.XX.XX 时,可以执行 telnet YY.YY.YY.YY 8000 并且连接成功。以下是我启动的 iptables 命令(在 XX.XX.XX.XX 上):
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A PREROUTING -t nat -p tcp --dport 8000 -j DNAT --to YY.YY.YY.YY:8000
iptables -A FORWARD -p tcp -d YY.YY.YY.YY --dport 8000 -j ACCEPT
以下是 iptables -L 的输出:
Chain INPUT (policy ACCEPT 13486 packets, 6361K bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 122 6968 ACCEPT tcp -- any any anywhere YY.YY.YY.YY tcp dpt:irdmi
Chain OUTPUT (policy ACCEPT 14248 packets, 8532K bytes)
num pkts bytes target prot opt in out source destination
Chain acctboth (0 references)
num pkts bytes target prot opt in out source destination
规则已添加,一些数据包已通过该规则。但当我连接到 XX.XX.XX.XX:8000 时,浏览器仍然显示连接超时
有人能指出错误吗?提前谢谢!
PS. 负载均衡器的 route -n 输出 - 我在其中放置了这些规则:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
173.199.160.147 0.0.0.0 255.255.255.255 UH 0 0 0 eth1
173.199.160.146 0.0.0.0 255.255.255.255 UH 0 0 0 eth1
173.199.160.145 0.0.0.0 255.255.255.255 UH 0 0 0 eth1
173.199.160.144 0.0.0.0 255.255.255.255 UH 0 0 0 eth1
96.30.32.0 0.0.0.0 255.255.255.192 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
172.16.0.0 0.0.0.0 255.252.0.0 U 0 0 0 eth0
0.0.0.0 96.30.32.1 0.0.0.0 UG 0 0 0 eth1
YY.YY.YY.YY 实际上是 172.17.4.10。
ifconfig 输出中,只有两个接口可能影响这一切:
eth0 Link encap:Ethernet HWaddr 00:25:90:53:1F:A8
inet addr:172.17.4.163 Bcast:172.19.255.255 Mask:255.252.0.0
inet6 addr: fe80::225:90ff:fe53:1fa8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:111646 errors:0 dropped:0 overruns:0 frame:0
TX packets:79057 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:63144265 (60.2 MiB) TX bytes:11600837 (11.0 MiB)
Interrupt:217 Memory:fb900000-fb920000
eth1 Link encap:Ethernet HWaddr 00:25:90:53:1F:A9
inet addr:96.30.32.10 Bcast:96.30.32.63 Mask:255.255.255.192
inet6 addr: fe80::225:90ff:fe53:1fa9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:116136 errors:0 dropped:0 overruns:0 frame:0
TX packets:101365 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:16607792 (15.8 MiB) TX bytes:89471131 (85.3 MiB)
Interrupt:233 Memory:fba00000-fba20000
ip_转发:
root@load1 [~]# cat /proc/sys/net/ipv4/conf/eth0/forwarding
1
root@load1 [~]# cat /proc/sys/net/ipv4/conf/eth1/forwarding
1
root@load1 [~]# cat /proc/sys/net/ipv4/ip_forward
1
答案1
由于路由显然已启用,另一种可能且相当常见的错误配置是 172.17.4.10 上的默认路由不经过 172.17.4.163。在这种情况下,传入数据包将正确地 DNAT 到 172.17.4.10,但响应将通过不同的目的地路由出去,从而获得“错误”的源 IP 地址。
一般来说,真正了解正在发生的事情的一个好方法是运行 tcpdump
tcpdump -i eth0 -v -n host 172.17.4.10
并尝试连接。输出应该很有见地。
答案2
你的 iptables nat 规则错误。请将其更改为:
iptables -A PREROUTING -t nat -p tcp --dport 8000 -j DNAT --to-destination YY.YY.YY.YY:8000