如何模拟 mysql 不使用 iptables 监听端口?

how to emulate mysql not listening in a port using iptables?

我在 php 中使用 mysql_nd 连接到 mysql 数据库并在多个从服务器和主服务器之间进行故障转移,所以当 mysql 不是 运行 在服务器上,一切正常,所有查询都转到其他服务器。

我需要启动 mysql 服务器并在服务器中启动 运行 但阻止所有传入连接,因此 php 中的 mysql_nd 驱动程序认为服务器已关闭。我认为简单的拒绝饮用水就足够了,但事实并非如此;数据包被拒绝,未建立 mysql 连接,但 php 应用程序行为不同,php 线程等待并增加直到达到最大值。

如果 mysql 服务关闭,mysql_nd 会立即检测到它,将请求转发到其他服务器,不会降低速度,不会 php 线程堆积在 Web 服务器上。

即使使用 mysql 服务 运行,只要我添加或插入带有拒绝的 iptbles 规则,请求也会转发到其他服务器,但 php 堆积如山由于任何原因,与 mysql 的连接保持打开状态,因此我假设拒绝使用 iptables 发送到端口 returns 的数据包,这与 linux 内核在该端口没有任何监听。

有没有办法用 iptables 做这个行为?

公开暴露关闭端口的服务器将拒绝连接。在我看来,iptables REJECT 规则很好地模拟了这一点。如果您的应用程序服务器在启动时尝试连接到数据库,但在它准备好之前,这也可能是您得到的结果,因此这是一个有效的处理案例,尽管您可能不得不竭尽全力复制。您可能也应该使此响应有效。

但是,完全没有响应的服务器无法发送拒绝连接或拒绝任何类型的数据包。这种行为可以通过 iptables DROP 更好地建模,它简单地丢弃数据包而没有额外的响应。连接最终在客户端超时,对客户端请求引入了一些限制。

您可以在此处阅读更多关于拒绝和丢弃之间的区别 https://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables 但为了您的目的,可以说无法响应(不存在或无法运行)的服务器由 DROP 建模并且将在其上进行建模不响应(不监听端口或明确拒绝)由 REJECT 建模。

我在回答我自己的问题;经过一番挖掘,在 linux 中,我需要使用特定的 tcp 标志进行拒绝,否则 php 线程将保持打开状态并等待 php 超时。

正确的 iptables 行是:

iptables -A INPUT -s xx.xx.xx.xx -p tcp -m tcp --dport 3306 -j REJECT --reject-with tcp-reset

这样,我可以正确关闭从服务器上的 mysql 服务,而使用 mysql_nd 的 php 客户端将立即检测到服务已关闭并将查询重定向到其余的从服务器。