可通过iptables的connlimit与owner模块按uid限制用户tcp并发连接数,如限制www-data(uid=33)最多10个新建连接:iptables -a output -m owner --uid-owner 33 -p tcp --syn -m connlimit --connlimit-above 10 -j reject --reject-with tcp-reset。

可以通过 iptables 的 connlimit 模块配合 owner 模块,按 Linux 用户身份限制其发起的 TCP 并发连接总数。该方法适用于守护进程以特定用户运行、或需对交互式 SSH 会话之外的用户级网络行为做管控的场景。
确认内核模块与基础支持
确保系统已加载 xt_connlimit 和 xt_owner 模块:
- 执行
lsmod | grep -E 'connlimit|owner',若无输出,需手动加载:modprobe xt_connlimit && modprobe xt_owner - 较新内核(如 5.x+)通常默认内置,无需额外操作
- 仅限 IPv4;IPv6 需使用
ip6tables及对应模块
按 UID 限制单用户并发连接数
核心思路是匹配由指定 UID 发起的新建 TCP 连接(--syn),并用 connlimit 统计其当前 ESTABLISHED 连接数:
- 示例:限制用户
www-data(UID=33)最多同时建立 10 个 TCP 连接iptables -A OUTPUT -m owner --uid-owner 33 -p tcp --syn -m connlimit --connlimit-above 10 -j REJECT --reject-with tcp-reset - 规则作用于
OUTPUT链,因用户进程主动发起连接时,数据包从本机发出 - 必须加
--syn,否则会误匹配已建立连接的数据包 - 使用
REJECT --reject-with tcp-reset比DROP更友好,客户端能立即收到 RST 包而非超时
补充说明与注意事项
该限制存在几个关键前提和边界情况:
- 只限制该用户“主动发起”的连接(如 curl、wget、自研客户端),不控制其接收的入站连接(如 nginx 监听 80 端口)
- 若用户通过 sudo 切换 UID,新进程继承原 UID 或目标 UID,取决于 sudo 配置;建议以实际运行 UID 为准测试
- 规则不区分端口或协议类型,如需细化(例如只限 HTTP),可追加
--dport 80或--dport 443 - 已有连接不受影响,限制仅在新建连接时触发检查
验证与持久化
生效后可通过以下方式验证:
- 切换到目标用户,用
yes | nc example.com 80 &快速发起多个连接,观察第 11 个是否被拒绝 - 查看规则命中计数:
iptables -L OUTPUT -v -n | grep 'uid-owner' - 保存规则(依发行版):
Debian/Ubuntu:iptables-save > /etc/iptables/rules.v4
CentOS/RHEL:service iptables save或iptables-save > /etc/sysconfig/iptables










