Ubuntu 24.04 + SoftEther VPN クライアントで VPN 接続する時のルーティング設定をスクリプト化

前書き

2024 年 6 月、Let’s note CF-SV8 を中古で買いました。メルカリで送料込みで 28,500 円。

CPU はインテル Core i5 8365U (第 8 世代)、メモリー 8 GB、ストレージは NVMe SSD の 512 GB ものです。なかなか良い買い物だったかなと思います。

$ lscpu | head -12
アーキテクチャ: x86_64
CPU 操作モード: 32-bit, 64-bit
Address sizes: 39 bits physical, 48 bits virtual
バイト順序: Little Endian
CPU: 8
オンラインになっている CPU のリスト: 0-7
ベンダー ID: GenuineIntel
モデル名: Intel(R) Core(TM) i5-8365U CPU @ 1.60GHz
CPU ファミリー: 6
モデル: 142
コアあたりのスレッド数: 2
ソケットあたりのコア数: 4
$ free -h
total used free shared buff/cache available
Mem: 7.6Gi 2.1Gi 4.2Gi 440Mi 2.0Gi 5.4Gi
Swap: 4.0Gi 0B 4.0Gi
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 74.2M 1 loop /snap/core22/1380
loop1 7:1 0 4K 1 loop /snap/bare/5
loop2 7:2 0 269.6M 1 loop /snap/firefox/4173
loop3 7:3 0 268.7M 1 loop /snap/firefox/4483
loop4 7:4 0 505.1M 1 loop /snap/gnome-42-2204/176
loop5 7:5 0 91.7M 1 loop /snap/gtk-common-themes/1535
loop6 7:6 0 10.3M 1 loop /snap/snap-store/1124
loop7 7:7 0 10.7M 1 loop /snap/firmware-updater/127
loop8 7:8 0 10.4M 1 loop /snap/snap-store/1147
loop9 7:9 0 38.7M 1 loop /snap/snapd/21465
loop10 7:10 0 38.8M 1 loop /snap/snapd/21759
loop11 7:11 0 476K 1 loop /snap/snapd-desktop-integration/157
loop12 7:12 0 137.3M 1 loop /snap/thunderbird/470
loop13 7:13 0 138.9M 1 loop /snap/thunderbird/482
nvme0n1 259:0 0 476.9G 0 disk 
├─nvme0n1p1 259:1 0 1G 0 part /boot/efi
└─nvme0n1p2 259:2 0 475.9G 0 part /var/snap/firefox/common/host-hunspell
/
$

Windows 10 がインストールされていましたが、Ubuntu 24.04 を上書きインストールして普段使いにしています。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04 LTS
Release: 24.04
Codename: noble
$

このレッツノート CF-SV8 は軽くて使いやすいです。液晶のサイズは 12.1 inch で小さめですが持ち運びを重視する場合にはなかなか良いと思います。

SoftEther VPN クライアントをインストールした

カフェで使うことも想定しているので SoftEther VPN クライアントをインストールしました。カフェから自宅ネットワークに VPN 接続したいからですね。

そこで、です。

Linux 系 OS に SoftEther VPN クライアントをインストールして、VPN プロトコルに SSL (公式サイトで言うところの Ethernet over HTTPS) を使う場合、OS のルーティング設定にひと手間必要です。

このひと手間を Bash スクリプトしましたよ、というお話。以下の記事と同じような内容です。

[Fedora] カフェのフリー WiFi から SoftEther VPN サーバーに接続する為の Bash スクリプト

Bash スクリプトを使って VPN 接続させる

SoftEther VPN クライアントがインストール & セットアップ済みであることが前提にはなりますが、以下の Bash スクリプト (ファイル名: startvpn.bash) を実行して VPN 接続させる形にしています。

$ cat startvpn.bash
#!/usr/bin/bash

echo "VPN クライアントプロセスを起動します..."
sudo /usr/local/vpnclient/vpnclient start > /dev/null 2>&1

sleep 1

