ZeroPiを使って、有線LANポートしか対応していないデバイスを、無線LAN環境で使えるようにした。

イーサネットコンバーターとは

今回構築したのは、無線LAN(Wi-Fi)の信号を有線LAN(イーサネット)に変換するもの。無線LANを搭載していないデバイスでも、これを噛ませることによって無線LAN環境で使用可能になる。

 +-----------------------+
 |        Router         |
 +-----------------------+
             |
             |   Wi-Fi
             |
 +-----------------------+
 |  Wi-Fi to Ethernet    |
 |      Converter        |
 +-----------------------+
             |
             |   Ethernet
             |
 +-----------------------+
 |        Device         |
 +-----------------------+

ZeroPiとは

friendlyelec社が製造しているシングルボードコンピューター。製品ページはこちら

シングルボードコンピューターなのにGPIOを搭載せず、ギガビット・イーサネットとUSB2.0ポートを搭載する尖った製品だ。 値段も$26.00とお手頃価格。

特にギガビット・イーサネットに対応かつ、この価格帯のシングルボードコンピューターは貴重。というか唯一無二の製品。

目標

作成したイーサネットコンバーターを使って、無線LAN(Wi-Fi)非対応のテレビを無線LAN経由でインターネット接続させる。

 +-----------------------+
 |        Router         |
 +-----------------------+
             |
             |   Wi-Fi(192.168.1.0/24)
             |
 +-----------------------+
 |  Wi-Fi to Ethernet    |
 |      Converter        |
 +-----------------------+
             |
             |   Ethernet(192.168.2.0/24)
             |
 +-----------------------+
 |        Device         |
 +-----------------------+

必要なもの

  • ZeroPi
  • Archer T2U Nano(Wi-Fi子機)
  • LANケーブル

前提条件

イメージを焼くところとかは割愛。 ssh接続が完了するところまで進めておく。

やること

Archer T2U Nanoドライバーのインストール

  1. カーネルヘッダーのインストール
    $sudo apt install linux-headers-current-sunxi armbian-config
    
  2. 必要なソフトウェアのインストール
    $sudo apt install iw dkms git
    
  3. ドライバーのインストール ( ドライバー本体はここ )
    $git clone -b v5.6.4.2 https://github.com/aircrack-ng/rtl8812au.git
    $cd cd rtl*
    $sudo make dkms_install
    
  4. リブート
    $sudo reboot
    
  5. armbian-configでアクセスポイントを選択
    $sudo armbian-config
    
    Network -> WiFi

eth0のIPアドレスを固定する

  1. /etc/network/interfacesの修正

    $sudo nano /etc/network/interfaces
    
    # Interface eth0
    auto eth0
    allow-hotplug eth0
    iface eth0 inet static
    address 192.168.2.1
    
    

    eth0のIPアドレスを102.168.2.1に設定する

    ※armbian-config等で固定しないこと。競合するようでうまくいかない。

DHCPサーバーの構成

  1. isc-dhcp-serverのインストール

    $sudo apt-get install isc-dhcp-server
    
  2. /etc/default/isc-dhcp-serverの編集

    $sudo nano /etc/default/isc-dhcp-server
    
    INTERFACESv4="eth0"
    
  3. 動作確認

    $sudo service isc-dhcp-server start
    

    Active: active (running)となっていれば問題なし。

/etc/dhcp/dhcpd.confの修正

  1. dhcpcd5のインストール

    $sudo apt install dhcpcd5
    
  2. /etc/dhcp/dhcpd.confの修正

    $sudo nano /etc/dhcp/dhcpd.conf     
    
    authoritative;
    subnet 192.168.2.0 netmask 255.255.255.0 {
         range 192.168.2.2 192.168.2.250;
         option broadcast-address 192.168.2.255;
         option routers 192.168.2.1;
         default-lease-time 600;
         max-lease-time 7200;
         option domain-name "local-network";
         option domain-name-servers 8.8.8.8, 8.8.4.4;
    } 
    

IPフォワード設定

  1. 下記コマンドを実行する

    $sudo iptables -t nat -A POSTROUTING -o wlxc006c3036204 -j MASQUERADE
    $sudo iptables -A FORWARD -i wlxc006c3036204 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    $sudo iptables -A FORWARD -i eth0 -o wlxc006c3036204 -j ACCEPT
    

    コマンド中の「wlxc006c3036204」はWiFiドングル名。

  2. /etc/sysctl.confの修正

    $sudo nano /etc/sysctl.conf
    
    net.ipv4.ip_forward=1
    

ネットワークのメインルートをWi-Fiに設定する

  1. 下記コードをシェルスクリプト(.sh)として保存、実行する
    DEFAULT_IFACE=`route -n | grep -E "^0.0.0.0 .+UG" | awk '{print $8}'`
    if [ "$DEFAULT_IFACE" != "wlxc006c3036204" ]
    then
    GW=`route -n | grep -E "^0.0.0.0 .+UG .+wlxc006c3036204$" | awk '{print $2}'`
    echo Setting default route to wlxc006c3036204 via $GW
    route add default gw $GW wlxc006c3036204
    fi
    

