iptables + tc htb + 策略路由

個人拓撲在附件裏,本身作了個圖.
這個只是我在虛擬機上用5個系統作的簡單實驗.不少東西都沒有寫進去。
但願對和我同樣是初學者的朋友有所幫助.
也請各位高手多指點不足之處。多謝了。多謝了。

忘了畫上,7.7.7.0和8.8.8.0是模擬公網上的地址。這兩個地址是走策略的.

#!/bin/bash
IF_INTERNAL="eth0"
IF_CNTELCOM="eth1"
IF_CNNETCOM="eth2"
tc qdisc del dev $IF_INTERNAL root 2> /dev/null > /dev/null
tc qdisc del dev $IF_INTERNAL ingress 2> /dev/null > /dev/null
tc qdisc del dev $IF_CNTELCOM root 2> /dev/null > /dev/null
tc qdisc del dev $IF_CNTELCOM ingress 2> /dev/null > /dev/null
tc qdisc del dev $IF_CNNETCOM root 2> /dev/null > /dev/null
tc qdisc del dev $IF_CNNETCOM ingress 2> /dev/null > /dev/null
tc qdisc add dev $IF_INTERNAL root handle 1: htb default 14
tc class add dev $IF_INTERNAL parent 1: classid 1:1 htb rate 100mbit ceil 100mbit prio 0
tc class add dev $IF_INTERNAL parent 1:1 classid 1:11 htb rate 30mbit ceil 100mbit prio 1
tc class add dev $IF_INTERNAL parent 1:1 classid 1:12 htb rate 20mbit ceil 100mbit prio 2
tc class add dev $IF_INTERNAL parent 1:1 classid 1:13 htb rate 40mbit ceil 100mbit prio 3
tc class add dev $IF_INTERNAL parent 1:1 classid 1:14 htb rate 10mbit ceil 10mbit prio 4
tc filter add dev $IF_INTERNAL parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
tc filter add dev $IF_INTERNAL parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
tc filter add dev $IF_INTERNAL parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
tc filter add dev $IF_INTERNAL parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
tc qdisc add dev $IF_INTERNAL parent 1:11 handle 111: sfq perturb 5
tc qdisc add dev $IF_INTERNAL parent 1:12 handle 112: sfq perturb 10
tc qdisc add dev $IF_INTERNAL parent 1:13 handle 113: sfq perturb 10
tc qdisc add dev $IF_INTERNAL parent 1:14 handle 114: sfq perturb 15
tc qdisc add dev $IF_INTERNAL handle ffff: ingress
tc filter add dev $IF_INTERNAL parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate 90mbit burst 1mbit drop flowid :1
tc qdisc add dev $IF_CNTELCOM root handle 2: htb default 14
tc class add dev $IF_CNTELCOM parent 2: classid 2:1 htb rate 100mbit ceil 100mbit prio 0
tc class add dev $IF_CNTELCOM parent 2:1 classid 2:11 htb rate 30mbit ceil 100mbit prio 1
tc class add dev $IF_CNTELCOM parent 2:1 classid 2:12 htb rate 20mbit ceil 100mbit prio 2
tc class add dev $IF_CNTELCOM parent 2:1 classid 2:13 htb rate 40mbit ceil 100mbit prio 3
tc class add dev $IF_CNTELCOM parent 2:1 classid 2:14 htb rate 10mbit ceil 10mbit prio 4
tc filter add dev $IF_CNTELCOM parent 2:0 protocol ip prio 1 handle 1 fw classid 2:11
tc filter add dev $IF_CNTELCOM parent 2:0 protocol ip prio 2 handle 2 fw classid 2:12
tc filter add dev $IF_CNTELCOM parent 2:0 protocol ip prio 3 handle 3 fw classid 2:13
tc filter add dev $IF_CNTELCOM parent 2:0 protocol ip prio 5 handle 5 fw classid 2:14
tc qdisc add dev $IF_CNTELCOM parent 2:11 handle 211: sfq perturb 5
tc qdisc add dev $IF_CNTELCOM parent 2:12 handle 212: sfq perturb 10
tc qdisc add dev $IF_CNTELCOM parent 2:13 handle 213: sfq perturb 10
tc qdisc add dev $IF_CNTELCOM parent 2:14 handle 214: sfq perturb 15
tc qdisc add dev $IF_CNTELCOM handle ffff: ingress
tc filter add dev $IF_CNTELCOM parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate 90mbit burst 1mbit drop flowid :1
tc qdisc add dev $IF_CNNETCOM root handle 3: htb default 14
tc class add dev $IF_CNNETCOM parent 3: classid 3:1 htb rate 100mbit ceil 100mbit prio 0
tc class add dev $IF_CNNETCOM parent 3:1 classid 3:11 htb rate 30mbit ceil 100mbit prio 1
tc class add dev $IF_CNNETCOM parent 3:1 classid 3:12 htb rate 20mbit ceil 100mbit prio 2
tc class add dev $IF_CNNETCOM parent 3:1 classid 3:13 htb rate 40mbit ceil 100mbit prio 3
tc class add dev $IF_CNNETCOM parent 3:1 classid 3:14 htb rate 10mbit ceil 10mbit prio 4
tc filter add dev $IF_CNNETCOM parent 3:0 protocol ip prio 1 handle 1 fw classid 3:11
tc filter add dev $IF_CNNETCOM parent 3:0 protocol ip prio 2 handle 2 fw classid 3:12
tc filter add dev $IF_CNNETCOM parent 3:0 protocol ip prio 3 handle 3 fw classid 3:13
tc filter add dev $IF_CNNETCOM parent 3:0 protocol ip prio 5 handle 5 fw classid 3:14
tc qdisc add dev $IF_CNNETCOM parent 3:11 handle 311: sfq perturb 5
tc qdisc add dev $IF_CNNETCOM parent 3:12 handle 312: sfq perturb 10
tc qdisc add dev $IF_CNNETCOM parent 3:13 handle 313: sfq perturb 10
tc qdisc add dev $IF_CNNETCOM parent 3:14 handle 314: sfq perturb 15
tc qdisc add dev $IF_CNNETCOM handle ffff: ingress
tc filter add dev $IF_CNNETCOM parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate 90mbit burst 1mbit drop flowid :1
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -P INPUT DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m mac --mac-source 00:c0:9f:XX:XX:XX -p tcp --dport 22 -j ACCEPT
iptables -P FORWARD ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 11 -j DROP
iptables -A FORWARD -p icmp -j ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -o $IF_CNTELCOM -j MASQUERADE
iptables -t nat -A POSTROUTING -o $IF_CNNETCOM -j MASQUERADE
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN ACK,RST -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN ACK,RST -j RETURN
iptables -t mangle -A PREROUTING -m length --length :64 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m length --length :64 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport ftp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport ftp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --sport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --sport 22 -j RETURN
iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp --dport 53 -j RETURN
iptables -t mangle -A PREROUTING -p udp --sport 53 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp --sport 53 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 25 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp --dport 25 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 25 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp --sport 25 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 110 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp --dport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 110 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp --sport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 443 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --sport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport ftp-data -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport ftp-data -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport ftp-data -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --sport ftp-data -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 80 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --sport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 8080 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 3389 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 3389 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 3389 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --sport 3389 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 139 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 139 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 139 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --sport 139 -j RETURN
iptables -t mangle -A PREROUTING -p udp --dport 4000:8000 -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -p udp --dport 4000:8000 -j RETURN
iptables -t mangle -A PREROUTING -p udp --sport 4000:8000 -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -p udp --sport 4000:8000 -j RETURN
iptables -t mangle -A PREROUTING -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -j RETURN
modprobe ip_nat_ftp
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 255 > /proc/sys/net/ipv4/ip_default_ttl
ip route add default via 1.1.1.2
ip route add default via 2.2.2.2 table 100
ip rule add to 7.0.0.0/8 table 100
ip rule add to 8.0.0.0/8 table 100

