ソフトウェア/WireGuard の履歴(No.1)

更新


WireGuard で VPN 接続を行う

WireGuard について調べよう。

https://deep.tacoskingdom.com/blog/142 ここで紹介されていた通りに作業する

WireGuard のインストール

LANG: console
$ lsb_release -a # 基本OS情報
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm
$ cat /etc/debian_version # Debianのマイナーバージョン
12.11
$ uname -srv # Linuxカーネルの情報
Linux 5.10.0-28-amd64 #1 SMP Debian 5.10.209-2 (2024-01-31)
$ sudo apt install wireguard # インストール
以下の追加パッケージがインストールされます:
  wireguard-tools
提案パッケージ:
  openresolv | resolvconf
以下のパッケージが新たにインストールされます:
  wireguard wireguard-tools
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
95.8 kB のアーカイブを取得する必要があります。
この操作後に追加で 346 kB のディスク容量が消費されます。
$ wg --version
wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/

鍵の生成

LANG: console
$ sudo su # スーパーユーザーに切り替え
# cd /etc/wireguard
# ls -la  # 設定が空なことと一般ユーザーが読めないことを確認
合計 28
drwx------   2 root root  4096  6月  6 13:14 .
drwxr-xr-x 121 root root 12288  6月  6 13:10 ..
# wg genkey > wgserver.key                # サーバー用秘密鍵
# wg pubkey < wgserver.key > wgserver.pub # サーバー用公開鍵
# wg genkey > wgclient.key                # クライアント用秘密鍵
# wg pubkey < wgclient.key > wgclient.pub # クライアント用公開鍵
# chmod 600 *.key
# ls -la
合計 32
drwx------   2 root root  4096  6月  6 13:15 .
drwxr-xr-x 121 root root 12288  6月  6 13:10 ..
--w-------   1 root root    45  6月  6 13:14 wgclient.key
-rw-r--r--   1 root root    45  6月  6 13:15 wgclient.pub
--w-------   1 root root    45  6月  6 13:13 wgserver.key
-rw-r--r--   1 root root    45  6月  6 13:14 wgserver.pub
# exit
$

サーバーの設定&起動テスト

LANG:console
$ sudo jed /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.17.1/32
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(※wgserver.keyの中身)
MTU = 1420
ListenPort = 51820

[Peer]
PublicKey = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy(※wgclient.pubの中身)
AllowedIPs = 10.0.17.2/32
$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.17.1/32 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 10.0.17.2/32 dev wg0
$ ip address
...
76311: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.0.17.1/32 scope global wg0
       valid_lft forever preferred_lft forever
...

これで起動した。

以上はあくまでテストなので、一旦WireGuardサーバー落とす。

LANG:console
$ sudo wg-quick down wg0
[#] ip link delete dev wg0

サービスとして常駐化させる

LANG:console           
$ sudo systemctl enable wg-quick@wg0
Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service
→ /lib/systemd/system/wg-quick@.service.
$ sudo systemctl start wg-quick@wg0
$ systemctl status wg-quick@wg0
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
     Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; preset: enabled)
     Active: active (exited) since Fri 2025-06-06 13:28:44 JST; 47s ago
       Docs: man:wg-quick(8)
             man:wg(8)
             https://www.wireguard.com/
             https://www.wireguard.com/quickstart/
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
    Process: 1874337 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
   Main PID: 1874337 (code=exited, status=0/SUCCESS)
        CPU: 26ms

 6月 06 13:28:44 xxxxx systemd[1]: Starting wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0...
 6月 06 13:28:44 xxxxx wg-quick[1874337]: [#] ip link add wg0 type wireguard
 6月 06 13:28:44 xxxxx wg-quick[1874337]: [#] wg setconf wg0 /dev/fd/63
 6月 06 13:28:44 xxxxx wg-quick[1874337]: [#] ip -4 address add 10.0.17.1/32 dev wg0
 6月 06 13:28:44 xxxxx wg-quick[1874337]: [#] ip link set mtu 1420 up dev wg0
 6月 06 13:28:44 xxxxx wg-quick[1874337]: [#] ip -4 route add 10.0.17.2/32 dev wg0
 6月 06 13:28:44 xxxxx systemd[1]: Finished wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0.
 $ ip address
...
76312: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.0.17.1/32 scope global wg0
       valid_lft forever preferred_lft forever
...

ポートフォワード(IPv4)を許可

LANG: console
$ grep ip_forward /etc/sysctl.conf  # はじめ無効になっていた
#net.ipv4.ip_forward=1
$ sudo jed /etc/sysctl.conf         # 有効化する
- #net.ipv4.ip_forward=1
+ net.ipv4.ip_forward=1
$ sudo sysctl -p                    # 変更を反映
net.ipv4.ip_forward = 1
net.ipv4.tcp_keepalive_time = 300

IPマスカレードの設定 (wg0.conf)

起動時と終了時に IP マスカレードについて iptables を書き換えるよう設定する。

LANG:console
$ ip addr        # インターフェース名を確認
...
2: enp3s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 6c:4b:90:f5:6e:dc brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.5/24 brd 192.168.0.255 scope global enp3s0f0
       valid_lft forever preferred_lft forever
... 
$ sudo jed /etc/wireguard/wg0.conf
  [Interface]
  ...
+ PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
+ PostUp = iptables -t nat -A POSTROUTING -o enp3s0f0 -j MASQUERADE
+ PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
+ PostDown = iptables -t nat -D POSTROUTING -o enp3s0f0 -j MASQUERADE
$ sudo systemctl restart wg-quick@wg0    # 設定を反映
$ sudo iptables -L -n -t nat
...
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  0    --  0.0.0.0/0            0.0.0.0/0           
...

ファイアウォールの設定

ufw を使っているので、

$ ufw allow proto udp to 0.0.0.0/0 port 51820

ルータのポートマッピング

ポートマッピングを設定して、外からの 58120 へのアクセスを WireGuard サーバーへ転送するようにしました。

  • WAN 側ポート: 58120
  • LAN 側ホスト: 192.168.0.5
  • プロトコル: UDP
  • ポート: 58120

クライアント

[Interface]
PrivateKey = (wgclient.key の内容)
Address = 10.0.17.2/32

[Peer]
PublicKey = (wgserver.pub の内容)
AllowedIPs = 10.0.17.1/32,192.168.0.0/24 (通信したい宛先)
Endpoint = (ルーターの外向きアドレス):51820
PersistentKeepalive = 25

クライアント側の WireShark のログで

Sending handshake initiation to peer 1 (xxx.xxx.xxx.xxx:51820)
Receiving handshake response from peer 1 (xxx.xxx.xxx.xxx:51820)
Keypair 1 created fo peer 1

と出れば接続はうまく行っている。

これが、

Handshake for peer 1 (xxx.xxx.xxx.xxx:51820) did not complete after 5 seconds, retrying (try ?)

などとなっているのはそもそもサーバーへの通信がうまく行っていないので、

  • ルーターのポートマッピング設定
  • ファイアウォール設定
  • サーバーの起動状態

のチェックが必要。

VPN サーバーに接続できているのにその先に接続できない場合には、

  • クライアント側の AllowedIPs の設定
  • クライアントマシンのローカル IP アドレス範囲と VPN で繋いだ先の LAN のローカル IP アドレス範囲がかぶっていないことを確認する
    • かぶっていた場合にはどちらかを変えないとダメな気がする?
    • どうにかすれば変換が可能?

コメント&質問





Counter: 142 (from 2010/06/03), today: 2, yesterday: 2