ここまで実施すれば、eth0に接続したデバイスがWi-Fiを介してインターネットに出ていけるはずだ。

ZeroPi起動時に上記の設定を自動実行させる

  1. ~/router.shを作成する

    $nano ./router.sh
    
    service isc-dhcp-server start
    iptables -t nat -A POSTROUTING -o wlxc006c3036204 -j MASQUERADE
    iptables -A FORWARD -i wlxc006c3036204 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -i eth0 -o wlxc006c3036204 -j ACCEPT
    
    DEFAULT_IFACE=`route -n | grep -E "^0.0.0.0 .+UG" | awk '{print $8}'`
    if [ "$DEFAULT_IFACE" != "wlxc006c3036204" ]
    then
         GW=`route -n | grep -E "^0.0.0.0 .+UG .+wlxc006c3036204$" | awk '{print $2}'`
         route add default gw $GW wlxc006c3036204
    fi
    
  2. 実行可能にする

    $chmod +x ~/router.sh
    
  3. rebootしたときに実行されるようにする

    $sudo crontab -e
    
    @reboot sudo /home/pi/router
    

動作確認

手元にあるNanoPi Neoを繋いで試してみる。 ネットワーク図はこんな感じ。

 +-----------------------+
 |        Router         |
 +-----------------------+
             |  Wi-Fi(192.168.1.1/24)
             |   
             |  Wi-Fi(192.168.1.249/24(Static))
 +-----------------------+
 |        ZeroPi         |
 +-----------------------+
             |  Ethernet(192.168.2.1/24(Static))
             |  
             |  Ethernet(192.168.2.7/24(DHCP))
 +-----------------------+
 |      NanoPi NEO       |   
 +-----------------------+

192.168.2.0/24へのアクセスはZeroPiへ飛ばすようルール設定済み。これがないと192.168.1.0/24側からアクセスできない。

とりあえず192.168.1.0/24のネットワークにあるPCからsshしてみる

$ ssh [email protected]
[email protected]'s password:
 _   _ ____  _   _   _
| \ | |  _ \(_) | \ | | ___  ___
|  \| | |_) | | |  \| |/ _ \/ _ \
| |\  |  __/| | | |\  |  __/ (_) |
|_| \_|_|   |_| |_| \_|\___|\___/

Welcome to Armbian 23.02.2 Jammy with Linux 5.15.93-sunxi

System load:   25%              Up time:       1 min
Memory usage:  12% of 491M      IP:            192.168.2.7
CPU temp:      27°C             Usage of /:    2% of 227G

~~略~~

できてる

インターネット側に出ていけるか試してみる

nanopi@nanopineo:~$ ping google.co.jp -c 10
PING google.co.jp (142.250.198.3) 56(84) bytes of data.
64 bytes from nrt12s58-in-f3.1e100.net (142.250.198.3): icmp_seq=1 ttl=55 time=12.3 ms
64 bytes from nrt12s58-in-f3.1e100.net (142.250.198.3): icmp_seq=2 ttl=55 time=12.1 ms
64 bytes from nrt12s58-in-f3.1e100.net (142.250.198.3): icmp_seq=3 ttl=55 time=10.7 ms
64 bytes from nrt12s58-in-f3.1e100.net (142.250.198.3): icmp_seq=4 ttl=55 time=13.0 ms
64 bytes from nrt12s58-in-f3.1e100.net (142.250.198.3): icmp_seq=5 ttl=55 time=11.6 ms
64 bytes from nrt12s58-in-f3.1e100.net (142.250.198.3): icmp_seq=6 ttl=55 time=9.79 ms
64 bytes from nrt12s58-in-f3.1e100.net (142.250.198.3): icmp_seq=7 ttl=55 time=10.8 ms
64 bytes from nrt12s58-in-f3.1e100.net (142.250.198.3): icmp_seq=8 ttl=55 time=11.6 ms
64 bytes from nrt12s58-in-f3.1e100.net (142.250.198.3): icmp_seq=9 ttl=55 time=10.3 ms
64 bytes from nrt12s58-in-f3.1e100.net (142.250.198.3): icmp_seq=10 ttl=55 time=10.8 ms

--- google.co.jp ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9013ms
rtt min/avg/max/mdev = 9.788/11.299/12.975/0.937 ms

よさそう。

パフォーマンス測定

回線速度がどれくらい落ちるのか気になるので測定する。

測定にはSpeedtest® CLIを使用する。

DownloadUploadIdle Latency
ZeroPi経由94.45 Mbps83.07 Mbps11.52 ms
ルーター直差し94.98 Mbps94.78 Mbps10.67 ms

ちなみにNanoPi NEOはギガビットイーサネット対応ではないので注意。

アップロード速度が微妙に遅くなっている位で他は誤差程度の差だ。

まとめ

テレビにつなぎ、DHCPがしっかり動作できていることを確認できた。 ZeroPiはいいぞ。