iptables blocks mysql port 3306

iptables blocks mysql port 3306

前些日子,我装Ghost Blog 出了问题,nodejs连不上mysql,(但是我的phpmyadmin是没有问题的,至今不知道原因)[知道原因了,phpmyadmin使用的是php拓展库mysqli,mysqli对于localhost无法打开 TCP/IP连接,必须是127.0.0.1才是TCP/IP]官方文档。nodejs的问题,之后发现是因为屏蔽了3306端口,我总以为是屏蔽了3306端口对外开放,其实把内部也屏蔽了,但是为什么php没有问题不得而知(待解决,已解决)。
以下演示是在CentOS上,Debian系列会有所不同, Debian系列中iptables不是Service,是没有关闭功能也不需要保存。 解决方法。 先ACCEPT回环网卡的所有对于mysqld的INPUT请求
再DROP所有网络所有来源的对于mysqld的INPUT请求

iptables -A INPUT -i lo -p tcp --dport mysql -j ACCEPT  
#iptables -A INPUT -i eth0 -p tcp --dport mysql -s 123.123.123.123 -j ACCEPT
iptables -A INPUT -p tcp --dport mysql -j DROP
iptables 查看所有规则链
sudo iptables -L
jack@c30:/var/lib$ sudo iptables -L  
Chain INPUT (policy ACCEPT)  
target     prot opt source               destination  
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:mysql  
DROP       tcp  --  anywhere             anywhere             tcp dpt:mysql

Chain FORWARD (policy ACCEPT)  
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)  
target     prot opt source               destination  
sudo iptables -L -v
jack@c30:/var/lib$ sudo iptables -L  -v  
Chain INPUT (policy ACCEPT 116 packets, 8241 bytes)  
 pkts bytes target     prot opt in     out     source               destination         
    3   164 ACCEPT     tcp  --  lo     any     anywhere             anywhere             tcp dpt:mysql
   13   784 DROP       tcp  --  any    any     anywhere             anywhere             tcp dpt:mysql

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)  
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 71 packets, 9336 bytes)  
 pkts bytes target     prot opt in     out     source               destination         
jack@c30:/var/lib$ 
sudo iptables -L INPUT
jack@c30:/var/lib$ sudo iptables -L INPUT  
Chain INPUT (policy ACCEPT)  
target     prot opt source               destination  
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:mysql  
DROP       tcp  --  anywhere             anywhere             tcp dpt:mysql  
sudo iptables -L INPUT -v
jack@c30:/var/lib$ sudo iptables -L INPUT -v  
Chain INPUT (policy ACCEPT 46 packets, 2796 bytes)  
 pkts bytes target     prot opt in     out     source               destination         
    3   164 ACCEPT     tcp  --  lo     any     anywhere             anywhere             tcp dpt:mysql
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcp dpt:mysql
sudo iptables -I chain [rulenum] 指定插入位置
sudo iptables -D chain rulenum [options] 删除规则

建立规则是需要先看清iptables规则链列表 注意链顺序,比如我之前遇到的情况,iptables阻挡了3306,阻挡了所有的3306端口,连本地也无法连接,当我意识到需要给本地连接放行,于是就添加了一条,iptables -A INPUT -i lo -p tcp --dport mysql -j ACCEPT,最新的一条会添加到INPUT链的最末尾,当有INPUT3306请求时,按顺序从上往下,当遇到阻挡所有的那条规则,该请求就认为已经处理完毕,不再向下进行,所以最末尾给本地INPUT3306放行的规则没有起到作用,要注意,先删掉上一条,再按顺序插入,或者 插入到指定位置。

$ sudo iptables -D INPUT 2 #删除INPUT链中的第二条 注意规则第一条从1开始不是0
保存iptables,即使不保存,规则链当时也可生效,-L即可查看,只是服务重启,后需要重新插入,非常不便。
$ sudo service iptables save

Reference

Related Article