au HWD12と Raspberry piで、お外で使えるモバイルWifiルーターを作る

## 概要

自分、Macに auのHWD12をUSBでつないでモバイル通信していたのですが、macOS Catalinaになってから、この機種がUSB接続で使用できなくなりました。

どうやらこの子は、Catalinaで死んでしまう、32bitアプリケーションを使って接続する仕様だったようです。
テザリングで凌ごうにも、いままで一ヶ月で20GBも通信に使っていた手前、下手するとパケ死しかねません。


仕方ないので、Raspberry piを調達し、au HWD12に接続されたモバイルWifiルーターとして動かすことで、間接的に macOS Catalinaからでも使えるようにしました。

----
#### 変更履歴

* 19/11/05火　IPマスカレードの -o usb0 が -o eth0 になっていたので修正

----
## 必要なもの

* au HWD12 データ通信カード
    * これはもともとあった
* Raspberry pi 3 B
    * B+を買ったつもりが、Bでした。でもなんとかなりました
* ラズパイケース
    * 持ち歩き用。なんでもよい
* マイクロSDカード
    * 4GBでよいはず。もう見かけないので8GBを買いました
* マイクロUSBケーブル
    * 電源用
* バッテリー (オプション)
    * なくてもいいけどあるとPCと一緒に移動できて便利
* SDカードに焼くことができるPC

----
## 今回の環境
|機種|OS|SDカード|
|---|---|------|
|Raspberry Pi Model 3 B|Raspbian Buster Lite(2019-9-26)|8GB|

----
## 段取り

### 1. 起動用のSDカードを作成する

OSイメージのZIPファイルを公式サイトからダウンロードし、Etcherで空のSDカードに書き込みます。

**Raspbian公式ダウンロードページ**
いくつかDLリンクがあるが、「with desktop」とかがないやつを選ぶと良い
https://www.raspberrypi.org/downloads/raspbian/

**Etcher**
Mac版もWindows版もあります
https://etcher.io/


### 2. ラズパイ起動・初期設定

Raspberry piに、上記のSDカードをさします。
その後、USBキーボードとHDMIケーブルを挿入して、電源を入れましょう。
なお自分はUSBマウスは使いませんでした。これだと初期設定画面がGUIにならず、コマンドコンソールになるようです。

初期設定画面が出たら、下記の設定をしましょう。

* SSHを有効にする
    * メニューの`5 Interface Options`
    * `P2 SSH`を選択
    * `Would you like the SSH sever to be enabled`で`Yes`を選択
    * `ESC`キー連打で終了

ここで、ログイン画面が出た場合は、ユーザー名`pi`、パスワード`raspberry`でログインした後、`sudo raspi-config`コマンドで設定画面を出せます。

### 3. ラズパイにログイン

ユーザー名`pi`、パスワード`raspberry`でログインします。
パスワードは手順の最後で任意のものに変更します。

### 4. 既存ネットワークに接続

この時点で、有線LANに接続するか、無線LAN設定を行い既存のWifiに接続します。
無線LAN設定をする場合はこのようにします。
なお、ラズパイの内蔵Wifiは2.4GHz帯のみ使用できます。(SSIDに g, Gがついている事が多いです)


`$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf`
を押下した後、`o`を押下し、下記を設定します。
`SSID_OF_YOUR_ENV`と、`PASSWD_OF_YOUR_ENV`は、好きな前適宜既存環境の値を設定してください。


```
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="SSID_OF_YOUR_ENV"
    psk="PASSWD_OF_YOUR_ENV"
}

```
終わったら、`ESC`キーを押して`:x`を押下し保存終了します。保存したくない場合は`:q!`です。



なお、PCで直接マイクロSDカードを編集できる場合は、あらかじめPC上でマイクロSDカードのルートに`wpa_supplicant.conf`ファイルを配置してもよいです。
この場合は、ラズパイ起動時に自動的に `/etc/wpa_supplicant/wpa_supplicant.conf` を上書きするようになっています。
読み込まれたあと、マイクロSDのルートディレクトリに作成したファイルは削除されます。



