- やりたいこと
- ネットワーク設定のポイント
- VyOS の展開と設定
- Rocky Linux の展開と VirtualBOX の設定
- VM-1, VM-2 のブリッジインタフェースの設定
- ブリッジインタフェースへの NW 設定
- VM-1 への Softether VPN Server のインストール
- VM-2 への Softether VPN Bridge のインストール
- Softether VPN Server Manager for Windows のダウンロード&インストール
- VPN Server の設定
- VPN Bridge の設定
- VM-1 と VM-2 のそれぞれで、br0 と tap_0 をリンク
- サービス起動時に br0 と tap_0 をリンクさせる
- 不要な設定を削除する
- おまけ: bridge インタフェースと tap インタフェース
- IT/インフラエンジニアの地位とスキル向上のために
やりたいこと
RHEL 系 Linux (Rocky Linux) を VirtualBOX 上に 2 台用意し、Softether VPN で拠点間 L3 接続する。
Linux で Softether を使う場合、ローカルブリッジ設定で指定したインタフェースの IP には対向拠点からはアクセスできなくなってしまう。そうなると Softether を動かしているサーバはその IP でサービスを待ち受けても使えなくなってしまう。
そこで今回は bridge インタフェースと tap インタフェースを作り、tap インタフェースをローカルブリッジに指定することで、この問題を回避した。ブリッジインタフェース br0 を作り、IP を持たせ、ルーティング設定もしている。
構成図は以下の通り。
図の右側にある通り、10.2.2.2 から 198.51.100.1 への https 接続を VyOS で NAT し、10.1.1.1 へ到達性を持たせている。(今回の目的は 10.1.1.0/24 と 10.2.2.0/24 を接続するので互いの IP を隠蔽する目的で NAT をかませている。VyOS + NAT でインターネットをシミュレーションしている。)
この右側の https 接続により左側の Softether 管理下の各種機能が動作し、10.1.1.0/24 と 10.2.2.0/24 が L3 接続できるようになる。
ネットワーク設定のポイント
上記を構成する上で一番厄介なのがネットワークの設定である。何が厄介かというと、最近の RedHat 系 OS (CentOS/Rocky Linux/Almalinux) は NetworkManager によるインタフェース管理が前提だが、Softether が作る tap インタフェースは softether が管理を譲らないため、NetworkManager (nmcli コマンド等) での [tap_0 <-> br0] 接続設定ができない。
そのため別途コマンド (ip link set, 詳細は後述する) を実行しなければならないが、Softether のサービス再起動や br0 インタフェースの down->up でこの接続が切れてしまうため、そのたびにそのコマンド実行が必要になる。
VyOS の展開と設定
以下手順を参照に構築する。
アダプター 1 は「内部ネットワーク」の [LAN1] に設定する。
同様にアダプター 2 は「内部ネットワーク」の [LAN2] に設定する。
アダプター 3 は「NAT」とし、ポートフォーワードの設定をする。
config は以下を投入する。
vyos@vyos# set interfaces ethernet eth0 address '10.1.1.254/24' vyos@vyos# set interfaces ethernet eth1 address '10.2.2.254/24' vyos@vyos# set nat destination rule 1 destination address '198.51.100.1' vyos@vyos# set nat destination rule 1 translation address '10.1.1.1' vyos@vyos# set nat destination rule 1 inbound-interface 'eth1' vyos@vyos# set nat source rule 1 source address '10.2.2.2' vyos@vyos# set nat source rule 1 translation address '10.1.1.254' vyos@vyos# set nat source rule 1 outbound-interface 'eth0'
Rocky Linux の展開と VirtualBOX の設定
VirtualBOX 上に Rocky Linux 9 をインストールする。
VirtualBOX の「ネットワーク」において先ほどの VyOS と合うように VM-1 のアダプター 1 は「内部ネットワーク」の [LAN1] に、VM-2 のアダプター 1 は「内部ネットワーク」の [LAN2] に設定する。
アダプター 2 の設定は不要である。
アダプター 3 は NAT + ポートフォワードの設定をする。VM については ssh だけでなく https のポートフォワードの設定も行う。なお、以下は VM-1 の例だが、VM-2 の場合はホスト IP を 127.0.0.12 にする。
VM-1 には 127.0.0.11 の 10022/tcp で ssh 接続できる。VM-2 や VyOS もホスト IP だけ変え、他は同様の手順でログインできる。
なお、VyOS は TeraTerm 等においては「キーボードインタラクティブ認証を使う」で認証しないとうまくログインできない。
VM-1, VM-2 のブリッジインタフェースの設定
まず、ブリッジインタフェース br0 を作成する。
# nmcli con add type bridge con-name br0 ifname br0
STP が嫌いな人は止める。
# nmcli con mod br0 bridge.stp no
次に enp0s3 の IP は削除したいのだが、NetworkManager の管理下においては固定 IP を空欄にすることはできないので、NetworkManager の管理から外す。
# nmcli con del enp0s3
del という表現だが、nmcli device でデバイス自体は表示されるし、nmcli device set enp0s3 managed yes で元に戻すことができる。なお、今回の構成では enp0s3 はマシン外部との接続の媒介となる。図にある通り、VyOS との接続に必要となる。
次に、br0 と enp0s3 をリンクする。これは両方とも NetworkManager 管理下であるため nmcli コマンドで実行できる
# nmcli con add type bridge-slave ifname enp0s3 master br0
Linux 内部の仮想ブリッジの接続状況を確認するには bridge link show コマンド、もしくは ip link show master br0 コマンドを使う。
ブリッジインタフェースへの NW 設定
次に br0 に IP 等の NW 設定を行う。本来 enp0s3 で割り当てる設定を br0 に持たせる。
VM-1 は以下の通り。
[root@VM-1 ~]# nmcli con mod br0 ipv4.method manual ipv4.address 10.1.1.1/24 [root@VM-1 ~]# nmcli con mod br0 +ipv4.routes "10.2.2.0/24 10.1.1.250" [root@VM-1 ~]# nmcli con up br0
VM-2 は以下の通り。
[root@VM-2 ~]# nmcli con mod br0 ipv4.method manual ipv4.address 10.2.2.2/24 [root@VM-2 ~]# nmcli con mod br0 +ipv4.routes "10.1.1.0/24 10.2.2.250" [root@VM-2 ~]# nmcli con mod br0 +ipv4.routes "198.51.100.0/24 10.2.2.254" [root@VM-2 ~]# nmcli con up br0
OS はルーティングテーブルにより出力インタフェースを決めるので、10.X.X.0/24 宛の通信については br0 が発信元となり、NextHop 10.Y.Y.250 へ ARP 解決し、パケットを投げることになる。なお、10.Y.Y.250 は Softether VPN の接続が出来てからでないと接続できない、レイヤ 3 スイッチに設定されている。ルーティングテーブルは ip route コマンドで表示できる。
VM-1 への Softether VPN Server のインストール
必要パッケージをインストールする。
[root@VM-1 ~]# dnf -y install gcc binutils tar chkconfig
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
VM-2 への Softether VPN Bridge のインストール
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-2 ~]# restorecon -v /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
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.21:10443 の通信をゲスト OS の IP の 443/tcp へ変換しているので、この場合は以下のように設定する。
接続ボタンを押すと管理者の初期パスワード設定を求められるため、設定する。その後は以下のスライドに従って設定する。
VPN Bridge の設定
サーバー管理マネージャーで同様に VPN Bridge に接続する。
同様に管理者パスワードの初期設定を求められるので設定する。以降は以下のスライドに従って設定する。
VM-1 と VM-2 のそれぞれで、br0 と tap_0 をリンク
VM-1 と VM-2 の両方で、以下コマンドにて br0 と tap_0 を L2 接続させる。
# ip link set dev tap_0 master br0
これで完成である。VM-1 で ping 10.1.1.1 、VM-2 で ping 10.2.2.2 を打って疎通確認をする。
サービス起動時に br0 と tap_0 をリンクさせる
サービス起動時に自動で br0 と tap_0 をリンクさせるために、VM1 の /etc/systemd/system/softether-server.service と VM-2 の/etc/systemd/system/softether-bridge.service の ExecStart の行の下に以下を追記する。
ExecStartPost=/usr/bin/sleep 5s
ExecStartPost=/usr/sbin/ip link set dev tap_0 master br0
不要な設定を削除する
デフォルトで解放している「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 本となっている。
おまけ: bridge インタフェースと tap インタフェース
最初の図で見てみると分かり易いと思うが、bridge インタフェースはマシン内部の L2 スイッチングを担っており、マシンから見て外部の NW 機器である [VyOS] と [仮想HUB] への接続がそれぞれ enp0s3 と tap インタフェースが担ってる。
なのでこの図から直感的に「ここでの enp0s3 インタフェースと tap インタフェースの機能は同じ」であり、tap インタフェースは外部機器との 1 対 1 の L2 接続に使えるものである。例えば L2 VPN 接続時で対向拠点との仮想的な L2 接続を表現するときに使われる。
[VyOS] は完全に外部の機器なので分かり易いが、今回の [仮想HUB] はマシン内部で生成されているのでちょっと分かりづらい。実は br0 を作った後にローカルブリッジの設定画面で見てみると br0 も選択できる。だが、br0 は IP を持たせているのでローカルブリッジをしてしまうと冒頭の通り到達性が無くなる。
ということでやはり tap が無いとダメであり、今回 tap を使う意味というのは正にその点である。
つまり、[仮想HUB] はマシン内部なので br0 へ直結することもできるが、IP 到達性を確保するために tap を介す、ということである。
(と私は理解した)
コメント