iptables的MARK标记单个数据包,CONNMARK则绑定标记到整条连接以保障双向一致性;典型流程为:PREROUTING链打标并save-mark→所有包restore-mark→策略路由按fwmark分流。

要在 Linux 中用 iptables 的 MARK 和 CONNMARK 实现基于连接的流量分类与路由,核心不是给单个包打标,而是把标记“绑定到整条连接”,确保请求和响应都走同一路径——这对策略路由、多出口分流、审计引流等场景至关重要。
一、先明确标记对象:包 vs 连接
MARK 作用于单个数据包,只在当前包生效;CONNMARK 才真正管理“连接级”状态。内核连接跟踪(conntrack)会为每个 TCP/UDP 流维护一个连接条目,CONNMARK 就是操作这个条目的工具:
- --set-mark:直接给连接本身设一个连接标记(不依赖包标记)
- --save-mark:把当前包的 MARK 值存进它所属连接的 conntrack 条目中
- --restore-mark:把连接已有的标记,重新写回该连接后续所有包的 MARK 字段
二、典型配置流程(以双WAN出口分流为例)
假设 eth0 接电信线路(默认网关 192.168.1.1),eth1 接联通线路(网关 192.168.2.1),你想让来自 10.10.10.0/24 的流量固定走联通出口:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 给入向包打标并保存到连接:
iptables -t mangle -A PREROUTING -s 10.10.10.0/24 -j MARK --set-mark 0x200
iptables -t mangle -A PREROUTING -m mark --mark 0x200 -j CONNMARK --save-mark - 对所有包恢复连接标记(含回程):
iptables -t mangle -A PREROUTING -m connmark --ctmark 0x200 -j CONNMARK --restore-mark - 创建专用路由表并绑定:
echo "200 telecom" >> /etc/iproute2/rt_tables
ip route add default via 192.168.2.1 dev eth1 table telecom
ip rule add fwmark 0x200 table telecom
三、为什么必须用 CONNMARK?
若只用 MARK 不同步连接状态,会出现严重错位:
- 客户端发 SYN 到服务器,被标记 0x200 → 走联通路由出去
- 服务器回 SYN-ACK,因无标记 → 走默认路由(电信出口)
- TCP 三次握手失败,连接中断
CONNMARK 的 --restore-mark 确保回程包自动带上相同标记,使策略路由全程一致。
四、常见配合技巧
- 结合 recent 模块识别扫描行为:先用 recent 记录高频访问 IP,再用 MARK + CONNMARK 标记整个连接,引流至蜜罐
- 区分本机出向连接:在 OUTPUT 链使用 CONNMARK --save-mark,避免本地服务发起的连接被漏标
- 避免标记污染:建议用十六进制值(如 0x100、0x200)而非纯数字,减少与其他模块冲突可能


















