使用 IPtables 进行负载平衡

使用 IPtables 进行负载平衡

我在 AWS 中的同一个 EC2 实例上运行 2 个 nginx docker 容器。容器使用容器端口 80。第一个容器的 IP 地址为 172.17.0.2,映射到主机的端口 81,第二个容器的 IP 地址为 172.17.0.3,映射到主机的端口 82。我希望使用 iptables 而不是 swarm 或 kubernetes 设置负载平衡。

我制定了以下规则:

iptables -A PREROUTING -t nat -i eth0 -p tcp -d 0.0.0.0/0 --dport 80 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 172.17.0.2:81
iptables -A PREROUTING -t nat -i eth0 -p tcp -d 0.0.0.0/0 --dport 80 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 172.17.0.3:82

但是,我无法连接主机 IP 的端口 80,但可以连接端口 81 和 82。

我的所有 iptable 规则都可以在这里找到:https://paste.ubuntu.com/p/V9gJZqHYGd/

tcpdump 的输出显示数据包正在被回复,但是在客户端却出现了连接被拒绝的错误。

[root@ip-172-31-30-129 ~]# tcpdump -i any port 80 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

19:12:37.229013 IP 37.228.249.144.31060 > 172.31.30.129.80: Flags [S], seq 573169062, win 29200, options [mss 1420,sackOK,TS val 439057061 ecr 0,nop,wscale 7], length 0
19:12:37.229117 IP 172.31.30.129.80 > 37.228.249.144.31060: Flags [R.], seq 0, ack 573169063, win 0, length 0

任何帮助都将不胜感激。

问候,

答案1

我在与容器关联的端口号上犯了一个相当愚蠢的错误。正确的 IP 表规则如下:

iptables -A PREROUTING -t nat -i eth0 -p tcp -d 0.0.0.0/0 --dport 80 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 172.17.0.2:80
iptables -A PREROUTING -t nat -i eth0 -p tcp -d 0.0.0.0/0 --dport 80 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 172.17.0.3:80

谢谢。

相关内容