iptables的mangle表通过tos或connmark标记voip流量(如sip端口5060/5061、rtp动态端口),为后续tc队列调度提供依据;需结合nf_conntrack_sip模块自动关联信令与媒体流,并排除lo接口及已标记包以防干扰,最终依赖dscp值(如ef=0x2e)实现qos保障。

在Linux中,利用iptables -t mangle对VoIP语音流量(如SIP、RTP)进行优先级标记,是实现QoS(服务质量)保障的关键一步。核心思路是:识别VoIP协议端口或特征,用TOS或CONNMARK打标,再配合内核队列(如tc)调度转发——mangle表本身不加速,只负责“贴标签”,真正的加速由后续的流量整形策略完成。
识别并标记SIP信令流量(TCP/UDP 5060, 5061)
SIP作为VoIP控制协议,需低延迟、高可靠。建议对SIP包设置TOS字段为0x10(CS1,表示“优先转发”),便于后续队列识别:
iptables -t mangle -A OUTPUT -p tcp --dport 5060 -j TOS --set-tos 0x10<br>iptables -t mangle -A OUTPUT -p udp --dport 5060 -j TOS --set-tos 0x10<br>iptables -t mangle -A INPUT -p tcp --sport 5060 -j TOS --set-tos 0x10<br>iptables -t mangle -A INPUT -p udp --sport 5060 -j TOS --set-tos 0x10
若使用TLS加密的SIP(5061端口),同样规则追加即可。注意:部分旧内核或设备可能忽略TOS,此时改用CONNMARK更稳妥。
标记RTP媒体流(动态UDP端口范围)
RTP实际承载语音,端口不固定(常为10000–20000)。单纯靠端口匹配易漏标,推荐结合连接跟踪标记会话:
- 先标记SIP新建连接并保存状态:
iptables -t mangle -A OUTPUT -p udp --dport 5060 -m state --state NEW -j CONNMARK --save-mark - 再对同一连接的后续UDP包(即RTP)继承标记:
iptables -t mangle -A OUTPUT -p udp -m connmark --mark 0x1 -j CONNMARK --restore-mark - 最后统一设置DSCP值(如EF,0x2e):
iptables -t mangle -A OUTPUT -p udp -m connmark --mark 0x1 -j DSCP --set-dscp 0x2e
该方法依赖nf_conntrack_sip模块已加载(modprobe nf_conntrack_sip),能自动关联SIP与RTP流,比硬写端口范围更可靠。
避免标记干扰:跳过本地回环与非VoIP流量
误标会导致其他服务异常(如DNS、SSH延迟升高),务必添加排除规则:
- 跳过lo接口:
iptables -t mangle -A OUTPUT -o lo -j RETURN - 跳过已标记包(防重复):
iptables -t mangle -A OUTPUT -m dscp --dscp 0x2e -j RETURN - 限制仅标记局域网VoIP设备(如192.168.1.100):
iptables -t mangle -A OUTPUT -s 192.168.1.100 -p udp -m multiport --dports 5060,10000:20000 -j DSCP --set-dscp 0x2e
验证标记是否生效
标记后必须确认数据包携带正确DSCP/TOS值:
- 抓包检查:
tcpdump -i eth0 -n -v port 5060 or port 10000 | grep -i "tos\|dscp" - 查看iptables计数器:
iptables -t mangle -L OUTPUT -v -n | grep -A2 "DSCP\|TOS" - 确认内核支持DSCP:
cat /proc/sys/net/ipv4/conf/all/forwarding(需为1);sysctl net.ipv4.ip_forward=1开启转发(若作网关)
标记只是第一步。真正加速需配合tc qdisc(如hfsc或cake)按DSCP分类调度,并确保上游ISP不重置DSCP字段。否则标记仅在本机或局域网内有效。











