VPSとWireGuardでVPNサーバ建ててついでにIPv4オンリーな環境からv6で外に出るやつ
Overview
やりたいこと
グローバルIPアドレスが固定じゃなく、かつ外からも入ってこれないそんな固定回線にいじめられているのですが、その対策とか、フリーウィーフィーに繋げざるを得ない時暗号化だけでもする用だとか、あるいはIPv4でしかインターネットにしか抜けられない環境でIPv6を手に入れるとか、そういうやつ。
v4, v6デュアルスタックなVPSやらIaaSならどこ使ってもこの記事と似たようなことできると思いますが今回はConoHaを使ってます。
単にスペックだけ見るならLinodeとかのが良さそう。
AWSとか使ってもいいけど通信料金考えるのがねーとなったため候補からも外しました。
常時使うわけじゃないから使うときだけ立ち上げて、とすればかなりいいけど、そうすると起動用のiOSショートカットだとか何かしらを用意しなきゃならなくて面倒だったため今回は無し。
VMの準備
今回はConoHaで雑に1台一番スペックの低いタイプでUbuntu18.04のインスタンスを用意しました。
PPA追加せずWireGuard使うのに20.04に上げたかったのでとりあえずdo-release-upgrade -d
を実行。
その後は適当にuser作ったりsshのrootログインできないようにしたりポート変えたりとか。
ネットワーク回り
ConoHaのUbuntuはデフォでIPv6拾ってきてくれないのでその為の設定。
ちなみにConoHaの公式ドキュメントにあるv6設定する方法がCentOS6、CentOS7の方法しか無くて大分苦戦。
あのさぁ……。
/etc/netplan/10-gmovps.yaml
network:
ethernets:
eth0:
addresses: []
dhcp4: true
dhcp6: true
accept-ra: true
optional: true
version: 2
dhcp6
とaccept-ra
をtrueに編集後sudo netplan apply
適当にip a
とかでv6のアドレスを拾えていることを確認。
後はping6
コマンドとか。
フォワーディング用カーネルパラメータ
/etc/sysctl.conf
から
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
のコメントアウトを外す。
編集後sudo sysctl -p
WireGuard
とりあえずサーバ側用の鍵を用意。(クライアントの鍵はWinとかAndroidのクライアントで勝手に生成してくれる)
wg genkey > wg_server_privatekey
wg publickey < wg_server_privatekey > wg_server_publickey
/etc/wireguard/wg0.conf
を作成、編集。
[Interface]
Address = <トンネル内でサーバが使うv4アドレス>, <トンネル内でサーバが使うv6アドレス>
ListenPort = 51820
PrivateKey = <サーバ側PrivateKey>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <クライアント側PublicKey>
AllowedIPs = <トンネル内でクライアントが使うv4アドレス>/32, <トンネル内でクライアントが使うv6アドレス>/128
<デバイスの分だけ繰り返す>
設定終わったらsudo systemctl start wg-quick@wg0
enableも忘れずに。
クライアント側設定
[Interface]
PrivateKey = <クライアント側PrivateKey>
Address = <トンネル内でクライアントが使うv4アドレス>/32, <トンネル内でクライアントが使うv6アドレス>/128
DNS = 8.8.8.8, 2001:4860:4860::8888
# DNSは適当に
[Peer]
PublicKey = <サーバ側PublicKey>
AllowedIPs = 0.0.0.0/0, ::/0
# 全部VPN越しでお外に
Endpoint = サーバが持ってるv4のグローバルIPアドレス:51820
この例だとv4, v6両方アドレス振ってますが、どちらかのみを振ればどちらかのみ通信できるようになります。
ちなみにKAMEは両方振ってると動きませんでした。
感想
- はじめてKAMEがうごいてるのみた。ほんとに動くのねあれ
- 設定のために公開鍵をサーバとクライアントでやり取りするの面倒くさい
- それでもOpenVPNの数倍楽な気がする
- OpenVPN触ったの紀元前なので気のせいかもしれない