如何使用防火墙/iptables 不中断地重新启动 Java 服务?

如何使用防火墙/iptables 不中断地重新启动 Java 服务?

如果启用此规则

iptables -t nat -A PREROUTING -p tcp --dport 80  -j REDIRECT --to 8080

然后,到达服务器端口 80 的连接将重定向到 localhost:8080。如果我想重新启动服务,我可以在另一个端口上启动服务吗?比如说端口 8081,然后将防火墙重新路由到

iptables -t nat -A PREROUTING -p tcp --dport 80  -j REDIRECT --to 8081 # Apparently -A won't work. I have to replace the rule, not add it. But I don't know how to do it yet

但是,NAT 端口 8080 上已建立的 TCP 套接字连接怎么办?防火墙更改后,它们会立即被丢弃吗?或者,它们会一直工作到正常 TCP 套接字关闭吗?

如果是这样,那么通过正常关闭端口 8080 上的旧实例以及端口 8081 上的具有新功能的新实例,可以无中断地重新启动应用程序。

这个推理正确吗?

答案1

你问: ”这个推理正确吗?

我的回答是:“为了部分正确,你必须在假设和行动中修正几个细节。这不是 100% 正确,这也意味着……它基本上是一个错误的方法!”。我之所以这么说,是基于以下几个因素(顺序大致随机):

  1. 恕我直言,您将使用错误的方法来解决问题(重新启动 TCP 服务器/服务而不中断现有的已建立 TCP 连接)。在我看来,一种“自然”的方法是在“应用程序级别”解决问题。当您谈论 TCP/服务器应用程序时,它很有可能是“多线程”或“多进程”。在这样的环境中,没有什么可以阻止您“重新启动”未使用的线程/进程,同时等待“繁忙”线程/进程完成其活动。当然,这比制定几个 iptables 规则更复杂,但......这看起来很“自然”(对我来说)。顺便说一句:这是确切地“Apache”开发人员在他们的“优雅重启“用于 httpd TCP 守护进程

综上所述,对于iptables您感兴趣的方法,以下是我的评论:

  1. 正如@iain 所提到的,您不能使用现有规则,-A而需要替换现有规则。看一下iptables 手册页并搜索-R或——如果您在识别要替换的规则时遇到问题——夫妇-D+ -A

  2. iptables非常强大所以应该可以只匹配新的连接。换句话说,你可以重写你的 NAT 规则来匹配仅有的新的连接(看看连接状态连接跟踪匹配)。通过这种方法,现有连接将坚持使用“旧”端口,而新连接将重定向到“新”端口。不幸的是,“新”连接很快就会“建立”,并且……将被第一条规则识别(重定向到旧端口,因为它处理“已建立”连接)。无论如何,您应该能够通过混合使用 1) 来解决此类问题粉碎入站/出站数据包;2)适当的端口范围选择;3)连接跟踪的用户空间管理; 4) 其他我肯定会忽略的东西。话虽如此,请不要问我细节,因为我不是 netfilter 专家(但我敢打赌这可以做到);

  3. 你问: ”那么在 NAT 端口 8080 上建立的 TCP 套接字连接怎么办?防火墙更改后,它们会立即被丢弃吗?或者,它们会一直工作到正常 TCP 套接字关闭吗?

    4.1”他们会立即被放弃吗“:这里你误用了“DROP”这个词,在iptables/netfilter 上下文中,它是一个关键概念,与“REJECT”一词成对出现。请参阅这里作为个人调查的开始。在您的特定情况下(在建立连接时更改底层 NAT 规则),我认为,由于更新的 DNAT 规则,一旦“新”TCP/服务器收到已建立连接(“向“旧”TCP/服务器建立”)的第一个 TCP 数据包,“新”TCP/服务器将简单地“终止“连接(我猜是带有“RESET”标志的),因为它不会识别这样的数据包。我不认为这可以归类为“DROP”,因为将发送 RST(我猜)。

    4.2”它们会一直工作直到正常 TCP 套接字关闭吗“:我敢打赌他们不会!如果你对已建立的 TCP 连接的随机 TCP 数据包施加一些“暴力”,不仅删除数据包,还将它们发送到不同的 TCP/服务器……你可以肯定会发生一些奇怪的事情。而且,至少,单词“他们继续工作“无法申请!顺便说一句:这正是像这样的软件的原因连接跟踪存在,以确保双节点 HAiptables防火墙集群之间的连接跟踪数据的对齐。

答案2

由于您正在使用,-A因此先前的规则不受影响。

使用 iptables 时,第一个匹配的规则将获胜,因此根据规定的规则,任何到达端口 80 的连接都将被转发到端口 8080。

但是,如果您决定删除将端口 80 转发到端口 8080 的规则,那么发往端口 80 的数据包将被转发到端口 8081。这将中断现有连接,因为端口 8081 上的服务器对它们一无所知。

相关内容