【问题标题】:Iptables setting multiple multiports in one ruleiptables 在一条规则中设置多个多端口
【发布时间】:2011-09-17 02:36:15
【问题描述】:

多端口扩展对可以指定的端口有一个限制 (15)。

但是我需要在一个规则中指定更多的端口号,所以我尝试在一个规则中使用多个多端口,例如:

iptables -A INPUT -p tcp -m multiport --destination-ports 59100 -m multiport --destination-ports 3000 -m state --state NEW -j REJECT --reject-with tcp-reset

iptables -L INPUT -n 的结果是

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0           multiport dports 59100 multiport dports 3000 state NEW reject-with tcp-reset

但事实证明,当我尝试从客户端连接时,两个端口都没有被拒绝。

版本为v1.4.2-rc1。

是否有解决方法,或者当我需要在一个规则中指定超过 15 个端口时应该怎么做。

【问题讨论】:

    标签: iptables


    【解决方案1】:

    据我所知,写多个匹配是逻辑与运算;所以你的规则意味着如果目标端口是“59100”和“3000”,那么拒绝与 tcp-reset 的连接;解决方法是使用 -mport 选项。注意手册页。

    【讨论】:

      【解决方案2】:

      您需要使用多个规则来实现类似 OR 的语义,因为在一个规则中,匹配项始终是 AND-ed。或者,您可以对端口索引 ipset (ipset create blah bitmap:port) 进行匹配。

      【讨论】:

        【解决方案3】:

        作为解决此限制的方法,我使用两条规则来涵盖所有情况。

        例如,如果我想允许或拒绝这 18 个端口:

        465,110,995,587,143,11025,20,21,22,26,80,443,3000,10000,7080,8080,3000,5666
        

        我使用以下规则:

        iptables -A INPUT -p tcp -i eth0 -m multiport --dports 465,110,995,587,143,11025,20,21,22,26,80,443 -j ACCEPT
        
        iptables -A INPUT -p tcp -i eth0 -m multiport --dports 3000,10000,7080,8080,3000,5666 -j ACCEPT
        

        上述规则也适用于您的场景。如果您在第一条和第二条规则上都达到了 15 个端口的限制,您可以创建另一个规则。

        【讨论】:

        • 您还可以添加一个范围:--dports 20:11025(在您的情况下,这不是有利的解决方案)。是否可以在该列表中混合范围和单个端口,如20:26,80,143,110,443:465,995,587,3000,7080,8080,5666,10000,11025?另见:serverfault.com/a/751074/128892
        【解决方案4】:
        enable_boxi_poorten
        
        }
        
        enable_boxi_poorten() {
        SRV="boxi_poorten"
        boxi_ports="427 5666 6001 6002 6003 6004 6005 6400 6410 8080 9321 15191 16447 17284 17723 17736 21306 25146 26632 27657 27683 28925 41583 45637 47648 49633 52551 53166 56392 56599 56911 59115 59898 60163 63512 6352 25834"
        
        
        case "$1" in
          "LOCAL")
                 for port in $boxi_ports; do $IPT -A tcp_inbound -p TCP -s $LOC_SUB --dport $port -j ACCEPT -m comment --comment "boxi specifieke poorten";done
             # multiports gaat maar tot 15 maximaal :((
             # daarom maar for loop maken
             # $IPT -A tcp_inbound -p TCP -s $LOC_SUB -m state --state NEW -m multiport --dports $MULTIPORTS -j ACCEPT -m comment --comment "boxi specifieke poorten"
             echo "${GREEN}Allowing $SRV for local hosts.....${NORMAL}"
            ;;
          "WEB")
             for port in $boxi_ports; do $IPT -A tcp_inbound -p TCP -s 0/0 --dport $port -j ACCEPT -m comment --comment "boxi specifieke poorten";done
             echo "${RED}Allowing $SRV for all hosts.....${NORMAL}"
            ;;
          *)
             for port in $boxi_ports; do $IPT -A tcp_inbound -p TCP -s $LOC_SUB --dport $port -j ACCEPT -m comment --comment "boxi specifieke poorten";done
             echo "${GREEN}Allowing $SRV for local hosts.....${NORMAL}"
            ;;
         esac
        
        }
        

        【讨论】:

        • 您至少应该在代码的作用上留下一些 cmets,并避免用英语以外的其他语言编写 cmets。
        • 我不懂荷兰语,但我懂一些 cmets:“multiports go to 15 max.”和“这就是我们制作这个循环的原因”。
        【解决方案5】:
        sudo iptables -A INPUT -i enp1s0 -p tcp -m multiport --dport 0:8080 -j REJECT
        

        (enp0 是我的接口;用你的接口名称更改它)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-13
          • 2021-03-15
          • 1970-01-01
          • 1970-01-01
          • 2014-04-01
          • 2012-12-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多