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

时间:2018-12-15 05:54:22

标签: php mysql iptables

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

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

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

即使在运行mysql服务的情况下,只要我添加或插入带有拒绝的iptbles规则,请求也会转发到其他服务器,但是php堆积起来,就好像由于任何原因保持与mysql的连接保持打开一样,所以我假设拒绝带有iptables的数据包到端口返回的内容不同于Linux内核,该端口没有监听任何内容。

有没有办法用iptables做到这一点?

2 个答案:

答案 0 :(得分:1)

我正在回答自己的问题;经过一些挖掘,在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客户端将立即检测到服务已关闭,并将查询重定向到其余的从服务器。

答案 1 :(得分:0)

公开暴露封闭端口的服务器将拒绝连接。在我看来,这似乎可以通过iptables REJECT规则很好地模仿。如果您的应用程序服务器在启动时尝试连接到数据库,但也可能在准备就绪之前,这可能也是您将获得的,因此这是一个有效的案例,尽管您可能不得不尝试复制。您可能也应该使此响应起作用。

但是,完全没有响应的服务器无法发送被拒绝的连接或拒绝任何类型的数据包。 iptables DROP可以更好地模拟这种行为,它可以简单地丢弃没有附加响应的数据包。该连接最终在客户端上超时,从而给客户端请求带来一些限制。

您可以在此处https://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables详细了解拒绝与丢弃之间的区别,但是出于您的目的,可以说不能响应(不存在或无法运行)的服务器是由DROP建模的,并且不能对其进行响应(不监听端口或不明确拒绝)由REJECT建模。