GCPにSoftether Serverを立てる（iPhone／ラズパイから接続）（NAT超えWake on LAN[2]）

# はじめに
[前回](https://qiita.com/jjjkkkjjj/items/d0370573fcb04deeb91f)の続きです．
とりあえずやりたいことはこんなんです．

![network_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/5834caa5-20e1-6878-79a1-01469d50525e.png)

今回は「GCPにSoftether Serverを立てる（iPhone／ラズパイから接続）」です．

- [1][GCPとMyDNSを使って，ドメインを取得する](https://qiita.com/jjjkkkjjj/items/d0370573fcb04deeb91f)
- [2][GCPにSoftether Serverを立てる（iPhone／ラズパイから接続）](https://qiita.com/jjjkkkjjj/items/824998a6106eff941347)
- [3][GCP上のApacheからローカルのラズパイApacheにリバースプロキシする](https://qiita.com/jjjkkkjjj/items/b8363536c488cf51d577)
- [4][ラズパイをルーター化する](https://qiita.com/jjjkkkjjj/items/6f416f27eabbaf04979e)
- [5][Wake on LAN用のPythonスクリプトを作成する．](https://qiita.com/jjjkkkjjj/items/afa4fe637e2c6dae3ecf)

# Softether Client
## GCPにSoftether Clientをインストール
まず，Softether Clientをインストールします．（※もしかしたら，必要ないかもです．）
GCPにSSH接続し，必要なモジュールをインストールします．

```bash
sudo apt update
sudo apt-get install -y gcc make wget tzdata git libreadline-dev libncurses-dev libssl-dev bridge-utils
```

Softherで指定するCPUのためにCPU情報を取得します．

```bash
$ lscpu
Architecture:        x86_64 <<< bit info
CPU op-mode(s):      32-bit, 64-bit <<< which bit cpu can handle
Byte Order:          Little Endian
CPU(s):              1
On-line CPU(s) list: 0
Thread(s) per core:  1
Core(s) per socket:  1
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               79
Model name:          Intel(R) Xeon(R) CPU @ 2.20GHz
Stepping:            0
CPU MHz:             2200.000
```

上記情報を元に[公式サイト](http://www.softether-download.com/ja.aspx?product=softether)からClientのダウンロード用URLを取得します．

```bash
# Download and Install
mkdir tmp
cd /tmp
wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.34-9745-beta/~~~~.tar.gz
tar -xvf ~~~.tar.gz
cd vpnclient
make # >> Enter 1

# move to usr/local
cd ../
sudo mv vpnclient/ /usr/local/

# set permission
cd /usr/local/vpnclient/
sudo chmod 600 *
sudo chmod 700 vpncmd vpnclient
```

再起動した時にSoftether Clientが起動するようにサービスを作成します．

```bash
sudo vi /etc/systemd/system/vpnclient.service
```

```bash:/etc/systemd/system/vpnclient.service
[Unit]
Description=SoftEther VPN Client
After=network.target network-online.target

[Service]
ExecStart=/usr/local/vpnclient/vpnclient start
ExecStop=/usr/local/vpnclient/vpnclient stop
Type=forking
RestartSec=3s

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

先ほど作成したサービスを有効にします．

```bash
sudo systemctl daemon-reload
sudo systemctl start vpnclient
sudo systemctl enable vpnclient
```

# Softether Server
## GCPにSoftether Serverを立てる
Client同様に[公式サイト](http://www.softether-download.com/ja.aspx?product=softether)からServerのダウンロード用URLを取得します．※GCPにはClientとServerの両方インストールします．

```bash
# Download and Install
mkdir tmp
cd /tmp
wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.34-9745-beta/~~~~.tar.gz #取得したURLをここで貼り付け
tar -xvf ~~~.tar.gz
cd vpnserver
make # >> Enter 1

# move to usr/local
cd ../
sudo mv vpnserver/ /usr/local/

# set permission
cd /usr/local/vpnserver/
sudo chmod 600 *
sudo chmod 700 vpncmd vpnserver
```

再起動した時にSoftether serverが起動するようにサービスを作成します．

```bash
sudo vi /etc/systemd/system/vpnserver.service
```

```bash:/etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target

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

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

先ほど作成したサービスを有効にします．

```bash
# read service
sudo systemctl daemon-reload

# enable and start
sudo systemctl enable vpnserver.service
sudo systemctl start vpnserver.service
```

## server用のポートを解放する
VPN接続用にGCPのポート（TCP992,1194,5555のいずれか,UDP500,4500,1701）を開放する必要があります．

手順は[SSH用にポート開放した手順](https://qiita.com/jjjkkkjjj/items/d0370573fcb04deeb91f#ssh%E7%94%A8%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A)と同様です．

![port1](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F253935%2F81b1145f-6ae0-8341-a1a3-d2558f3bd010.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=0d49cba4bd1c71b8108a19dd13303d8c)

画像の「さっき設定したやつ」のところに適宜，「TCP992,1194,5555のいずれか」と「UDP500,4500,1701（iPhoneのL2TP用）」入力して保存します．

![port2](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F253935%2F4e98caa0-dba6-62b3-ac00-9e19c8e5f45e.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=72337f7eaf8540622ee03f63fd2e6475)

## softether serverの詳細な設定を行う
WindowsまたはMacの方は[公式サイト](https://www.softether-download.com/en.aspx?product=softether)からGUIツールが配布されているので，それをインストールします．

インストールが完了し，実行します．
初期画面＞New Setting から新しくホストを作成します．ホストネームに先ほどDDNSで取得したドメインを入力します．この時のパスワードは空で良いです．

![0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/749f8918-86bb-01ea-2e78-729f2c9c5e9d.png)

OKを選択し，作成したホストをクリックすると，パスワード設定するように言われるので設定します．

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/23a03b99-8abd-3bb6-fb47-9cc745ff1c3e.png)

仮想ハブを作成します．

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/0ba7d937-89f1-5bd1-821b-5a54dd588a84.png)

DDNSは既に設定しているので，青丸部分はテキトーでいいです．（あとで無効にします．）

![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/73fbb008-3d4d-917f-b9a2-dcdcc8debba2.png)

VPN　Azureは使いません．

![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/f01f5fc5-b41f-1efb-cf2c-7cbccfb8b965.png)

Create Userを選択し，ユーザーを作成します．

![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/6c21c621-7f34-dcb1-73f5-94a7461c87ac.png)

ユーザーネームとパスワードを設定します．

![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/73cdee18-ac79-92c1-ded2-5898486ff75d.png)

次にDDNSを無効にします．
※25/01/08追記：<span style="color:red">こちらのDDNSを使った方が使い勝手が良いです．</span>MyDNSは定期的にアドレスを通知しないといけないので，しばらくサーバーをOFFにしていたらDDNSの設定を再度行う必要があります．

![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/3b365421-212e-ed2d-e9d2-ff59aed3cbad.png)

設定ファイルを出力し，そのファイルを以下にようにfalseからtrueに編集し保存します．

![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/b86aa621-e994-be8f-9a89-cfaa8ec09724.png)

先ほど編集したファイルを読み込み，適用すればOKです．

⚠️**また，443ポートはApacheサーバー用にしたいので，Listener Listから443をStopさせます．**

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/e84cc97b-a053-013f-d1f1-9d37d0d5ae2c.png)

## Secure NATの設定
Manage Virtual Hub > Virtual NAT and Virtual DHCP Server (Secure NAT) > Secure NAT Configurationから好きなプライベートアドレスを割り当てます．

![network_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/5834caa5-20e1-6878-79a1-01469d50525e.png)

今回は最初に載せた上図のような構成にしたいので，192.168.0.0/24のネットワークを構築します．

![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/5c20a640-1579-8949-e9d4-4e3d1ef30a73.png)

# ClientからServerに接続する
## Clientの設定
ClientにはGUIツールがないので，コマンドで操作します．

```bash
cd /usr/local/vpnclient/
./vpncmd
```

仮想NICを作成します．今回は`vpn_nic`という名前にします．
```bash
NicCreate {name}
```

アカウントを作成します．今回は`test`とします．

```bash
AccountCreate test
> host and port: {ip address or host name}:{port number}　# 前回取得したドメイン：ポート番号は992か1194か5555
> virtual hub name: {server's hub name} # Server Managerで設定したハブ名
> username: {username} # Server Managerで設定したユーザーネーム
> LAN card name: vpn_nic # さっき作成したやつ

AccountPassword test (AccountCreateで作成した名前)
> Password: *****
> standard or radius: standard

AccountConnect test
```

以下で接続済と出ればOKです．

```bash
# check connection status
AccountList
```

また，再起動時に自動で接続するように設定します．

```bash
AccountStartupSet test
```
これでClientの設定は終わりです．

## ルーティングテーブルの設定
先ほど作成した仮想NICにIPアドレスを振るようにします．恐らく，`ip a`コマンドを打ってもまだ割り当てられていないと思います．

```bash
sudo vi /etc/sysctl.conf
```

```bash:/etc/sysctl.conf
net.ipv4.ip_forward=1
```

```bash
sudo sysctl -p
sudo dhclient vpn_{name} # 今回は{name}=vpn_nic
ip a
```
でIPが割り当てられたらOK

最後にスタートアップ時にDHCPが動くようにします．

```bash
sudo vi /home/{user}/vpn/dhcp.sh
```

```bash:/home/{user}/vpn/dhcp.sh
dhclient vpn_{name}
```

# iPhoneから接続する
本題とは逸れますが，一応行います．

まず，iPhone用にL2TPの設定を行います．最初の画面＞IPSec/L2TP Settingというのがあるのでそれをクリックします．そして，下図の画面のようにします．

![18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/a0d5bbab-5621-c5d5-7487-b568b8b4d939.png)


ip addressの部分はDDNSのドメイン名にしてください．

<img width="375" alt="12.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/02db2b06-ea9a-9190-09d9-2c4c8dc01167.jpeg">

で接続できればOKです．
192.168.0.11が割り当てられていて，ちゃんと接続できていますね！

<img width="375" alt="17.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/4babca11-eb74-a547-3494-f7269ff84517.png">

# ラズパイから接続する
## softether client
基本的には，[GCPにSoftether Clientをインストール](https://qiita.com/jjjkkkjjj/items/824998a6106eff941347#softether-client)と[Clientの設定](https://qiita.com/jjjkkkjjj/items/824998a6106eff941347#client%E3%81%AE%E8%A8%AD%E5%AE%9A)と同じことをラズパイでします．

## IPの固定
ラズパイはIPを固定した方が使い勝手がいい（∵GCP→ラズパイにリバースプロキシしたい）ので，固定します．
`/etc/dhcpcd.conf`に以下を追記します．`{name}`には，作成した仮想NICの名前が入ります．

```bash:/etc/dhcpcd.conf
interface {name}
static ip_address=*.*.*.*/~
```

再起動して，ホスト（GCPのsoftether serverのインターフェース）に`ping`が通ればOKです！
※今回は，Secure NATの設定で指定した`192.168.0.10`に`ping`を送っていいます．

```bash
sudo reboot
ping 192.168.0.10 # check host's interface
```


# おわりに
とりあえず，長いのでここで終了です．

# 参考
- [Ubuntu上でSoftEther VPN Server構築](https://qiita.com/t-ken/items/c43865973dc3dd5d047c)
- [SoftEther VPN Server Manager for Windows](https://qiita.com/naoyoshinori/items/aab1b3cc0a31dfc3557b)
- [Installation Guide of SoftEther VPN Client on Linux](https://medium.com/@anuradha.15/installation-guide-of-softether-vpn-client-on-linux-54a405a0ae2c)