Raspberry Pi によるルーターを設置して接続状況や帯域制限をおこなう
Raspberry Pi ルーター設定
eth1 (USB Ether) にアドレスを割り当てる。 (/etc/dhcpcd.conf)
interface eth1
static ip_address=192.168.19.4/24
ルーティングを有効化。 (/etc/sysctl.conf)
net.ipv4.ip_forward=1
外部に出るルータ
経路を設定
- 宛先IPアドレス/マスク長: 192.168.19.0/24
- ゲートウェイ: 192.168.13.4
DNSMasq
DHCP サーバーにもなる DNS Proxy
参考) https://raspberrytips.com/dhcp-server-on-raspberry-pi/
DNSMasq のインストール
sudo apt-get install -y dnsmasq
設定 (/etc/dnsmasq.conf)
interface=eth1
bind-dynamic
domain-needed
bogus-priv
dhcp-range = 192.168.19.128, 192.168.19.191, 255.255.255.0, 12h
dhcp-option = option:router, 192.168.19.4
dhcp-option = option:dns-server, 192.168.19.4
dhcp-option = option:ntp-server, 192.168.19.4
設定反映
sudo systemctl restart dnsmasq
帯域制限 (tc)
参考
- https://linuxjf.osdn.jp/JFdocs/Adv-Routing-HOWTO/lartc.qdisc.classful.html
- https://labs.gree.jp/blog/2014/10/11266/
通信の出力側インターフェイスに設定する。 (ターゲットから出て行く速度を制限する場合は eth0、ターゲットに入る速度を制限する場合は eth1)
速度を指定する際の単位は以下のとおり (ちょっと変則なので注意)
kbit
: kbpsmbit
: Mbpskbps
: KB/s ★kbps ではない!mbps
: MB/s ★Mbps ではない!
qdisc の確認
sudo tc -s qdisc show dev eth0
sudo tc -s qdisc show dev eth1
帯域制限 (TBF; Token Bucket Filter)
すべての通信で帯域を制限する場合。
BITRATE=512kbit
sudo tc qdisc add dev ${QDISC_DEV} root tbf limit 1Mb buffer 200Kb rate ${BITRATE}
帯域制限 (HTB; Hierarchical Token Bucket)
特定のターゲットから 443/tcp 宛の通信のみ制限する場合。(出口側インタフェース: eth0)
QDISC_DEV=eth0
CAMERA_IP=192.168.19.104
BITRATE=512kbit
sudo tc qdisc del dev ${QDISC_DEV} root
sudo tc qdisc add dev ${QDISC_DEV} root handle 1: htb default 20
sudo tc class add dev ${QDISC_DEV} parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
sudo tc class add dev ${QDISC_DEV} parent 1:1 classid 1:10 htb rate ${BITRATE} ceil ${BITRATE} burst 1Mb cburst 1Mb
sudo tc filter add dev ${QDISC_DEV} protocol ip parent 1:0 prio 1 u32 \
match ip protocol 6 0xff \
match ip dport 443 0xffff \
match ip src ${CAMERA_IP} \
flowid 1:10
特定のターゲット宛の通信のみ制限する場合。(ターゲット側インタフェース: eth1)
QDISC_DEV=eth1
CAMERA_IP=192.168.19.104
BITRATE=512kbit
sudo tc qdisc del dev ${QDISC_DEV} root
sudo tc qdisc add dev ${QDISC_DEV} root handle 1: htb default 20
sudo tc class add dev ${QDISC_DEV} parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
sudo tc class add dev ${QDISC_DEV} parent 1:1 classid 1:10 htb rate ${BITRATE} ceil ${BITRATE} burst 1Mb cburst 1Mb
sudo tc filter add dev ${QDISC_DEV} protocol ip parent 1:0 prio 1 u32 \
match ip dst ${CAMERA_IP} \
flowid 1:10
解除
sudo tc qdisc del dev eth0 root
sudo tc qdisc del dev eth1 root
ネットワーク切断
切断状態
ターゲット宛パケットを破棄する。
CAMERA_IP=192.168.19.104
sudo iptables -i eth1 -A OUTPUT -j DROP -p tcp -d ${CAMERA_IP}
解除
sudo iptables -i eth1 -F OUTPUT