Linuxルーターですべてのホストのダウンロードクォータを設定するには?
以下は、多くのゲストと共有されるWi-Fiネットワークです。
- 訪問者あたりのダウンロードクォータは、最初は制限なしで150 MBでなければなりません。
- クォータに達すると、ダウンロード速度は50k / sに制限する必要があります。
- フィルタリングはmacアドレスベースで行う必要があり、IPアドレスはdhcpによって変更されることがあります。
ガーゴイルルータは同様の機能を実装していますが、残念ながらここではガーゴイルを使用することはできません。これを実装するには、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
IPの代わりにMACアドレスを使用することは簡単ですが、アドレスを事前に知っておく必要がありますが、ここではそうではありません。
答え1
いくつかの研究の最後に、以下を発見しました。
まず、いくつかの構成は次のとおりです。
# 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 IP用のIPsetを作成します。
ipset create IP_QUOTA bitmap:ip range $lan.0/24 counters
ipset add IP_QUOTA $lan.1-$lan.254
iptablesを使用して過剰な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アドレスあたりのダウンロードクォータを取得する1つの方法は、mac / ipペアの変更を監視し、それに応じてIPカウンタを設定/リセットすることです。
私プロジェクトgithubはOpenWrtのための完全なソリューションを実装します。
メモ:2017年6月現在、GargoyleのダウンロードクォータはIPアドレスに基づいて計算されます。最後に、Gargoyleでこのようなものを実装することをお勧めします。