Iptables

iptables:所有主機的每個mac地址的下載配額

  • July 9, 2017

在 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 中實現這樣的東西會很好。

引用自:https://unix.stackexchange.com/questions/373643