ポン酢ブログ(β)

The harder you work, the luckier you get. - Gary Player

UniFi Security GatewayでDS-Lite

実売2万6000円のIPS/IDS付きエッジルーター、Ubiquiti「UniFi Security Gateway(USG)」【イニシャルB】 - INTERNET Watchを見て、UniFi Security Gatewayの中身はEdgeOSなので簡単にDS-Liteできるなと思って買ったのですが、色々大変だったので、メモ。

やること

環境

  • UniFi Security Gateway
  • UniFi nano HD

コントローラーはRaspberry Piに公式のdebパッケージを入れています。上流はひかり電話ルーター(ホームゲートウェイ)です。

設定

初期セットアップ

コントローラーに接続し、通常通りセットアップを進めます。このとき一回HGW側でPPPoEセッション等を貼ってDHCPでもらったIPアドレスでインターネットに出れるようにしておくと楽だと思います。UniFiは自動で192.168.1.0/24を使うので、セットアップ後にLAN側の設定をずらすか、HGWのセグメントをずらすしておくと楽です。

WAN側の設定を開き、IPv6 Connection TypeをUsing DHCPv6にします。Prefix Delegation Sizeは60です。(ひかり電話ルーターの場合)

f:id:atpons:20200423134925p:plain

SSHの有効化

SSHを有効にします。SSHは、Network Settingsの中のDevice Authenticationにあります。

f:id:atpons:20200423135203p:plain

コンソールでの設定

しばらく待ってからSSHに接続し、ip aなどでeth1に振られたv6アドレスを記録しておきます。あとは、show ipv6 neighborsでHGWのIPv6アドレスを確認します。

あとは、以下のようにconfigureの中で設定します。

set interfaces ethernet eth0 address [IPv6アドレス]/64
set protocols static route6 ::/0 next-hop [HGWのIPv6アドレス]
set interfaces ipv6-tunnel v6tun0 encapsulation ipip6
set interfaces ipv6-tunnel v6tun0 local-ip [IPv6アドレス]
set interfaces ipv6-tunnel v6tun0 remote-ip [transixのAFTR]
set interfaces ipv6-tunnel v6tun0 mtu 1500
set interfaces ipv6-tunnel v6tun0 multicast disable
set interfaces ipv6-tunnel v6tun0 ttl 64
set protocols static interface-route 0.0.0.0/1 next-hop-interface v6tun0
set protocols static interface-route 128.0.0.0/1 next-hop-interface v6tun0

既出のImpress Watchの記事と違うのはルーティングのところになります。UniFi Security Gatewayでは、0.0.0.0/0を上手く認識しないバグ(もしくは仕様)があり、0.0.0.0/0を宛先にできないので、0.0.0.0/1128.0.0.0/1を組み合わせて0.0.0.0/0を表現する必要があります。これで無限に時間を溶かしました。(というか、これはUniFiユーザーに教えてもらいました。ありがとうございます。)

参考: adding default route 0.0.0.0 0.0.0.0 on Unifi with USG impossible | Ubiquiti Community

JSONへの書き出し

これでDS-Liteで使えますが、commitしてsaveした場合でも、UniFi Controllerが次にプロビジョニングするとコマンドでの設定は消えてしまいます。そのため、以下のようなJSONをconfig.gateway.jsonとして保存します。場所はUniFi Controllerのデプロイ方法によりけりですが、公式debパッケージの場合、/var/lib/unifi/sites/default/config.gateway.jsonです。(sites/以下はないので作成します。サイト名も適宜default以外に変更してください。)

{
  "interfaces": {
    "ethernet": {
      "eth0": {
        "address": [
          "dhcp",
          "[IPv6アドレス]/64"
        ]
      }
    },
    "ipv6-tunnel": {
      "v6tun0": {
        "encapsulation": "ipip6",
        "local-ip": "[IPv6アドレス]",
        "mtu": "1454",
        "multicast": "disable",
        "remote-ip": "[transixのAFTR]",
        "ttl": "64"
      }
    }
  },
  "protocols": {
    "static": {
      "route6": {
        "::/0": {
          "next-hop": {
            "[HGWのIPv6アドレス]": {
              "interface": "eth0"
            }
          }
        }
      },
      "interface-route": {
        "0.0.0.0/1": {
          "next-hop-interface": {
            "v6tun0": "''"
          }
        },
        "128.0.0.0/1": {
          "next-hop-interface": {
            "v6tun0": "''"
          }
        }
      }
    }
  }
}

これで、USGでもIPv4 over IPv6 + IPv6環境が手に入ります。

f:id:atpons:20200423140630p:plain

最後に

この設定で接続できますが、自分の環境では上手くDPIが動作しませんでした。またUniFi Security Gatewayの動作が不安定になるかもしれないことも確認しています。(2時間おきに再起動したりしました、初期化で安定しました)

GUI以上のことをしようとするとなかなかハマりますね。また検証してみて、最適なUniFi生活をやっていこうと思います。

参考