如何在Linux流量控制(tc)中通过ematch排除端口范围?

时间:2016-02-29 14:30:20

标签: linux filtering ports network-traffic

我目前在代码中遇到了麻烦。

主要是,我模拟两台计算机之间的连接,通过以太网桥(Raspberry Pi,Raspbian)连接。因此,我可以通过 tc qdisc 影响此连接的参数(如带宽,延迟等)。 这很好,你可以在下面的代码中看到。


但现在我的问题是:

我也试图排除特定的端口范围,这意味着不受我给定参数影响的端口(延迟等等)。

为此,我创建了两个prio乐队。 prio band 0(更高优先级)处理我的端口排除(已在父根中)。 之后在prio band 1(较低优先级)中,我通过 netem 来减少延迟。
整个数据流量将通过我受影响的prio频段1,剩余的(排除数据)将通过prio频段0不受影响。

执行代码时我没有遇到内核错误!
但在输入 filter parent 1: protocol ip pref 1 basic 后,我才会收到 sudo tc filter show dev eth1 。 甚至没有提到我的比赛。

我错了什么? 你能解释一下为什么我没有得到我想要的输出吗?


这是我的代码(执行顺序正确):

父母根

sudo tc qdisc add dev eth1 root handle 1: prio bands 2 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

  • 这会产生两个priobands(1:1和1:2)

BAND 0 [PORT EXCLUSION |端口100 - 800]

sudo tc qdisc add dev eth1 parent 1:1 handle 10: tbf rate 512kbit buffer 1600 limit 3000

  • 创建tbf(令牌桶过滤器)以设置带宽

sudo tc filter add dev eth1 parent 1: protocol ip prio 1 handle 0x10 basic match "cmp(u16 at 0 layer transport lt 100) and cmp(u16 at 0 layer transport gt 800)" flowid 1:1

  • 创建一个具有特定句柄的过滤器,该过滤器从prioband 1(受影响的数据包)中排除端口100到800(

BAND 1 [NET EMULATION]

sudo tc qdisc add dev eth1 parent 1:2 handle 20: tbf rate 1024kbit buffer 1600 limit 3000

  • 与上面的tbf比较

sudo tc qdisc add dev eth1 parent 20:1 handle 21: netem delay 200ms

  • 通过netem创建延迟200ms

Here you can see my hierarchy as an image

  

问题再次出现:   
我甚至没有提到我的过滤器匹配。

我错了什么?   你能解释一下为什么我没有得到我想要的输出吗?


我感谢任何帮助!谢谢你的努力!
~Rotsechs

1 个答案:

答案 0 :(得分:0)

似乎我不得不忽略缺失的输出!然而,它完美地运作。
我建立了与以太网桥的SSH连接(通过MobaXterm)。
后来我延迟了400ms。控制台输入按预期减慢。
最后我创建了过滤器并将端口范围从20到24排除(SSH有端口22)。

我的SSH连接延迟立刻消失了!