奇怪的 iptables

2016-04-03 10:37:22 +08:00
 phttc

我的是 centos6.5 ,, iptables 配置如下

filter

INPUT DROP [53:7426]

FORWARD ACCEPT [0:0]

OUTPUT ACCEPT [108:16569]

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

COMMIT

mysql 的 user 表中:

mysql> select host,user from user;

+-----------+-----------+

| host | user |

+-----------+-----------+

| % | turing |

| 127.0.0.1 | root |

| localhost | root |

+-----------+-----------+

然而事实情况是,当我打开 iptables , mysql 就连接超时,关闭 iptables 就可以正常连接。。。很奇怪。

3935 次点击
所在节点    程序员
14 条回复
jasontse
2016-04-03 10:56:04 +08:00
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
j4fun
2016-04-03 12:33:16 +08:00
INPUT DROP [53:7426] 并不奇怪,你的 INPUT 默认是 drop
phttc
2016-04-03 12:36:23 +08:00
@j4fun 3306 的端口是开放的。。还要把 1 楼的那个给加进去才行。
shiji
2016-04-03 12:52:00 +08:00
个人觉得一楼的没用,你当前已经开放 3306 ,不管什么 state 都会畅通无阻。
我觉得问题在你的
INPUT DROP [53:7426] 这一行。还没等后面的开门呢,这句就直接把数据包扔了。

所以改成这样应该就行了:
filter

INPUT ACCEPT [0:0]

FORWARD ACCEPT [0:0]

OUTPUT ACCEPT [108:16569]

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -j DROP

COMMIT

======================
另一个方法:
把你所有的-A 改成-I
-A 是 append ,规则往后插
-I 是 Insert , 规则往前插,这样不管之前有什么规则,你这条优先执行
shiji
2016-04-03 13:03:09 +08:00
另外以后的那句插进去也有好处。
主要体现在你 SSH 的时候更新 Iptables 不会不小心断开连接。
比如你不小心屏蔽了 tcp22 ,刷新了 iptables 之后你的 SSH 依旧会保持连接因为是之前创建的连接,属于 ESTABLISHED ,放行。但是你想再新开一个 SSH 就不行了,因为新的这个 State 属于 NEW ,数据包被扔~
Devin
2016-04-03 14:36:26 +08:00
@shiji INPUT ACCEPT
默认进入规则为放行,你确定?
raysonx
2016-04-03 14:40:08 +08:00
我觉得楼主的规则没有问题,楼主执行一下`iptables -L -n`看看?
有没有试过重启 iptables ?
@Devin 个人也认为默认 DROP 不是个好习惯,什么时候手滑执行了`iptables -F`, SSH 连接直接跪。
Lentin
2016-04-03 14:50:41 +08:00
DROP 放在最后
phttc
2016-04-03 15:20:38 +08:00
@shiji 22 和 3306 我是一起加进去的, 22 和 80 没问题的,我试过。唯独 3306 超时了。我根据 2 楼的加了那条以后就可以了。。。我猜想是 RELATED 这个状态,但是又无法说服自己。
phttc
2016-04-03 15:38:26 +08:00
@j4fun
@raysonx
@shiji 我终于找到原因了。。我之前用的是 sequel pro ,连接会超时,当我用命令行去连接的时候,竟然连上了。。。猜想是 sequel pro 会建立一个别的端口链接,就像 ftp 那样。当 Accept 了 RELATED 状态的时候, iptables 会放行。
shiji
2016-04-03 21:45:31 +08:00
@Devin 我搞错了。。。 前面那三行都是统计用的,不知道前面的冒号哪去了,不好意思
@phttc 当我那没说 :)
phycgp
2016-04-05 11:03:07 +08:00
@phttc 一个 MySQL 只有一个端口提供服务的, ftp 多端口是一个控制一个数据。所以 sequel pro 连 MySQL 应该不会有其他端口的。

你这里应该还是别的问题。
phttc
2016-04-05 11:44:03 +08:00
@phycgp 是的。后来我在折腾另外一个问题的时候找到了原因。如果光是这样配置 iptables ,会导致 yum , wget 之类的都会超时,也就是说,当服务器自己发起一些行为的时候,也会被防火墙给干了。解决的方式同样是加入-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 。来源于 http://www.server110.com/linux/201309/1858.html 不过他只说了解决方法,却没说原因
hzqim
2016-04-05 23:08:23 +08:00
@phttc 这位仁兄有解析 http://dallascao.com/cn/iptables-tutorial-for-newbies/
为毛要允许状态 ESTABLISHED 和 RELATED 的入站数据呢?因为你的服务器同时也是台电脑,还要从别的服务器下载东西。下载时,你的服务器先向别的服务器发出连接请求(new),别的服务器允许你连接,连接建立(ESTABLISHED)之后,就需要接受别的服务器发来的数据,对于你的服务器来讲属于 INPUT 。也就是说,如果没有 iptables -A INPUT -m state – state ESTABLISHED,RELATED -j ACCEPT 这句, wget curl 啥的就都不工作了。

数据是双向的,服务器的另一个身份是客户端。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/268235

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX