YAMAHA RTX1200とさくらVPSを使ってマンションでグローバルIPをゲットしてみた

# はじめに
初めての記事です。指摘点が多いかもしれませんが大目に見てください・・・

# 何がしたいのか
アパートに住んでいるのですが、アパートなど集合住宅のLANでは、グローバルIPがない上に外からのパケットはほぼ内側には届きません。

マイクラなど、IPで接続するゲームや、自室のLAN内に存在するPCをWOLでブートしたり、ファイル共有をしたりしたいと思ったので、Linuxやネットワークの勉強も兼ねてVPSをレンタルしてグローバルIPをゲットすることにしました。
# なぜRTX1200を使ったのか
マイクラサーバーをVPNで利用するだけなら簡単です。しかし、WOLを利用するためには、常時VPNにログインしている端末から、マジックパケットを流す必要があります。

常時電源が入っていて、VPNクライアントとして動作できるものとしてRaspberryPiがありますが、応答速度やSDカードの信頼性の問題から使用は避けたいなと思ったのでRTX1200を利用することにしました。(というのは建前で、RTX1200を使ってみたかった。笑)

# 具体的にどうするか
さくらVPS上にSoftetherVPNをインストールしてVPNサーバーを立てます。そして、L2TPv3/IPsecを利用して、VPNサーバー上の仮想HUBとRTX1200のLAN1をカスケード接続します。

するとLAN１に接続されたホストは、VPNの仮想HUBと同じセグメントに存在するようになります。

こうすれば、L2TP/IPsecで同じようにVPNにログインしたスマホからマジックパケットをPCに送信することができ、インターネット側からVPSに対してのパケットもPCに届きます。(iptableの設定が必要です。)

