大学や会社等のネットワークでは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など可能になっていれば成功です。