Raspberry Piでモバイルルーターを作成する-wvdial,hostpad, dnsmasq
手元にあるRaspberry Pi 2とMVNOであるIIJmioのSIMカードを利用したモバイルルーターの作成を検討している。
手元にある以下のパーツを使用して、モバイルルーターの作成を行う。
- Raspberry Pi 2(memory 1GB)
WI-U2-433DM親機モードが無いため- WLI-UC-GNM2
- docomo L-02C
価格に関しては、RPが約5,000円とL-02Cがメルカリで1,000円、WLI-UC-GMN2がメルカリで600円でした。
microSDカードやUSBは手持ちですので、価格は7,000以下となります。
「raspberry pi ZERO」シリーズを使用すれば、3,000円ほどで作れるかもしれません。
Rasbianのインストール
debian系列のRasbianをSDカードに書き込む
ダウンロードサイトはこちら
テンプレートなので、以下記録のみ
diskutil list
/dev/disk2 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *8.0 GB disk2
1: EFI EFI 209.7 MB disk2s1
2: Microsoft Basic Data BOOT 7.8 GB disk2s2
sudo diskutil eraseDisk FAT32 BOOT /dev/disk2
diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
sudo gdd bs=1M if=2020-02-13-raspbian-buster.img of=/dev/rdisk2 conv=sync status=progress
3778019328 bytes (3.8 GB, 3.5 GiB) copied, 246 s, 15.4 MB/s
3612+0 records in
3612+0 records out
3787456512 bytes (3.8 GB, 3.5 GiB) copied, 246.827 s, 15.3 MB/s
WI-U2-433DM用ドライバーをインストール
rasbianでは、「WI-U2-433DM」を使用することができないのでドライバーをインストールする必要がある。
現在のカーネル情報
uname -a
Linux raspberrypi 4.19.97-v7+ #1294 SMP Thu Jan 30 13:15:58 GMT 2020 armv7l GNU/Linux
ドライバーのダウンロード
sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv raspberrypi-kernel-headers dkms build-essential bc
cd /usr/src
sudo git clone https://github.com/abperiasamy/rtl8812AU_8821AU_linux.git
cloneしたフォルダにあるMakefileを以下の箇所をyとnを入れ替える。
- CONFIG_PLATFORM_I386_PC = n
- CONFIG_PLATFORM_ARM_RPI = y
makeしてインストールを行う。
sudo make
sudo make install
sudo modprobe -a rtl8812au
WI-U2-433DMをRaspberry Piへ差し込み、「ifconfig」と入力すると「wlan0」が存在してることがわかる。
LTE接続を行う
外部通信を行うために「wvdial」をインストールする。
sudo apt-get install wvdial
今回使用する「L-02C」ですが、稀にストレージディバイスとして認識されてしまうようです。
この場合、固定ディバイス化する必要がありますが、今回はその必要がありませんでした。
「ls -l /dev」でttyUSB*が表示されることを前もって確認しましょう。
通信するに当たり、「/etc/wvdial.conf」をiijmioとして書き込みを行います。
[Dialer Defaults] Init1 = ATZ Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 Init3 = AT+CGDCONT=1,"IP","iijmio.jp" Dial Attempts = 3 Stupid Mode = 1 Modem Type = Analog Modem Dial Command = ATD Stupid Mode = yes Baud = 460800 New PPPD = yes APN = iijmio.jp Modem = /dev/ttyUSB2 ISDN = 0 Phone = *99# Password = iij Username = mio@iij Carrier Check = no
「sudo wvdial」で通信を行い、CONNECTの文字が表示されることを確認しましょう。
また、ifconfigを行うと「ppp0」が表示されるはずです。
終了する場合は、「Ctrl-C」です。
自動起動のために「/etc/systemd/system/wvdial.service」を作成します。
[Unit]
Description=wvdial service
Wants=network.target
[Service]
ExecStart=/usr/bin/wvdial
ExecStop=/bin/kill -HUP $MAINPID
Type=simple
Restart = always
[Install]
WantedBy=multi-user.target
以下のコマンドでスタートとステータスを確認しつつ、自動起動とする
sudo systemctl start wvdial.service
sudo systemctl status wvdial.service
sudo systemctl enable wvdial.service
以上で、LTE接続まで完了
Wi-Fiスポットを作成
まだapt installをすることがあるので、パケット通信に上限がある方は有線接続を継続することをおすすめします。
wi-fiのアクセスポイントサービスをインストールするためにhostapdをインストールします。
起動設定まで確保してしまいます。
sudo apt install hostapd
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo apt install dnsmasq
ここでインストールした2つのサービスには以下の役割があります。
- hostapd:Wi-Fiアクセスポイントとしてサービスを提供
- dnsmasq:IPアドレスの振り分けなどネットワーク関連のサービスを提供
最後に「netfilter-persistent」とそのプラグインである「iptables-presistent」をインストールします。
sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent
ネットワークを設定
ワイヤレスネットワーク用のDHCPサーバーを構築します。
そのため、無線側であるwlan0へ静的IP構成が必要となります。
古いRasbianであれば「/etc/network/interfaces」へDHCPの設定を行いますが、新しい 場合は「/etc/dhcpcd.conf」が推奨されております。
/etc/dhcpcd.confを以下のように変更し、静的IPを設定します。
interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant
ルーティングとIPマスカレードを設定
ルーティングにより、Rasbianのネットワークから別のネットワークへトラフィックを流れるようにするための設定はこちらです。
/etc/sysctl.d/routed-ap.conf
# https://www.raspberrypi.org/documentation/configuration/wireless/access-point-routed.md
# Enable IPv4 routing
net.ipv4.ip_forward=1
このルーティング設定によって、ネットワーク「192.168.4.0/24」からメインルーターにインターネット接続ができるようになります。
次に以下のプロセスをファイヤーウォールルールへ設定します。
- メインルーターは、無線クライアントからのすべての発信トラフィックをRaspberry Piからのトラフィックとして認識し、インターネットとの通信を可能にします。
- Raspberry Piはすべての着信トラフィックを受信し、IPアドレスを置き換え、トラフィックを元のワイヤレスクライアントに転送します。
これを実現するための設定方法はこちらです。
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
単純なwi-fiルーターを構築したい場合は、「ppp0」を「eth0」へ変更するだけです。
次にIPv4のファイアウォールルールとIPv6を保存して、起動時に「netfilter-persistent」サービスによってロードされるようにします。
sudo netfilter-persistent save
これで、ファイアウォールルールが自動化され舞うが、変更をこない場合は、将来的に注意が必要となります。
ワイヤレスネットワークのDHCPおよびDNSサービスを構成
DHCPおよびDNSサービスは、「dnsmasq」によって実現できます。
デフォルトのテンプレートをバックアップして、ファイルの修正を行います。
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
ファイルの中身は以下のようにします。
interface=wlan0 # Listening interface
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
# Pool of IP addresses served via DHCP
domain=wlan # Local wireless DNS domain
address=/gw.wlan/192.168.4.1
# Alias for this router
これにより、DHCPで192.168.4.2~192.168.4.20までのIPアドレスを提供できます。
ワイヤレスアクセスポイントを設定
接続したwi-fiドングルが、ハードウェアとソフトウェアでロックがかかっていないか見る必要があります。
sudo rfkill unblock wlan
hostapdでアクセスポイントを設定する方法は、「/etc/hostapd/hostapd.conf」で行います。
country_code=JP
interface=wlan0
ssid=ras-wifi
hw_mode=g
channel=7
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=raspberry
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
以外にも最も重要な設定値は、「country_code」だったりします。
本設定では、SSIDが「ras-wifi」として表示され、パスワードは「raspberry」となります。
「hw-mode=g」とは、「IEEE 802.11g」を指します。
これは、使用しているwi-fiドングルにも依存する保で注意が必要です。
- a = IEEE 802.11a(5 GHz)
- b = IEEE 802.11b(2.4 GHz)
- g = IEEE 802.11g(2.4 GHz)
- ad = IEEE 802.11ad(60 GHz)
ここまで完了したら、rasbianの再起動を行いましょう。
sudo systemctl reboot
手持ちのスマートフォンなどでSSIDが表示され、ネットワーク接続が可能であることを確認しましょう。
さいごに
最初は、「WI-U2-433DM」というwi-fiドングルを使用していたのですが、SSIDが表示されるが「パスワードが違います」と表示されてしまいました。
syslogを見ても、DHCPサーバーでエラーが起きているようにも見えず、3日ほど悩みました。
理由は単純で、「WI-U2-433DM」はそもそもホットスポットという親機モードに対応していないことが原因でした。
他の技術ブログでは、「WI-U2-433DM」で設定したがDHCPの設定がうまく行かないという理由はこのためです。
親機モードが使える「WLI-UC-GNM2」を差してみたところ、正常にwi-fiへ接続され、ネットワークへのアクセスも確認できました。
(ドライバーが一緒なので、そのまま使えます。)
しかし、acモードで接続できないため、当初の想定よりも通信速度が遅くなってしまいました。
wi-fi接続による通信速度ですが、上がりも下りも10Mbpsを超えるくらいでした。
なお「WLI-UC-GNM2」の最新版である「WLI-UC-GNM2S」ですと、使用できない口コミがありましたので、あえて「WLI-UC-GNM2」使用しておりました。
[Setting up a Raspberry Pi as a routed wireless access point]