使用 TC 和代理进行 Linux 流量整形

使用 TC 和代理进行 Linux 流量整形

我有一个用作路由器的 Linux 机器。它有 2 个接口,一个用于连接互联网(使用 NAT),另一个用于连接为多台计算机提供服务的本地网络。

我希望使用“tc”来调整从本地计算机流向互联网的流量(上传),并根据每台计算机的 IP 地址监管流入的流量(下载)。通常,我会在外部接口上添加一个出口调整器和一个入口监管器,但问题是,我在服务器上有一个 squid 代理,本地计算机需要连接到该代理才能访问网络。

如果我在数据包离开本地网络接口时使用 iptables 标记数据包,则对网络流量没有任何影响,因为当 squid 截获数据包并在其他端口上创建自己的网络连接时,标记就会丢失。同样,管制传入流量也不起作用,因为网络流量始终发往 squid,因此我无法匹配 IP 地址。

到目前为止,我已成功解决了 90% 的问题,方法是在内部接口上添加一个出口整形器,根据 IP 限制每台本地计算机的下载速度。当然,这不会节省线路​​速度,它只是创建一个队列,这样每台计算机只能看到一定的下载速度。对于上传,我在数据包离开本地网络时对其进行标记,并在外部接口的出口处使用整形器对其进行整形,但这不适用于来自 squid 的网络流量。

有没有其他人遇到过类似的问题,或者知道当 squid 拦截具有目标端口 80 的上传流量时,我该如何塑造它?

答案1

我设法通过在内部接口上使用入口策略器来解决这个问题,该策略器会将本地计算机中多余的数据包丢弃到 Squid。但我只能使用可变缓冲区大小才能让它工作。很奇怪。

答案2

您必须在 Squid 内部使用 tcp_outgoing_tos 再次标记数据包的 TOS。这是在 Squid 之前和之后匹配 IP 的唯一方法。

acl tosX src x.x.x.1 x.x.x.2 x.x.x.3
tcp_outgoing_tos 0x20 toxX

然后你必须使用 tc 中的 TOS 过滤器。

相关内容