WireGuard で VPS 経由で家庭内に入る(その2)

[WireGuard で VPS 経由で家庭内に入る](https://qiita.com/false-git@github/items/bf3884030a954751cd09) の続き

# 近況

* VPS に ssh のアタックが多くてログがうざいので、IPv4 での LISTEN をやめて IPv6 だけにしました。
* Raspberry Pi が起動しなくなったので調べたところ、SDカードがお亡くなりになったようなので、別SDにインストールしなおして、overlayfs で ROM化しました。
* ssh が IPv4 でしか LISTEN しなくなったので、IPv6 が使えない環境からVPSにログインできなくなりました。

# Raspberry Pi の wireguard について

* 前回の記事で、`apt install wireguard` とかさらっと書いてありましたが、うちにあるのは無印 Raspberry Pi Model B なので、apt では wireguard が入りません。
    * 前回は、[Install WireGuard on Raspberry Pi 1, 2 (not v1.2), Zero, Zero W · adrianmihalko/raspberrypiwireguard Wiki](https://github.com/adrianmihalko/raspberrypiwireguard/wiki/Install-WireGuard-on-Raspberry-Pi-1,-2-(not-v1.2),-Zero,-Zero-W) を見てインストールしていました。
* しかし、現時点(2021/1)の最新の Raspbian では、上記はビルドエラーが出てインストールできません。
* [Raspberry Pi 1, Zero and ZeroW wiki page needs to be updated · Issue #47 · adrianmihalko/raspberrypiwireguard](https://github.com/adrianmihalko/raspberrypiwireguard/issues/47) を参考に、以下の二つをインストールしました。
    * https://git.zx2c4.com/wireguard-linux-compat/
    * https://git.zx2c4.com/wireguard-tools

# 今回の変更点

* 外部の環境でIPv4しかないところから、VPSにログインするために VPN を張れるようにします。

![wireguard2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3357/bcef3195-feb4-12b3-d8a2-babb7bd36a22.png)

赤い文字のところが今回追加する IPv6 のアドレスです。

VPNに使うIPv4アドレスにプライベートアドレスを使ったように、IPv6の場合は[ユニークローカルアドレス](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%8B%E3%83%BC%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)を使います。
`fc::`または`fd::`で始めればなんでも良いのですが、RFC4193 と言うのがあるらしいので、それを使います。timestampとmacアドレスから生成するものですが、既に実装済みのものがいくつもあるので、私は https://cd34.com/rfc4193/ を使って上記アドレスを生成しました。

## VPS(FreeBSD) の設定

wireguardの設定は、Addressおよび AllowedIPsにv6アドレスを追加するだけ。(Qiitaでシンタックスハイライトじゃなくてコードブロックを強調する方法ってないのかな？)

```/usr/local/etc/wireguard/wg0.conf
[Interface]
Address = 192.168.1.1, fd15:6ef3:7073:1::1
ListenPort = 51820
PrivateKey = <private key of server>

[Peer]
PublicKey = <public key of raspberry pi>
AllowedIPs = 192.168.1.2/32, 192.168.0.0/24, fd15:6ef3:7073:1::2, fd15:6ef3:7073:0::/64
```
```/usr/local/etc/wireguard/wg1.conf
[Interface]
Address = 192.168.2.1, fd15:6ef3:7073:2::1
ListenPort = 51821
PrivateKey = <private key of server>

[Peer]
# iphone
PublicKey = <public key of iphone>
AllowedIPs = 192.168.2.2/32, fd15:6ef3:7073:2::2
```

これ、テストし切れていないのでうまく行っているか不明。

```/etc/rc.conf(差分)
ipv6_gateway_enable="YES"
```

## Rasipberry PI の設定

```wg0.conf
[Interface]
PrivateKey = <private key of raspberry pi>
Address = 192.168.1.2, fd15:6ef3:7073:1::2
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT

[Peer]
PublicKey = <public key of server>
EndPoint = <host name or ip address of server>:51820
AllowedIPs = 192.168.1.0/24, 192.168.2.0/24, fd15:6ef3:7073:1::/64, fd15:6ef3:7073:2::/64
PersistentKeepalive = 25
```

```/etc/sysctl.conf(差分)
net.ipv6.conf.all.forwarding=1
```

## iPhoneの設定

```wg0.conf
[Interface]
PrivateKey = <private key of iphone>
Address = 192.168.2.2, fd15:6ef3:7073:2::2

[Peer]
PublicKey = <public key of server>
EndPoint = <host name or ip address of server>:51821
AllowedIPs = 192.168.2.0/24, 192.168.1.0/24, 192.168.0.0/24, fd15:6ef3:7073::/48
PersistentKeepalive = 25
```

## NVR510 の設定

* prefix 2 として家庭内用のULAを設定。(prefix 1 はプロバイダからdhcpで割り当てられる)
* 家庭内LAN側に ULA の `::1` を割り当てる
* `rdadv` を prefix 1 だけでなく prefix 2 も送るようにする
* ULA宛の静的ルーティングを Raspberry Pi にする
* 参考: [IPv6 でアドレスの手動設定はイヤ - JULY’s diary](https://july-diary.hatenablog.com/entry/20140322/p1)

```
ipv6 prefix 2 fd15:6ef3:7073:0::/64
ipv6 lan1 address fd15:6ef3:7073:0::1/64
ipv6 lan1 rtadv send 1 2 o_flag=on
ipv6 route fd15:6ef3:7073::/48 gateway <raspiのULA>%lan1
```

# できるようになったこととできないこと

* IPv4しかない外部端末から、VPSにVPNを貼ることで、VPSのIPv6アドレスにsshできるようになった。
* ~~家庭内 ⇔ 外部端末での IPv6 通信はできない。~~
    * ~~これは、AllowedIPs に新しく割り当てたユニークローカルアドレスのみを書いていて、家庭内のリンクローカルアドレスを書いていないためと思われる。~~ ← リンクローカルではなく ULA を家庭内にも振って、AllowedIPs に書いた。
    * IPv4の場合、`192.168.1.0/24` と `192.168.2.0/24` が VPN 用のサブネットで、`192.168.0.0/24` が家庭内LANのサブネット。全部プライベートアドレスなので、この間でルーティングしても問題ない。(VPN用のサブネットは、`192.168.0.0/16` を使わないで `172.16.0.0/12` を使った方がわかりやすかったかも)
    * IPv6の場合、`fd15:6ef3:7073::/48` が VPN 用のサブネットで、家庭内のv6アドレスはグローバルアドレスとリンクローカルアドレスしかないため、ルーティングするのが辛い。(今にして思えば、`fd15:6ef3:7073:0::/64` を家庭内、`fd15:6ef3:7073:1::/64`, `fd15:6ef3:7073:2::/64` をVPNとかにすれば v4と対応が取れて綺麗だった ← 振り直したので、上記を修正しました)
    * 当面の目的は果たせたのでこのままで良いことにする。
    * ~~だったらnvr510のipv6 静的routing の設定は不要だったのではと思ったりする。~~
* 外部端末 → Internet の IPv6 通信はできない
    * これは、v4のときに意図的にそうしたので v6 もそうしているのだが、できた方が便利かも知れない。そのときは nat の設定を復活すれば良いのかもしれない。(未検証)