RaspberryPiでルーターを自作し無線AP化

今までWiMax2を使ってたんですが、聞いて分かるように速度制限だったり、そもそも遅かったり、インフラの勉強がてら自宅の環境いじるのが出来なかったりと色々不便だったのでau光を契約しました。

アパートでしたが新築で共有回線も無いので管理会社に問い合わせて許可を取り、戸建てプランで契約したんですが、**うっかり**無線LANオプションに申し込み忘れてしまいました。

これでは有線でしか接続できない!3DプリンタやAmaz○nFireTVがインターネットに繋がりません。

#RaspberryPi 「待たせたな」

茶番はここまでにして早速RaspberryPiを無線AP化していきます。
環境は以下の通り

|機種|OS|SD|
|---|---|---|
|RaspberryPi Model 3 B|Raspbian Stretch Lite(2018-11-13)|SP 32GB|

早速やって行きます。
なお、作る上で[ここの記事とかオススメです](https://qiita.com/mogulla3/items/efb4c9328d82d24d98e6)
あとは[TCP/IP本](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP-%E5%85%A5%E9%96%80%E7%B7%A8-%E7%AC%AC5%E7%89%88-%E7%AB%B9%E4%B8%8B/dp/4274068765)とか

#環境構築
[公式サイト](https://www.raspberrypi.org/downloads/raspbian/)からRaspbianのLite版のzipをダウンロードします。
<img width="128" alt="スクリーンショット 2019-03-25 2.29.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/3e3f5bfd-f382-c43e-641d-75d08eeccea3.png">

SDカードに書き込むのは[Etcher](https://www.balena.io/etcher/)を使いました。
<img width="805" alt="スクリーンショット 2019-03-25 2.30.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/249725/39ca6fe5-a629-e21e-8ba3-e9ebb7804e2e.png">

SDに書き込みが完了したらSSHの設定をします。Lite版なので。
一度MacからSDカードを抜き、再度差し込みます。
Terminalを開いて、以下のコマンドを実行。
`$ touch /Volumes/boot/ssh`
今回RaspberryPiは有線で繋いでますが、無線でやる場合以下の手順を踏んでください。
`$ vi /Volumes/boot/wpa_supplicant.conf`
以下を追加

```
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="YOUR_SSID"
    psk="YOUR_PASSWORD"
}
```
見て分かるように、`YOUR_SSID`にはRaspberryPiを接続するSSID、
`YOUR_PASSWORD`はそこのパスワードを入力します。

ここまで来たら、SDカードを取り出しRaspberryPiに挿入。
電源を入れて少し待ってからSSHで接続します。
基本的に、RaspberryPiの初期ユーザーはpiで、パスワードはraspberryです。
また、LAN内であれば`raspberrypi.local`で名前解決出来ます。
`$ ssh pi@raspberrypi.local`

#ソフトウェアのインストール
sshしたら、必要なソフトウェアをインストールします。
以下の順でコマンドを実行。

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

`dnsmasq`と`hostapd`のインストールが終わったら、これらのサービスを終了させます。

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

#dhcpの設定
次に設定ファイルを編集していきます。
まずはdhcpの設定。
`$ sudo vi /etc/dhcpcd.conf`
`Shift + G`で最後の行まで飛び、以下を追加します。

```
interface wlan0
static ip_address=192.168.100.1/24
```

今回は自宅用なので192...で設定します。ただ、ここは好きなもので構わないです。
`ESC`押して`:x`で保存して終了しましょう。
ではdhcpを再起動させます。
`$ sudo service dhcpcd restart`

#dnsmasqの設定
お次はdnsmasqの設定です。
dhcpと同じく`/etc/`の中にあるんですが、こちらのファイルすごい長いのでコピー取って新しく追加します。必要なのは2行だけですので。

```
$ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.old
$ sudo vi /etc/dnsmasq.conf
```
以下の2行を追加します。

```
interface=wlan0
dhcp-range=192.168.100.2,192.168.100.40,255.255.255.0,24h
```
`dhcp-range`の設定は、dhcpの時に設定したアドレスと照らし合わせて記入してください。
同じく`ESC :x`で保存して終了。

#hostapdの設定
次はhostapdです。ここで自作ルーターのSSIDやパスワードを設定していきます。
まずは設定ファイルを開きましょう。
`$ sudo vi /etc/hostapd/hostapd.conf`
私の環境ではこのファイルは無かったので新規作成されました。
開いたら以下を追加。

```
interface=wlan0
driver=nl80211
ssid=YOUR_SSID
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
```
書き換える部分は`YOUR_SSID`と`YOUR_PASSWORD`です。お好きなものを入力しましょう。ただしパスワードは8~64文字で。
また、全ての設定が完了し、接続する時に繋がりにくいと感じた場合`channel`の値を変更してみてください。
保存して終了したら、この設定ファイルを読むように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"`と書き換えましょう。
viでの操作ですと、`#`にカーソルをあわせ、`x`で消去、2個目の`"`にカーソルをあわせ`i`でインサートモードに入り、編集後、保存して終了。
deleteキーや、インサートモード時にカーソルキー移動しようとすると、別のキー入力として解釈されるので、慣れない人はnanoでも使ってください。
ここまで来たら、dnsmasqとhostapdを起動しましょう。

```
$ sudo systemctl start hostapd
$ sudo systemctl start dnsmasq
```
##Failed to start hostapd.service: Unit hostapd.service is masked.
もし、hostapdを起動させようとした時、上記エラーが出た場合、以下の手順でコマンドを実行してください。

```
$ sudo systemctl unmask hostapd
$ sudo systemctl enable hostapd
$ sudo systemctl start hostapd
```
#IP転送
残り少しです。IP転送の設定をします。
`$ sudo vi /etc/sysctl.conf`
長めですが多分30行目前半あたりに`#net.ipv4.ip_forward=1`とあるはずなので、#にカーソルをあわせ、xキーを押し、コメントを外して保存終了。

#マスカレード
最後の項目です。IPマスカレードの設定をします。
下記コマンドを実行してください。
`$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE`
私の環境だと、ここで

```
iptables v1.6.0: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
```
とエラーを吐かれました。解決は下の方に書いてます。エラーが出てない人はこのまま進んでいきましょう。
`$ sudo sh -c iptables-save > /etc/iptables.ipv4.nat`
を実行し、以下のファイルを開きます。
`$ sudo vi /etc/rc.local`
一番下に`exit 0`とあるので、その上に以下の行を追加します。
`iptables-restore < /etc/iptables.ipv4.nat`
追加したら保存して終了。
これで自作ルーターの設定は終わりです。お疲れ様でした。最後にRaspberryPiを再起動しましょう。
`$ sudo reboot`
しばらくすると、先程hostapdで設定したSSIDが見えるようになってますので、設定したパスワードで繋いでみましょう。
以下が私の環境です。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">自作ルーター完了 <a href="https://t.co/Q9l4Fai3Zl">pic.twitter.com/Q9l4Fai3Zl</a></p>&mdash; にし (@cidr_cuckooo) <a href="https://twitter.com/cidr_cuckooo/status/1109868935829045248?ref_src=twsrc%5Etfw">2019年3月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##iptables v1.6.0: can't initialize iptables table...とエラーが出る
上記の場合、以下の手順で解決できます。
`$ sudo modprobe ip_tables`
を実行後、
`$ sudo echo 'ip_tables' >> /etc/modules`
の後に、再度
`$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE`

##sudo modprobe ip_tablesでもエラーが、、、
私の環境だと、更に以下のエラーが出ました。

```
modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.14.79-v7+/modules.dep.bin'
modprobe: FATAL: Module ip_tables not found in directory /lib/modules/4.14.79-v7+
```
この場合、以下の順でコマンドを実行していってください。

```
$ sudo apt update
$ sudo apt upgrade
$ sudo reboot
$ sudo modprobe ip_tables
```
これで解決出来ました。

##Permission denied
`sudo`をつけてるのにアクセス拒否される場合は、
`$ sudo su`
の後に再度実行してみてください。