動かざることバグの如し

近づきたいよ 君の理想に

WireGuardで格安SIMをサーバー化する

概要

格安SIMは名前の通り安いし、サーバー運用にできそうだが、一般的なSIMだとグローバルIPは固定ではないので他のサーバーからアクセスできないし、そもそもポート開放を許可していないSIMのほうが多かったりする。

しかし、今回の様にWireGuardを使って格安SIMが刺さったサーバー側をVPNクライアントにすることで解決できる。

WireGuardとは

新しい技術を取り入れて実現した後発のVPNプロトコル、及びアプリケーション。ここが詳しい

ゴール

サーバー側とクライアント側で相互にping,sshができるようにする

構成

  • サーバー側IP 10.100.0.1
  • クライアント側IP 10.100.0.10

サーバー側セットアップ

以下の記事を参考にUbuntuにWireGuardをインストール

thr3a.hatenablog.com

/etc/wireguard/wg0.conf を作成して以下

[Interface]
PrivateKey = 作成したサーバーの秘密鍵(server_private.key)
Address = 10.100.0.1
ListenPort = 51820

[Peer]
PublicKey = 作成したクライアントの公開鍵(client_public.key)
AllowedIPs = 10.100.0.0/24

systemctl start wg-quick@wg0 で再起動しておくこと

クライアント側セットアップ

サーバー同様にWireGuardをインストール。ちょっと戸惑うが、インストールするパッケージ等はサーバーと同じ

こっちも /etc/wireguard/wg0.conf を作成して以下

[Interface]
PrivateKey = 作成したクライアントの秘密鍵(client_private.key)
Address = 10.100.0.10
PostUp = ping -c 1 10.100.0.1

[Peer]
PublicKey = 作成したサーバーの公開鍵(server_public.key)
Endpoint = サーバーのグローバルIP:51820
AllowedIPs = 10.100.0.0/24
PersistentKeepAlive = 10

ポイントはいくつかあって、

  • PostUp: 最初はクライアントから通信を開始しないと接続できない pingを1回無駄撃ちすることで接続を確立させている
  • PersistentKeepAlive: NATの設定を維持するのに必要 これがないと一定時間通信がないと切断されてしまう

いざ接続

# wg-quick up wg0

確認

pingで疎通確認師をしてみる

サーバーからクライアントのIPを叩いて見えてるか確認

# from server
root@wg01:~# ping 10.100.0.10
PING 10.100.0.10 (10.100.0.10) 56(84) bytes of data.
64 bytes from 10.100.0.10: icmp_seq=1 ttl=64 time=1114 ms
64 bytes from 10.100.0.10: icmp_seq=2 ttl=64 time=114 ms
64 bytes from 10.100.0.10: icmp_seq=3 ttl=64 time=43.0 ms

反対にクライアントからサーバーが見えているかも確認

# from client
$ ping 10.100.0.1
PING 10.100.0.1 (10.100.0.1) 56(84) bytes of data.
64 bytes from 10.100.0.1: icmp_seq=1 ttl=64 time=53.2 ms
64 bytes from 10.100.0.1: icmp_seq=2 ttl=64 time=46.10 ms
64 bytes from 10.100.0.1: icmp_seq=3 ttl=64 time=46.7 ms

完璧 あとはローカルネットワーク内の 10.100.0.0/24 でルーティングさせてあげれば色々できそう

参考リンク

追記

結果的に今回の自分の設定は以下のようになった

サーバー側

root@rails2:/etc/wireguard# cat wg0.conf
[Interface]
Address = 10.0.0.1/32
ListenPort = 51820
PrivateKey = OCiRKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

# raspi01
[Peer]
PublicKey = UKO8h5gcyEBucvcpxEBNUAJ61sOdyCHEoIRku02HNyc=
AllowedIPs = 10.0.0.11/32

# raspi02
[Peer]
PublicKey = zp5+0hwgBX6TV5KioJSBfHgK+Nf/ipweJyPFuktPGUQ=
AllowedIPs = 10.0.0.12/32

クライアント側

root@raspi01:~# cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXX
Address = 10.0.0.11
PostUp = ping -c 1 10.0.0.1

[Peer]
PublicKey = E1xodlbEUXeNe2dyENcQ6RSwsXUWBEpinONAbQRrwU4=
Endpoint = XXXXXX:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepAlive = 15