LoginSignup
6
5

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-01-23

WireGuard で VPS 経由で家庭内に入る の続き

近況

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

Raspberry Pi の wireguard について

今回の変更点

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

wireguard2.png

赤い文字のところが今回追加する 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/24192.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 の設定を復活すれば良いのかもしれない。(未検証)
6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5