Cent OS 9 でMS-SSTP用 Softether Clientの設定

大学や会社等のネットワークではNATを超えた通信が厳しく制限していることが多いです。
そういったときに多少「行儀がわるい」のですがうまく使うと便利なのがSoftEther VPNです。

SoftEtherではNATを回避してセッションを維持する工夫がされており、
その中でも手軽で強力なのが VPN Azureで、困ったときはこれを使っておけば
かなり厳しい環境であってもVPN接続を確立することができます。

唯一の問題は この接続に対応しているプロトコルが MS-SSTP のみであるという点です。
WindowsであればOS付属の機能で簡単に接続できますが、mac / Linux ではクライアントの導入が必要です。
特に macはまともなクライアントツールがありません。

Linuxだと fedoraなどで使える NetworkManager-sstp プラグインを導入すれば、わりと安定して接続できますが
これ以外だと SoftEtherの公式クライアントを使う方法があります。
安定性などの面で公式Clientnの方が安心な気がするので、今回はこちらを設定します。

Step1. SoftEther clientのインストール

公式ダウンロードページより

最新安定板のダウンロードリンクURLをコピーしておき

wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.38-9760-rtm/softether-vpnclient-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz
tar xzvf softether-vpnclient-*.tar.gz

としてダウンロード&解凍します。
次にクライアントプログラムのコンパイルと /url/local へのインストールを行います。

cd ./vpnclient
make
cd ..
sudo cp -r ./vpnclient /usr/local
sudo chown -R root:root /usr/local/vpnclient/
cd /usr/local/vpnclient/
sudo chmod 600 *
sudo chmod 700 vpncmd
sudo chmod 700 vpnclient

vpncmdで動作チェック

付属のCLIツールで動作診断ができます。

sudo /usr/local/vpnclient/vpncmd
Select 1, 2 or 3: 3
VPN Tools> check

The command completed successfully.

VPN Tools> exit

vpnclientの仮起動

以下の systemed unit fileを作成して
vpnclient の起動を確認します。

/usr/lib/systemd/system/vpnclient.service

[Unit]
Description=SoftEther vpnclient
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnclient/vpnclient start
ExecStop=/usr/local/vpnclient/vpnclient stop

[Install]
WantedBy=multi-user.target

起動します

sudo systemctrl start vpnclient

clientツールが起動すると vpncmdからクライアントの設定が可能になります。

sudo /usr/local/vpnclient/vpncmd localhost  /CLIENT

以下次のように設定していきます

> PasswordSet  # クライアントの管理用パスワード設定
> NicCreate  tap1 #仮想 NICを生成
> AccountCreate  ACCOUNT1  /SERVER:xxxxxxxxxxx.vpnazure.net:443  /HUB:DEFAULT  /USERNAME:(softethersサーバのユーザ名) /NICNAME:tap1  # 新しいアカウント ACCOUNT1 の作成
・・・接続設定ACCOUNT1 の作成 SERVER,HUB,USERNAMEはサーバー側の設定に合わせること。
・・・NICNAMEは上で生成した仮想NICを指定
> AccountPasswordSet ACCOUNT1  /TYPE:standard # パスワードを保存
> AccountStartupSet  ACCOUNT1 # ACCOUNT1を有効化
> AccountConnect ACCOUNT1 # ACCOUNT1の設定でVPN接続を試みる
> AccountList

Item                        |Value
----------------------------+-------------------------------------------------------
VPN Connection Setting Name |ACCOUNT1
Status                      |Connected
VPN Server Hostname         |xxxxxxxxxxxxxxx.vpnazure.net:443 (Direct TCP/IP Connection)
Virtual Hub                 |DEFAULT
Virtual Network Adapter Name|tap1
The command completed successfully.

Status が Connectedになっていれば vpnclientはサーバとセッションを貼れています。

route設定

ここまでの設定で vpnclient側はセッションを貼っていますが
vpn_tap1 はまだ接続状態になりません。

$ nmcli device
DEVICE    TYPE      STATE      CONNECTION
enp0s3    ethernet  connected  enp0s3
lo        loopback  unmanaged  --
vpn_tap1  tun       unmanaged  --

デバイスにIPアドレスを割り当て、routeの設定が必要です。
まずは、IPアドレスの割り当てですが、今回はサーバー側で SecureNAT(192.168.30.1/24)が
有効になっているので DHCPで開いているアドレスを割り当ててもらいます。

$ sudo nmcli connection modify vpn_tap1 ipv4.method auto
$ sudo nmcli connection up vpn_tap1
$ sudo nmcli device
DEVICE    TYPE      STATE                   CONNECTION
enp0s3    ethernet  connected               enp0s3
vpn_tap1  tun       connected          vpn_tap1
lo        loopback  unmanaged               --

表示が connected になりました。
静的なアドレスを指定する必要がある場合は

ip address add 192.168.30.2/24 dev vpn_tap1

また、最低限の route設定が必要です。
まず

$ sudo ip route add 192.168.30.0/24 dev vpn_tap1
$ sudo ip route add 10.1.2.0/24 via 192.168.30.1 dev vpn_tap1 onlink

など、VPNを通す必要がある通信先を登録しておきます。この設定はサーバー側やネットワークの
必要に応じて設定してください。

設定の永続化

vpn_tap1 は vpnclientサービスの起動ごとに生成されますので、

/usr/lib/systemd/system/vpnclient.serviceの [service]セクションに

ExecStartPost=/usr/local/vpnclient/init.sh

を追加し

/usr/local/vpnclient/init.shとして

#!/bin/sh
nmcli connection modify vpn_tap1 ipv4.method auto
sudo nmcli connection up vpn_tap1
ip route add 192.168.30.0/24 dev vpn_tap1
sudo ip route add 10.1.2.0/24 via 192.168.30.1 dev vpn_tap1 onlink

などを書いておきます。

お疲れ様でした

無事にVPNがつながり SSHなど可能になっていれば成功です。

コメントを追加する