コンテンツにスキップ

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 : kbps
  • mbit : Mbps
  • kbps : 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