### 5. ソフトウェアのインストール

まずはシステムを最新にして、その後 `dnsmasq` と `hostapd`をインストールします。
以下の順にコマンドを実行してください。


```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install dnsmasq hostapd
```


インストールが終わったら、`dnsmasq`と、`hostapd` のサービスを一旦終了します。
設定ファイルをこれからいじるので、悪影響を防ぐためです。

```
$ sudo systemctl stop dnsmasq
$ sudo systemctl stop hostapd
```

ちなみにこれらのサービスが動作しているかどうかは、下記のコマンドでわかります。

```
$ systemctl status dnsmasq
$ systemctl status hostapd
```

### 6. USBデータ通信カード HWD12の設定

今回は、USBデータ通信カード「HWD12」で通信するモバイルWifiルータを作りますので、それに必要な関連ソフトをここで導入します。

まず、HWD12をラズパイに挿入してください。
この時点では、USBストレージとして認識されてしまうので、通信はできないと思います。

下記のコマンドを入力します。
`bridge-utils`は、USBデータ通信カードをブリッジにするために導入しています。

```
$ sudo apt-get install bridge-utils -y --no-install-recommends
$ sudo apt-get install usb-modeswitch
$ sudo cp /etc/usb_modeswitch.conf{,.back}
$ sudo vi /etc/usb_modeswitch.conf
```
編集画面が起動しますので、`Shiftキー + G`で、最後の行まで飛びます。
その後、`o`を押すと編集モードに入れるので、下記を入力します。

```
DefaultVendor=0x12d1
DefaultProduct=0x1f03

TargetVendor=0x12d1
TargetProduct=0x14db

MessageContent="55534243123456780000000000000a11062000000000000100000000000000"
```
編集が終わったら、`ESC`キーを押して、`:x`を押して終了します。
その後は下記コマンドを入力してください。

```
$ sudo modprobe usbserial vendor=0x12d1 product=0x14db
$ sudo usb_modeswitch -c /etc/usb_modeswitch.conf
```

ここまで来たら、HWD12 のランプが紫になり、インターネットにつながるようになります。
この時点で、LANは切り離してしまってよいです。


### 7. ネットワーク・インタフェースのブリッジ作成

ラズパイに搭載されている無線LANと、HWD12をつなぐブリッジを作成します。
これによって 無線LAN を アクセス・ポイント化した際に、そのまま HWD12側ののネットワークに接続することができます。

ネットワーク・インターフェースの設定に、ブリッジ・インターフェースを追加して usb0 と wlan0 を ブリッジさせる設定をします。
設定は /etc/network/interfaces ファイルに、下記の3行を追加します. 

`$ sudo vi /etc/network/interfaces`

と押下した後、`Shiftキー+G`を押して末尾に飛びます。
その後、`o`を押して、下記の行を追加します。

```
auto br0
iface br0 inet dhcp
     bridge_ports usb0 wlan0
```

設定後に、ブリッジのインタフェースをupすると状態を確認できます。このとき既存のネットワークが一旦切断されます。

`$ sudo ifup br0`

再起動後、`$ brctl show`コマンドを押下すると、内容が確認できます。


```
$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.021e101f0000       no              usb0
                                                        wlan0
```




### 8. dhcpの設定

次に設定ファイルを編集します。
まずはdhcpの設定です。


`$ sudo vi /etc/dhcpcd.conf`
viが開きまする
`Shiftキー + G`で、最後の行まで飛びます。
その後、`o`を押すと編集モードに入れるので、以下2行を追加します。
これは、「無線LANのネットワークカードのゼロ番(wlan0)に、静的IPアドレスとして 192.168.200.1/24を設定する」という意味になります。
このIPアドレス自体は、好きなものでよいです。


```
interface wlan0
static ip_address-192.168.200.1/24
```

`ESC`キーを押して`:x`と押すと保存終了できます。保存しない時は`:q!`です。

ここまでやったら、dhcpを再起動させます。

`$ sudo service dhcpcd restart`


### 9. dnsmasqの設定

