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

dhcp6accept-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触ったの紀元前なので気のせいかもしれない
comments powered by Disqus