前書き

DNS64

OpenWRT23.05になり、dnsmasq2.89が採用されている。
dnsmasq2.87以上で、A Filterが利用できる。

今回、UnboundとDnsmasqを組み合わせて、DNS64 with A Filterを実現する。

NAT64

IPv4インターネットへの疎通には、PPPoEを使用する。
以前は、MAP-E(IPv4 over IPv6)を使用していた。

弊宅では、MAP-EのルーティングをHGWが担っており、IPマスカレード最大4096セッションである。
このセッション数をほかのネットワークと共有しており、セッションの枯渇が以前から問題になっていた。

[チューニング]により回避はしてきたが、OpenWRTの膨大なセッション数は、これを根本的に解決できる。

以前、NGN網の網終端装置の混雑により、インターネット通信の速度が低下する問題がありMAP-Eに移行したのだが、昨今はこの移行が進みPPPoEの網終端装置が空いてきたのであろう。
通信速度が十分に出るようになっており、実用に耐えると判断し、今回はこちらを採用することとした。

メリット

  • NAT64を使用する経路のNAT回数を減らせる
    • 従来はOpenWRTによるNAT64とHGWによるNAT44で2回実施していた
    • NAT64を使用しない経路については、OpenWRTでForward、HGWで静的ルーティングを行うことで、HGWのNAT44のみだった
  • ルーティングが簡素化する
    • 外からの通信を受け入れる場合、従来はPPPoEも併用しており、正しいI/Fから通信を返すようにする必要があった

デメリット

  • NGNにおけるPPPoEのMTUが1454と低く、特に大きな容量の通信をする場合に、ネットワーク機器への負荷が増える
    • パケット当たりの容量の低下により、パケット数が増えることに起因
  • NAT64に使うjoolでは、一部のホストとの疎通性が悪化する
    • Path MTU Discovery が利用できないホストと推測
    • OpenWRTの「MSS clamping」が機能しない

MTUの問題についてはチューニングにより改善できた。手順の中に含めて紹介する。

手順

Firewall

ファイアーウォールを用いてMSSを書き換える設定。これが今回のキモ。

設定ファイルを作る。pppoeのインターフェイス名は異なる場合があるので、必要ならば設定されているものに変更してください。

vi /root/nat64_pppoe-wan4.nft
oifname "pppoe-wan" meta nfproto ipv4 meta l4proto tcp tcp flags syn tcp option maxseg size set rt mtu

作った設定ファイルを読ませる設定を記述。

vi /etc/config/firewall
config include
        option type 'nftables'
        option path '/root/nat64_pppoe-wan4.nft'
        option position 'chain-post'
        option chain 'mangle_postrouting'

設定を適用する。

/etc/init.d/firewall restart

NAT64

必要なパッケージをインストール。

opkg update
opkg install jool-tools-netfilter

サービスの停止と標準設定ファイルのバックアップ。

service jool stop
mv /etc/jool/jool-nat64.conf.json /etc/jool/jool-nat64.conf.json.bk

設定ファイルを新たに作成。

vi /etc/jool/jool-nat64.conf.json
{
    "instance": "nat64-minimal",
    "framework": "netfilter",

    "global": {
        "pool6": "64:ff9b::/96"
    }
}
vi /etc/config/jool
config jool 'general'
        option enabled '1'

config jool 'nat64'
        option enabled '1'

config jool 'siit'
        option enabled '0'

サービスを開始。

service jool start

DNS64

パッケージのインストール。

opkg install luci-app-unbound

unboundのDNS64を設定

uci set unbound.@unbound[0].dns64='1'
uci set unbound.@unbound[0].listen_port='5353'
uci commit unbound

WebUIを開いて、次のように設定。
CLIから設定する方法もあるかと思いますが、面倒なのでWebUIに逃げる

Services → Recursive DNS → Unbound → Basic

Enable DNSSEC チェック

Services → Recursive DNS → Zones

標準設定を全部消して、次のように設定。

Zone Type: Forward
Zone names: flets-west.jp., flets-east.jp.
Servers: 2400:4153:e1c2:ef00:1eb1:7fff:fe12:b3c
Zone Type: Forward
Zone Names: .
Servers: <各自お好みのDNSフルサービスリゾルバを指定>
DNS over TLS: チェック
TLS Name Index: <DNSフルサービスリゾルバのドメインを指定>

Network → DNS and DHCP → General Settings

DNS forwardings ::1#5353

Network → DNS and DHCP → Advanced Settings

Filter IPv4 A records チェック

Network → Interfaces → wan6 [Edit] → Advanced Settings

Use DNS servers advertised by peer チェック無し

Save & Apply をして設定保存した後、サービスを再起動

service dnsmasq restart
service unbound restart

参考資料

https://github.com/openwrt/openwrt/pull/11190
https://openwrt.org/releases/23.05/notes-23.05.0