iptables 是四层流量控制工具,支持按连接特征、用户身份、流量方向精细分流与拦截,需合理选用表、链、模块并协同策略路由实现限流、标记与多出口分流。

iptables 不只是封端口或拦 IP 的工具,它能按连接特征、用户身份、流量方向做精细分流与拦截。关键在于选对表(mangle/nat/filter)、链(INPUT/OUTPUT/FORWARD)和匹配模块(如 owner、hashlimit、multiport),再配合标记(MARK)与策略路由协同工作。
按服务端口做精准限流拦截
针对高频访问或易被扫描的服务(如 SSH、MySQL、Web),用 hashlimit 模块限制单个源 IP 的新建连接速率,避免暴力尝试或慢速攻击:
- 只匹配新连接:必须加 -m state --state NEW,否则会把 ACK、RST 等包也计入,导致正常会话中断
- 按源 IP 分桶计数:用 --hashlimit-mode srcip,确保每个 IP 独立限流,不互相干扰
- 设合理突发值:比如 --hashlimit-burst 8 配合 --hashlimit-above 3/min,允许短时重连但抑制持续探测
- 白名单优先:在限流规则前插入 iptables -I INPUT -s 192.168.10.5 -j ACCEPT,保障运维通道畅通
按用户身份分流本地出站流量
在软路由或跳板机上,可区分不同用户的网络行为。例如让开发用户走代理,测试用户直连,运维用户走专线:
- 在 mangle 表 OUTPUT 链中,用 owner 模块识别 UID:iptables -t mangle -A OUTPUT -m owner --uid-owner devuser -j MARK --set-mark 100
- 创建自定义路由表(如 echo "100 devproxy" >> /etc/iproute2/rt_tables)
- 添加策略路由:ip rule add fwmark 100 table devproxy,再配置该表的默认网关
- 注意:owner 模块仅适用于本机发起的连接,不适用于转发或容器内进程
按目标端口或协议类型做应用层分流
虽然 iptables 是四层工具,但结合 multiport、string 或 protocol 模块,也能粗粒度区分应用流量:
- 区分游戏与信令流量:PS4/PS5 的 RTMP 直播走 1935 端口,弹幕走 6667 端口,可用 -m multiport --dports 1935,6667 单独标记或转发
- 拦截非标准端口扫描:对常见未开放端口(21、23、110、143)加 SYN 限速:-p tcp --syn -m multiport --dports 21,23,110,143 -m hashlimit --hashlimit-above 3/sec -j DROP
- 避免七层误判:不建议用 string 匹配 HTTP 方法做限流,效率低且易绕过;这类需求更适合 Nginx 或应用层处理
结合策略路由实现多出口分流
当有多个代理通道(如 US/Singapore/HK 的 SOCKS 服务器)时,可将不同目的端口或 IP 段导向不同出口:
- 用 DNAT 将本地端口映射到远端代理:iptables -t nat -A PREROUTING -p tcp --dport 12345 -j DNAT --to-destination us-server:10000
- 用 TPROXY 或 REDIRECT 配合透明代理,再通过 fwmark 触发策略路由
- 对局域网设备按 IP 分流:比如 PS4(192.168.88.100)所有非 1935/6667 流量打标,走 HK 通道;其余走 SG 通道
- 注意链位置:PREROUTING 在路由决策前,OUTPUT 在本地进程发出后,选择错误会导致规则不生效








