SoftetherとCentOS7で拠点間接続&L2ルーター構築

この記事はネットワークの理解のためにSoftetherを用いて拠点間接続を行います。
別の方法として、ルーティング部にスイッチングハブを用いてL3で拠点間接続を行う方法もあります。

# はじめに

この記事では、CentOSをインストールした2つ以上のNICを持つマシンにSoftetherをインストールして、レイヤー2での拠点間接続を構築します。
これにより拠点間でサブネットを分割する必要がなくなります。詳細はSoftEtherのドキュメントをご覧ください。
[2. レイヤ 2 Ethernet ベースの VPN - SoftEther VPN プロジェクト](https://ja.softether.org/1-features/2._%E3%83%AC%E3%82%A4%E3%83%A4_2_Ethernet_%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE_VPN#2.4._.E6.8B.A0.E7.82.B9.E9.96.93.E6.8E.A5.E7.B6.9A.E3.81.AB.E3.81.8A.E3.81.91.E3.82.8B.E3.83.AC.E3.82.A4.E3.83.A4_2_VPN_.E3.81.AE.E5.88.A9.E7.82.B9)

## 構成図

今回の構成では2つの拠点間接続を行います。
大阪拠点と沖縄拠点が存在し、沖縄拠点の通信をすべて大阪拠点経由に行うことが今回の目標です。
なお、沖縄拠点のnodeは任意の数のNICをserverに接続することで増設できます。
増設を簡略化するには、沖縄拠点のserverのnodeの間にスイッチングハブをはさみ、これでルーティングしてもらう方法が良いでしょう。
![v3_SoftetherとCentOS7で拠点間接続ルーター作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/b5b873ba-1bda-5304-6191-d51d0a0c802c.png)

沖縄拠点のserverにある緑色の枠は物理NICを表しています。
また、紫色の枠はコンピューターです。

## 構成マシン

以下の構成で行います

```
server:CentOS 7
Softether server 4.34 Build 9745 インストール済み

Client:CentOS 7
Softether serverをインストール予定
Raspberry pi 4 Model B

```

ラズパイでない通常のPCでも手順は変わらないはずです。

# 事前準備

## 大阪拠点の初期セットアップ

Softether serverが稼働しており、インターネットに接続できるSoftether serverを構築します。
以下の記事を参考にしてください。
[softether VPNをCentos7で構築する。](https://qiita.com/honahuku/items/1fdc8c6b6ad49816f1a0)

## 沖縄拠点のの初期セットアップ

OSをインストールした直後の状態からラズパイ固有の設定、SSHとパッケージの更新など初期設定については以下の記事で解説しています。

# 拠点間接続の準備

さきほど構築した大阪拠点は変更しません。
通常のセットアップと異なり、ブリッジ側（ここでは沖縄拠点）に追加の設定を行う必要があります。

## ソフトウェアのインストール

ルーティングとSoftetherの動作に必要なソフトをインストールします

```sh
$ yum -y install gcc make which net-tools wget tar bind-utils dhcp libevent-devel ncurses-devel
```

## NICの設定

接続されているNICの状態を確認する。

- eth0 - ラズパイ本体のLANポート
- enp1s0u1 - 拡張したLANポート
- enp1s0u2 - 拡張したLANポート

NICのデバイス名は機器や接続のタイミングで異なることがあるので、適宜読み替えてください。

```sh
$ nmcli d
DEVICE			TYPE		STATE			CONNECTION
eth0			ethernet	connected		Wired connection 1
wlan0			wifi		disconnected	--
p2p-dev-wlan0	wifi-p2p	disconnected	--
enp1s0u1		ethernet	unavailable		--
enp1s0u2		ethernet	unavailable		--
lo　			 loopback	 unmanaged		 --
```

```
$ nmcli c
NAME　　　　　　　　　　UUID　　　　　　　　TYPE　　	DEVICE
Wired connection 1　378bd0b3-[省略]　	ethernet	eth0
Wired connection 2　3478457a-[省略]　	ethernet	--
Wired connection 3　a19806a4-[省略]　	ethernet	--
```

LAN側のenp1s0u1の設定を行います。
インターフェイスのconfigファイルを作成します。

```sh
$ vi /etc/sysconfig/network-scripts/ifcfg-enp1s0u1
```

すでにファイルがある場合もありますが、以下の内容で上書きします。
UUIDはwebの生成ツールを使用した結果を入力します。

[UUIDの生成ツール](https://uuid.doratool.com/)

```sh:ifcfg-enp1s0u1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=no
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=no
IPV6_DEFROUTE=no
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp1s0u1
UUID=2a2bc558-[省略]
DEVICE=enp1s0u1
ONBOOT=yes
IPADDR=192.168.1.254
NETMASK=255.255.255.0
PREFIX=24
```

ネットワークの再起動、インターフェイスの状態を確認します。

```
$ systemctl restart network
```

設定確認

```
$ nmcli d
DEVICE			TYPE		STATE			CONNECTION
eth0			ethernet	connected		Wired connection 1
wlan0			wifi		disconnected	--
p2p-dev-wlan0	wifi-p2p	disconnected	--
enp1s0u1		ethernet	connected		enp1s0u1
enp1s0u2		ethernet	unavailable		--
lo　			 loopback	 unmanaged		 --
```

```
$ nmcli c
NAME　　　　　　　　　　UUID　　　　　　　　TYPE　　	DEVICE
Wired connection 1　378bd0b3-[省略]　	ethernet	eth0
enp1s0u1		    2a2bc558-[省略]　   ethernet	   enp1s0u1
Wired connection 3　a19806a4-[省略]　	ethernet	--
```

これでenp1s0u1の準備が完了しました。
enp1s0u2に関してはこれらの手順を行わなくて良いです。

## DHCP有効化

DHCPサーバー設定ファイルの作成を行います。

```
vi /etc/dhcp/dhcpd.conf
```

以下を記述

```sh:dhcpd.conf
#デフォルト貸出期間
default-lease-time 600;
#最大貸出期間
max-lease-time 7200;
#正当なDHCPサーバーであることの宣言
authoritative;
#ネットワークアドレスとサブネットマスク指定
subnet 192.168.1.0 netmask 255.255.255.0 {
#貸し出すIPアドレスの範囲指定
range dynamic-bootp 192.168.1.10 192.168.1.253;
#ブロードキャストアドレス指定
option broadcast-address 192.168.1.0;
#ゲートウェイアドレス指定
option routers 192.168.1.254;
}
```

## DNSについて

今回DNSはSoftetherの機能に頼るためOS側で用意しません。
一度dnsmasqを利用した方法もありますが、今回は割愛します。

<https://linux.just4fun.biz/?Linux%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A/dnsmasq%E3%82%92DHCP%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88%E3%81%AE%E6%9C%80%E5%B0%8F%E9%99%90%E3%81%AE%E8%A8%AD%E5%AE%9A%E4%BE%8B#lfb7fff1>

<https://server.etutsplus.com/dnsmasq-setup-internal-dns/>

# softetherのセットアップ

Softetherの設定を行います。

## ダウンロードと解凍と移動

wgetのurl、tarとrmのファイル名はCPUなどの環境に応じて適宜読み替えてください。
ここで規約の同意と動作確認まで行います。

```sh
wget https://www.softether-download.com/files/softether/v4.34-9745-rtm-2020.04.05-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gz
tar zxvf softether-vpnserver-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gz
cd vpnserver
make i_read_and_agree_the_license_agreement
cd ../
mv ./vpnserver /usr/local
ls -lra
rm -rf softether-vpnserver-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gz
```

\##自動起動設定
systemdに登録して自動起動するようにします。

```
cd /etc/systemd/system && \
vim softethervpn.service

# 以下を記述
[Unit]
Description=SoftEther VPN Server
After=network.target

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

[Install]
WantedBy=multi-user.target
```

\##systemdの反映と確認
先ほど作成したsystemdのファイルを登録して有効化し実行します。

```sh
systemctl daemon-reload && \
systemctl enable softethervpn && \
systemctl start softethervpn && \
systemctl status softethervpn
```

以下のような表示が出ればソフトのインストールは成功です。

```sh
● softethervpn.service - SoftEther VPN Server
   Loaded: loaded (/etc/systemd/system/softethervpn.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-01-11 21:14:54 JST; 3s ago
  Process: 20904 ExecStart=/usr/local/vpnserver/vpnserver start (code=exited, status=0/SUCCESS)
```

## 詳細設定

サーバー側の詳細設定、ユーザー登録処理などは以下の記事を参照してください。
[Softether VPN serverをGUIで初期設定する - Qiita](https://qiita.com/honahuku/items/5a29355faaf363f87654)

# dhcp無効化

これまではDHCPをOSの機能で行っていましたが、これはサーバー管理時のみ有効化します。
本稼働時はSoftetherの機能で行います。

```
dhcp_stop
reboot
```

これ以降沖縄拠点のSoftether serverにはSSHできなくなります。（すべて通信が大阪に飛ぶ）そのため操作するにはコンソールに直接アクセスしてください。
再度SSHを有効化する場合はdhcp_startを実行します。その場合は大阪へアクセスできなくなる代わりにルーターのメンテナンスが可能になります。
小規模なメンテナンスの場合はコンソールに直接アクセスすることでVPN接続を中断せずともメンテナンスが可能です。

# L2とL3の拠点間接続方法の違い

もともと私は知見のためにL3接続による構築を行うつもりでした。
ですが、公式ドキュメントの[10.6.3 IP ルーティングを使用する場合のデメリット](https://ja.softether.org/4-docs/1-manual/A/10.6#IP_.E3.83.AB.E3.83.BC.E3.83.86.E3.82.A3.E3.83.B3.E3.82.B0.E3.82.92.E4.BD.BF.E7.94.A8.E3.81.99.E3.82.8B.E5.A0.B4.E5.90.88.E3.81.AE.E3.83.87.E3.83.A1.E3.83.AA.E3.83.83.E3.83.88)に記載されていた以下の事項が気になりました。

> ・若干パフォーマンスが低下する
> ・IP 以外の通信を行うことはできません

この2点は私にとって致命的でした。
私はUDPを用いた通信をリモートサーバーに対して行うため、L3での構築は断念し、L2での構築を行うことにしました。
今後問い合わせが多ければL2とL3での負荷比較とスピードテストを行うつもりです。

# 参考文献

### dhcp有効化まで

<https://grapho.jp/raspberrypi4/router/>

### Softetherでの拠点間接続

<https://ja.softether.org/4-docs/1-manual/A/10.5>
<https://ja.softether.org/4-docs/1-manual/A/10.6>