这是我的配置。 我有 varnish 监听端口 80 和 2 个 Web 服务器(tomcat)的端口 8080 和 8081 以及 https 4430 和 4431。
HTTP 流量从 varnish 流向 1 个 Web 服务器。当我需要升级我的应用程序时,我关闭一个tomcat,升级代码,重新启动并更改varnish配置以转到升级后的tomcat。
我需要对 HTTP 流量执行相同的操作。流量很小,而且我不需要缓存,所以我想我可以只使用 iptables。
所以我添加了这样的规则:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 4430
当我需要切换到另一个 tomcat 时,我会这样做:
iptables -t nat -D PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 4430
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 4431
它似乎有效,但几天后所有机器都出现连接问题。 Varnish 无法连接到 tomcat,dns 查找不起作用等。
我在/var/log/messages 中发现了数千条:
Mar 27 10:04:15 ip-10-72-254-31 kernel: [2112599.753509] nf_conntrack: table full, dropping packet.
关闭 iptables 似乎可以解决连接问题。
那么,我可以像现在这样使用 iptables 吗? 如何防止“表已满,丢包”问题? 我还可以使用什么来重定向我的 https 流量?
最佳答案
我们广泛使用 iptables,从未遇到过 NAT 表填满的情况;我看到的唯一区别是我们使用 DNAT 目标(即使对于本地主机)而不是重定向使用稍微不同的规则。
/sbin/iptables -I PREROUTING -t nat -i eth0 -p tcp --dport 443 -j DNAT --to :4430
(我们的内核为 2.6.32 及更高版本 - iptables 1.4.3.1 及更高版本)
编辑
您可以尝试对 nf_conntrack tacble(跟踪所有打开的连接)进行一些调整。
第一个是将跟踪连接的时间减少到更合理的值,例如一天。像这样的东西:
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_builted=86400
您还可以尝试增加表格的大小
sysctl -w net.netfilter.nf_conntrack_max=65535
重新启动网络接口(interface)应该足以使用这些新值。
最后,您可能需要对 sysctl.conf 进行这些修改才能在下次重新启动后继续存在。
关于linux - 如何将 https 流量从一台 Web 服务器切换到另一台 Web 服务器。 IPTABLE问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898259/