我有:
- 2 个 Linux 盒 (A、B)
- 1 个开关(S)
- 1 个网关(G)[我无法控制这个]
+---------------+ | switch S +-------+ +---+--------+--+ | | | +--+-+ | | | gw | +--+-+ +--+-+ +----+ | A | | B | +----+ +----+
出于一些测试目的,我需要塑造交通来自 A 的流量在到达网关 G 之前。我在 MAC 层用 向 A 注入流量tcpreplay
,因此无法直接在 A 上进行整形。
我的想法是:
- 将来自 A 的所有流量路由到 B
- 在 B 上应用流量整形(Linux 流量控制或虚拟网络)
- 将来自 A 到达 B 的所有流量重新路由到网关 G
我的解决方案可以吗?有没有更简单的解决方案,不需要 B 上的两个 (以太网) 网络接口?
会虚拟网络接口B 能让我的生活更轻松吗?
为了部署上述设置(流量整形除外),我需要哪些典型命令?
答案1
一些想法:
- 您甚至可以在 GW 上塑造来自 A 和 B 的传出流量!
- 如果您的交换机更智能一点...它不是有嵌入式 Linux 吗?
- 如果您通过 B 进行路由,请注意,B 上需要在 B 上进行一些网络标志设置才能正确处理 arp 重定向。
您的解决方案的主要问题是它会让 A 的网络依赖于 B。您的网络将更加不稳定。
尽管您的解决方案使 B Linux 本质上成为基于 Linux 的智能路由器。如果“gw”和“交换机 S”是虚拟的,而 B 是智能的,您甚至可以考虑丢弃其中至少一个,并将 B 设置为您的真实网关。
答案2
您不需要为此做任何路由技巧,也不需要虚拟接口。
您只需在流量离开系统 A 时对其进行整形即可。
明确概述您想要做的事情,为其编写“tc”规则就很简单了。
例如,假设您想将 A 的所有传出流量限制为 1mbit/s:
# Flush tc
tc qdisc del dev eth0 root &> /dev/null
tc qdisc add dev eth0 root handle 1: htb default 1
tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit
完毕。
从 A 运行速度测试,您会发现您的传入流量可能不受影响,但您的传出流量限制为每秒 1 Mebibit。
为什么我说“即将到来大概不受影响?因为如果你的 ACK 数据包的传入速率非常高,可能超过 1Mbit 限制,就会受到限制。如果您的 ACK 速度变慢,您的传入流量也会变慢。
如果您无法在 A 上使用 tc 或 iptables - 例如您的流量对于 tc/iptables 是不可见的 - 例如 tcpreplay,那么您需要在 B 上进行流量控制。
为此,至少有以下三种方法可以做到。
为 B 购买网卡,并将 A/B1 放在网络 1 上,将 B2/网关放在网络 2 上。即,B 成为网关。现在使用“tc”来调整 A 的流量。
B 上的多主 eth0。即 eth0:1 -> 172.16.5.0/24,并在此网络中为 A 提供一个地址。配置 B 以在 eth0 和 eth0:1 之间转发流量,标记和整形前往主网关的流量 (tc)。
- 使用“brctl”在 eth0 上创建网桥,并为 A/B 和 B/gw 创建接口,并再次标记和塑造前往主网关的流量(tc)。