[注意]
引用本文請完整引用並須於引用文章中列上本文章的完整連結
[前言]
某個的vpn設置的時候是希望滿足兩個條件: 1) 隨時可以使用內部ip存取經過ip認證的服務。(如: IEL) 2) 利用固定制ADSL的路由優勢存取原本需要繞遠路的網域 (如:連往對岸),增快存取速度。
[架構]

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
0 Response to “Debian Multi-WAN QoS Howto”