Wireguardを試す
Linuxでサイト間VPN(+暗号化)を試そうと調べていたところ、WireguardがEasyらしいということがわかり、試してみることにした。シリーズ投稿中の「Network Namespace」で実現したかったのであるが、まずは確実なGNS3のVM環境でトライ。
情報
下記サイトをもとに設定。
- WireGuard VPN site-to-site
- オープンソースVPN 「WireGuard」とは?ホワイトペーパーから読み解く仕組みや実用性
- WireGuardとOpenVPNの比較:違いの全て
ネットワーク環境
下記環境。
- WireguardによるVPNをRouter1-Router2間で確立
- Router1およびRouter2ネットワーク:172.16.1.0/24
- Wireguardトンネルネットワーク:10.1.1.0/24
- 両端ネットワーク192.168.10.0/24および192.168.20.0/24がトンネル対象ネットワーク
設定
Router1およびRouter2での設定である。
ルーティング
net.ipv4.ip_forward=1
Wireguard
秘密鍵と公開鍵の作成
Router1での設定(Router2でも同様)。
$ wg genkey | sudo tee /etc/wireguard/wg1.secret | wg pubkey | sudo tee /etc/wireguard/wg1.public
- wg1.secret:秘密鍵
- wg1.public:公開鍵(Router2に渡す)
鍵情報やIPアドレスの設定
こちらもRouter1での設定(Router2でも同様)。
Router1:~$ sudo cat /etc/wireguard/wg1.conf
[Interface]
PrivateKey = 2Cd38b+7RDpOG7MjDNaWQ1Hi9n7/pgqohxtcQDsbZ1M=
Address = 10.1.1.1/30
ListenPort = 61000
[Peer]
PublicKey = uPvlAwRi5m1XJ7sZMnyOfDTqUKWI5IPYQEXK+pK6k1Q=
AllowedIPs = 10.1.1.2/32,192.168.20.0/24
Endpoint = 172.16.1.2:61000
- [Interface]:自身の設定
- PrivateKey:秘密鍵
- Address:VPNとしてのIPアドレス
- ListenPort:待ち受けするUDPポート
- [Peer]:相手の設定
- PublicKey:公開鍵
- AllowedIPs:VPN対象とする相手側のIPアドレス
- 相手のIPアドレスおよび接続ポート
鍵や設定情報を置く場所
同じくRouter1の情報。/etc/wireguardに配置。
Router1:~$ sudo ls -l /etc/wireguard/
total 16
-rw-r--r-- 1 root root 245 Dec 10 10:54 wg1.conf
-rw-r--r-- 1 root root 45 Dec 9 08:27 wg1.public
-rw-r--r-- 1 root root 45 Dec 9 08:27 wg1.secret
-rw-r--r-- 1 debian debian 45 Dec 9 08:33 wg2.public
自明(wg1.publicは、Router1では不要)。
検証
起動
まずはWireguardを起動。下記はRouter1での様子。
Router1:~$ sudo wg-quick up wg1
[#] ip link add wg1 type wireguard
[ 98.400558] wireguard: WireGuard 1.0.0 loaded. See www.wireguard.com for information.
[ 98.406853] wireguard: Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
[#] wg setconf wg1 /dev/fd/63
[#] ip -4 address add 10.1.1.1/30 dev wg1
[#] ip link set mtu 1420 up dev wg1
[#] ip -4 route add 192.168.20.0/24 dev wg1
- wg1というトンネルネットワークインターフェースを作成
- IPアドレスアサイン
- MTU設定(Wireguardは80(=1500-1420)バイトのヘッダサイズ?)
- 対向トンネルネットワークのスタティックルート設定
終了
念のため終了も記載。
Router1:~$ sudo wg-quick down wg1
[#] ip link delete dev wg1
- トンネルネットワークインターフェース削除
末端PCどうしの疎通&パケット確認
左端PCから右端PCへのping実行。
PC1> ping 192.168.20.2
84 bytes from 192.168.20.2 icmp_seq=1 ttl=62 time=46.837 ms
84 bytes from 192.168.20.2 icmp_seq=2 ttl=62 time=9.248 ms
84 bytes from 192.168.20.2 icmp_seq=3 ttl=62 time=10.382 ms
84 bytes from 192.168.20.2 icmp_seq=4 ttl=62 time=3.290 ms
84 bytes from 192.168.20.2 icmp_seq=5 ttl=62 time=12.983 ms
この時のWiresharkデータを見る。
基本シーケンス
- WireguardはUDPパケット上でやりとりされている
- Handshake
- Initiation
- Response
- Transport Data
- ここでは、上記ping5回分のデータのようだ
- Keepalive
IPsec/IKEと比べるとネゴシエーションが少ない。
ポート番号に依存せず、解釈してくれる?
ここは、Wiresharkの話。設定ファイルでポート61000を指定しても(下記)、
ポート番号31000を指定しても(下記)
Wiresharkでは、Wireguardと把握してくれる。スマート。
なお、上記は、Handshake InitiationおよびTransportパケットの詳細でもある。内容は割愛。
参考までに、他のパケットの詳細も紹介。こちらは、Handshake Response。
こちらはKeepalive。
Router2とPC2との間
参考までに、Wireguard通過(デコード)後のWiresharkデータも紹介。
当然だが、生データが見える。
EOF