使用TC模擬網絡故障


tc命令是linux自帶的流控工具,不僅可以控制發包的速度,還可以借助其中的netem工具模擬網絡故障,非常實用

 

tc的包iproute2-4.9.0 下載路徑wget https://mirrors.edge.kernel.org/pub/linux/utils/net/iproute2/iproute2-4.9.0.tar.xz

docker里無法使用的bug 可以參考 https://bugzilla.redhat.com/show_bug.cgi?id=1152231,解決方法就是升級tc版本,tc qdisc add 時加上direct_qlen參數

如何使用TC參考http://www.tldp.org/HOWTO/html_single/Traffic-Control-HOWTO/

man文件: http://man7.org/linux/man-pages/man8/tc-netem.8.html

比較詳細的用例參考: https://www.cs.unm.edu/~crandall/netsfall13/TCtutorial.pdf

 

tc的細節直接參考上文的鏈接,講的比較詳細,本文介紹下如何使用

場景:

故障注入的docker: 10.183.60.149

中控機:11.136.106.200

10.183.60.149上會模擬各種網絡故障,但是中控機到該docker的連接需要不受影響

 

登陸中控機:

ssh 10.183.60.149 (從宿主機進入docker,否則玩失敗就連不上了)

docker exec -it ddf110b6fca9 bash

 

DEVICE_NAME=eth0

 

# 根規則,direct_qlen 1000必須加,否則在docker的虛擬網絡跑不了

tc qdisc add dev ${DEVICE_NAME} root handle 1: htb  default 1024 direct_qlen 1000

 

# 建立兩個類繼承root

tc class add dev ${DEVICE_NAME} parent 1:0 classid 1:1 htb rate 10000mbit

tc class add dev ${DEVICE_NAME} parent 1:0 classid 1:2 htb rate 10000mbit

 

#新版本的tc在filter設置完后,所有網絡都會斷,類似黑名單,需要加qdisc才能恢復, 所以先讓兩個通道都能跑

# 隊列采用公平的調度算法,保證網絡通暢,perturb參數是每隔10秒換一次hash,進一步保障平均

tc qdisc add dev ${DEVICE_NAME} parent 1:1 sfq perturb 10

tc qdisc add dev ${DEVICE_NAME} parent 1:2 sfq perturb 10

 

# 加過濾規則

#1.隊列1是和跳板機交互的網絡,需要保持通暢

tc filter add dev ${DEVICE_NAME} protocol ip parent 1: prio 10 u32 match ip dst 11.136.106.200/32 flowid 1:1

 

#2.其他所有主機走隊列2,實現網絡模擬

tc filter add dev ${DEVICE_NAME} protocol ip parent 1: prio 10 u32 match ip dst 0.0.0.0/0 flowid 1:2

 

 

 

#隊列2 開始網絡模擬

#該命令將${DEVICE_NAME}網卡的耗時隨機delay 100ms,延遲的尖刺在標准值的正負30ms, 最后的百分比數字是尖刺的相關系數

# 這邊用replace是因為之前已經用add加過規則了

tc qdisc replace dev ${DEVICE_NAME} parent 1:2 netem delay 100ms 30ms 25%

 

#該命令將 ${DEVICE_NAME} 網卡的傳輸設置為隨機丟掉10%的數據包, 成功率為50%

tc qdisc replace dev ${DEVICE_NAME} parent 1:2 netem loss 10% 50%

 

#該命令將 ${DEVICE_NAME} 網卡的傳輸設置為隨機產生10%的重復數據包。

tc qdisc replace dev ${DEVICE_NAME} parent 1:2 netem duplicate 10%

 

#該命令將 ${DEVICE_NAME} 網卡的傳輸設置為:有25%的數據包會被立即發送,其他的延遲10ms,相關性是10%,產生亂序

tc qdisc replace dev ${DEVICE_NAME} parent 1:2 netem delay 10ms reorder 25% 10% 

 

#該命令將 ${DEVICE_NAME} 網卡的傳輸設置為隨機產生9%的損壞的數據包。

tc qdisc replace dev ${DEVICE_NAME} parent 1:2 netem corrupt 9%

 

#讓網絡恢復正常

tc qdisc replace dev ${DEVICE_NAME} parent 1:2 sfq perturb 10

 

# =================== 查看規則 ======================

tc filter show dev ${DEVICE_NAME}

tc class show dev ${DEVICE_NAME}

tc qdisc show dev ${DEVICE_NAME}

 

#====================== 清理 ======================

tc filter delete dev ${DEVICE_NAME} parent 1:0 protocol ip pref 10

tc qdisc del dev ${DEVICE_NAME} parent 1:2 netem

tc class del dev ${DEVICE_NAME} parent 1:0 classid 1:2

tc class del dev ${DEVICE_NAME} parent 1:0 classid 1:1

tc qdisc del dev ${DEVICE_NAME} root handle 1

 

 

tc還可以進行速度控制,可以參考上文的鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM