我想创建一个虚拟网络接口来 TCP 代理一个网站,并让我的浏览器通过慢速网络连接查看它,以便调试网站本身的性能问题。
到目前为止,我已设法按以下方式进行设置:
ip link add dummy-SLOW type dummy
ifconfig dummy-SLOW 10.54.0.10 up
tc qdisc add dev dummy-SLOW root tbf rate 120kbit latency 200ms burst 1540
进而
socat tcp-listen:443,bind=10.54.0.10,reuseaddr,fork tcp:XXX.XXX.XXX.XXX:443
我还添加了一个别名,/etc/hosts
以便我可以看到该 IP 地址下的网站10.54.0.10
。
好吧,我可以通过这个设置查看网站,没有问题,地址10.54.0.10
甚至显示在 Chrome devtools 中。但流量整形不起作用……我仍然看到太多字节下载太快。我怎样才能让流量整形起作用?
注意:如果有办法让代理进行限制,那么这对我来说也是有效的。
答案1
您可以在常规接口上调整流量,而无需添加虚拟接口。
分配一个具有唯一 ID 的 qdisc
tc qdisc add dev eth0 root handle 1: htb
将类分配给上面定义的 qdisc。这被视为 qdisc 的子项。我使用 htb 模式,因为它本质上是 tbf 的功能更丰富的版本。
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 120kbit latency 200ms burst 1540
为该类别分配一个过滤器,并主动查找带有“10”标签的流量
tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 10 fw flowid 1:10
现在 TC 已经有了规则,我们现在需要将流量发送到流量管制部门进行节流。
iptables -A OUTPUT -t mangle -p tcp --dport 443 -j MARK --set-mark 10
更进一步,为了不限制所有进行 443 流量的人,让我们编写一条仅影响您的流量的规则。
iptables -A OUTPUT -t mangle -p tcp -s <client IP > --dport 443 -j MARK --set-mark 10
通过在离开服务器的路径上标记流量,我们确保所有(技术上是 90%)可能的 Linux 网络路由都已完成,现在我们已准备好标记符合规则的流量。测试进入端口 443 的源(笔记本电脑或其他服务器)将在数据包头中标记为 10。一旦看到这一点,内核就会接收数据包并对其应用 TC 规则。
您可以通过执行以下操作来查看所有 mangle 规则iptables -t mangle -nvL