やりたいこと
RHEL 系 (CentOS/Rocky Linux/Almalinux) 2 台で拠点間 L2 VPNを構築したい。VPN 接続は他のブラウザ通信と見かけ上変わらないような https 通信で行いたい。
今回は Rocky Linux9 に Softether VPN をインストールし拠点間で L2 VPN を構築した。両端にさらに VM 2 台を用意し疎通確認をした。
余談 : Softehter と OpenVPN の大きな違い
OpenVPN でも似たことができるのだが、試して分かったのだが、OpenVPN の場合は見かけ上は https になっていない。どいういうことかというと、OpenVPN の場合はパケットキャプチャをしてみると TLS としてパースされないのだ。どうやら OpenVPN の独自プロトコルの中で TLS ハンドシェイクをしているようだ。
これはつまり、アプリケーションまで識別できるファイアウォール/UTM (PaloAlto , FortiGate 等のいわゆる NGFW) を通過できない可能性があるということだ。
一方、Softether で試してみたところ、ばっちり TLS1.3 でのハンドシェイクが見えた。
これが Softether の剛腕なファイアウォール突破力の一因を担っているように思える。
Rocky Linux の展開
4 台とも以下手順の通りに構築する。
VyOS の展開と設定
以下手順を参照に構築する。
具体的な設定として以下を投入する。インタフェースへの IP 設定のみである。
$ configure # set interfaces ethernet eth0 address '198.51.100.254/24' # set interfaces ethernet eth1 address '203.0.113.254/24' # commit # save
VirtualBOX 側の設定
基本的に最初の図の通りに設定すること。
仮想マシンのインタフェースの「割り当て」はデフォルトでは「NAT」になっているが、ここでは「内部ネットワーク」を指定する。
なお、重要なポイントとして、VM-1 と VM-3 の間は [LAN1] だが、VM-2 と VM-4 は [LAN2] と別のラベルにすること。どちらも同セグメント (10.1.1.0/24) だが、ここを同じラベルにしてしまうと、L2 VPN を接続した途端に L2 ループが発生するので、気を付けること。
以下は VM-1 の VirtualBOX のネットワーク設定である。
VM-1 の LAN1 (enp0s3) と VM-2 の LAN2 (enp0s8) に限っては、上図の通り、「プロミスキャスモード(P)」を「すべて許可」に設定すること。これにより、自分の IP 以外宛の通信もそのインタフェースで受け取るようになる。(これを設定しないと L2 VPN が確立できても VM-3 と VM-4 の IP が通らないため、必須の設定である)
VyOS も同様にアダプター 1 (eth0) の内部ネットワークを [WAN1], アダプター 2 (eth1) の内部ネットワークを [WAN2] に設定する。
また、各 VM でインターネット接続が無いと不便なので、図には書いていないが、全 VM 共通でアダプター 3 も追加しておく。(VM-3 と VM-4 はアダプター 2 でも OK)
また、ポートフォワーディングの設定もしておく。ssh は説明不要だが、https は、Softehter VPN は VPN サービスだけでなく管理コンソールも https が担っているので、後ほど必要となる管理コンソール接続のために今あわせて設定をしておく。
この設定により、ホスト PC から 127.0.0.11 の 10022/tcp へ ssh 接続することで、ゲスト OS の 22/tcp へ ssh 接続できるようになる。
VM-1 の設定は上図のとおりだが、VM-2 ではポートフォワーディングのホスト IP を [127.0.0.12] など変えるとよい。同様に VM-3 , VM-4 も ssh だけ設定する。
Softether VPN Server (VM-1) の設定
VM-1 にて Softether VPN Server の設定を行う。
Softether VPN Server は基幹となるサービスである。今回はこの VPN Server にて 443/tcp を Listen し、拠点の Softether VPN Bridge からのカスケード接続を待ち受ける。
以下の手順を root ユーザーで設定していく。
インタフェースの調整
VM-1 の NW を設定する。まず各サーバの追加インタフェースのデバイス名と NAME が違うのが気持ち悪いので、nmcli c s で現在の NAME を確認し、以下コマンドで enp0s8 と enp0s9 を修正する。
[root@VM-1 ~]# nmcli c s [root@VM-1 ~]# nmcli con mod "Wired connection 1" connection.id enp0s8 [root@VM-1 ~]# nmcli con mod "Wired connection 2" connection.id enp0s9 [root@VM-1 ~]# nmcli c s
LAN1 の enp0s3 は Softether のローカルブリッジの設定を入れるため IP は付与しないことが推奨されている。Network Manager の管理にあると IP 付与が必要となるため、管理から外す。一方 WAN1 の enp0s8 は固定 IP を設定し、インタフェースを起動する。
[root@VM-1 ~]# nmcli con del enp0s3 [root@VM-1 ~]# nmcli con mod enp0s8 ipv4.method manual ipv4.address 198.51.100.1/24 [root@VM-1 ~]# nmcli con up enp0s8
また、デフォルト GW は enp0s9 が NAT インタフェースで内部的に取得するので、VM-1 ⇔ VM-2 間が通信できるように個別ルートを追加する。
[root@VM-1 ~]# nmcli con mod enp0s8 +ipv4.routes "203.0.113.0/24 198.51.100.254" [root@VM-1 ~]# nmcli con up enp0s8
インターネットと vyos eth1 への疎通確認をする。
[root@VM-1 ~]# ping 1.1.1.1 [root@VM-1 ~]# ping 203.0.113.254
SELinux の Permissive 化
[root@VM-1 ~]# setenforce 0
/etc/selinux/config も SELINUX=enforcing から SELINUX=permissive に変更する。
必要パッケージインストール、および softether 自体のコンパイル、インストール
[root@VM-1 ~]# dnf -y install gcc binutils tar chkconfig
以下から Softether の安定板 RTM のバージョンを確認する。今回は v4.38 でしたのでこれを使う。
v4.38 をダウンロードし、解凍する。
[root@VM-1 ~]# curl -OL https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.38-9760-rtm/softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz [root@VM-1 ~]# tar xzvf softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz
vpnserver を make して move して chmod する。
[root@VM-1 ~]# cd vpnserver [root@VM-1 vpnserver]# make [root@VM-1 vpnserver]# cd .. [root@VM-1 ~]# mv vpnserver /usr/local [root@VM-1 ~]# restorecon -RFv /usr/local/vpnserver [root@VM-1 ~]# cd /usr/local/vpnserver [root@VM-1 vpnserver]# chmod 600 * [root@VM-1 vpnserver]# chmod 700 vpncmd vpnserver
動作確認する。
[root@VM-1 vpnserver]# ./vpncmd Select 1, 2 or 3: 3 VPN Tools> check VPN Tools> exit
check の後に以下が表示されれば OK。
The command completed successfully.
OS 起動時にサービスが自動起動するように、systemd に登録してサービス化する。
[root@VM-1 ~]# vi /etc/systemd/system/softether-server.service
[Unit]
Description=Softether VPN Server Service
After=network.target
[Service]
Type=forking
User=root
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Restart=on-abort
WorkingDirectory=/usr/local/vpnserver/
[Install]
WantedBy=multi-user.target
サービスを起動および自動起動有効化する。
[root@VM-1 ~]# systemctl daemon-reload [root@VM-1 ~]# systemctl enable --now softether-server
サービスの起動状態を確認する。
[root@VM-1 ~]# systemctl status softether-server
firewalld で https を開放する。
[root@VM-1 ~]# firewall-cmd --permanent --add-service=https [root@VM-1 ~]# firewall-cmd --reload [root@VM-1 ~]# firewall-cmd --list-all
Softether VPN Bridge (VM-2) の設定
VM-2 にて Softether VPN Bridge の設定を行う。この設定により、Softehter VPN Bridge (拠点) 側の仮想 HUB [BRIDGE] を、VPN Server 側の仮想 HUB [VPN] にカスケード接続する (つまり LAN1 と LAN2 が L2 接続される)。
以下の手順を root ユーザーで設定していく。手順は Server と似ているがところどころ違うので注意。
インタフェースの調整
VM-2 の NW を設定する。まず各サーバの追加インタフェースのデバイス名と NAME が違うのが気持ち悪いので、nmcli c s で現在の NAME を確認し、以下コマンドで enp0s8 と enp0s9 を修正する。
[root@VM-2 ~]# nmcli c s [root@VM-2 ~]# nmcli con mod "Wired connection 1" connection.id enp0s8 [root@VM-2 ~]# nmcli con mod "Wired connection 2" connection.id enp0s9 [root@VM-2 ~]# nmcli c s
VM-1 と同様、WAN2 の enp0s3 は固定 IP を設定し、LAN2 の enp0s8 は Network Manager の管理から外す。
[root@VM-2 ~]# nmcli con mod enp0s3 ipv4.method manual ipv4.address 203.0.113.2/24 [root@VM-2 ~]# nmcli con up enp0s3 [root@VM-2 ~]# nmcli con del enp0s8
また、こちらも同様、VM-2 ⇔ VM-3 間が通信できるように個別ルートを追加する。
[root@VM-2 ~]# nmcli con mod enp0s3 +ipv4.routes "198.51.100.0/24 203.0.113.254" [root@VM-2 ~]# nmcli con up enp0s3
インターネットと VM-2 への疎通確認をする。
[root@VM-2 ~]# ping 1.1.1.1 [root@VM-2 ~]# ping 198.51.100.1
SELinux の Permissive 化
[root@VM-2 ~]# setenforce 0
/etc/selinux/config も SELINUX=enforcing から SELINUX=permissive に変更する。
必要パッケージインストール、および softether 自体のコンパイル、インストール
[root@VM-2 ~]# dnf -y install gcc binutils tar chkconfig
Softether VPN Server と同じバージョンの Softether VPN Bridge をダウンロードし、解凍する。
[root@VM-2 ~]# curl -OL https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.38-9760-rtm/softether-vpnbridge-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz [root@VM-2 ~]# tar xzvf softether-vpnbridge-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz
vpnbridge を make して move して chmod する。
[root@VM-2 ~]# cd vpnbridge [root@VM-2 vpnbridge]# make [root@VM-2 vpnbridge]# cd .. [root@VM-2 ~]# mv vpnbridge /usr/local [root@VM-1 ~]# restorecon -RFv /usr/local/vpnbridge [root@VM-2 ~]# cd /usr/local/vpnbridge [root@VM-2 vpnbridge]# chmod 600 * [root@VM-2 vpnbridge]# chmod 700 vpncmd vpnbridge
動作確認する。
[root@VM-2 ~]# ./vpncmd Select 1, 2 or 3: 3 VPN Tools> check VPN Tools> exit
OS 起動時にサービスが自動起動するように、systemd に登録してサービス化する。
[root@VM-2 ~]# vi /etc/systemd/system/softether-bridge.service
[Unit]
Description=Softether VPN Bridge Service
After=network.target
[Service]
Type=forking
User=root
ExecStart=/usr/local/vpnbridge/vpnbridge start
ExecStop=/usr/local/vpnbridge/vpnbridge stop
Restart=on-abort
WorkingDirectory=/usr/local/vpnbridge/
[Install]
WantedBy=multi-user.target
サービスを起動および自動起動有効化する。
[root@VM-2 ~]# systemctl daemon-reload [root@VM-2 ~]# systemctl enable --now softether-bridge
サービスの起動状態を確認する。
[root@VM-2 ~]# systemctl status softether-bridge
firewalld で https を開放する。なお、この設定は VPN 接続としては不要だが、次章の管理コンソール接続のために利用する。
[root@VM-2 ~]# firewall-cmd --permanent --add-service=https [root@VM-2 ~]# firewall-cmd --reload [root@VM-2 ~]# firewall-cmd --list-all
Softether VPN Server Manager for Windows のダウンロード&インストール
VPN Server と Bridge の細かい設定は Manager ソフトにて GUI で設定できる。
VirtualBOX を動かしているホスト OS にて、以下サイトからインストーラをダウンロードする。
以下のスライドの手順でインストールする。
プログラムを起動し、Softether VPN Server と VPN Bridge の設定を GUI にて行っていく。
VPN Server の設定
まずは VPN Server への接続設定をする。通常はホスト名はVM-1 の IP, ポート番号は 443 を設定するのだが、今回の例では前述の通り、VM-1 の NAT インタフェースのポートフォワード設定で 127.0.0.11:10443 の通信をゲスト OS の IP の 443/tcp へ変換しているので、この場合は以下のように設定する。
接続ボタンを押すと管理者の初期パスワード設定を求められるため、設定する。
すると以下の画面が表示されるため、「リモートアクセス VPN サーバー(R)」にチェックを入れ、「次へ(N)」をクリックする。
仮想 HUB 名はデフォルトの「VPN」のままとする。
次にダイナミック DNS 機能について聞かれるが、今回は使わないため「閉じる(X)」をクリックする。
同様に IPsec / L2TP /EtherIP / L2TPv3 サーバー機能も使わないため、「キャンセル」をクリックする。
VPN Azure も使わないので無効にして OK をクリックする。
以下の画面が表示されるので、ユーザーを作成する。
ユーザー名とパスワードを入力する。この ID/PW は VPN Bridge 側で利用する。この例ではユーザー名を vpn-bridge1 とした。
ユーザーの作成状況などを確認した後、先ほどの Window に戻り、一番下の「3. ローカルブリッジの設定」にLAN 側の enp0s3 を設定し、「閉じる(C)」をクリックする。VM なのでプロミスキャスモードに関する注意がでるが、先ほど VirtualBOX で設定した通りなので問題ない。「OK」をクリックする。
これで Server の設定は終わりである。
VPN Bridge の設定
サーバー管理マネージャーで同様に VPN Bridge に接続する。
同様に管理者パスワードの初期設定を求められるので設定すると、以下の画面が表示されるので、そのまま「次へ」をクリックする。
簡易セットアップの実行として「2. 接続先の VPN Server への接続設定」を行う。接続設定名は任意の名前でよい。ホスト名とポート番号は VM-3 の気持ちになって設定すること。仮想 HUB 名(V)、ユーザー名とパスワードは VPN Server 側で設定した通りである。
状態が「オンライン (接続済み)」となるはずである。
先ほどの Window に戻って「3. ローカルブリッジの設定」を行う。今度は LAN 側は enp0s8 である。
同様にプロミスキャスモードの注意が出るがこちらも OK。
これで完成である。VM-3 で ping 10.1.1.4 、VM-4 で ping 10.1.1.3 を打って疎通確認をする。
不要な設定を削除する
デフォルトで解放している「992/tcp, 1194/tcp, 5555/tcp」は不要なので削除する。これは VPN Server 側も VPN Bridge 側もである。(firewalld で 443/tcp のみになっているので不要とも思えるかもしれないが、多層防御の考え方としては重要である。)
また、デフォルトでは UDP による高速接続も設定されているが、今回は 443/tcp のみで通信しているため、これは設定を止めておく。
「仮想 HUB の管理(A)」⇒「カスケード接続の管理(C)」にて「BRIDGE 上のカスケード接続」Window を表示し、対象の接続設定名をクリックした状態で「編集(E)」をクリックし、「高度な通信設定(N)」をクリックすると以下が表示されるので、「UDP 高速化機能を無効にする」にチェックを入れる。
設定を反映するため、「オフライン(F)」⇒「オンライン(N)」をクリックする。
ちなみに上図にある通り、ここで TCP コネクションの数も設定できる。デフォルトでは 8 本となっている。
以上。
コメント