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

如果启用此规则

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

然后到服务器端口80的连接被redirect到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端口上build立的TCP套接字连接呢? 防火墙更改后会立即丢弃吗? 或者,他们将继续工作,直到正常的TCP套接字closures?

如果是这样,那么这将重新启动应用程序而不会中断,因为正常关机时端口8080上的旧实例和端口8081上的新实例具有新function。

这个推理是否正确?

你问:“ 这个推理是否正确?

我的回答是:“为了部分正确,你必须在你的假设和行动中确定一些细节,不是100%正确,这也意味着……这基本上是一个错误的方法!” 我也是这样说的,因为下面的因素(或多或less是随机的):

  1. 恕我直言,你要解决一个问题(重新启动一个TCP服务器/服务,而不会中断现有的已build立的TCP连接)使用错误的方法。 在我看来,“自然”的做法是在“应用层面”解决问题。 正如你在谈论一个TCP / Server应用程序,机会是非常高的“multithreading”或“多进程”。 在这样的环境中,没有什么能阻止你在“忙”线程/进程等待完成其活动的时候“重启”未使用的线程/进程。 当然,这比放下一些iptables规则更复杂,但是这对于我来说看起来是“自然的”。 顺便说一句:这正是 “apache”开发人员在其“ 正常重启 ”中为httpd TCP守护进程实现的方法

说了上面的话,至于你感兴趣的iptables方法,下面是我的评论:

  1. 正如@iain所提到的那样,您不能使用-A但需要replace现有的规则。 看一下iptables的man-page,然后search-R或者 – 如果你在识别待更换的规则时遇到了问题 – 这个对 – -D + -A ;

  2. iptables 真的很强大,所以应该只能匹配新的连接。 换句话说,你可以改写你的NAT规则, 匹配新的连接(查看连接状态和conntrack匹配 )。 通过这种方式,现有的连接将坚持“旧”PORT,而新的连接将被redirect到“新”PORT。 不幸的是,“新”连接将很快成为“已build立”,并将被第一条规则(redirect到旧的端口,因为它处理“已build立的”连接)所认可。 无论如何,你应该能够解决这个问题的混合物1)捣毁入站/ oubound数据包; 2)适当的端口范围select; 3) 连接跟踪的用户空间pipe理 ; 4)其他东西,我肯定,忽略。 话虽如此,请不要问我的细节,因为我不是一个netfilter专家 (但我敢打赌,它可以完成);

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

    4.1“ 会立即丢弃 ”:在这里,您滥用了“DROP”这个词,在iptables / netfilter环境下,它是一个关键概念,与“REJECT” 请看这里作为个人调查的开始。 在你的特定情况下(当连接build立的时候你改变底层的NAT规则),我认为一旦build立连接的第一个TCP数据包(“build立”到“旧”TCP /服务器) “新”的TCP /服务器,由于更新的DNAT规则,“新”TCP /服务器将简单地“ 终止 ”连接(我想是一个“RESET”标志),因为它不会识别这样的数据包。 我不认为这可以归类为“DROP”,因为RST将被发送(我猜)。

    4.2“ 他们会继续工作,直到一个正常的TCP套接字closures ”:我敢打赌,他们不会! 如果你对已build立的TCP连接的随机TCP数据包应用一些“暴力”,不仅是通过删除数据包,而是将它们传送到不同的TCP /服务器….你可以肯定会发生一些奇怪的事情。 而且,至less, 他们继续工作 ”这个词不能适用! 顺便说一句:这正是像conntrackd这样的软件存在的原因,所以为了确保双节点HA iptables防火墙集群之间的连接跟踪数据的alignment。

正如你正在使用的-A你正在添加一个规则,所以早期的规则不受影响。

在iptables中,匹配的第一条规则与所述的规则一样有效,任何到达端口80的连接都将被转发到端口8080。

但是,如果您决定删除将端口80转发到端口8080的规则,则发往端口80的数据包将被转发到端口8081.由于端口8081上的服务器不会了解这些连接,因此这将破坏现有连接。