VyOSからtransix ipv4接続(固定ip)を使う

## とは

2020/06/01から
フレッツ接続 ZOOT NATIVE IPv4固定IP- INTERLINK
https://www.interlink.or.jp/service/zootnative/koteiip.html
が開始されたので、これをVyOSから使う。

2022/03/12 追記:
ここの「v6Direct」も同じ方法で接続できた。
https://www.open-circuit.ne.jp/isp/ipv6-ipoe.html

このサービス自体は、PPPoE接続を通すことなく固定IPv4アドレスが使えるものである。もちろん外部からの接続を受け付けられるのでサーバーにも使える。

似たようなサービスとしては、DS-LiteやMAP-Eを使った物が多くのプロバイダーにて提供されているが、これらは外部からの接続を受け付ける事に制限がある(MAP-Eでは使えるポートに制限がある/DS-Liteでは完全に不可能)。

同様のサービスは他の一部プロバイダでも実施されている。
仕組み自体の説明はこちらへ。
transix IPv4接続（固定IP）
https://www.mfeed.ad.jp/transix/staticip/

## DS-Liteとの違い

ググるとVyOSからDS-Liteに接続する方法は多数出てくる。基本的にはこれに以下の変更を加えたものである。

* VyOS側でNATを用意する。
    * DS-Liteではプロバイダー側にNATがある
* トンネル接続に使うIPv6アドレスの後半を、プロバイダーが指定した「インターフェースID」と同じにする。
    * そもそもIPv6アドレスの後半64bitのことを「インターフェイスID」という


## VyOSの設定

設定ファイル中で【】で囲まれている項目は、プロバイダからのメール内に記載されている各項目に対応する。

