iptables 端口转发从负载均衡器到内部 Web 服务器

iptables 端口转发从负载均衡器到内部 Web 服务器

我无法将 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

相关内容