使用“tc”進行 Linux 流量整形:未應用主機上直接請求的 QoS 過濾器?
我正在嘗試減少介面吞吐量以在較慢的網路速度上調試我的應用程序。
我記得
tc
在過去工作的界面上執行此操作的聲明。我在專用(遠端)開發機器上使用它。這是聲明
tc qdisc add dev wlan0 root tbf rate 250kbit latency 300ms burst 125kbit
它在嘗試從另一台主機訪問本地套接字時效果很好,但是當從我的****本地電腦訪問該介面上的套接字時,過濾器沒有被應用。
界面:
# ifconfig wlan0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet XXX.XXX.XXX:XXX netmask 255.255.255.0 broadcast XXX.XXX.0.255 inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link> ether XX:XX:XX:XX:XX:XX txqueuelen 1000 (Ethernet) RX packets 31438 bytes 28025182 (26.7 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 27035 bytes 7482740 (7.1 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
插座(任何):
# netstat -lntp | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 5990/nginx: master
套接字(lo/wlan0):
# netstat -lntp | grep 8080 tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 7432/nginx: master tcp 0 0 XXX.XXX.XXX.XXX:8080 0.0.0.0:* LISTEN 7432/nginx: master
在瀏覽器中,我嘗試訪問
http://XXX.XXX.XXX.XXX:8080/path
並且頁面(> 1 MB 內容+資產)立即顯示(之前清除了記憶體)。在可以訪問我的系統的另一台主機上,所有內容的載入(明顯)緩慢。
我當然查看了其他資源,但沒有一個對我有用:
- 基於埠的頻寬整形
- 使用 HTB 在 Linux 上進行流量整形:奇怪的結果
- http://www.cyberciti.biz/faq/linux-traffic-shaping-using-tc-to-control-http-traffic/
- https://coderwall.com/p/zpckbg
我還嘗試在 Fedora 19 上創建一個使用
tc
和處理數據包的類iptables
(如第三個連結所示)在 Fedora 19 上是不可能的。該規則被忽略(添加規則時沒有錯誤,但發出時沒有出現iptabls -n -L
)。因此,我懷疑過濾僅適用於到達介面的包或本地請求不通過過濾層。
環境:
- 費多拉 Linux 19
- 核心 3.11.10-100.fc18.x86_64
- tc 實用程序,iproute2-ss121001
- Nginx 是服務 HTTPD
如何讓流量整形適用於本地請求?
(也歡迎提供替代解決方案的提示。接下來我將嘗試 squid 作為具有延遲類的反向代理。)
- 應該直接在主機上解決
- 不需要額外的硬體
- 我更喜歡不限於 HTTP 的解決方案(也可以測試 Websockets 或其他協議)
發往本地機器的數據包不會通過網路介面。例如,您可以用 1GBit 的流量淹沒 eth0 介面的 IP 地址(比如說 100Mbit 連結),而不通過它傳遞任何數據。因此調度程序將不會被使用。
FWIW,使用 netem 調度程序代替 tbf 更容易。netem 旨在完全按照您的要求做。但是,它仍然不適用於您的情況。
對於涉及兩個介面的測試,我曾經做過一個非常骯髒的黑客攻擊。假設您有 eth0 和 eth1:
您用電纜將它們相互連接
您在 eth0 上分配 IP 地址 10.0.0.1/24,在 eth1 上分配 IP 地址 10.0.1.2/24
您在兩個介面上添加 NAT 規則說:
- 使用 DST IP 10.0.0.2 退出 eth0 的流量被 DNATed 到 10.0.1.2
- 使用 DST IP 10.0.1.1 離開 eth1 的流量被 DNATed 到 10.0.0.1
您添加靜態 ARP 條目,說明:
- 10.0.0.2 映射到 eth1 的 MAC 地址,但與介面 eth0 關聯
- 10.0.1.1 映射到 eth0 的 MAC 地址,但與介面 eth1 關聯
然後您可以 ping 10.0.0.2,這將退出 eth0 並返回 eth1。之後,您可以在適當的界面上添加所需的 qdisc 並執行測試。