linux - 如何将 https 流量从一台 Web 服务器切换到另一台 Web 服务器。 IPTABLE问题

标签 linux tcp routes iptables varnish

这是我的配置。 我有 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/

相关文章:

c# - 为什么我的客户端/服务器代码不能在我的本地机器之外工作?

networking - 关于 tcp tahoe 和 reno?

c# - 为什么我的 C# .Net Core Rest API 路由找不到我的方法?

c - 有没有办法让我的二进制文件对 Linux 中的某些全局热键使用react?

c - Write() 给出奇怪的整数符号

linux - 在 'grep' 中 - 为什么它会这样?

ruby-on-rails - ruby on rails - routes.rb - 当文件名中存在多个句点时匹配文件扩展名

python - Windows 和 Linux 中正则表达式的不同结果?

apache - TIME_WAIT 连接过多

php - symfony 如何到 "wildcard everything"路由