为了负载平衡目的,我们的服务器偶尔会将请求转发到不同的端口;我们服务的默认端口是端口 5000。
这是使用的代码:iptables -t nat -A PREROUTING -p tcp --dport 5000 -j REDIRECT --to-port 5001
应用此代码后,端口转发对新请求非常有效。
端口 5000 上的新请求被转发到端口 5001 上的服务。但是,现有连接仍连接到端口 5000,如 netstat 所示。
我的问题是,如何强制此 iptables 规则立即应用于所有连接(包括新的和现有的(已建立的)连接)-而不先丢弃所有连接?
提前致谢
答案1
现有连接保持连接,因为 iptables NAT 跟踪连接的状态 - 也就是说,它是“有状态的”。
iptables 工具不允许您修改现有连接的状态。即使您可以不知何故修改 iptables NAT 连接跟踪表中的现有连接,您将如何提醒远程客户端更改它们正在通信的端口?这就是问题所在——TCP 协议中没有功能来告诉远程客户端“更改为端口号 ###”。这不是协议的一部分(而且既然不是,iptables 没有理由让您执行您要求的操作)。