また、今回の目的では、VPNの主な目的である「暗号化によるセキュアな通信」は必要ないので、内から外への通信(httpなど)は原則として自室LANに流すことにします。
# 実際にやったこと
## さくらVPSにVPNサーバーを建てる
### Softetherのインストール
割愛します。[こちら](https://qiita.com/snowdog/items/cd42496ca90776bccf9d)などを参考にインストールしてください。

ポイントとして、さくらVPSではデフォルトでパケットフィルタがありますので、コントロールパネルから利用しないように設定するか、UDP500、1701、4500ポートを開放してください。また、OS側でもファイアウォールがありますので、後述する方法でポート開放してください。

### VPNの設定
WindowsのVPNサーバー管理ソフトウェアでVPNサーバーの設定を行います。前述の通り今回は、VPNからトラフィックを流したいわけではないので、Softetherの記事の多くに見られる設定から変えます。ポイントとなる部分に重点を置いて説明していきます。

**1.ローカルブリッジの設定**
今回は、インターネットに接続されているeth0とブリッジさせるのではなく、新しいTAPデバイスにブリッジさせます。ラジオボタンを変更して新しいタップでデバイスを作成し、ブリッジさせます。(以後、このTAPをtap1とします。)
<img width="400" alt="e.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545161/c275ea71-9b68-d265-1028-c4f1971f94ab.jpeg">

**2.IPsec/L2TP設定**
L2TPサーバー機能とEther/L2TPv3 over IPsecサーバー機能にチェックを入れ、IPsec事前共有鍵を変更します。さらにサーバ機能の詳細設定に進みます。
<img width="400" alt="a.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545161/1fec7908-a630-9f28-c5c5-bcfd62f20050.jpeg">

こういう画面が出てくるので、追加を押します。
<img width="400" alt="b.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545161/ec5434eb-9e24-1089-21c3-f28f24a1321b.jpeg">

任意のISAKMP Phase 1 IDと接続先の仮想HUBとそれにあらかじめ登録しておいたユーザー名とパスワードを入力します。
<img width="400" alt="c.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545161/a75f3c12-f228-a7a6-ba4d-dce8eb5384a9.jpeg">

これでGUIからの設定は完了です。

### VPSのshellからの設定
**1.TAPデバイスへのIPアドレス付加**
はじめに、前項で作成したtapにIPアドレスを振ります。IPアドレスは、192.168.100.2/24を振ります。tapの名前は、tap_tap1となっているはずです。適宜ifconfigなどで確認しましょう。

```bash:shell
sudo ip addr add 192.168.100.2/24 dev tap_tap1
```
きちんとIPが振られているかifconfigで確認しましょう。

**2.ファイアウォールの設定**
firewalldを使って、前述のUDP500、1701及び4500ポートの開放と、WOL、マイクラのデフォルトポートである、UDP9及びTCP25565ポートのポートフォワーディング設定を行います。フォワード先のIPは192.168.100.127とします。

```bash:shell
sudo firewall-cmd --zone=external --change-interface=eth0 --permanent
sudo firewall-cmd --zone=internal --change-interface=tap_tap1 --permanent
sudo firewall-cmd --zone=external --add-port=500/udp --permanent
sudo firewall-cmd --zone=external --add-port=4500/udp --permanent
sudo firewall-cmd --zone=external --add-port=1701/udp --permanent
sudo firewall-cmd --zone=external --add-forward-port=port=9:proto=udp:toport=9:toaddr=192.168.100.127 --permanent
sudo firewall-cmd --zone=external --add-forward-port=port=25565:proto=tcp:toport=25565:toaddr=192.168.100.127 --permanent
sudo firewall-cmd --zone=internal --add-masquerade --permanent
sudo firewall-cmd --zone=external --remove-masquerade --permanent
sudo firewall-cmd --reload
```
戻り値は省いていますが、successなどと表示されるはずです。これでコンソールからの設定は終了です。

## RTX1200の設定
### RTX1200のコンフィグファイル
今回の実装でのコンフィグファイルはこんな感じ。[Softetherのサイト](https://ja.softether.org/4-docs/2-howto/Other_VPN_Appliance_Setup_Guide/9-yamaha-rtx-l2tpv3)にRTXシリーズ用の設定例がありますのでそれを参考にしました。

前半で書いたように、内から外の通信自体はVPNサーバーを経由させずにルーターから直接出すので、LAN2にIPマスカレード設定をしたり、ブリッジにIPアドレスを振っています。その他にも、ntpによる時刻合わせ設定や、LAN3から通常のアクセスができるようにDHCPとIPアドレス設定もしています。


```
login password
administrator password
ip route default gateway dhcp lan2
bridge member bridge1 lan1 tunnel1
ip bridge1 address 192.168.100.1/24
ip lan2 address dhcp
ip lan2 nat descriptor 1
ip lan3 address 192.168.200.1/24
tunnel select 1
 tunnel encapsulation l2tpv3
 tunnel endpoint address (さくらVPSのグローバルip)
 ipsec tunnel 101
  ipsec sa policy 101 1 esp aes-cbc sha-hmac
  ipsec ike duration ipsec-sa 1 691200 rekey 90%
  ipsec ike duration isakmp-sa 1 691200 rekey 90%
  ipsec ike keepalive log 1 on
  ipsec ike keepalive use 1 on dpd 10 6 0
  ipsec ike local name 1 (前項で設定したISAKMP Phase 1 ID) fqdn
  ipsec ike nat-traversal 1 on keepalive=30 force=off
  ipsec ike pre-shared-key 1 text (前項で設定した事前共有鍵)
  ipsec ike remote address 1 (さくらVPSのグローバルip)
  ipsec ike restrict-dangling-sa 1 off
 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 vpn
 tunnel enable 1
nat descriptor type 1 masquerade
nat descriptor address outer 1 primary
ipsec auto refresh on
ipsec transport 1 101 udp 1701
telnetd host lan
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.3-192.168.100.191/24
dhcp scope 2 192.168.200.2-192.168.200.191/24
dns server dhcp lan2
schedule at 1 */* 00:00:00 * ntpdate ntp.nict.jp syslog
l2tp service on l2tpv3
```

これをSDカードなどから内蔵ROMに書き込みます。

### CUI(telnet)の操作
まずはじめに、telnetクライアントをインストールする必要があります。Windowsの機能の有効化または無効化から、telnet clientを有効化します。

コマンドプロンプトからtelnetを実行すると、こんな感じの画面になるので、<img width="400" alt="z.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545161/f684b81d-827f-735e-971e-887e1f1d7417.jpeg">

```
open 192.168.100.1
```
といれて、ルーターにtelnet接続をします。パスワードを聞かれますが、工場集荷状態では設定されていまあせんので、空欄でEnterを押すとノーマルユーザーとしてログインできます。コマンドを実行するには管理者としてログインが必要なので、

```
administrator
```
を実行します。パスワードを聞かれますので、同じように空欄でEnterを押します。これでコマンドで設定する準備ができました。

作ったコンフィグファイルをconfig.txtとしてSDカードのルートディレクトリに保存し、RTX1200本体に指します。ピポッと鳴ったら、

```
copy config sd1:/config.txt 0
```
を実行します。config.txtを内蔵ROMのconfig0に保存するという意味です。USBメモリのときは"sd1"を"usb1"に変えます。

これでLAN2を自宅LAN、LAN1にPCを繋げば、ネットもできて、外部からのWOLやグローバルIPを利用したゲームができるでしょう。

# 終わりに
いかがだったでしょうか。拙い文章でわかりにくい部分や、間違っている部分があったかもしれませんが、似たようなことをやろうとしている人の助けになれば幸いです。


# おまけ
おまけというか使っていて気がついたことなのですが、上記の設定だと60Mbpsくらいで頭打ちになってしまうみたいです。ブリッジインターフェースを介して通信すると遅くなってしまうみたいなので、tunnel1をLAN3にブリッジさせて、LAN3からLAN1に物理的なEthernetケーブルを利用してブリッジさせるようにしました。VPNサーバーからのパケットも来るし、速度も戻ったので、少し気持ち悪いですがよしとしました。

本文のコンフィグの

```
bridge member bridge1 lan1 tunnel1
```


```
ip lan3 address 192.168.200.1/24
```
の行をそれぞれ

```
bridge member bridge1 lan3 tunnel1
```

```
ip lan1 address 192.168.100.1/24
```
に変えて、

```
ip bridge1 address 192.168.100.1/24
```
を消せばOKです。（たぶん）

## 追記:2022/02/26
いろいろ試してるうちに、同じブリッジインタフェースに収容したbridge1とLAN1に同じIPアドレスを振ると、速度が低下せずに通信できることに気が付きました。

[こちら](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/bridge_interface/bridge_member.html)のYAMAHA公式サイトでは、ブリッジインタフェースに収容する実インタフェースにはIPアドレスを振ってはいけないと書いていますが、何故かうまく動きます。ちなみにIPアドレスはLAN1だけに振ると通信ができず、bridge1だけに振ると速度が低下します。多分バグに近い仕様だと思います。本文中のconfigに加えて

```
ip lan1 address 192.168.100.1/24
```

を加えると幸せになれます。