**この例ではIPv6ブリッジを構成していないので、このままでは他のPCからインターネットへのIPv6通信が通らない。** そこはググってほしい(´・ω・`)

### インターフェイスの設定を行う

* LAN側: eth0
* WAN(インターネット)側: eth1

として例を示す。

先にIPv6ネットワークに接続されている他のPCで ```ip addr``` などを使って、自分のIPv6アドレスを調べておく。そしてここからIPv6プレフィックスを切り出す。
例えば ```2001:1234:5678:abcd:0123:1234:2345:3456/64``` なら 
```2001:1234:5678:abcd``` がプレフィックスで ```64``` がプレフィックス長だ。

そしてVyOSには例えば次のように設定する。

```
 interfaces {
     ethernet eth0 {
         address 192.168.1.1/24
         description LAN
         dhcpv6-options {
             parameters-only
         }
         hw-id (LAN側ポートのMACアドレス)
         policy {
             route transix
         }
         speed auto
     }
     ethernet eth1 {
         address (自分のIPv6プレフィックス):【インターフェースID】/(プレフィックス長)
         description WAN
         dhcpv6-options {
             parameters-only
         }
         hw-id (WAN側ポートのMACアドレス)
         ipv6 {
             address {
                 autoconf
             }
         }
     }
 }
 policy {
     route transix {
         rule 10 {
             protocol tcp
             set {
                 tcp-mss 1412
             }
             tcp {
                 flags SYN
             }
         }
     }
 }
```

### トンネルを作る

``` 
interfaces {
(tunnel以外は省略)
     tunnel tun0 {
         address 【グローバル固定IPv4アドレス】/32
         encapsulation ipip6
         local-ip (自分のIPv6プレフィックス):【インターフェースID】
         remote-ip 【固定IPトンネル終端装置 IPv6アドレス】
     }
}
```

### ルーティング

```
 protocols {
     static {
         interface-route 0.0.0.0/0 {
             next-hop-interface tun0 {
             }
         }
     }
 }
```

### NATを構成する

```destination``` の部分はポート開放(外部からの接続を受け付ける)例である。外に接続するだけなら ```source``` の部分だけ書けばよい。

```
 nat {
     destination {
         rule 10 {
             description http
             destination {
                 port 80,443
             }
             inbound-interface tun0
             protocol tcp
             translation {
                 address (webサーバーのIPv4アドレス)
             }
         }
     }
     source {
         rule 20 {
             outbound-interface tun0
             source {
                 address 192.168.1.0/24
             }
             translation {
                 address masquerade
             }
         }
     }
 }
```

### DHCPを構成する

VyOS自身がルーターとして振る舞うため、DHCPもここに用意するとよいだろう。

```
 service {
     dhcp-server {
         shared-network-name LOCAL_NET {
             subnet 192.168.1.0/24 {
                 default-router 192.168.1.1
                 dns-server 192.168.1.1
                 lease 86400
                 range 0 {
                     start 192.168.1.100
                     stop 192.168.1.249
                 }
             }
         }
     }
     dhcpv6-server {
         disable
     }
     dns {
         forwarding {
             allow-from 0.0.0.0/0
             cache-size 1000
             listen-address 192.168.1.1
             name-server 8.8.8.8
             name-server 8.8.4.4
         }
     }
 }
```

### ファイヤーウォールを構成する

おそらくかなり手を抜いている。
zone-policyを用いている。

```
 firewall {
     all-ping enable
     broadcast-ping disable
     config-trap disable
     ipv6-name accept_all_v6 {
         default-action accept
         rule 2 {
             action drop
             state {
                 invalid enable
             }
         }
     }
     ipv6-name public_to_local_v6 {
         default-action drop
         rule 1 {
             action accept
             state {
                 established enable
                 related enable
             }
         }
         rule 2 {
             action drop
             state {
                 invalid enable
             }
         }
         rule 3 {
             action accept
             protocol icmpv6
         }
         rule 4 {
             action accept
             protocol ipip
         }
     }
     ipv6-receive-redirects disable
     ipv6-src-route disable
     ip-src-route disable
     log-martians enable
     name accept_all {
         default-action accept
         rule 2 {
             action drop
             state {
                 invalid enable
             }
         }
     }
     name public_to_local {
         default-action drop
         rule 1 {
             action accept
             state {
                 established enable
                 related enable
             }
         }
         rule 2 {
             action drop
             state {
                 invalid enable
             }
         }
     }
     name public_to_private {
         default-action drop
         rule 1 {
             action accept
             state {
                 established enable
                 related enable
             }
         }
         rule 2 {
             action drop
             state {
                 invalid enable
             }
         }
         rule 10 {
             action accept
             description http (Webサーバーを置く場合の例)
             destination {
                 port 80,443
             }
             protocol tcp
         }
     }
     receive-redirects disable
     send-redirects enable
     source-validation disable
     syn-cookies enable
     twa-hazards-protection disable
 }
```

zone-policyも書く。

```
 zone-policy {
     zone local {
         default-action drop
         from private {
             firewall {
                 ipv6-name accept_all_v6
                 name accept_all
             }
         }
         from public {
             firewall {
                 ipv6-name public_to_local_v6
                 name public_to_local
             }
         }
         local-zone
     }
     zone private {
         default-action drop
         from local {
             firewall {
                 ipv6-name accept_all_v6
                 name accept_all
             }
         }
         from public {
             firewall {
                 ipv6-name public_to_local_v6
                 name public_to_private
             }
         }
         interface eth0
     }
     zone public {
         default-action drop
         from local {
             firewall {
                 ipv6-name accept_all_v6
                 name accept_all
             }
         }
         from private {
             firewall {
                 ipv6-name accept_all_v6
                 name accept_all
             }
         }
         interface tun0
         interface eth1
     }
 }
```


## 動作確認

まずはVyOS自身からIPv4インターネットに出て行けるか確認する。

適当なIPv4アドレスに向けて ```traceroute``` を打って ```transix.jp``` を通過していれば多分おｋ

```
$ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  ike-bbrt10.transix.jp (14.0.9.93)  4.654 ms  4.631 ms  4.458 ms
 2  72.14.222.189 (72.14.222.189)  6.416 ms  6.405 ms  6.380 ms
 3  * * *
 4  dns.google (8.8.8.8)  6.090 ms
```

これができたら、他のPCからも接続を確認する。