V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
phttc
V2EX  ›  程序员

奇怪的 iptables

  •  
  •   phttc · 2016-04-03 10:37:22 +08:00 · 3970 次点击
    这是一个创建于 3190 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的是 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 就可以正常连接。。。很奇怪。

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

    你这里应该还是别的问题。
    phttc
        13
    phttc  
    OP
       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
        14
    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 啥的就都不工作了。

    数据是双向的,服务器的另一个身份是客户端。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   973 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:53 · PVG 03:53 · LAX 11:53 · JFK 14:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.