Raspberry Piを自宅のwifiに接続したままアクセスポイントとしても使用する

# はじめに

Raspberry Piを使用する際、SSHやVNCで接続することがほとんどである。この時、windowsやmacなどのPCとRaspberry Piを自宅などの同じwifiに接続して使用するが、Raspberry Piの機能でwifiのアクセスポイントとして有効にし、ネットワーク環境が無い場所でも使用できるようにしていく。

なお、既に自宅などのwifiには接続されている前提とする。

# 仮想wifiインターフェース作成

デフォルトで`wlan0`があるので、`iw dev`コマンドで確認する。

```
$ iw dev
phy#0
	Unnamed/non-netdev interface
		wdev 0x3
		addr e6:5f:01:05:24:87
		type P2P-device
		txpower 31.00 dBm
	Interface wlan0
		ifindex 3
		wdev 0x1
		addr e4:5f:01:05:24:87
		ssid D80F99DB9298-5G
		type managed
		channel 36 (5180 MHz), width: 80 MHz, center1: 5210 MHz
		txpower 31.00 dBm
```

これを自宅のwifiに接続したまま、新たに仮想wifiインターフェースを作成してアクセスポイントとして使用する。

```
$ sudo iw phy phy0 interface add ap0 type __ap
$ sudo ip link set ap0 address e4:5f:01:05:24:87
```

で、仮想インターフェースの作成とMACアドレスの設定をすればOKだが、再起動でリセットされてしまうので、udevを利用して起動時に自動で作成するように設定する。

```
$ sudo nano /etc/udev/rules.d/99-ap0.rules
```

などで`/etc/udev/rules.d/99-ap0.rules`を作成し、中に以下のように記述する。

```:/etc/udev/rules.d/99-ap0.rules
SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="e4:5f:01:05:24:87", KERNEL=="phy0", \
  RUN+="/sbin/iw phy phy0 interface add ap0 type __ap", \
  RUN+="/bin/ip link set ap0 address e4:5f:01:05:24:87"
```

※MACアドレスの値は自分のものに置換

これで再起動時に自動で`ap0`が作成されるはず。

# パッケージのインストール

`hostpd` `dnsmasq`をインストールする。

```
$ sudo apt install hostapd dnsmasq
```

# DHCPサーバーの設定(dnsmasq)

dnsmasqの設定ファイル`/etc/dnsmasq.conf`を編集する。

```
$ sudo nano /etc/dnsmasq.conf
```

ファイル末尾に以下を追加する。

```:/etc/dnsmasq.conf
interface=ap0
dhcp-range=192.168.81.50,192.168.81.150,255.255.255.0,12h
```

`dhcp-range=リースする最初のアドレス,リースする最後のアドレス,リース期間`のように、DHCPクライアントに配布するアドレスとリース期間を設定する。

# DHCPクライアントの設定(dhcpcd)

アクセスポイントのIPアドレスを固定するために`/etc/dhcpcd.conf`を編集する。

```
$ sudo nano /etc/dhcpcd.conf
```

ファイル末尾に以下を追加する。

```:/etc/dhcpcd.conf
interface ap0
static ip_address=192.168.81.1/24
nohook wpa_supplicant
```

これで、アクセスポイントのIPアドレスを`192.168.81.1`に固定できる。

# hostapdの設定

`/etc/hostapd/hostapd.conf`というファイルでhostapdの設定をする。

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

```:/etc/hostapd/hostapd.conf
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=ap0
driver=nl80211
ssid=＜ここに指定するSSIDを入れる＞
hw_mode=g
country_code=JP
channel=11
ieee80211d=1
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_passphrase=＜ここに指定するパスワードを入れる＞
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
```

hostapdは自動で有効にならないので、起動時に有効になるように以下のコマンドを実行する。

```
$ sudo systemctl unmask hostapd.service
$ sudo systemctl enable hostapd.service
```

# ここまでの動作を確認する

以上が完了したら再起動し、動作を確認してみる。

スマホなどからアクセスポイントを探してみる（wifiの設定などを開く）と、設定したSSIDのアクセスポイントが見えて、設定したパスワードで接続できるはず。

インターネットには接続していないので、`インターネットに接続されていません`という表示が出たりする。


# インターネットにも接続できるようにする

このままでは、Raspberry Piのwifiに接続している際にインターネットが使えなくなってしまうのでインターネットに接続できるように設定していく。


# IPv4フォワーディングの有効化

```
$ sudo sysctl -w net.ipv4.ip_forward=1
```

これを実行すれば良いが、再起動時に消えるため、`/etc/sysctl.d/routed-ap.conf`を作成する。

```
$ sudo nano /etc/sysctl.d/routed-ap.conf
```

```:/etc/sysctl.d/routed-ap.conf
net.ipv4.ip_forward=1
```

これで、起動時にIPv4フォワーディングが有効になる。


# IPマスカレード(NAPT)の有効化

IPマスカレード機能で、応答を返す先を指定して正しく通信が出来るようにする。

```
$ sudo iptables -t nat -A POSTROUTING -s 192.168.249.0/24 ! -d 192.168.249.0/24 -j MASQUERADE
```

実行すると設定が完了する。（`iptables`はLinuxのファイアウォール機能やNAT機能を設定するツール）

再起動で設定が消えてしまうので、`netfilter-persistent`で設定を保存する。

まずはパッケージをインストール。

```
$ sudo apt install netfilter-persistent iptables-persistent
```

設定を保存するか聞かれるのでYesを選択する。

その後、以下のコマンドで設定を`/etc/iptables/`以下に保存し、再起動時に読み込まれるようになる。

```
$ sudo netfilter-persistent save
```


# インターネットに接続するか確認

再起動し、適当なサイトにアクセス出来たらOK。



# 参考

https://www.mikan-tech.net/entry/raspi-wifi-ap-sta

https://www.mikan-tech.net/entry/raspi-ap-sta-router

https://github.com/lukicdarkoo/rpi-wifi

https://blog.thewalr.us/2017/09/26/raspberry-pi-zero-w-simultaneous-ap-and-managed-mode-wifi/

https://qiita.com/JhonnyBravo/items/5df2d9b2fcb142b6a67c


# 関連記事

https://qiita.com/tatsuki1119/items/cfcd9220e2c20b01bbf6