dnsmasqは、インストール時点で設定ファイルが配置されますが、今回やりたいことは単純なので、既存のファイルをリネームして待避し、設定ファイルをいちから作ります。

```
$ sudo mv /etc/dnsmasq.conf /etc/dsnmasq.conf.old
$ sudo nano /etc/dnsmasq.conf
```
viが開いたら、`o`を押して、下記の2行を入力します。
これは、「無線LAN wlan0のIPアドレス貸出範囲は192.168.200.2～192.168.200.40、ネットワークマスクは255.255.255.0、IPアドレス貸出期間は24時間」という意味になります。
独自のIPアドレスにした場合はこちらも変更してください。

```
interface=wlan0
dhcp-range=192.168.200.2,192.168.200.40,255.255.255.0,24h
```
入力したら、`ESC`キーを押して`:x`で終了します。


### 10. hostapdの設定

いよいよhostapdです。これを設定するとアクセス・ポイントが作成されます。
ここでは、自作ルーターのSSIDやパスワードを設定することになります。
まずは、hostapdの設定ファイルを編集します。

`$ sudo vi /etc/hostapd/hostapd.conf`

このファイル、ない場合は新規作成されます。
開いたら、下記を追記してください。

このとき、`YOUR_SSID`と`YOUR_PASSWORD`は適宜書き換えてください。
`YOUR_PASSWORD`は、8-64文字にすることをおすすめします。

```
interface=wlan0
bridge=br0
driver=nl80211
ssid=YOUR_SSID
country_code=JP
hw_mode=g
channel=6
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=YOUR_PASSWORD
```

終わったら、`ESC`キーを押して、`:x`で終了します。
この時、もし、このファイルが新規作成されている場合、権限が `644`などになっていることがあります。
その場合、このファイルは読まれないので、権限を`600`にしてやります。

確認方法
`$ ls -al /etc/hostapd/hostapd.conf`

```
pi@raspberrypi:~ $ ls -al /etc/hostapd/hostapd.conf
-rw-r--r-- root root 220 Oct 30 04:00 /etc/hostapd/hostapd.conf
```

ここで、左はしが`-rw-------`以外になっていたら、`600`ではないので、下記のコマンドを打ってください。

`$ sudo chmod 600 /etc/hostapd/hostapd.conf`

その後、`600`になったことを確認します。


```
pi@raspberrypi:~ $ ls -al /etc/hostapd/hostapd.conf
-rw------- root root 220 Oct 30 04:00 /etc/hostapd/hostapd.conf
```


この後は、この設定ファイルを読み込むように、hostapdの設定ファイルを書き換えます。

`$ sudo vi /etc/default/hostapd`

開くと以下のように表示されると思います。

```
# Defaults for hostapd initscript
#
# See /usr/share/doc/hostapd/README.Debian for information about alternative
# methods of managing hostapd.
#
# Uncomment and set DAEMON_CONF to the absolute path of a hostapd configuration
# file and hostapd will be started during system boot. An example configuration
# file can be found at /usr/share/doc/hostapd/examples/hostapd.conf.gz
#
#DAEMON_CONF=""

# Additional daemon options to be appended to hostapd command:-
#       -d   show more debug messages (-dd for even more)
#       -K   include key data in debug messages
#       -t   include timestamps in some debug messages
#
# Note that -B (daemon mode) and -P (pidfile) options are automatically
# configured by the init.d script and must not be added to DAEMON_OPTS.
#
#DAEMON_OPTS=""
```

真ん中あたりに
`#DAEMON_CONF=""`
という行があります。
ここの行をDAEMON_CONF="/etc/hostapd/hostapd.conf"と書き換えます。

* 先頭の`#`を削除
* 右の""にパス名を入れる

という編集となります。

ここまで来たら、dnsmasqとhostapdを起動してみます。

```
$ sudo systemctl start hostapd
$ sudo systemctl start dnsmasq
```

エラー表示なく起動したらOKです。


### 11. IP転送の設定

ここまでで無線LANのアクセスポイントが設定されました。
この後は、無線LANに接続したPCなどから、HWD12につながるよう設定します。

