Docker容器网络限速与包过滤需借助Linux内核工具:先定位veth接口及PID,再用tc在宿主机侧对veth主机端配置egress限速,或用iptables/nftables在宿主机/容器命名空间中进行包过滤。
在 Docker 中配置容器网络流量限速和包过滤,不能靠 docker run 原生命令直接实现,必须借助 Linux 内核的底层网络工具。核心在于定位容器对应的虚拟网卡(veth),进入其网络命名空间或在宿主机侧操作,再用 tc 限速、iptables 或 nftables 过滤数据包。
找到容器对应的 veth 接口和网络命名空间
每个桥接模式容器在宿主机上对应一个 veth 设备(如 vethabcd12),一端连容器内 eth0,另一端挂在 docker0 网桥上。
- 查容器 IP 和 MAC:
docker inspect mycontainer | grep -A 5 "NetworkSettings" - 定位 veth 名称:
ip link show | grep -B1 'aa:bb:cc:dd:ee:ff' | head -1 | awk '{print $2}' | tr -d ':'(用实际 MAC 替换) - 获取容器 PID:
docker inspect mycontainer -f '{{.State.Pid}}' - 验证命名空间:
nsenter -t $PID -n ip addr应能看到容器内eth0
用 tc 实现出口(egress)限速
tc 只能在出方向做精细限速,推荐在宿主机侧对 veth 主机端配置,无需修改容器。
知了zKnown
知了zKnown:致力于信息降噪 / 阅读提效的个人知识助手。
下载
- 添加 TBF 队列(简单固定限速):
tc qdisc add dev vethabcd12 root tbf rate 2mbit burst 32kbit latency 400ms - 使用 HTB 实现带宽分层(如保底+借用):
tc qdisc add dev vethabcd12 root handle 1: htb default 30,再加 class 和 filter - 限速仅作用于容器发出的流量(容器 → 外部),若需双向控制,可在容器内对
eth0配置,但需启动时加--cap-add=NET_ADMIN
用 iptables/nftables 做包过滤
包过滤可在宿主机或容器网络命名空间中进行,取决于过滤目标(源/目的地址、端口、协议等)。
- 在宿主机上限制某容器发往外部的特定端口:
iptables -A FORWARD -s -d ! 172.17.0.0/16 -p tcp --dport 8080 -j DROP - 在容器命名空间内过滤入向流量:
nsenter -t $PID -n iptables -A INPUT -p icmp -j DROP - 用
nftables更现代简洁,例如限速并记录:nft add rule inet filter output ip saddr limit rate 10/second counter drop
注意事项与替代方案
直接操作需 root 权限,且规则不随容器生命周期自动清理。生产环境建议考虑更稳定的方案:
- 使用
wondershaper封装tc,命令更简:wondershaper vethabcd12 2048 1024(下行/上行 KB/s) - 在 Kubernetes 中优先用 CNI 插件(如 Cilium + eBPF),支持声明式限速和策略
- 避免在
--network=host模式下限速——此时容器共享宿主机网络栈,无法按容器粒度隔离