tech.guitarrapc.cóm

Technical updates

Unity Dream RouterでデュアルNATを回避する

以前、MAP-E方式のIPv4 over IPv6をUniFi Dream RouterUniFi Dream Machineで利用する方法を紹介しましたが、いずれもホームゲートウェイ(HGW)と組み合わせる際にデュアルNATとなっていました。2024年7月リリースのファームウェアNetwork Appklication 8.3でUDR/UDMのNATを無効にできるようになりました。

早速デュアルNATを回避することで速度はよくなるのか、何かトラブルが起こらないのか見てみました。

環境

次の環境で行います。

構成図

デュアルNATの構成は次のようになります。

Mermaidコード

flowchart TD
    subgraph IPv6 IPoE網
      G[事業者ルーター]
    end
    subgraph "ユーザーLAN(IPv4/IPv6)"
      A([光コンセント])
      B[HGW]
      subgraph "UDR LAN(IPv4/IPv6)"
        C[UDR]
        D[VLAN]
        E[VLAN]
      end
    end

    G -->|IPv4 over IPv6トンネル| A
    A --WAN (NAT)--> B
    B --WAN (NAT)--> C
    C -->|LAN| D
    C -->|LAN| E

デュアルNATの構成

UDRのNATを無効にした構成は次のようになります。

Mermaidコード

flowchart TD
    subgraph IPv6 IPoE網
      G[事業者ルーター]
    end
    subgraph "ユーザーLAN(IPv4/IPv6)"
      A([光コンセント])
      B[HGW]
      subgraph "UDR LAN(IPv4/IPv6)"
        C[UDR]
        D[VLAN]
        E[VLAN]
      end
    end

    G -->|IPv4 over IPv6トンネル| A
    A --WAN (NAT)--> B
    B --WAN (IPv4はLAN側静的ルーティング)--> C
    C -->|LAN| D
    C -->|LAN| E

UDRのNATを無効にした構成

UDRのNATを無効にする

UDRのNATはネットワークごとに有効/無効を選択できます。そこで従来のネットワークとは別にNATを無効にするネットワーク(及びVLAN)を切り、専用のSSIDも作成します。これでWi-Fiを切り替えるだけで動作を検証できます。従来のWi-FiはデュアルNATのままなので、万が一トラブルがあっても元のWi-Fiにつながっている端末に影響出ません。

手順は次の通りです。

  1. (UDR) NATを切るネットワークNoNATを用意する
  2. (UDR) NATを切るネットワークにつなげるSSIDを用意する
  3. (UDR) NATのNAT設定で除外ネットワークへNoNATを指定する
  4. (HGW) NATを切るネットワークのCIDR/UDRのWAN側IPアドレスを静的ルーティングする

順番に見ていきましょう。

(UDR) NATを切るネットワークNoNATを用意する

UDRのWeb UIにアクセスしSettings -> Networksを開きます。いい感じでネットワークを切ってください。特にこだわるポイントはありません。CIDRは192.168.13.0/24とします。

UDRでネットワークを切る

(UDR) NATを切るネットワークにつなげるSSIDを用意する

作成したネットワークをさくっと試すならWi-Fiがベストです。私が宅内をWi-Fiで統一している理由の1つです。

Settings -> WiFiを開き、SSIDを作成します。SSIDはNoNATとでもしておきましょう。

[UDRのWiFi設定]

(UDR) NATのNAT設定で除外ネットワークへNoNATを指定する

重要なポイント1です。

Settings -> Routing -> NATを開き、Global NAT SettingsをAutoからCustomに変更、Exclude NetworksにNoNATを追加します。もしも全てのネットワークを除外したい場合は、Global NAT SettingsをOffにしてしまうのも手です。私も安定動作を確認したらOffにする予定です。

UDRのNAT除外設定

(HGW) NATを切るネットワークのCIDR/UDRのWAN側IPアドレスを静的ルーティングする

重要なポイント2です。

接続先がIPv61なら、HGWの静的ルーティング設定をせずとも通信できます。しかし接続先がIPv4な場合、上位のHGWでUDR配下の端末当て通信が正しく中継できません2。NATを無効にしたため、インターネットからの戻り通信宛先がローカルPCアドレスのままになり、HGWはどこに転送すればいいか分からなくなるためです。そこでHGWの静的ルーティングを使って、LAN側のネットワーク宛て通信はUDRのWAN側IPアドレスへ転送するよう設定します。

私のHGWはRX-600KIなので、HGWのWeb UIにアクセスし詳細設定 -> LAN側静的ルーティング設定を開きます。宛先IPアドレス/マスク長にNoNATネットワークのCIDR192.168.13.0/24を、次のホストIPアドレスにUDRのWAN側IPアドレス192.168.1.2を指定します。

HGWの静的ルーティング設定

これでUDRのNATを無効にしたネットワークができました。

動作試験

さっそく接続してみましょう。NAT無効なSSIDに接続しIPアドレスを確認すると、NAT無効なネットワークのアドレスが割り当てられています。

$ ipconfig
Wireless LAN adapter WiFi:

   Connection-specific DNS Suffix  . :
   IPv6 Address. . . . . . . . . . . : xxxx:xxxx:xxxx:xxxx::xxx
   IPv6 Address. . . . . . . . . . . : xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
   Temporary IPv6 Address. . . . . . : xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxx:xxxx
   Link-local IPv6 Address . . . . . : fe80::1ecf:2056:38cb:af3c%9
   IPv4 Address. . . . . . . . . . . : 192.168.13.184
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : fe80::6222:32ff:feaa:33d9%9
                                       192.168.13.1

速度チェック

有線接続の速度を確認します。

HGWからの有線LAN

参考値として、HGWから有線LANで接続したPCからfast.comで速度を測定します。理論上の最速接続です。

HGW直接の有線LAN

UDRのLANポートに接続したPCからfast.comで速度を測定します。

デュアルNAT シングルNAT (本記事の構成)
450Mbps
デュアルNATの有線LAN
470Mbps
シングルATの有線LAN

無線接続の速度を確認します。UDRのWi-Fiに接続したPCからfast.comで速度を測定します。

デュアルNAT シングルNAT (本記事の構成)
270Mbps
デュアルNATのWi-Fi速度
320Mbps
シングルNATのWi-Fi速度

なお、運ゲーなので、実行タイミングによってはWi-Fiでも有線ぐらいにはなります。

Wi-Fi速度の上振れ

通信トラブルの有無

1週程利用していますが、特に通信トラブルはありませんでした。 あと1週間様子を見てから全体に展開予定です。

まとめ

速度差は微々たるもので計測誤差にも感じますが、デュアルNATを回避できるのが大きいです。ただ、構成自体はシンプルですがHGWに追加設定を必要としているのは微妙3なポイントです。

ようやく念願のデュアルNAT回避ができるようになりました。あとはMAP-Eのネイティブ対応ですね。

参考


  1. 例えばGoogleやXは問題なく接続できるのを確認できます。
  2. 行きは良いが、戻り通信を端末に戻せない。
  3. デュアルNATよりはましだと割り切っています