
Linux 라우터에서 모든 호스트에 대한 다운로드 할당량을 설정하는 방법은 무엇입니까?
다음은 많은 게스트와 공유되는 Wi-Fi 네트워크입니다.
- 방문자당 다운로드 할당량은 처음에는 제한 없이 150MB여야 합니다.
- 할당량에 도달하면 다운로드 속도는 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 주소당 다운로드 할당량을 얻는 한 가지 방법은 mac/ip 쌍의 변경 사항을 모니터링하고 이에 따라 IP 카운터를 설정/재설정하는 것입니다.
나는프로젝트github에서는 OpenWrt를 위한 완벽한 솔루션을 구현합니다.
노트:2017년 6월 현재 Gargoyle의 다운로드 할당량은 IP 주소를 기준으로 계산됩니다. 마침내 Gargoyle에서 이와 같은 것을 구현하면 좋을 것 같습니다.