v6プラス x SoftEtherで、ルータの設定を一切変更せずに外部から自宅LANに接続する方法

<a id="markdown-はじめに" name="はじめに"></a>
# はじめに
外出中に自宅LANにアクセスしたい！この願望を叶えます。 
私のマンションの回線はv6プラスで、固定グローバルIPはおろか、ポート解放もできません。
なので、クラウド環境をフロントに配置して、自宅からクラウドの環境にトンネリングすることで外部から安全に接続できるようにしました。

最終的な構成のイメージは以下の通りです。
自宅NWとConoHaが常時VPNトンネルで接続され、外出先からはConoHa上にL2TPでVPNトンネルを開通することで、自宅LANに参加できます。
<img src=https://grimoire.f5.si/wp-content/uploads/2020/07/softether.jpg>

<a id="markdown-目次" name="目次"></a>
# 目次
<!-- TOC -->

- [はじめに](#はじめに)
- [目次](#目次)
- [動作環境](#動作環境)
- [SoftEther ServerとSoftEther Bridgeのインストール](#softether-serverとsoftether-bridgeのインストール)
- [SoftEther VPN Server Managerダウンロード](#softether-vpn-server-managerダウンロード)
- [SoftEther Serverセットアップ](#softether-serverセットアップ)
    - [接続情報入力](#接続情報入力)
    - [仮想HUBの作成](#仮想hubの作成)
    - [ユーザの作成](#ユーザの作成)
    - [ローカルブリッジ設定](#ローカルブリッジ設定)
    - [L2TPサーバの有効化](#l2tpサーバの有効化)
- [SoftEther Bridgeセットアップ](#softether-bridgeセットアップ)
    - [接続情報入力](#接続情報入力-1)
    - [ローカルブリッジ設定](#ローカルブリッジ設定-1)
    - [カスケード接続](#カスケード接続)
- [IPアドレスの設定](#ipアドレスの設定)
    - [SoftEther Server](#softether-server)
    - [SoftEther Bridge](#softether-bridge)
- [疎通確認](#疎通確認)
- [おわりに](#おわりに)
- [参考サイト](#参考サイト)

<!-- /TOC -->

<a id="markdown-動作環境" name="動作環境"></a>
# 動作環境
- Raspberry Pi 3B+ Rasbian 9.3 (SoftEther Bridge用)
- ConoHa CentOS 8.1 (SoftEther Server用)
- Windows 10 (Manager用)

<a id="markdown-softether-serverとsoftether-bridgeのインストール" name="softether-serverとsoftether-bridgeのインストール"></a>
# SoftEther ServerとSoftEther Bridgeのインストール
公式の[ダウンロードセンター](https://www.softether-download.com/?product=softether)から、ダウンロードできます。
ConoHaのVPS上にSoftEther Server、ラズパイ上にSoftEther Bridgeをそれぞれインストールします。
インストール作業は、公式ドキュメント[VPN Server の導入](https://ja.softether.org/4-docs/1-manual/7)の通りにやれば簡単にできます。
SoftEther VPN Bridgeの手順は、こちら[VPN Bridge の導入](https://ja.softether.org/4-docs/1-manual/9)  を参考にどうぞ。

gccなどの依存パッケージは、自分でインストールする必要があるのは要注意です。

<a id="markdown-softether-vpn-server-managerダウンロード" name="softether-vpn-server-managerダウンロード"></a>
# SoftEther VPN Server Managerダウンロード
これも公式の[ダウンロードセンター](https://www.softether-download.com/?product=softether)から、SoftEther VPN Server Manager（以降 Manager)のパッケージをダウンロードできます。
解凍したファイルのvpnsmgr.exeを起動して、手元のWindows 10からセットアップ作業をしていきます。　　

<a id="markdown-softether-serverセットアップ" name="softether-serverセットアップ"></a>
# SoftEther Serverセットアップ
<a id="markdown-接続情報入力" name="接続情報入力"></a>
## 接続情報入力
Managerの**新しい接続設定**を押下して、SoftEther Serverに繋げます。
入力項目は下記の図のように、ホスト名には上記でSoftEther ServerをインストールしたサーバのIPアドレスを入力します。
<img src=https://grimoire.f5.si/wp-content/uploads/2020/07/02.png>

<a id="markdown-仮想hubの作成" name="仮想hubの作成"></a>
## 仮想HUBの作成
[**仮想HUBの作成**]を押下し、新規の仮想HUBを作成します。
<img src=https://grimoire.f5.si/wp-content/uploads/2020/07/04.png>


<a id="markdown-ユーザの作成" name="ユーザの作成"></a>
## ユーザの作成
[**仮想HUBの管理**]>[**ユーザの管理**]>[**新規作成**]を順に押下します。
任意の**ユーザ名**と**パスワード**を入力します。最後に[**OK**]を押して確定です。

<img src=https://grimoire.f5.si/wp-content/uploads/2020/07/06.png>


<a id="markdown-ローカルブリッジ設定" name="ローカルブリッジ設定"></a>
## ローカルブリッジ設定
仮想HUBと実際のNICを繋ぐための設定です。
ConoHaのVPSは、NICが1つしかないのでtapデバイスとブリッジ接続させます。
[**ローカルブリッジ接続**]を押下し、下記の図を参考に入力します。
入力できたら[**ローカルブリッジを追加**]を押下して追加します。

<img src=https://grimoire.f5.si/wp-content/uploads/2020/07/09.png>

<a id="markdown-l2tpサーバの有効化" name="l2tpサーバの有効化"></a>
## L2TPサーバの有効化
iPhoneやPCから、VPN接続できるように[**IPsec / L2TP 設定**]>[**L2TP サーバ機能を有効にする**]にチェックを入れます。
IPsecの事前共有鍵のパスワードを入力できたら、[**OK**]を押下する。

<img src=https://grimoire.f5.si/wp-content/uploads/2020/07/08.png>

<a id="markdown-softether-bridgeセットアップ" name="softether-bridgeセットアップ"></a>
# SoftEther Bridgeセットアップ
<a id="markdown-接続情報入力-1" name="接続情報入力-1"></a>
## 接続情報入力
SoftEther Serverと同様の手順のため割愛

<a id="markdown-ローカルブリッジ設定-1" name="ローカルブリッジ設定-1"></a>
## ローカルブリッジ設定
SoftEther Serverと同様の手順で追加しますが、1つ注意点があります。
既に自宅ルータと接続しているNICと同じものを選択すると、正常に通信ができません。
仮に無線のwlan0を既に使用しているなら、eth0など別のNICを選んでください。
自分は未検証ですが、おそらくtapデバイスでも可能です。
  

<img src=https://grimoire.f5.si/wp-content/uploads/2020/07/10.png>


私はwlan0で自宅のWi-Fiに繋いでるので、使用していないeth0を選択しました。
eth0を選んだ場合は、写真のようにLANケーブルで自宅のルータと繋いであげます。

<img src=https://grimoire.f5.si/wp-content/uploads/2020/07/IMG_0120-scaled.jpg>

<a id="markdown-カスケード接続" name="カスケード接続"></a>
## カスケード接続
[**仮想HUBの管理**]＞[**カスケード接続の管理**]を順に押下します。
[**新規作成**]から、上記手順でセットアップしたSoftEther Serverの情報を入力します。
入力後、**状態**が**オンライン(接続済み)**になっていれば成功です。

これで自宅LAN(RaspberryPi)とConoHaのVPS間で、L2のVPNトンネルができました。


<img src=https://grimoire.f5.si/wp-content/uploads/2020/07/11.png>

<a id="markdown-ipアドレスの設定" name="ipアドレスの設定"></a>
# IPアドレスの設定
<a id="markdown-softether-server" name="softether-server"></a>
## SoftEther Server
L2レイヤーでの接続ができましたが、IPアドレスを適切に設定してあげないとIP通信ができません。
SoftEther Server(ConoHa)側でifconfigを叩くと、tap_(tapデバイス名)があるはずです。
こいつに自宅LANのIPアドレスを割り当てます。下記のように、ifcfgコマンドで割り当てられます。

```bash
#!/bin/bash

# case Static IP
TAP_IF="tap_vpn"  # ここは自分の環境に合わせてください

# 30sec Loop
for i in {1..30}
do
    sleep 1
    ip tap | grep --quiet ${TAP_IF}
    STATUS=$?
    if [ "${STATUS}" == "0" ]
    then
        # 自宅と同セグメントのIPアドレス
        ifcfg  ${TAP_IF}  add  192.168.10.254/24 　
        break;
    fi
done
exit 0
```

```bash
#!/bin/sh
# chkconfig: 2345 99 01
# description: SoftEther VPN Server
STATIC_IP=/usr/local/vpnserver/setting_ip.sh　# 追加
DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/subsys/vpnserver
test -x $DAEMON || exit 0
case "$1" in
start)
$DAEMON start
$STATIC_IP  # 追加
touch $LOCK
;;
stop)
$DAEMON stop
rm $LOCK
;;
restart)
$DAEMON stop
$STATIC_IP  # 追加
sleep 3
$DAEMON start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
```

上記のスクリプトを、Softetherのスタートアップスクリプトに組み込みます。

<a id="markdown-softether-bridge" name="softether-bridge"></a>
## SoftEther Bridge
公式ドキュメントの推奨通り、ローカルブリッジで使用するNICにはIPアドレスが振られないようにします。
Debian系のOSなら、下記の通り/etc/dhcpcd.confに2行追加します。
追加できたら、ネットワークの再起動かrebootで設定を適用させます。

>[SoftEther公式ドキュメント](https://ja.softether.org/4-docs/1-manual/3._SoftEther_VPN_Server_マニュアル/3.6_ローカルブリッジ)
>ローカルブリッジ用に、コンピュータに用意したローカルブリッジ専用 LAN カードがある場合には、パフォーマンスを向上させるために、その LAN カードには TCP/IP プロトコルや他のプロトコルスタックなどを「無効」にすることを推奨します。

```shell
$ vi /etc/dhcpcd.conf
```

```bash
# eth0 configuration
interface eth0
static ip_address=0.0.0.0
```

<a id="markdown-疎通確認" name="疎通確認"></a>
# 疎通確認
全ての設定ができたら、pingコマンドで疎通確認してみてください。

```shell
$ ping 192.168.10.254 // SoftEther ServerのIPアドレス宛
```

注意点ですが、ローカルブリッジで使用しているNIC(この場合は、eth0)に割り当てられるIPを無効にしてあげないと正常に通信できません。
公式ドキュメントで下記のように説明されています。　　

>[SoftEther公式ドキュメント](https://ja.softether.org/4-docs/1-manual/3/3.6)
>Linux オペレーティングシステム内部での制限事項により、VPN 側 (仮想 HUB 側) からローカルブリッジしている LAN カードに割り当てられる IP アドレスに対して通信を行うことはできません。

<a id="markdown-おわりに" name="おわりに"></a>
# おわりに
記事に書いてみると、本当に少ない手順でVPN環境が作成できましたね。
しかし、ネット検索で出てくる記事の通りにやってもIPの通信疎通できなかったので、今回は自分が実施した手順を投稿させていただきました。
自分が出来なかったのは、以下のポイントで不適切な設定をしていたからです。
- SoftEther ServerとSoftEther BridgeのIPアドレスの設定
- ローカルブリッジで使用するNICの設定
- 外部接続時用にSecureNAT機能を有効にしていた
(自宅ルータから、IPアドレスを取得するので不要)

ここまでで力尽きて、記事では割愛してますが、同セグメント化しているので、
ファイアウォールの設定を適切にしてあげないと、クラウドを突破されるといきなり自宅LANまで侵入されます。
私は、インターネットからのSSH接続を完全に拒否してVPNトンネル開通に必要な443ポートだけ空けてます。
なので、外部からはVPN経由でしか入れないようになってます。

誰かの参考になれば幸いです(｡･ω･｡)

<a id="markdown-参考サイト" name="参考サイト"></a>
# 参考サイト
- [個人運営ブログの同記事](https://grimoire.f5.si/archives/147)
- [SoftEther VPN プロジェクト](https://ja.softether.org)
- [Raspberry PiにSoftEther VPN Bridgeをインストールして常時VPN接続されたネットワークを作成する](https://qiita.com/kakken1988/items/6e4a4ae0a9cdf49564a3)
- [Raspberry Piで自宅VPNサーバを構築する SoftEtherVPN【完全保存版】](https://nobuntu.jp/raspberrypi-vpn-server-softethervpn/)
- [【Centos7】SoftEther Server 構築手順【L2TP/IPsec】
](https://qiita.com/nobu-maple/items/61f51baa9965dbd6fb04)
- [Conohaと自宅鯖をVPNでつないで大容量ストレージサーバーを構築した話](https://qiita.com/salt_field/items/5969f7d7a8612e150bda)
- [AWS(EC2)でSoftEtherを使ってL2TP/IPsecなVPNを構築する (Mac)](https://qiita.com/showwin/items/92861057a8b62611444d)