さくらのクラウドでwireguardを使ってみる


概要

さくらのクラウドで作ったVPCルーター配下のサーバとグローバルネットワークに直接繋がっているサーバ間を
wireguardを使ってVPNを張ってみます。

構成

共有セグメントに繋がっているグローバルのIPが振られたサーバをVPNサーバとし、
VPCルータ配下にあるサーバをクライアントとしてwireguardを使ってみます。

インスタンスの構成情報

  • VPNサーバ側
    • OS: Ubuntu 20.04 LTS
    • eth0 には 153.125.137.154/24 が設定されている
  • クライアント側
    • OS: Ubuntu 20.04 LTS
    • eth0 には 192.168.1.15/24 が設定されている

wireguardについて

wireguardのインストール

VPNサーバ側とクライアント側で行う

sudo apt update
sudo apt install wireguard

公開鍵と秘密鍵を作る

VPNサーバ側とクライアント側の両方でする。

umask 077 # やらなくてもいいんだけどやらないと注意書きが標準出力にペロッと出るし、chmodで都度permissionを変えないといけない
wg genkey > privatekey # wg genkey コマンドで秘密鍵を作る
wg pubkey < privatekey > publickey # wg pubkey コマンドで秘密鍵から公開鍵を作る

privatekeyファイルとpublickeyファイルの内容は以下の感じ。

# サーバ側
cat privatekey 
uCSI+741hx3v42pgs3zwMzO8nm/Tkd4wi3yO4H4Xq3k=

cat publickey 
woN4V2wU28RhHK3OSNzRuSHTMmEwDlkPcUiThAvO1g4=

---
# クライアント側
cat privatekey 
iCki6pNR+stpegsWvg4LFJyOiNW1IiA+j92eDNq6S2I=

cat publickey 
fRfhnfj3rLuxG9y1LAMKBeZ8uoh17rf/TFNnokAiQBA=

サーバ側で設定ファイルを書く

/etc/wireguard/ 配下に wg0.conf というファイルを作って以下の感じで書く。

[interface]

PrivateKey = サーバ側の秘密鍵
Address = VPNの時に割り当てるIPアドレス
ListenPort = 待ち受けるポート番号

[Peer]
PublicKey = クライアント側の公開鍵
AllowedIPs = 接続を許可するIP

---
# 今回はこんな感じ
[interface]
PrivateKey = uCSI+741hx3v42pgs3zwMzO8nm/Tkd4wi3yO4H4Xq3k=
Address = 10.0.0.1
ListenPort = 37859

[Peer]
PublicKey = fRfhnfj3rLuxG9y1LAMKBeZ8uoh17rf/TFNnokAiQBA=
AllowedIPs = 10.0.0.2/32

サーバ側でwireguardが自動起動するようにする

sudo systemctl enable wg-quick@wg0
sudo systemctl start [email protected] 

サーバ側でwg0デバイスができているのを確認する

ip addr
(前略)
6: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.0.0.1/32 scope global wg0
       valid_lft forever preferred_lft forever

クライアント側で設定ファイルを書く

/etc/wireguard/ 配下に wg0.conf というファイルを作って以下の感じで書く。

[interface]
PrivateKey = クライアントの秘密鍵
Address = VPNの時に割り当てるIPアドレス

[Peer]
PublicKey = サーバ側の公開鍵
EndPoint = サーバ側のIP:待ち受けているポート番号
AllowedIPs = VPNサーバ側に流すトラフィックの範囲

---
# 今回はこんな感じ
[interface]
PrivateKey = iCki6pNR+stpegsWvg4LFJyOiNW1IiA+j92eDNq6S2I=
Address = 10.0.0.2

[Peer]
PublicKey = woN4V2wU28RhHK3OSNzRuSHTMmEwDlkPcUiThAvO1g4=
EndPoint = 153.125.137.154:37859
AllowedIPs = 10.0.0.1/32
#AllowedIPs = 0.0.0.0/0 とすると全部の通信をVPNサーバ経由でする感じになる。サーバ側でnatとかの設定をしないとグローバルには繋がらない。後述。

クライアント側でwireguardを起動させて、pingを打ってみる。

sudo wg-quick up wg0
ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) バイトのデータ
64 バイト応答 送信元 10.0.0.1: icmp_seq=1 ttl=64 時間=0.879ミリ秒
64 バイト応答 送信元 10.0.0.1: icmp_seq=2 ttl=64 時間=0.971ミリ秒
64 バイト応答 送信元 10.0.0.1: icmp_seq=3 ttl=64 時間=1.39ミリ秒
^C
--- 10.0.0.1 ping 統計 ---
送信パケット数 3, 受信パケット数 3, パケット損失 0%, 時間 2000ミリ秒
rtt 最小/平均/最大/mdev = 0.879/1.080/1.391/0.222ミリ秒

sudo wg-quick down wg0 とすると繋がらなくなる。

VPNサーバ側に設定をして、全部の通信をVPNサーバ経由でしてみる。

iptablesの設定

sudo iptables -A FORWARD -o wg0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

/etc/sysctl.conf ファイルを編集して転送を有効にする

/etc/sysctl.conf ファイル内の
#net.ipv4.ip_forward=1 の行のコメントを外す。(先頭の#を削除する)

# コメント外す前
#net.ipv4.ip_forward=1

---
# 外した後
net.ipv4.ip_forward=1

以下のコマンドで設定を反映させる

sudo sysctl -p

クライアント側から、www.wireguard.com へのtracerouteを見てみる

sudo wg-quick up wg0 した状態

traceroute www.wireguard.com
traceroute to www.wireguard.com (147.75.79.213), 30 hops max, 60 byte packets
 1  10.0.0.1 (10.0.0.1)  4.634 ms  4.156 ms  4.109 ms # <-VPNサーバを通ってる!
 2  153.125.137.2 (153.125.137.2)  5.095 ms  5.074 ms  5.055 ms
 3  192.168.11.12 (192.168.11.12)  5.009 ms  5.007 ms  4.989 ms
(後略)

sudo wg-quick down wg0 した状態

 traceroute www.wireguard.com
traceroute to www.wireguard.com (147.75.79.213), 30 hops max, 60 byte packets
 1  _gateway (192.168.1.254)  0.808 ms  0.796 ms  0.779 ms #<-VPNサーバを通ってない!
 2  133.242.237.2 (133.242.237.2)  1.623 ms  1.646 ms  1.821 ms
 3  192.168.11.12 (192.168.11.12)  1.821 ms  1.752 ms 192.168.10.11 (192.168.10.11)  1.557 ms
(後略)

おわり

シュシュっとできて便利。
公式のquickstart のsidebysideのvideoの方法で設定すると
再起動したら設定したものは消えるので気軽に試せるよよよ。
androidとios用のアプリもある。