システム設定ファイルを編集し、ポートフォワード機能を有効化します。

`$ sudo vi /etc/sysctl.conf`

28行目くらいに、下記の行があります。(net.ipv6.conf.all.forwardingや、net.ipv4.confなど、紛らわしい行が多いので気をつけてください)

```
#net.ipv4.ip_forward=1
```
これを下記のように書き換えます。
先頭の`#`にカーソルをあわせて`x`を押すと`#`が消えます。

```
net.ipv4.ip_forward=1
```
設定後、`ESC`キーを押して`:x`で終了してください。
再起動後、ポートフォワードが有効になります。


### 12. IPマスカレード設定

最後に、IPマスカレードの設定です。
しかし、2019年11月時点では、iptablesの最新1.8以上になると、このコマンドが使えません。
ほっとくと勝手に1.8になるので、まずは、iptablesをレガシーモードで動くようにしてやります。

`$ sudo update-alternatives --config iptables`

と打つと、下記のように出ます。

```
pi@raspberrypi:~ $ sudo update-alternatives --config iptables
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).

 Selection    Path                      Priority Status
----------------------------------------------------
  0            /usr/sbin/iptables-nft    20       auto mode
* 1            /usr/sbin/iptables-legacy 10       manual mode
  2            /usr/sbin/iptables-nft    20       manual mode

Press <enter> to keep the current choice[*:, or type selection number:

```

ここでは、`1`を押してやります。

この後、`$ iptables --version`と押すと、

```
iptables v1.8.2 (legacy)
```

等とでるので、切り替わったことがわかります。


この後は、下記のコマンドを実行してください。

`$ sudo iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE`

その後は、下記のコマンドを実行します。

`$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat`
`$ cat /etc/iptables.ipv4.nat`

ファイルに内容が書かれていることを確認したら、次に下記のコマンドで、以下のファイルを開いてください。

`$ sudo vi /etc/rc.local`

一番下に `exit 0`という行があります。この行が実行されると、シェルは止まります。
この行の下ではなく、上に、以下の行を追加します。

```
iptables-restore < /etc/iptables.ipv4.nat
dhclient -4 -v usb0
ifdown br0
ifup br0
```
追加したら、`ESC`キーを押した後、`:x`を押して終了です。

これで、ルーターの設定は終了です。
ラズパイを再起動します。

`$sudo reboot`

しばらくすると、先ほど hostapd で設定したSSIDが見えるようになっていると思います。
設定したパスワードを入れると接続できるようになります。

問題なければ、ラズパイにログインし、OSパスワードを変更してください。

`$ passwd`

これで終了です。お疲れ様でした。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190535/49a042d1-a75f-bbf6-990e-76264c3897f5.jpeg width=50% height=50%>


---
## 使用感

* 起動までに2〜3分かかります。
* たまに、起動後にインターネット接続に失敗することがあります。そのときはルーターを再起動してください。
* 通常の使用では問題ないのですが、たまにビデオ会議で切れたりすることがあります。
* wifiの電波は、15mくらいはゆうに届くようです。
* 普通のUSB電源だと、バッテリーの電力不足エラー(Under-voltage detected)が出ることがあります。ラズパイ用の電源/バッテリーを使うと解消するかもしれません。



---
## 参考にしたサイト

こちらの記事を参考にしました。ありがとうございます!

Raspberry Pi 3 Model B+の無線LANでルータを構成する
http://mekiku.com/view.php?a=51

RaspberryPiでルーターを自作し無線AP化
https://qiita.com/wannabe/items/a66c4549e4a11491f9d5

Raspberry Pi 3 を WiFi アクセス・ポイント化する 
https://azriton.github.io/2017/03/22/Raspberry-Pi-3-%E3%82%92-WiFi-%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%BB%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E5%8C%96%E3%81%99%E3%82%8B/

RaspberryPi で Huawei の HWD12 を使う方法 
https://blog.kakakikikeke.com/2015/12/raspberrypi-with-huawei-hwd12.html