V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
xiaoz
V2EX  ›  Linux

请教一个关于 iptables 的问题

  •  
  •   xiaoz ·
    helloxz · 2017-01-05 16:32:16 +08:00 · 3294 次点击
    这是一个创建于 2913 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假如 ss 端口监听为 9000 , iptables 放行 9000 后, telnet 测试 9000 正常,但是 ss 连接超时,那么 service iptables stop 关闭后, ss 连接正常,应该就是 iptables 规则导致,但是又无法找到具体原因。完整规则如下:

    *filter
    :INPUT DROP [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :syn-flood - [0:0]
    -A INPUT -p udp -m state --state NEW -m udp --dport 9000:9999 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 9000:9999 -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 20000:50000 -j ACCEPT
    -A INPUT -p udp -m state --state NEW -m udp --dport 20000:50000 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
    -A INPUT -p icmp -m limit --limit 1/sec --limit-burst 10 -j ACCEPT
    -A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
    -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN
    -A syn-flood -j REJECT --reject-with icmp-port-unreachable
    COMMIT
    
    

    再次说明一下,端口 telnet 是正常的,但是 ss 无法使用,关闭 iptables 后正常。

    29 条回复    2017-01-09 17:03:46 +08:00
    Devin
        1
    Devin  
       2017-01-05 19:35:13 +08:00 via iPhone   ❤️ 1
    开启 iptables 日志记录(我最近的主题刚好有),看日志排查
    b1eberg0n
        2
    b1eberg0n  
       2017-01-05 23:18:50 +08:00 via iPhone   ❤️ 1
    INPUT DROP 改为 ACCEPT?
    xiaoz
        3
    xiaoz  
    OP
       2017-01-05 23:21:24 +08:00 via iPhone
    @b1eberg0n 这样会不会很危险?
    INPUT DROP 是先拒绝所有,再放行指定,如果改成 ACCEPT 就是先允许所有可。
    b1eberg0n
        4
    b1eberg0n  
       2017-01-05 23:26:09 +08:00 via iPhone
    弄这么严格 是生产服么?
    拒绝所有的话可能还要放行 input --sport 80 /443
    iCyMind
        5
    iCyMind  
       2017-01-05 23:44:13 +08:00 via Android   ❤️ 1
    为什么写得那么啰嗦,试试以下:

    iptables -F
    iptables -X
    iptables -Z
    iptables -P INPUT DROP
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT

    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    #ssh port: 11235
    iptables -A INPUT -p tcp --dport 9000 -j ACCEPT
    iptables -A INPUT -p udp --dport 9000 -j ACCEPT
    iCyMind
        6
    iCyMind  
       2017-01-05 23:45:43 +08:00 via Android   ❤️ 1
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT

    忘了 ssh....希望楼主还没看到上一条吧
    kuretru
        7
    kuretru  
       2017-01-05 23:48:13 +08:00 via iPhone   ❤️ 1
    把-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 放到 ss 前面
    lcdtyph
        8
    lcdtyph  
       2017-01-05 23:53:04 +08:00
    指定协议不是-p 吗= =||
    -A INPUT -p udp -m state --state NEW -p udp --dport 9000:9999 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -p tcp --dport 9000:9999 -j ACCEPT
    这样?
    iCyMind
        9
    iCyMind  
       2017-01-06 00:03:11 +08:00 via Android
    你的规则问题可能在于,发往服务器 9000 端口的 udp 数据被丢弃了。
    因为 udp 是无状态的,跟 udp 9000 端口有关的两条规则它都匹配不上:
    -A INPUT -p udp -m state --state NEW -m udp --dport 9000:9999 -j ACCEPT
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    raysonx
        10
    raysonx  
       2017-01-06 00:20:55 +08:00 via iPad
    @iCyMind 目测楼主执行 iptables -F 后,已被挡在 ssh 外面 😏
    iCyMind
        11
    iCyMind  
       2017-01-06 00:41:23 +08:00
    @raysonx good jop? 2333
    shiji
        12
    shiji  
       2017-01-06 00:57:28 +08:00 via Android
    @raysonx 哈哈,我也想说这个。都是被坑过的人啊
    des
        13
    des  
       2017-01-06 06:05:21 +08:00 via Android   ❤️ 1
    @shiji 话说就没人先写个比如半个小时关闭防火墙的定时任务?
    同被坑过
    ryd994
        14
    ryd994  
       2017-01-06 07:06:19 +08:00 via Android
    @des 怕什么嘛,大不了拔线重启
    @iCyMind
    @raysonx
    xiaoz
        15
    xiaoz  
    OP
       2017-01-06 09:09:46 +08:00
    @des 这是一个好办法
    xiaoz
        16
    xiaoz  
    OP
       2017-01-06 09:10:19 +08:00
    @raysonx 昨天改错了规则,然后就被挡在外面了,最后通过控制台进入把 iptables 停了才进去。
    raysonx
        17
    raysonx  
       2017-01-06 10:42:46 +08:00
    @ryd994 当年维护学校机房的服务器,没有远程控制卡,被挡在外面只能找领导批条子进机房手动重启。。。。
    jimzhong
        18
    jimzhong  
       2017-01-06 16:58:58 +08:00
    既然 telnet 正常说明外面是可以访问 TCP9000 的,把 DROP 的日志打出来看看把。
    ryd994
        19
    ryd994  
       2017-01-07 02:39:28 +08:00 via Android
    @iCyMind 你说 UDP 无状态所以不匹配是不对的
    iptables 里的 new 和 established 不是连接意义上的,而是之前是否见过相关包。没见过就是 new 。是以四元组判断。所以才有使用 net-speeder 后 iptables 无效的问题。
    iCyMind
        20
    iCyMind  
       2017-01-07 09:26:17 +08:00
    @ryd994 我去看了下, 真的如你所说, 谢谢纠正.
    或许楼主的规则错在 -m udp --dport 9000:9999 和 -m tcp --dport 9000:9999
    要匹配某协议的端口号, 一般都是这么写吧:
    -p udp --dport 9000:9999

    文档里没见有 -m tcp 这种写法
    http://ipset.netfilter.org/iptables-extensions.man.html#lbCL
    julyclyde
        21
    julyclyde  
       2017-01-07 11:18:53 +08:00
    @iCyMind -m 肯定没错的。只是被-p 给隐含了而已
    -m tcp 是 match tcp
    xiaoz
        22
    xiaoz  
    OP
       2017-01-07 11:30:36 +08:00 via iPhone
    @iCyMind 但是我这样写 telnet 端口的确是通的
    iCyMind
        23
    iCyMind  
       2017-01-07 11:42:29 +08:00
    @xiaoz 如果找到问题所在, 请 @ 我.
    我也想知道原因在哪

    @julyclyde 嗯, 你是对的. 刚试了下, 就算是执行
    iptables -A INPUT -p tcp --dport 9000 -j ACCEPT
    iptables -S 出来的结果都是
    -A INPUT -p tcp -m tcp --dport 9000 -j ACCEPT
    xiaoz
        24
    xiaoz  
    OP
       2017-01-09 16:46:31 +08:00
    @iCyMind 原来是规则顺序问题导致,好坑呀,按照 7 楼的办法修改了下规则顺序,然后启动 iptables ,居然可以了。
    xiaoz
        25
    xiaoz  
    OP
       2017-01-09 16:46:57 +08:00
    @kuretru 非常感谢,按照您说的,修改了下顺序居然可以了。是什么原因呢?
    iCyMind
        26
    iCyMind  
       2017-01-09 16:58:02 +08:00
    @xiaoz 顺序应该不是问题所在, 我把
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    改到了最后面, 一样能连上.

    你是不是用了 docker?
    xiaoz
        27
    xiaoz  
    OP
       2017-01-09 17:01:31 +08:00
    @iCyMind 不对,刚刚可能幻觉了,试了下还是不行,应该不是顺序导致。我是 docker ,就是 centos 部署的 ss
    xiaoz
        28
    xiaoz  
    OP
       2017-01-09 17:01:45 +08:00
    @xiaoz 不是 docker
    iCyMind
        29
    iCyMind  
       2017-01-09 17:03:46 +08:00
    @xiaoz 这些规则不行?
    iptables -F
    iptables -X
    iptables -Z
    iptables -P INPUT DROP
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT

    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -p tcp --dport 9000 -j ACCEPT
    iptables -A INPUT -p udp --dport 9000 -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2791 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 102ms · UTC 02:33 · PVG 10:33 · LAX 18:33 · JFK 21:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.