近況
- 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 が入りません。 - しかし、現時点(2021/1)の最新の Raspbian では、上記はビルドエラーが出てインストールできません。
- Raspberry Pi 1, Zero and ZeroW wiki page needs to be updated · Issue #47 · adrianmihalko/raspberrypiwireguard を参考に、以下の二つをインストールしました。
今回の変更点
- 外部の環境でIPv4しかないところから、VPSにログインするために VPN を張れるようにします。
赤い文字のところが今回追加する IPv6 のアドレスです。
VPNに使うIPv4アドレスにプライベートアドレスを使ったように、IPv6の場合はユニークローカルアドレスを使います。
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
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 の設定を復活すれば良いのかもしれない。(未検証)