ソフトウェア/WireGuard の変更点

更新


#author("2025-06-06T09:46:39+00:00","default:administrator","administrator")
#author("2025-06-06T09:47:13+00:00","default:administrator","administrator")
* WireGuard で VPN 接続を行う [#iddffd9c]

WireGuard について調べよう。

https://deep.tacoskingdom.com/blog/142 ここで紹介されていた通りに作業したところ、うまく繋がった

** WireGuard のインストール [#odcc564c]

 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/

** 鍵の生成 [#w6b0b9f0]

WireGuard で接続を確立するには事前にサーバーとクライアントのカギを互いに交換しておく必要がある。

本当はクライアントのカギはクライアント側で作って公開鍵のみサーバーに送ればいいのだけれど、
ここでは両方ともサーバーで作っちゃう。

 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 ..
 -rw-------   1 root root    45  6月  6 13:14 wgclient.key
 -rw-r--r--   1 root root    45  6月  6 13:15 wgclient.pub
 -rw-------   1 root root    45  6月  6 13:13 wgserver.key
 -rw-r--r--   1 root root    45  6月  6 13:14 wgserver.pub
 
 # exit                                    # スーパーユーザーから抜ける
 
 $

** サーバーの設定&起動テスト [#v1486078]

 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

** サービスとして常駐化させる [#ta68047e]

 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)を許可 [#z9f828f1]

 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) [#rd795a0a]

起動時と終了時に 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           
 ...

** ファイアウォールの設定 [#k55cf0a4]

ufw を使って ipv4 による 51820/udp へのアクセスを許可した。

 LANG: console
 $ ufw allow proto udp to 0.0.0.0/0 port 51820

** ルータのポートマッピング [#z6c0d803]

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

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

** クライアント [#f6b5faf3]

クライアントとなる Windows マシンに WireGuard をインストールして、
「空のトンネルを追加」から、

 [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 (VPN 経由で通信したいアドレス範囲)
 Endpoint = (ルーターの外向きアドレス):51820
 PersistentKeepalive = 25

とした。

VPN 経由で通信したいアドレス範囲を AllowedIPs に設定している。

この接続を「有効化」したところ、
ちゃんと 192.168.0.xxx へのアクセスが VPN を経由して繋がるようになった。

クライアント側の 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 アドレス範囲がかぶっていないことを確認する
-- かぶっていた場合にはどちらかを変えないとダメな気がする?
-- どうにかすれば変換が可能?

ああ、「ログ」を見なくても「ピア」で「直近のハンドシェイク」に時間が入っていれば正しく繋がっていることが確認できるわけか。

#ref(wireguard_handshake.png,,around,wrap,50%);
#ref(wireguard_handshake.png,,50%,wrap);

* コメント&質問 [#z75ebc0d]

#article_kcaptcha

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