echo "IP アドレスを DHCP サーバーから取得します..."
sudo dhclient vpn_vnic > /dev/null 2>&1

sleep 1

echo "スタティックルートを追加します..."
sudo ip route add 172.16.1.0/24 via 10.1.0.1 dev vpn_vnic > /dev/null 2>&1

sleep 1

echo "不要なデフォルトゲートウェイを削除します..."
sudo ip route del default via 10.1.0.1 dev vpn_vnic > /dev/null 2>&1
$

このスクリプトでやっていることは以下の 4 つです。

  1. VPN クライアントプロセスを起動する
  2. DHCP で仮想 LAN カードに IP アドレスを設定する
  3. スタティックルートを設定する
  4. 不要なデフォルトゲートウェイを削除する

Bash スクリプトを実行したときの様子

以下のメッセージが出力されてスクリプト進行状況を確認することができます。

$ sudo ./startvpn.bash 
[sudo] hoge のパスワード: 
VPN クライアントプロセスを起動します...
IP アドレスを DHCP サーバーから取得します...
スタティックルートを追加します...
不要なデフォルトゲートウェイを削除します...
$

Bash スクリプトの解説

1 では、まず VPN クライアントを起動しないと始まらないのでプロセスを起動させています。

2 は 1 の VPN クライアント起動により VPN 接続が行われ、その後にこの VPN 接続を介して DHCP サーバーから IP アドレスをもらって、そのもらったアドレスを仮想 LAN カードに設定しています。

(注) この DHCP サーバーは VPN 接続した先にあります。僕の環境の場合、僕の自宅にある Wi-Fi ルーターがこの DHCP サーバーです。

3 は VPN 接続した先にあるネットワーク (我が家の 172.16.1.0/24 というネットワーク) に対するスタティックルートを設定しています。これにより 172.16.1.0/24 に接続する場合は、スタティックルートにより VPN を経由して 172.16.1.0/24 にアクセスする形になります。

4 は 2 で DHCP サーバーから IP アドレスをもらう際、デフォルトゲートウェイの設定も DHCP サーバーから受け取ってしまうので、このデフォルトゲートウェイを削除しています。これにより、デフォルトゲートウェイは VPN 接続する前に持っていたデフォルトゲートウェイを使い続ける動作になります。

このようにつらつら書くとややこしく感じるかもしれませんね。以下に噛み砕いて説明してみます。

やっていることのキモ

VPN 接続が必要なところだけ VPN を経由して通信させ、それ以外は VPN を経由させないで直接インターネットに抜けさせています。

たとえばカフェにノートパソコンを持っていって、カフェのフリー Wi-Fi を使ってインターネットに接続していることを想像してください。フリー Wi-Fi に接続するとデフォルトゲートウェイが設定されます。ほとんどの場合、デフォルトゲートウェイは カフェの何処かに設置されている Wi-Fi ルーターの IP アドレスになるでしょう。Wi-Fi ルーターは DHCP サーバーでもあります。

(注) この DHCP サーバーはカフェにある DHCP サーバーであることに注意してください。↑ に書いた「VPN 接続した先にある DHCP サーバー」とは別の DHCP サーバーになります。つまり DHCP サーバー x2 台が登場しているということです。

この状態で VPN 接続を行うと、VPN を接続した先にある DHCP サーバー がデフォルトゲートウェイの設定を送ってきて、ノートパソコンがそれを受け取ってデフォルトゲートウェイとして設定してしまうのです。この結果、ノートパソコンにはデフォルトゲートウェイが 2 個設定される形になり、これが不都合な設定になることが多いのです。

だから、VPN 接続を行う処理をスクリプト化して、VPN 接続すると同時に必要なスタティックルートを追加して、必要な通信だけ VPN 経由で通信させています。それ以外は直接インターネットに抜ければ良い設定にしたいので VPN 接続したときに、VPN 接続の先にある DHCP サーバーから受け取ったデフォルトゲートウェイを消す、という一連の処理を行っているというわけです。

この一連の手続きをスクリプト化しないで手作業でやるのはとても面倒くさいのです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください