RTX1200を廃してUbuntuで作るルーターに置き換えた話。

# 前提条件
先日こんな記事を書きました。

https://qiita.com/daisuke_yanase/items/9ea95d048041a26b78c9

この記事では書いていませんでしたが、宅内ルーターとしてRTX1200が既にあり、その上流をスイッチングハブで割ってもう1台RTX1200を導入し、既設セグメントは既設RTX1200で、新設セグメントは新設RTX1200で其々VPSとVPNを張ってホストしようと考えていました。
RTX1200（正確には、YAMAHAのConfig）に親しんでいたので、なるべく違う仕組みで管理する対象を減らしたかったのです。
しかし既設RTX1200と並列に繋ぎ込んでも、既設RTX1200の背後に直列に繋ぎ込んでも、新設のRTX1200は新しいVPSと疎通が取れませんでした。
この時点で、上流にNDプロキシを挟めばワンチャン動くかな？みたいな仮説はあったのですが、態々検証するには機材も足りず、 **そもそもNDプロキシを上流に置くならそのNDプロキシに新旧其々のVPSとVPNを張らせて管理機材（RTX1200）を減らした方が良い** という至極真っ当な論理的帰結に至り、敢えなく廃案となりました。
という訳で（？）、二週間を見込んでいた宅内ネットワークリプレイス計画最終章、「RTX1200を廃してUbuntuで作るルーターに置き換える話」が発動しました。

# 要件定義
* 既設ネットワークのセグメントを変更しない。
* 新たな設備の購入をしない。~~4ポート2.5GbEが載ったアプライアンスを買ったりしない（欲しい）。~~
* 使い慣れたOS（UbuntuServer）を使う。変にUTM入れたりしない。
* IPv4/IPv6両対応する。
* VPSとはIPv6で接続する。

# 実践
既に先の記事に於いて、新VPSとはSoftEtherVPN Serverだけを動かしている仮想マシンを新たに建立して疎通を取っていましたので、今回は仮想化基盤サーバーまで上流回線からLANケーブルを繋ぎ込んで、仮想スイッチで仮想ルーター（仮）に収容することにします。
WAN側に1、LAN側にセグメント毎に各1の計3つの仮想スイッチを仮想ルーター（仮）に接続します。

```/etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    eth0:
      accept-ra: false
      addresses:
      - 192.168.0.1/24
      dhcp4: false
      dhcp6: false
      optional: true
    eth1:
      accept-ra: false
      addresses:
      - 192.168.2.2/24
      dhcp4: false
      dhcp6: false
      optional: true
    eth2:
      accept-ra: true
      dhcp4: true
      dhcp6: true
      optional: true
  version: 2

```

多少誤魔化しが入っていますが、そのものズバリのnetplanをコピペしたのが上です。ズボラしてインストール時に生成されたファイルをそのまま使っています。
上から順に「宅内既設LAN（eth0）」「宅内新設LAN（eth1）」「WAN（eth2）」の順に並んでいます。
WAN（eth2）は近頃流行りのマンション共有回線が、DHCPでIPv4プライベートアドレスとIPv6グローバルアドレス（※InternetからReachableではない）を/64で振り出してきますので、全てDHCPにお任せなので「true」です。
eth0は既設ネットワークです。この仮想マシンがRTX1200を置き換えますので、RTX1200が持っていたアドレスをそのままスライドさせます。
eth1は新設ネットワークです。このネットワークはVPSがルーターの役目を担いますので、VPSのtapデバイスに振ったIPと被らないアドレスを振っています。
次にSoftEtherVPN管理ツールを使い、新旧のVPSとカスケード接続する設定を作ります。eth0とeth1を其々のセグメントに対応するVPSとのVPNにブリッジ接続します。この辺りの設定は先行例が多数ありますので割愛させていただきます。
ここまで出来たら、サクッとUFWにファイアウォール設定をお好みでぶち込みます。一部抜粋するとこんな感じです。

