linux无全局端口并发连接数配置,但可通过iptables/nftables配合conntrack实现限制:iptables用connlimit按端口或源ip限流,nftables用ct count或meter更灵活;需调优sysctl参数如nf_conntrack_max、tcp_max_syn_backlog等,并监控conntrack表使用率。

Linux 本身不直接提供“每个端口最大并发连接数”的全局配置项,但可以通过 iptables 或 nftables 配合连接跟踪(conntrack)机制,在内核层面实现对指定 TCP 端口的并发连接数限制。核心思路是:对目标端口的新建连接(SYN)进行速率或连接数控制,超出阈值则丢弃。
使用 iptables + connlimit 限制端口并发连接
connlimit 是 iptables 的一个扩展模块,可按源 IP 或目标端口统计当前 ESTABLISHED 连接数,并对超过阈值的新建连接(--syn)执行 DROP 或 REJECT。
- 限制所有客户端对本机 8080 端口的总并发连接不超过 100:
iptables -A INPUT -p tcp --dport 8080 -m connlimit --connlimit-above 100 -j DROP
- 限制单个源 IP 对 8080 端口的并发连接不超过 10(防扫描/滥用):
iptables -A INPUT -p tcp --dport 8080 -m connlimit --connlimit-above 10 --connlimit-mask 32 -j DROP
注意:--connlimit-mask 指定网络掩码位数(32=单IP,24=整个C类网段),--connlimit-above 是触发动作的连接数阈值(指当前已建立的连接数)。
使用 nftables 实现等效限制(推荐用于新系统)
nftables 更现代、语法更清晰。以下规则限制 8080 端口总并发连接 ≤ 200:
nft add rule ip filter input tcp dport 8080 ct state new @conncount_8080 { ip saddr : counter name conncount_8080 } limit rate over 200 connections/second
更准确的做法是用 ct count(需 kernel ≥ 5.13)或结合 meter + ct count 做动态计数。实际常用组合如下:
- 创建命名计数器并限制每源IP连接数:
nft add chain ip filter limit_conns '{ type filter hook input priority 0; policy accept; }'
nft add rule ip filter limit_conns tcp dport 8080 ct state new @srcip_conns { ip saddr : counter } ct count over 10 drop
配合 sysctl 调优连接相关参数
单纯规则拦截不能替代内核连接管理优化。关键参数包括:
-
net.netfilter.nf_conntrack_max:连接跟踪表最大容量,应 ≥ 预期并发连接数; -
net.ipv4.tcp_max_syn_backlog:SYN 队列长度,影响突发连接接纳能力; -
net.core.somaxconn:应用 listen() 的 backlog 上限,需与服务程序设置一致(如 Nginx 的listen ... backlog=4096); -
net.netfilter.nf_conntrack_tcp_be_liberal = 1:有助于减少误判 FIN/RST 导致的连接残留。
修改后执行 sysctl -p 生效。若 conntrack 表满,新连接会被静默丢弃(日志中可见 nf_conntrack: table full)。
验证与排查技巧
确认规则是否生效:
- 查看当前匹配计数:
iptables -L INPUT -v -n | grep 8080; - 检查实时连接数:
ss -tn sport = :8080 | wc -l或netstat -ant | grep ':8080.*ESTAB' | wc -l; - 监控 conntrack 使用率:
cat /proc/sys/net/netfilter/nf_conntrack_count和/proc/sys/net/netfilter/nf_conntrack_max; - 抓包确认 SYN 是否被 DROP:
tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and port 8080',对比客户端连接失败现象。











