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 つです。
- VPN クライアントプロセスを起動する
- DHCP で仮想 LAN カードに IP アドレスを設定する
- スタティックルートを設定する
- 不要なデフォルトゲートウェイを削除する
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 サーバーから受け取ったデフォルトゲートウェイを消す、という一連の処理を行っているというわけです。
この一連の手続きをスクリプト化しないで手作業でやるのはとても面倒くさいのです。