建立壹臺虛擬機,並安裝完成後以橋接的方式在虛擬機上面添加兩張網卡。分別為eth0和eth1。
eth0: a.b.c.d(外網的上網地址)
eth1: 172.16.44.1(做為內網的網關)
Tip
原先我使用eth0:0的這種虛擬網卡的形式去配置壹直不成功,後來使用雙網卡的時候壹直忘了把eth0:0這張虛擬網卡刪掉導致了限速配置壹直不成功,浪費了大把的青蔥。
配置iptables nat
#開啟ip_forward
echo "1">/proc/sys/net/ipv4/ip_forward
#清除原來的防火墻規則
iptables -F
iptables -t nat -F
iptables -t mangle -F
#添加nat轉發
iptables -t nat -A POSTROUTING -s 172.16.44.0/24 -o eth0 -j MASQUERADE
通過執行上面的代碼後,局域網內的電腦就可以上網了。
端口轉發
由於我的內網還掛了網站,所以要開啟80端口的轉發。
iptables -t nat -I PREROUTING -p tcp -d a.b.c.d --dport 80 -j DNAT --to 172.16.44.210:80
iptables -t nat -I POSTROUTING -p tcp -d 172.16.44.210 --dport 80 -j SNAT --to 172.16.44.1
這條命令指定外網地址a.b.c.d的80端口轉發到172.16.44.210:80上。由於是雙網卡,所以需要做壹下回路。
下載限速
下載限速要在eth1上面做,判斷數據包的目的地址來做限制。tc包括三部分:隊列、類、過濾器。我使用了htb方式去限制速度,也可以使用cbq,但cbq配置比較復雜壹點,而且據說性能沒htb好。
#刪除原來的tc規則隊列
tc qdisc del dev eth1 root
#添加tc規則隊列
tc qdisc add dev eth1 root handle 10: htb default 256
#生成根類
tc class add dev eth1 parent 10: classid 10:1 htb rate 100mbit ceil 100mbit
#支類列表用於限制速度
#這裏的rate指的是保證帶寬,ceil是最大帶寬。
tc class add dev eth1 parent 10:1 classid 10:10 htb rate 400kbps ceil 400kbps prio 1
#添加支類規則隊列
#采用sfq偽隨機隊列,並且10秒重置壹次散列函數。
tc qdisc add dev eth1 parent 10:10 handle 101: sfq perturb 10
#建立網絡包過濾器,設置fw。
tc filter add dev eth1 parent 10: protocol ip prio 10 handle 1 fw classid 10:10
#在iptables裏面設定mark值,與上面的handle值對應。
iptables -t mangle -A POSTROUTING -d 172.16.44.130 -j MARK --set-mark 1
通過上面的代碼就可以限制172.16.44.130這臺機子的下載速度到400kbps。
Tip
經過實際測試這裏的kbps實際上就是KB/S每秒千字節。另壹個單位是kbit,這個才是每秒千比特。這裏的172.16.44.130也可以寫成壹個網段,比如:172.16.44.0/24
上傳限速
上傳限速的原理其實跟下載的差不多,只不過限制的網卡不同,要在eth0上過濾來源地址去限制。
#刪除原來的tc規則隊列
tc qdisc del dev eth0 root
#添加tc規則隊列
tc qdisc add dev eth0 root handle 20: htb default 256
#生成根類
tc class add dev eth0 parent 20: classid 20:1 htb rate 100mbit ceil 100mbit
#支類列表用於限制速度
tc class add dev eth0 parent 20:1 classid 20:10 htb rate 40kbps ceil 40kbps prio 1
#添加支類規則隊列
tc qdisc add dev eth0 parent 20:10 handle 201: sfq perturb 10
#建立網絡包過濾器
tc filter add dev eth0 parent 20: protocol ip prio 100 handle 2 fw classid 20:10
iptables -t mangle -A PREROUTING -s 172.16.44.130 -j MARK --set-mark 2
Tip
跟下載不同的是POSTROUTING要改成PREROUTING,-d改成-s。
觀察連接數
通過iptables的nat連接可以通過下面的代碼查看。至於統計連接數可以寫代碼實現,也可以利用awk,grep等工具。反正裏面的內容就是文本,處理起來也比較簡單。
cat /proc/net/ip_conntrack
寫在結尾
到此上網、端口轉發和流量限制都已經實現。下次再考慮配置個dhcp server和dnsmasq。至於壹些路由器其它諸如mac地址綁定,限制上網等用到的時候再去研究研究。