我有一个带有 2 个网络接口的 Ubuntu 路由器。eth0
是私有网络,eth1
是互联网。 我想要的是:从指定私有 IP(例如 192.168.0.4)到给定目标端口(例如 5200)的所有包(主要是 udp)应延迟 500 毫秒。
我尝试了几种方法,包括这,这和这.唯一的结果是,没有增加任何延迟。
如果可能的话我想决定使用iptables
哪些应该延迟的包。
以下是我遇到的一些错误:
root@ubuntu:~# tc qdisc del dev eth1 root
root@ubuntu:~# tc qdisc ls dev eth1
qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
root@ubuntu:~# tc qdisc add dev eth1 root handle 1: htb default 20
root@ubuntu:~# tc class add dev eth1 parent 1: classid 1:1 pfifo_fast
Error: Qdisc "pfifo_fast" is classless.
root@ubuntu:~# tc class add dev eth1 parent 1: classid 1:1 prio
Error: Qdisc "prio" is classless.
root@ubuntu:~# tc class add dev eth1 parent 1: classid 1:10 netem delay 500ms
Error: Qdisc "netem" is classless.
root@ubuntu:~# tc class add dev eth1 parent 1:10 netem delay 500ms
Error: Qdisc "netem" is classless.
我究竟做错了什么?
答案1
您正在尝试将“netem”应用到类,而不是 qdisc。
基本思想是您必须创建根 qdisc,(正如您所做的那样)将一个类应用于该类,该类可以具有子类,这些子类必须具有与父类相同的流量方法(在本例中为 htb)。然后,这些叶类可能会应用一个 qdisc,并且您可以在那里指定 netem(或 pfifo_fast,或其他有类或无类形式)及其设置。
(或者,如果您想要全局应用它,您可以将 netem 应用于根 qdisc 而不使用类,(因此 '“netem”是无类的'))
根 qdisc --> 内部(父)类 --> 叶(子)类 --> qdisc
这里有一些旧 tc 文档我发现这一点非常清楚,尽管在编写或更新时 netem 显然不是一个选项。