``` 
[ 2] 192.168.0.1 5555/tcp    ALLOW IN    192.168.0.0/24           
[ 3] 192.168.0.1 5555/udp    ALLOW IN    192.168.0.0/24                
[ 5] 192.168.0.1 53/udp        ALLOW IN    192.168.0.0/24           
[ 7] 255.255.255.255 67:68/udp  ALLOW IN    0.0.0.0                  
[ 8] 22,135,137:139,445,3389,5900/udp on eth0 DENY FWD    Anywhere on eth2          
[ 9] 22,135,137:139,445,3389,5900/tcp on eth0 DENY FWD    Anywhere on eth2          
[10] 22,135,137:139,445,3389,5900/udp on eth1 DENY FWD    Anywhere on eth2          
[11] 22,135,137:139,445,3389,5900/tcp on eth1 DENY FWD    Anywhere on eth2          
[12] 22,135,137:139,445,3389,5900/tcp on eth2 DENY FWD    Anywhere on eth1          
[13] 22,135,137:139,445,3389,5900/udp on eth2 DENY FWD    Anywhere on eth1          
[14] 53/udp on eth2             ALLOW FWD   Anywhere on eth0          
[16] 80,443/tcp on eth2         ALLOW FWD   Anywhere on eth0          
[17] 80,443/udp on eth2         ALLOW FWD   Anywhere on eth0          
[20] 135,137:139,445/udp on eth2 DENY FWD    Anywhere on eth0          
[21] 135,137:139,445/tcp on eth2 DENY FWD    Anywhere on eth0          
[22] 192.168.2.0/24 80,443/tcp on eth1 ALLOW FWD   Anywhere on eth1          
[23] 192.168.2.0/24 80,443/udp on eth1 ALLOW FWD   Anywhere on eth1          
[24] 465,587,993/tcp on eth2    ALLOW FWD   Anywhere on eth0            
[28] 5555/tcp                   ALLOW IN    <<新VPSのIPv6アドレス>>
[29] 5555/udp                   ALLOW IN    <<新VPSのIPv6アドレス>>
[30] 40000:49999/udp (v6)       ALLOW IN    Anywhere (v6)             
[31] 5555/tcp                   ALLOW IN    <<旧VPSのIPv6アドレス>>
[32] 5555/udp                   ALLOW IN    <<旧VPSのIPv6アドレス>>
[33] 22,135,137:139,445,3389,5900/udp (v6) on eth0 DENY FWD    Anywhere (v6) on eth2     
[34] 22,135,137:139,445,3389,5900/tcp (v6) on eth0 DENY FWD    Anywhere (v6) on eth2     
[35] 22,135,137:139,445,3389,5900/udp (v6) on eth1 DENY FWD    Anywhere (v6) on eth2     
[36] 22,135,137:139,445,3389,5900/tcp (v6) on eth1 DENY FWD    Anywhere (v6) on eth2     
[37] 22,135,137:139,445,3389,5900/tcp (v6) on eth2 DENY FWD    Anywhere (v6) on eth1     
[38] 22,135,137:139,445,3389,5900/udp (v6) on eth2 DENY FWD    Anywhere (v6) on eth1     
[39] 546,547/udp (v6)           ALLOW IN    546,547/udp (v6)          
[40] 53/udp (v6) on eth2        ALLOW FWD   Anywhere (v6) on eth0     
[42] 80,443/tcp (v6) on eth2    ALLOW FWD   Anywhere (v6) on eth0     
[43] 80,443/udp (v6) on eth2    ALLOW FWD   Anywhere (v6) on eth0     
[44] 465,587,993/tcp (v6) on eth2 ALLOW FWD   Anywhere (v6) on eth0     
[45] 135,137:139,445/udp (v6) on eth2 DENY FWD    Anywhere (v6) on eth0     
[46] 135,137:139,445/tcp (v6) on eth2 DENY FWD    Anywhere (v6) on eth0 
```
あと、/etc/ufw/before.rules にNATの設定を流し込んでReloadしておくのもお忘れなく。
```/etc/ufw/before.rules
# NAT rules
*nat
-F
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.0.0/24 -o eth2 -j MASQUERADE
COMMIT
```

次にIPv6アドレスをクライアントに配布するため、bind9、radvd、ndppd、keaをインストールします。SoftEtherのSecureNATはお手軽なのですがIPv6に非対応かつパフォーマンスが出ませんので、比較的楽なkeaで配布することにします。
VPS（Vultr）がくれるReachableなアドレスと違い、上流回線から来るのはInternet側からUnreachableでWeb閲覧ぐらいにしか役に立ちませんので、/64で貰ってもしょうがないので今回は/112（それでも65536個ある）に絞ります。


