限制 Linux 到外部子网的带宽

限制 Linux 到外部子网的带宽

我正在为我的企业寻找一个新的开源镜像,但也有兴趣将其开放给外部客户。但是,出于显而易见的原因,我想限制不在我的本地子网中的任何人的传出带宽(例如,流向边界路由器之一的流量)。

我最初考虑的是 apache mod_bw,但是也可能有 FTP 访问此镜像。我见过许多使用“tc”的有希望的选项,但是看起来它将匹配基于子网的模式。但我想要否定它——我有一个包含几个(5 或 6 个)内部子网的列表,这些子网应该没有限制,其他一切都应该通过流量整形器。事情有点复杂,因为我还需要匹配 v4 和 v6 子网。

我正在尝试,但我基本上需要因此“不要塑造这些子网;将策略应用于其他所有内容”。也许是 2 个类,一个带有速率限制器,另一个没有?我仍然不清楚“tc”的处理顺序如何进行——处理是在找到匹配项后终止,还是会一直持续到最后?(例如,最后的 catch-all 是否真的可以捕获一切,还是只是尚未匹配?)

答案1

据我所知,“tc match”不能与 ipv6 一起使用。您必须使用带有“-j CLASSIFY”的 iptables。

使用 iptables 时,在找到匹配项后继续处理。但使用 tc 时,flowid 会将数据包重定向到该类并停止处理。

关于树,我认为你想要的是:

  • 根队列规定
  • 具有所有带宽的类(这样叶类可以借用)
  • 两个类别,例如保证 20%(外部)和 80%(内部)的带宽,并且最大值为 100%:保证的带宽不能超过 100%
  • 每个类一个叶 qdisc(pfifo、fq、fq_codel)

虽然我不知道你的架构。如果你使用 NAT,你的 iptables 规则必须准确(无范围)。如果你使用反向代理,你将无法区分内部和外部流量。

如果您有反向代理,则替代方案是:

  1. 在第 7 级进行整形(使用 mod_bw 和 ftp 的等效项),因为您将能够查看 X-Forwarded-For 标头
  2. 在边界路由器/防火墙(具有公共 IP 的路由器/防火墙)上设置整形器,因为您将能够查看公共 IP(请记住您始终在处理上传链接)

根据您执行此操作的能力,最好的选择是第二个,因为您将能够根据您的 WAN 带宽(而不是 Web 服务器上的 1 或 10Gb NIC)进行精确调整。即使没有反向代理,这也是您的最佳选择。

关于类别的选择,您应该使用 htb 或 hfsc 来更好地利用动态带宽和根 qdisc 中的“默认”选项。

相关内容