不能。iptables的multiport模块硬性限制每条规则最多匹配15个端口或端口段,无法单条规则开放数百个非连续端口;替代方案包括分批添加、反向代理、服务网格或迁移到nftables。

用 iptables 的 multiport 模块关闭冗余端口,核心不是“逐个 DROP”,而是“精准屏蔽非必要端口组合”——它不靠堆规则,而靠合并逻辑、限定范围、配合状态跟踪,让一条规则管住一批端口。
用 multiport 集中封禁离散冗余端口
当你发现服务器上开放了大量零散但都不该对外的服务端口(比如 23、111、514、631、902、3389 等),不要写十几条 --dport X -j DROP。改用 multiport 一次性覆盖:
-
语法示例:
iptables -I INPUT 1 -p tcp -m multiport --dports 23,111,514,631,902,3389 -m conntrack --ctstate NEW -j DROP - 这条规则在 INPUT 链最前插入,只匹配新建 TCP 连接的目标端口,命中即丢弃,避免后续规则误放
- 注意:UDP 冗余端口需另起一条规则,如
-p udp -m multiport --dports 137,138,161,不能混在同一条里
结合 ipset 实现“按来源封端口组”
若某些端口只对特定网段有害(如开发网段不该访问数据库端口,但运维网段需要),单独用 multiport 不够细粒度。此时搭配 ipset:
- 先建一个包含所有“非信任源”的集合:
ipset create untrusted_nets hash:net - 批量加入可疑子网:
ipset add untrusted_nets 192.168.5.0/24; ipset add untrusted_nets 203.0.113.0/27 - 再用 multiport 封禁该来源下的多端口:
iptables -I INPUT 1 -m set --match-set untrusted_nets src -p tcp -m multiport --dports 3306,5432,6379,27017 -m conntrack --ctstate NEW -j DROP
用端口范围替代枚举,应对扫描类冗余端口
有些冗余端口是成片存在的(如旧版 Windows RPC 端口 135–139、NetBIOS 相关 445、SMBv1 服务等),multiport 支持端口段写法,避免漏写:
-
混合写法示例:
--dports 135:139,445,9100:9105,5900:5905—— 既涵盖连续段,也保留关键单端口 - 最多支持 15 组(单端口或端口段各计 1 组),超限时拆成两条规则,仍比 20+ 条单端口规则清晰得多
- 特别适合封禁扫描器常探的“高危端口区间”,比如打印机管理(9100–9105)、VNC(5900–5905)、远程调试(8000–8009)
配合默认策略,让 multiport 封禁更可靠
multiport DROP 规则只有放在默认拒绝策略之前才真正生效。推荐基础结构如下:
- 设默认策略:
iptables -P INPUT DROP - 放行已建立连接:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - 再插入 multiport 封禁规则(如上)
- 最后放行业务必需端口(同样用 multiport 合并,如
--dports 22,80,443,8080) - 顺序错乱会导致封禁失效——multiport DROP 必须在默认 DROP 之前,且在 ESTABLISHED 之后

















