3-ifb虛擬接口

QoS分爲入口(Ingress)部分和出口(Egress)部分,入口部分主要用於進行入口流量限速(policing),出口部分主要用於隊列調度(queuing scheduling),大多數排隊規則(qdisc)都是用於輸出方向的,輸入方向只有一個排隊規則,即ingress qdisc

1.開始思路

image.png

  • 對於wan口來說:下載是ingress,上傳是egress
  • 對於lan口來說:下載是egress,上傳是ingress

因此,常規做法是,在lan口做下載流控,在wan口做上傳流控

2.遇到問題

按上面的做法,LAN口到LAN口的流量也會被控制了。

嘗試對lan-lan流量進行過濾,但是1.不靈活,IP識別困難,外網IP也可以當做內網IP用;2.對不關注的流量進行操作,有性能損耗。

如何只對外網流量(lan-wan)進行控制,不對內網流量(lan-lan)進行控制

3.增加虛擬接口ifb

ifb原理就是開一個接口,把實際接口的ingress流量轉到這些ifb接口的egress上,所以我們就把wan口的ingress轉發到ifb口的egress,這時候相當於只需要對ifb的輸出控制即可,不對lan口進行控制。

WAN口控制上傳,ifb口控制下載。

image.png

4.如何區分lan口的IP,使用mark標記

上面雖然把lan口釋放了,不去控制lan-lan口的數據,但是我們要對lan口的上傳/下載做控制。

egress的流量,經過nat以後,源IP不再是lan段的IP,因此無法標識具體的IP/用戶。
(SNAT基於原地址的轉換一般用在我們的許多內網用戶通過一個外網的口上網的時候,這時我們將我們內網的地址轉換爲一個外網的IP,我們就可以實現連接其他外網IP的功能)

解決方法是使用fw分類器。在netfilter的forward上掛一個自定義的模塊(如:MyMark),根據需求打mark,這裏可以任意發揮想象,直覺可以實現任意你想到的功能。
fw分類器,根據mark來分類:先在父類20:1下面穿件一個子類20:17,(這個類裏面做了限速規則)再把打了257/0xfffff標記的分類到20:17,而打了257/0xfffff標記的又在iptable的FORWARD表裏面做了對應。

iptables -t mangle -A QOS_RULES_FORWARD_eth1 -m mac --mac-source 14:75:90:F7:97:7D -d 0.0.0.0/0 -j MARK --set-mark 257/0xfffff
/usr/sbin/tc class add dev eth1 parent 20:1 classid 20:17 hfsc sc rate 204800kbit ul rate 204800kbit
/usr/sbin/tc filter add dev eth1 parent 20:0 protocol ip handle 257/0xfffff fw flowid 20:17
/usr/sbin/tc class add dev ifb4eth1 parent 20:1 classid 20:17 hfsc sc rate 102400kbit ul rate 102400kbit
/usr/sbin/tc filter add dev ifb4eth1 parent 20:0 protocol ip handle 257/0xfffff fw flowid 20:17

5.實例

以eth1爲例
1).創建入隊列

/usr/sbin/tc qdisc add dev eth1 handle ffff: ingress
/usr/sbin/tc qdisc del dev ifb4eth1 root

2).把eth1的入口流量導入ifb4eth1

/usr/sbin/tc filter add dev eth1 parent ffff: protocol all prio 10 u32 match u32 0 0 flowid 1:1 action connmark action mirred egress redirect dev ifb4eth1

tc filter add dev eth0 parent fff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0

3).TC工具對ifb4eth1設置QoS規則

/usr/sbin/tc qdisc add dev ifb4eth1 root handle 1: prio bands 2 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
/usr/sbin/tc qdisc add dev ifb4eth1 parent 1:1 handle 10: pfifo limit 3000
/usr/sbin/tc qdisc add dev ifb4eth1 parent 1:2 handle 20: hfsc default 3
/usr/sbin/tc class add dev ifb4eth1 parent 20: classid 20:1 hfsc ls rate 1000Mbit ul rate 1024000kbit
/usr/sbin/tc filter add dev ifb4eth1 parent 1: protocol ip prio 1 handle 0xf0/0xf0 fw flowid 1:1
/usr/sbin/tc filter add dev ifb4eth1 parent 1: protocol ip prio 2 u32 match ip protocol 1 0xf0/0xf0 flowid 1:1
。。。

4).啓動ifb4eth1端口

/usr/sbin/ip link set dev ifb4eth1 up

啓動成功會有如下端口信息

root@zihome:~# ifconfig ifb4eth1
ifb4eth1  Link encap:Ethernet  HWaddr 6E:ED:FD:76:56:8B  
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:2764 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2764 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:32 
          RX bytes:2622255 (2.5 MiB)  TX bytes:2622255 (2.5 MiB)

https://wiki.linuxfoundation.org/networking/ifb
http://tldp.org/HOWTO/Traffic-Control-HOWTO/index.html

輸入方向的流量控制 --ifb:
https://blog.csdn.net/eydwyz/article/details/53392227

Linux 工具 | 第1篇:高級流控-TC+HTB+IFB+內核模塊
https://blog.csdn.net/i_scream_/article/details/82776333

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章