我想限制某些端口的连接数量。例如:我想只允许我的服务器上 2300 到 2500 之间的端口有 2 个连接。但我不知道如何使用 iptables 做到这一点。是否需要额外的软件?有什么建议吗?
答案1
你可以这样做nftables,使用内核 >= 4.18(此处使用内核 5.3 进行测试)和 nftables >= 0.9.1限制的数数功能(以及动态的此处使用的标志)。它比iptables的限制因为您可以在创建时选择仪表 放、将应用限制的选择器和掩码,而仅存在少数可能的选择器(不包括端口)iptables,这可能需要每个端口有一条规则。
下面是改编的内容维基示例,除了我们跟踪传入的 TCP 端口而不是传出的 IP 地址来解决 OP 的问题。在已建立两个连接后,到 2300 和 2500 之间同一本地端口的任何 TCP 连接都将被 TCP RST 拒绝。我明白CT状态新只是一种优化,以避免必须尝试从数据包路径添加新元素每一个连接中的传入数据包而不仅仅是第一个。
NFFT要加载的规则文件nft -f
:
flush ruleset
table ip my_filter_table {
set my_connlimit {
type inet_service
size 65535
flags dynamic
}
chain my_input_chain {
type filter hook input priority filter; policy accept;
tcp dport 2300-2500 ct state new add @my_connlimit { tcp dport ct count over 2 } counter reject with tcp reset
}
}
匹配的连接将在以下位置创建条目我的连接限制:动态创建的选择器条目,而不是当前计数(由限制使用连线的条目)。对于这种特定情况,将集合的大小设置为 2500-2300+1=201 可能就足够了。当不再有关联的计数时(即:该端口上的所有连接都已关闭),添加的元素将自动消失(至少在内核 5.3 上)。在端口 2301 上建立一两个连接后的示例:
# nft list set ip my_filter_table my_connlimit
table ip my_filter_table {
set my_connlimit {
type inet_service
size 65535
flags dynamic
elements = { 2301 ct count over 2 }
}
}
UDP 的工作原理是一样的,只是 conntrack 通常会在上次活动后 30 秒到 120 秒(之前是 180 秒)之间使条目超时,因为没有实际连接。也可以使用级联而不是简单的放作为米,例如限制这个每个服务器的 IP 加端口而不仅仅是每个端口对于具有多个 IP 的服务器,如下所示:
flush ruleset
table ip my_filter_table {
set my_connlimit {
type ipv4_addr . inet_service
size 65535
flags dynamic
}
chain my_input_chain {
type filter hook input priority filter; policy accept;
tcp dport 2300-2500 ct state new add @my_connlimit { ip daddr . tcp dport ct count over 2 } counter reject with tcp reset
}
}
注意:为了避免计算仪表中的本地连接,通过罗应绕过设备。例如:
# nft insert rule ip my_filter_table my_input_chain iif lo accept