我们在应用程序服务器和数据库服务器(Mysql)之间的最近几天遇到了一个奇怪的问题:从应用程序服务器到数据库服务器的连接在SYN_SENT状态下挂起,之后我们无法与数据库服务器建立任何连接mysql端口(3306)。当我们检查数据库服务器上的netstat输出时它处于SYN_RECV状态。
我能弄清楚的是mysql服务器正在接收SYN请求并且还响应它并且它没有到达客户端因此服务器端的SYN_RECV和客户端的SYN_SENT。我认为SYN_SENT状态应该会持续一段时间,因为这个其他数据库连接尝试不应该挂起。
有人知道我们如何解决这个问题?
输出设置细节:应用服务器:RHEL 5.4,kernel-release = 2.6.18-164.el5,x86_64数据库服务器:Mysql版本:5.1.49 RHEL 5.4,kernel-release = 2.6.18-164.el5, x86_64的
答案 0 :(得分:-1)
修复仅具有localhost访问权限的服务器: 在my.cnf的绑定地址中设置127.0.0.1
修复连接到远程ip的问题 (REMOTE_IP替换为远程ip)
iptables -A INPUT -p tcp -d 127.0.0.1 --dport 3306 -s REMOTE_IP -j ACCEPT
iptables -A INPUT -p udp -d 127.0.0.1 --dport 3306 -s REMOTE_IP -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
iptables -A INPUT -p udp --dport 3306 -j DROP
此外,您需要将my.cnf中的bind ip设置为0.0.0.0。你不需要的第二条规则,我只是确定了;)(udp part)
概念证明: 首先允许从remoteip到目标的连接(-d 127.0.0.1 = localhost) -p tcp / udp = protocoll tcp或udp
在此规则之后,您需要制定规则以将所有请求丢弃到tcp / udp连接到端口3306。
为什么会这样: 因为iptables是“数字”。始终是一个接一个的规则。
您可以使用以下命令查看规则:
iptables -L INPUT -n --line-numbers
显示的第一条规则是第一条规则,因此,如果您说接受所有连接,然后从ip x.x.x.x中删除所有连接,则它不起作用。 您需要选择从该IP中删除所有连接的第一条规则,然后允许所有连接。 (这是一个不好的例子..)
如果输入失败,您可以显示规则并获取规则前面的数字,并使用以下命令删除规则:
iptables -D INPUT <<number here>>