Debian Multi-WAN QoS Howto

[注意]

引用本文請完整引用並須於引用文章中列上本文章的完整連結

[前言]

某個的vpn設置的時候是希望滿足兩個條件: 1) 隨時可以使用內部ip存取經過ip認證的服務。(如: IEL) 2) 利用固定制ADSL的路由優勢存取原本需要繞遠路的網域 (如:連往對岸),增快存取速度。

[架構]

vpn structure

vpn structure

vpn server的OS為Debian Etch,使用iptables根據目的地的ip來決定封包要透過哪一個interface出去,上圖為VPN的架構,eth0負責handle vpn的連線要求以及做NAT Gateway,而eth1則連接固定制的ADSL負責連往學術網路連線不佳的國家,試用了一陣子,跑起來一切美好,大家也很滿意。無奈人性是邪惡的,使用者一旦發現通往特定地區只要使用vpn就會變快時,就會不理會節約ADSL頻寬使用的柔性宣導,狂抽猛的使用善加利用導致當初的美意徹底被摧毀,同時也降低使用者使用的意願。(本來學網夠慢了,結果用了VPN速度反而越來越慢誰會想用 zZzZZzzz)

因應的方法便是限制user在使用ADSL這段的速度,讓大家都可以使用到合理的速度。

[QoS Howto]

之前使用cbq.init來當做solution,why cbq。init? 因為它的設定最簡單,完全就是懶人的最愛,可惜它的queueing方式不太優良,導致沒有辦法做更精準的限制,所以研究了一下改用HTB來做。HTB跟CBQ差在哪呢? 請自行參考HTB官方網頁的說法。 (http://luxik.cdi.cz/~devik/qos/htb/old/htbmeas1.htm)

QoS怎麼套入這個架構呢? 由於poptop這個vpn server會為每個連線建立一個ppp的interface,而系統會在每個ppp interface啟動時自行呼叫/etc/ppp/ip-up,所以我在這個script最下方加上QoS的設定,之後每個連線都會自動被套用上這個設定。首先先針對下載的部分做限制,由於頻寬較為充裕,最多可以允許768kbps的速度,設定如下:

# Download Speed QoS of ADSL! offer at least 720Kbps (Max 768Kbps) for user
/sbin/tc qdisc add dev $1 root handle 2: htb
/sbin/tc class add dev $1 parent 2: classid 2:1 htb rate 720kbit ceil 768kbit
/sbin/tc filter add dev $1 protocol ip parent 2:0 prio 1 handle 6 fw flowid 2:1

這邊使用一個技巧,由於我們可以確定ADSL的inbound一定會從eth1進來,所以我們利用iptables可以將封包加上mark的功能,將eth1進來的封包都加上mark (標號為6) 所以就可以利用這個mark去做tc的filter依據。iptables加上mark指令如下:

/sbin/iptables -A PREROUTING -t mangle -i eth1 -j MARK –set-mark 6

下載限速的部分就大功告成啦。

接著則是上傳速度限制的部分,礙於ADSL的uplink頻寬普遍不大,為了避免濫用,每個user限制只能使用128kbps。首先在eth1上面掛載一個root qdisc:

/sbin/tc qdisc del dev eth1 root
/sbin/tc qdisc add dev eth1 root handle 2: htb r2q 8

接著編輯/etc/ppp/ip-up:

# 限制個別user對ADSL端的上傳速度
#取得撥進來的user目前是使用哪個ppp interface
interface=$1

#針對不同的使用者給予特定的標記
contamark=`echo $interface | cut -c 4-99`
mark=`expr $contamark + 500`

#由於vpn架設時,已經先把送往eth1的封包都標成1了
#所以下面這行指令的意思是(當中的$5則是使用者撥入後取得的ip):
#當封包的source ip是$5 且 已經被標記成 mark 0x1了
#就把該封包套用到使用者專屬的tc-class
/usr/local/sbin/iptables -t mangle -A POSTROUTING -s $5 -m mark --mark 0x1 -j CLASSIFY --set-class 2:$mark

#建立使用者專屬的tc-class
/sbin/tc class add dev eth1 parent 2: classid 2:$mark htb rate 128kbit ceil 128kbit

最後,編輯/etc/ppp/ip-down,當使用者斷線後刪除相關設定。

# remove download tc disc
/sbin/tc qdisc del dev $1 root

# remove uplink limit
interface=$1
contamark=`echo $interface | cut -c 4-99`
mark=`expr $contamark + 500`

/usr/local/sbin/iptables -t mangle -D POSTROUTING -s $5 -m mark --mark 0x1 -j CLASSIFY --set-class 2:$mark
/sbin/tc class del dev eth1 parent 2: classid 2:$mark htb rate 128kbit ceil 128kbit

[結論]

對於ADSL端做出QoS限制後,反應良好、使用者人數回流、ADSL使用率增加(之前因為uplink被吃光導致download速度受阻)。最後當然是有圖有真相啦:

vpn mrtg traffic

vpn mrtg traffic

0 Response to “Debian Multi-WAN QoS Howto”


  • No Comments

Leave a Reply