```/etc/radvd.conf
interface eth0
{
        AdvSendAdvert on;
        AdvManagedFlag on;
        prefix 2001:db8::8964:8964:8964:0/112
        {
                AdvAutonomous on;
                AdvOnLink on;
                AdvRouterAddr on;
        };
        RDNSS 2606:4700:4700::1111
        {
        };
};
```
```/etc/ndppd.conf
proxy eth2 {
        router no
        timeout 500
        autowire yes
        keepalive yes
        retries 3
        ttl 30000
        rule 2001:db8::8964:8964:8964:0/112 {
                static
        }
}
```
```/etc/kea/kea-dhcp4.conf
{
"Dhcp4": {
    "interfaces-config": {
        "interfaces": [ "eth0" ]
    },
    "control-socket": {
        "socket-type": "unix",
        "socket-name": "/tmp/kea-dhcp4-ctrl.sock"
    },
    "lease-database": {
        "type": "memfile",
        "lfc-interval": 3600
    },
    "expired-leases-processing": {
        "reclaim-timer-wait-time": 10,
        "flush-reclaimed-timer-wait-time": 25,
        "hold-reclaimed-time": 3600,
        "max-reclaim-leases": 100,
        "max-reclaim-time": 250,
        "unwarned-reclaim-cycles": 5
    },
    "renew-timer": 900,
    "rebind-timer": 1800,
    "valid-lifetime": 3600,
    "option-data": [
        {
            "name": "domain-name-servers",
            "data": "192.168.0.1"
        },
        {
            "name": "default-ip-ttl",
            "data": "0xf0"
        }
    ],
    "subnet4": [
        {
            "subnet": "192.168.0.0/24",
            "pools": [ { "pool": "192.168.0.10 - 192.168.0.200" } ],
            "option-data": [
                {
                    "name": "routers",
                    "data": "192.168.0.1"
                }
            ]
        }
    ],
    "loggers": [{
        "name": "kea-dhcp4",
        "output_options": [
            {
                "output": "stdout",
                "pattern": "%-5p %m\n"
            }
        ],
        "severity": "INFO",
        "debuglevel": 0
    }]
  }
}
```
```/etc/kea/kea-dhcp6.conf
{
"Dhcp6": {
        "valid-lifetime": 86400,
        "renew-timer": 3600,
        "rebind-timer": 7200,
        "preferred-lifetime": 54000,
        "decline-probation-period": 3600,
        "interfaces-config": {
                "interfaces": ["eth0"]
        },
        "lease-database": {
                "type": "memfile",
                "persist": true,
                "name": "/var/lib/kea/dhcp6.leases"
        },
        "option-data": [
                {
                "name": "dns-servers",
                "data": "2606:4700:4700::1111, 2606:4700:4700::1001"
                },
                {
                "name": "domain-search", "data": "hsidr.work"
                }
        ],
        "subnet6": [
                {
                "subnet": "2001:db8::8964:8964:8964:0/112",
                "pools": [{
                        "pool": "2001:db8::8964:8964:8964:0/112"
                }],
                "id": 1,
                "interface": "eth0"
                }
        ]
}
}
```
~~例示アドレスが8964を含みまくっていたり、CloudflareのPublic DNSを指定しているのは筆者の趣味です。特に深い意味はありません。~~
大体こんな感じにconfigを書いたら各サービスを有効化しましょう。
```
sudo systmectl enable bind9.service
sudo systemctl enable radvd.service
sudo systemctl enable ndppd.service
sudo systemctl enable kea-dhcp4-server.service
sudo systemctl enable kea-dhcp6-server.service
```
Configに問題なければそのまま各プロセスが走るはずです。eth0に接続されている端末にIPv6アドレスが配布されていて、IPv4/IPv6のサービスに接続が出来、VPSでホストしているサービスにもアクセスが可能であれば成功です。

# 仮想ルーターに置き換えた結果
肝心の速度ですが、**リプレイス前と変わりませんでした。**
大体RTX1200がL2TPv3/IPsecトンネルを張りながらCPUフルロードで上り下り130〜190Mbps程度の所、今回作成した仮想ルーターはVPNトンネルを2本張りながらSpeedTestして、平均160Mbpsあたりで頭打ちになる傾向にありました。
仮想化基盤サーバーのCPUやメモリにはまだ余裕がありますので、NIC（SR-IOVに対応していない？）か上流回線自体がボトルネックになっている可能性があります。あるいは仮想マシン自体のチューニングが不十分なのかも知れません。~~UFWの書き方が下手くそ過ぎてフィルタ数が多過ぎるのかも知れません。~~
しかしRTX1200×2台（になるはずだった）を仮想ルーター1台で置き換えたことにより、宅内ネットワークの配線が大幅に単純化されました。
RTX1200自体は良いルーターだと思うんですが、如何せん性能が頭打ちでメーカーサポートも終了しているのと、L2TPv3/IPsecトンネルを1本しか張れなかったり、宅内ネットワークの配線を複雑化させていたので、今回のリプレイスは技術習得の意義も含めて良い体験になりました。
中身がUbuntuServerなので定期的にアップデートでメンテナンスが見込めるのも大きなポイントかも知れません。
各種クラウドサービスでは仮想マシンをVPCルーターとして提供している所もある様ですし、pfSenseやVyOSなどもありますので、今後はそちらの情報をあたってみてチューニングで速度が向上しないか調査してみたいと思います。
それでは皆さんも、良いおうちクラウドライフをお送りください！