Iptables
iptables:所有主機的每個mac地址的下載配額
在 Linux 路由器上,如何為所有主機設置下載配額?
這是用於與許多客人共享的 wifi 網路:
- 每位客人應從 150 Mb 下載配額開始,無限制
- 達到配額後,下載速度應限制在 50 k/s
- 過濾必須基於mac地址,IP地址可能會隨著dhcp而改變。
Gargoyle路由器實現了這樣的功能,不幸的是,在這裡使用 gargoyle 不是一個選項,我需要使用 tc 和 iptables 來實現。
這個答案是一個很好的起點:
iptables -A INPUT -p tcp -s 192.168.0.2 -m quota --quota 13958643712 -j ACCEPT iptables -A INPUT -p tcp -j CLASSIFY --set-class 1:12
讓它使用 mac 地址而不是 IP 很容易,但是它需要提前知道地址,這裡不是這種情況。
經過一番研究,這是我發現的:
首先,一些配置:
# download quota (Mb) dl_quota_mb=150 dl_quota=$(($dl_quota_mb * 1024 * 1024)) # max speed once overquota (k/s) dl_cap_kb=50 dl_cap=$(($dl_cap_kb * 8)) # wifi interface if_lan=wlan0 # lan subnet lan=192.168.1
為每個 ip 創建 tc 類以限制下載速度:
TCA="tc class add dev $if_lan" TQA="tc qdisc add dev $if_lan" SFQ="sfq perturb 10" $TQA root handle 1: htb # over quota speed limits for i in `seq 1 254`; do $TCA parent 1: classid 1:$i htb rate ${dl_cap}kbit ceil ${dl_cap}kbit prio 2 $TQA parent 1:$i handle $i: $SFQ done
使用記帳為 lan ips 創建 ipset:
ipset create IP_QUOTA bitmap:ip range $lan.0/24 counters ipset add IP_QUOTA $lan.1-$lan.254
使用 iptables 對 overquota ips 數據包進行分類以進行限制:
IPT="iptables -t mangle" IPT_POST="iptables -t mangle -A POSTROUTING -o $if_lan" $IPT -N overquota $IPT_POST -m set --match-set IP_QUOTA dst --bytes-gt $dl_quota -j overquota # classify packets for i in `seq 1 254`; do $IPT -A overquota --dst $lan.$i -j CLASSIFY --set-class 1:$i done
這為我們提供了每個 IP 地址的下載配額。要獲取每個 mac 地址的下載配額,一種方法是觀察 mac/ip 對的更改並相應地設置/重置 IP 計數器。
我在 github 上設置了一個項目,它實現了 OpenWrt 的完整解決方案。
**注意:**截至 2017 年 6 月,Gargoyle 的下載配額是按 IP 地址計算的。最終在 Gargoyle 中實現這樣的東西會很好。