YAMAHA RTXルーターとSoftEtherでVPNを構築する

# はじめに
「この物件、インターネット回線付き！」
もちろん情報技術者からしたらなんとも面白みのない回線です。
自前でVPNを構築して遊び尽くしましょう！(？)

# 構築の理由
* ~~なんとなく面白そう~~
* 当然のごとくインターネットへ出る前にCGNAT(CGN)を通るのでなんとかしたい<br>※このせいでMinecraftマルチが簡単に開けない
* 外出先からnasneでリモート視聴すると、プロバイダ側で速度制限がかかるのでなんとかしたい

# 構築に必要な要素
* KAGOYA VPS (2コア/2GB/Ubuntu 20.04 LTS)
* YAMAHA RTX810
* ~~面白みのない~~インターネット回線

# ネットワーク構成図(概略)
![network_simple.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066798/f74df781-e708-643a-7fb0-0618eec9f0bb.png)
KAGOYA VPS上でSoftEtherによるVPNを構築し、インターネットへのゲートウェイとなってもらいます。
nasne君にはKAGOYA VPS上のゲートウェイからインターネットに出てもらうことで、CGNATでの速度制限を回避する狙いです。
ついでにVPSに来たMinecraftマルチサーバー用のポート(TCP 25565)への接続を、自宅のサーバーに転送してしまうという魂胆です。

# ネットワーク構成図(詳細)
![network_q.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066798/404c4779-69fa-af99-5da8-a89e462274fa.png)
いきなり図が複雑になりましたが、順番に見ていきましょう。
SoftEtherのSecureNATは大変処理が遅いので、Linux側にIP masqueradeを任せます。
この箇所は図上の`KAGOYA VPS`にある`eth0`から`tap`に対応する部分です。
SoftEther上にDHCPサーバーを用意しておきます。
将来的にL2TP/IPsecでスマートフォンなどを接続させる予定です。

L2TPv3/IPsecトンネルでSoftEtherとRTX810を接続します。
RTX側にもDHCPサーバーを用意するので、トンネル出入り口でDHCPパケットをフィルタリングします。

# 実際の構築
下記作業はrootで行っています。

## SoftEtherのインストール・設定
```shell
apt install gcc make
wget 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
tar xzvf softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz 
cd vpnserver
make
cd ../
mv vpnserver /usr/local/
cd /usr/local/vpnserver/
chmod g= o= *
vi /etc/systemd/system/softether-vpn.service
```

```softether-vpn.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/
ExecStartPre=/sbin/ip link set dev eth0 promisc on

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

```
systemctl daemon-reload 
systemctl start softether-vpn.service 
journalctl -f -u softether-vpn.service 
systemctl stop softether-vpn.service 
```

ここでちょっと手抜きをしてSoftEtherのSE-VPN サーバー管理 (ツール)を使いました。
SecureNATの設定でDHCPサーバーを任意のIP払い出し範囲で設定します。
NATはLinuxに任せるので、TAPデバイスを作成してハブとブリッジしておきます。

## Linux側の設定

お約束のルーティング機能有効化から始まります。

```/etc/sysctl.conf(追記または変更)
net.ipv4.ip_forward=1
```

```/etc/netplan/01-network-manager-all.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    tap_setrap:
      dhcp4: false
      dhcp6: false
      accept-ra: false
  bridges:
    br0:
      dhcp4: false
      dhcp6: false
      interfaces: [《タップデバイス名》]
      addresses: [《GWとするIPアドレス/ネットワーク長》]
```

```/etc/ufw/before.rules(末尾に追記)
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-F
-A POSTROUTING -s 《ネットワークの範囲》 -o eth0 -j MASQUERADE
-A PREROUTING -i eth0 -d 《VPSのグローバルIPアドレス》 -p tcp --dport 25565 -j DNAT --to-destination 《マイクラサーバーにするIPアドレス》:25565
COMMIT
```

```shell
ufw allow to any port 22
ufw allow to any port 1701
ufw allow to any port 4500
ufw allow to any port 500
ufw allow to any port 25565
ufw reload
```
※ SSH用の22番ポートはお好みに応じて変えたり閉じたりしてください
※ KAGOYA VPSの場合は、併せてコントロールパネルからセキュリティグループの設定を行ってください。


## YAMAHA RTX810の設定

```YAMAHA CLI
ipsec auto refresh on
ipsec transport 1 101 udp 1701
tunnel select 1
tunnel encapsulation l2tpv3
tunnel endpoint name 《VPNサーバーに割り当てたドメイン》 fqdn
ipsec tunnel 101
ipsec sa policy 101 1 esp aes-cbc sha-hmac
ipsec ike restrict-dangling-sa 1 off
ipsec ike nat-traversal 1 on keepalive=30 force=off
ipsec ike keepalive log 1 on
ipsec ike keepalive use 1 on dpd 10 6 0
ipsec ike pre-shared-key 1 text 《事前共有鍵》
ipsec ike local name 1 《ローカルID》 fqdn
ipsec ike duration isakmp-sa 1 691200 rekey 90%
ipsec ike duration ipsec-sa 1 691200 rekey 90%
ipsec ike remote address 1 《VPNサーバーに割り当てたドメイン》
ipsec ike encryption 1 aes-cbc
l2tp always-on on
l2tp tunnel disconnect time off
l2tp keepalive use on 5 10
l2tp keepalive log on
l2tp syslog on
l2tp remote end-id 《リモートID》
ip filter 100 pass * * * * *
ip filter 101 pass * * udp 1701 *
ip filter 102 reject * * tcp,udp dhcps dhcpc
ip tunnel secure filter in  101 102 100
ip tunnel secure filter out 101 102 100
tunnel enable 1
l2tp service on l2tpv3
bridge member bridge1 lan1 tunnel1

heartbeat2 myname keepalive
heartbeat2 transmit 1 auth keepalive 《ブロードキャストアドレス》
heartbeat2 transmit interval 30
heartbeat2 transmit enable 1

ip lan1 address 《デフォルトGWのIP》
dhcp service server
dhcp server rfc2131 compliant except remain-silent
no dhcp scope 1
dhcp scope 1 《IP範囲》 《通知するデフォルトGW》
dns server 8.8.8.8
dns private address spoof on
ip bridge1 address 《ブリッジ用に割り当てるIPアドレス》

save
restart
```

# 家庭内での作業
nasne君のネットワーク設定でゲートウェイにVPS上のGWを指定します。
Minecraftマルチを立ち上げるパソコンのプライベートIPアドレスを、所定のものに固定しておきます。

# 動作確認
外からtorne mobileでサクサク視聴ができるし、Minecraftマルチも外からつなぎ放題です！
…と書くとすんなり構築できたように見えますが、全部で2日程かかりました。

# さいごに
楽しいVPNライフを！