拠点間VPNで快適な実家帰省ライフを

皆さんいかがお過ごしでしょうか、最近寒くなってきて電気代が心配になる季節になってまいりました。


さて、私は静岡の実家を離れて東京都で生活をしているのですが、よく静岡の実家に帰省することがあります。
静岡の実家には10Gbpsのインターネット回線が整備されており、グローバルなIPv4アドレスもあるため、そこにサーバを設置して運用を行っています。

しかし、サーバを操作するときにいちいち接続するのも面倒なので、VPNによる常時接続を実現し、逆に実家にいるときに自宅のネットワークにアクセスできるように整備したためここにその方法などを書こうと思います。

この項目では、以下の３つのシチュエーションから互いに自由にアクセスできる環境の構築を目指します。

### 自宅
* NTT東日本フレッツ光
* 楽天ひかり IPv6 IPoE DS-Lite
* IPv4 CGNAT + IPv6 Global
* NEC IX2215
* ESXiホスト

### 実家
* コミュファ光 10Gbps
* IPv4 Global + IPv6 Global
* NEC製HGW
* ESXiホスト

### リモート環境
* docomoなどのLTEテザリング環境
* IPv4 CGNATのみ
* iPhoneやMacBook

## やりたいこと
* 実家のサーバから自宅のネットワークにアクセスでき
* 自宅のネットワークから実家のサーバにアクセスでき
* リモート環境から両方にアクセスできる

環境を作る

## 考慮しなくてはいけない注意点
* 携帯回線などリモートからアクセス環境には(基本的に)IPv6アドレスがない
* NTTのフレッツのIPoEではIPv4のグローバルアドレスがない
* vyOSの公式リファレンスが情報不足（書いてないオプション多数）
* vyOSのコマンド仕様が変わりまくるためググって出た情報がたいてい当てにならない

このため、リモート環境からNTTの拠点にアクセスするためには、グローバルなIPv4アドレスのある拠点を経由する必要があります。
今回は実家をリモートアクセスの拠点に利用する構成を行います。

## 構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969530/e96873f5-0555-dd4c-2d8f-08f95314c525.png)


実家と自宅の間を拠点間VPNで常時接続し、リモートアクセスは実家を経由して自宅までアクセスできるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969530/18320a57-22ee-962f-5620-4b5f080fd529.png)

このようにESXiのVMでvyOSを起動し、vSwitchにAPを接続することで、自分専用のネットワーク環境を用意することができます。

## vyOSの設定
vyOSではIPv6を使ったIPv4のトンネリングをL2TPで行うことができません。
そのため、IPv6 L2TP/IPsecをローカルで作ったIPIP6トンネルで覆うことでIPv6トンネルの中にIPv4通信を流すことができます。
また、ルーティングはRIPで行い、実家を経由して自宅やそれ以外の拠点へ通信ができるようにします。

ローカルのIPIP6トンネルで利用するIPv6アドレスは適当なジェネレーターで生成するといいと思います。
https://www.ultratools.com/tools/rangeGenerator

```
interfaces {
    ethernet eth0 {
        address 10.1.1.1/24
    }
    ethernet eth1 {
        address dhcpv6
        address 192.168.1.10/24
        ipv6 {
            address {
                autoconf
            }
        }
    }
    loopback lo {
    }
    tunnel tun0 {
        address 10.11.32.7/24
        encapsulation ipip6
        local-ip fd46:0d8d:b809:bc56::1
        multicast enable
        remote-ip fdbb:94ab:f305:4392::1
    }
}
nat {
    source {
        rule 98 {
            outbound-interface eth1
            source {
                address 10.37.3.0/24
            }
            translation {
                address masquerade
            }
        }
        rule 99 {
            outbound-interface eth1
            source {
                address 10.11.30.0/24
            }
            translation {
                address masquerade
            }
        }
    }
}
protocols {
    rip {
        network 10.0.0.0/8
        network 172.16.0.0/12
        redistribute {
            connected {
            }
        }
    }
    static {
        route 0.0.0.0/0 {
            next-hop 192.168.1.1 {
            }
        }
        route 10.77.3.0/24 {
            next-hop 10.11.32.7 {
            }
        }
    }
}
service {
    dhcp-server {
        shared-network-name MY_SUBNET {
            authoritative
            subnet 10.37.3.0/24 {
                default-router 10.37.3.1
                dns-server 1.1.1.1
                range 0 {
                    start 10.37.3.100
                    stop 10.37.3.199
                }
            }
        }
    }
    dns {
        forwarding {
            allow-from 10.37.3.0/24
            listen-address 10.37.3.1
            name-server 1.1.1.1
            name-server 8.8.8.8
            system
        }
    }
}
vpn {
    ipsec {
        esp-group rtr1-esp {
            compression disable
            lifetime 1800
            mode tunnel
            pfs enable
            proposal 1 {
                encryption aes256gcm128
                hash sha512
            }
        }
        ike-group rtr1-ike {
            close-action none
            dead-peer-detection {
                action restart
                interval 30
                timeout 120
            }
            ikev2-reauth yes
            key-exchange ikev2
            lifetime 3600
            proposal 1 {
                dh-group 26
                encryption aes256gcm128
                hash sha512
            }
        }
        ipsec-interfaces {
            interface eth1
        }
        nat-networks {
            allowed-network 0.0.0.0/0 {
            }
        }
        nat-traversal enable
        site-to-site {
            peer 【接続先のIPv6アドレス】 {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret 【事前共通鍵】
                }
                connection-type initiate
                ike-group rtr1-ike
                ikev2-reauth inherit
                local-address 【自分のIPv6アドレス】
                tunnel 0 {
                    allow-nat-networks disable
                    allow-public-networks disable
                    esp-group rtr1-esp
                    local {
                        prefix fd46:0d8d:b809:bc56::/64
                    }
                    remote {
                        prefix fdbb:94ab:f305:4392::/64
                    }
                }
            }
        }
    }
    l2tp {
        remote-access {
            authentication {
                local-users {
                    username 【ユーザ名】 {
                        password 【パスワード】
                    }
                }
                mode local
            }
            client-ip-pool {
                start 10.11.30.100
                stop 10.11.30.200
            }
            ipsec-settings {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret 【事前共通鍵】
                }
            }
            name-server 1.1.1.1
            name-server 8.8.8.8
            outside-address 192.168.1.10
        }
    }
}
```

このように10.11.32.7というローカルのIPIP6トンネルの出入り口を双方に配置して、通信することが必要ですが、この設定を行うことでリモートから実家を経由して自宅にアクセスすることが可能になります。

## 動作確認

大学からmacOSで実家のVPNサーバに接続してみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969530/7d784190-155c-e8a1-bedb-906ec03e9595.png)

無事接続できました。

この状態で自宅のサーバにアクセスすると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969530/f1e08c0c-6d2f-1bbd-92f6-d78a8db53559.png)


自宅のサーバの管理画面などが見れます
また、IAP認証などとは違いブラウザベース以外のアプリケーションも利用できるので、自宅においたサーバにSSH接続したり、Sambaのドライブをマウントすることもできます。

## おわりに

このような構成をすることによって、どこにいても自分の管理する情報にすぐアクセスできる環境を作ることができます。
みなさんも、実家に帰省する際などはこのようなシステムを作ってみると良いかもしれません。