[[i] 本帖最後由 Suniverse 於 2007-6-7 19:55 編輯 [/i]]
platinum
文中用到了 0、一、二、三、4 共 5 個不一樣的 class 優先級,以及不少 filter 優先級,能否講一下同優先級和不一樣優先級下他們的不一樣點在哪裏?

Suniverse
根據個人理解,我認爲PRIO的級別在不一樣時,當兩種級別的流量同時到達某一接口時,優先級搞的流量優先被處理和轉發。
(忘了寫,即便優先級不一樣,也不會讓某一流量永久佔用帶寬而讓其餘流量餓死,由於有SFQ在)


當PRIO相同時
則同時到達以後,採用先來先處理的原則(我不知道這算不算FIFO)。
而根據SFQ隊列的公平算法,每一個流量都不會一直佔用出口,而是根據每一個單位時間PERTURB重新進行散列算法的計算,來從新分配.

小弟初學,不知道對不對,請指點.

謝謝了,謝謝了

[[i] 本帖最後由 Suniverse 於 2007-6-8 08:19 編輯 [/i]]

gdqynic
寫得很好,受益非淺!
另外,根據我最近的測試發現,MARK部分能夠使用multiport減小規則的條數,我以爲能夠提升服務器的處理速度,我把個人代碼列一下,歡迎你們指正!
[code]$IPTABLES -t mangle -F

$IPTABLES -t mangle -A POSTROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -m tos --tos Minimize-Delay -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m length --length :64 -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -p tcp -m length --length :64 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p icmp -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -p icmp -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p udp -m multiport --port 53 -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -p udp -m multiport --port 53 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 20,22,23,1433,3389 -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 20,22,23,1433,3389 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 21,25,80,110,443 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 21,25,80,110,443 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p udp -m multiport --port 8000 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING -p udp -m multiport --port 8000 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 1038,3724,5050,5858,6299,7000,7050,7100,7200 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 1038,3724,5050,5858,6299,7000,7050,7100,7200 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 7202,7205,8888,28008,38101,39311,40041,55088 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 7202,7205,8888,28008,38101,39311,40041,55088 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 3000:3050 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 3000:3050 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 8000:8050 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 8000:8050 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -j MARK --set-mark 4[/code]

platinum
[quote]原帖由 [i]Suniverse[/i] 於 2007-6-8 08:18 發表於 3樓   根據個人理解,我認爲PRIO的級別在不一樣時,當兩種級別的流量同時到達某一接口時,優先級搞的流量優先被處理和轉發。 (忘了寫,即便優先級不一樣,也不會讓某一流量永久佔用帶寬而讓其餘流量餓死,由於有SFQ在) ... [/quote] 當帶寬沒有達到設置峯值最大值的時候,這種優先級和帶寬保障會生效嗎?據我所知,SFQ 在帶寬擠佔的時候纔開始生效 換句話講,若你設置峯值 2Mbps,帶寬也是 2Mbps 的,而因爲 ISP 的緣由實際帶寬只能達到 1.8Mbps,在這種狀況下,Linux 的隊列可能不會排滿,那麼這種優先級和隨機隊列公平競爭機制會生效嗎?
相關文章
相關標籤/搜索