UNIVERGE IX2215で、ひかり電話のない環境にデュアルスタックVLANをつくる

IX2215で、複数インタフェースで/64プレフィクスを共有する環境のネットワーク図

ひかり電話契約がない環境(RA方式)で、すべてのVLANにIPv6インターネット接続性を提供するのは難しい。とあるユーザフォーラムを覗いていると、NEC IXのブリッジ機能なら実現できる旨の記述があった。
VLAN分割下におけるIPoE IPv6について | ヤマハネットワークエンジニア会
IXルータは逸般の誤家庭の間で普及しつつあり、ショートパケット性能がよいと噂には聞いていた。
性能 : UNIVERGE IXシリーズ | NEC
今回、ご家庭に丁度いいサイズ感のIX2215が安価に出回っていたため、手に入れて実投入してみた。
Xユーザーのさくら夜📮︎︎︎︎ ♌さん: 「買い時のNEC UNIVERGE IXシリーズをまとめました 中古ならIX2215 新品ならIX2235 をそれぞれお勧めします! IX3110は値段と性能は良いがとても大きい… https://t.co/JWMUgN7tCu」 / X

結論から言えば最高だった。目論見通りRA方式でも各VLANにIPv6を提供でき、Luaで書いていたNTEガチャも多分何とかなると思っていたが何とかなってBufferbloatは叩きのめせたし、Everything おk。
何より公式ドキュメントが潤沢で、後は知らない部分のRFCを読むだけで殆ど設定できた。そのためこのような記事は全くもって不要なのだが、設定に至った経緯を参考文献を交えながら解説したい。
マニュアル : UNIVERGE IXシリーズ | NEC Web設定マニュアル, 機能説明書, コマンドリファレンスは必ずダウンロードしておこう。

更新履歴 見出しにジャンプ

日時 変更内容
2024-09-15
  • wan-hostsがGUA指定な理由
  • NUDが多かったのでRA, NDのパラメータを修正
  • http-serverとssh-serverのconfigと説明
  • ブリッジ間アクセスリストでDADをブロックしてもマルチキャストは減らなかったので削除
  • QoSのクラスでIPv4とIPv6を分ける理由が抜けてた
2024-09-18
  • IPv6フラグメントの拒否
  • ダイナミックアクセスリストの性質
  • MAP-EのNAT
    • IPv6パケットフィルタのFMR対応方法
    • ヘアピンはFMR非対応
    • VNEが想定するNAT BehaviorとDNSソースポートランダマイゼーションの影響
  • 収容ルータを送信元としたパケットを、LAN側でブロックする説明が抜けていた
  • DNRのLengthが誤っていた
  • QoS
    • ルール追加時に分かりづらいのでIETF Diffserv Service Class, Precedenceを追加
    • 執筆前のconfigの混在を修正
      • class-in-up6-pの削除・統合
      • IPv4 over IPv6のQoSに使う事前マーキングpolicy-mark-tu00の方向が誤っていた
    • Cloudflare Calls
2024-09-23
  • RFC 7857 Port OverlappingはSymmetric NATのことではないし、元々非推奨だったらしい
    @eqgご指摘感謝
  • 同じMAP IPv4アドレスを持つ人がどの辺に住んでるか調べて、ヘアピンNATを使うか再考する
2024-09-30
  • SIP-NAT ALG
  • パケットの気持ちになって、VLAN間のダイナミックアクセスリストの動作を解説
  • Do53をnocacheにしてもアクセスリストキャッシュが肥大していたので、VLAN間アクセスリストとclass-mapのアクセスリストを修正
    • vlan-out-nc
    • vlan23-out-nc
    • class-up7
    • class-vi5cs

ハードウェアの準備 見出しにジャンプ

  • サーマルパッド
    製造年が古いものは、PHYチップのサーマルパッドがオイルブリードし、ヒートシンクに接していないものが多い。
    大した発熱ではないのだが、それなりに発熱はあるので、メーカー推奨の範囲に収まるようにエアフローなりサーマルパッド交換なりで対応するのが望ましい。私は余っていたアルミ板と熱伝導テープで対処した。

温度はWeb GUIやshow environment (history)で確認できる。IX2215の内部温度上昇分を考慮すると、センサ読みで50°Cを上限としたい。縦置きするか、ちょっとしたエアフローをつくるだけでも改善するだろう。
cf. 動作保証温度範囲内で使用する UNIVERGE IX2000シリーズ 取扱説明書

  • シリアルコンソールケーブル
    初期コンフィグにsshdも何も入っていないため、シリアルコンソールケーブルが必須。
    cf. Web設定マニュアル
    どうやらWindowsの標準ドライバで動くのはFTDIチップで、FTDIのコピー品やCH340などはドライバが必要らしい。カーネルモードで下手なドライバが動いていいことなど微塵もないので避けた。
    下記は私が使っているもので、追加のインストールなしで認識した。

Windowsが認識したCOMポートは、WSL1でも使用できる。COM3なら/dev/ttyS3のように採番されるらしい。
ファイルディスクリプタをtailしながら、echoで何かしら送って反応があれば使える。

sudo dnf install screen

# デフォルトのボーレートに合わせて接続
sudo screen /dev/ttyS3 9600

# ボーレート 115200bit/s で接続
sudo screen /dev/ttyS3 115200

ownerがroot:gamesになっていると接続できないので、usermodで追加してあげる

# [screen caught a fatal signal. (core dumped)]

sudo ls -l /dev/ttyS3
# crw-rw---- 1 root games 4, 67 Sep  7 00:14 /dev/ttyS3
sudo usermod -G wheel,games user

シリアルコンソール - ArchWiki
【Windows10/WSL Ubuntu】COMポートにアクセスしシリアル通信する | The modern stone age.

初期化 見出しにジャンプ

シリアルコンソールに接続した状態で、起動中Loading: #####にCtrl - Cを押下するとブートモニタモードに入る。
不揮発メモリに残ったstartup-configの消去ccからルータソフトウェアの消去まで行える。
2.1.7. スーパーリセット — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
cf. ブートモニタ UNIVERGE IX2000/IX3000シリーズ コマンドリファレンスマニュアル

NEC Diagnostic Software
Copyright (c) NEC Corporation 2001-2022. All rights reserved.

%DIAG-INFO: Starting System POST(Power On Self Test)

               DRAM TEST 1: Pass
               DRAM TEST 2: Pass
                NVRAM TEST: Pass
~~
        1.0 VOLTAGE STATUS: 0.987V Pass
        1.5 VOLTAGE STATUS: 1.481V Pass
        2.5 VOLTAGE STATUS: 2.457V Pass
        3.3 VOLTAGE STATUS: 3.268V Pass
        5.0 VOLTAGE STATUS: 4.940V Pass
        TEMPERATURE STATUS: +41.0degC Pass

NEC Bootstrap Software
Copyright (c) NEC Corporation 2001-2022. All rights reserved.

%BOOT-INFO: Trying flash load, exec-image [ix2215-ms-10.7.18.ldc].
Loading: ##########################
NEC Bootstrap Software, Version 22.1
Copyright (c) NEC Corporation 2001-2022. All rights reserved.
boot[1]> cc
Enter "Y" to clear startup configuration: y
% Startup configuration is cleared.

NEC Bootstrap Software, Version 22.1
Copyright (c) NEC Corporation 2001-2022. All rights reserved.
boot[1]> b

ccでstartup-configを消去したら、bで装置を起動する。

ファームウェアアップデート 見出しにジャンプ

show version
NEC Portable Internetwork Core Operating System Software
IX Series IX2215 (magellan-sec) Software, Version 9.2.20, RELEASE SOFTWARE
Compiled Aug 19-Wed-2015 15:50:31 JST #2 by sw-build, coregen-9.2(20)

バージョン10.xならNetMeister経由で更新できるが、9.xまではUSBメモリやTFTPでのアップデートにのみ対応する。手動アップデート用のファームウェアは下記で配布されている。イベントログリファレンスも使うのでダウンロードしておこう。
プログラムファイル・ダウンロード : UNIVERGE IXシリーズ | NEC
USBメモリは、FAT32かつアロケーションユニットサイズが32KBになるようフォーマットして使用した。

NTFSやexFATなどFAT32以外でフォーマットされたUSBメモリは利用できません。
64キロバイト以上のアロケーションユニットサイズでフォーマットされたUSBメモリは利用できません。(例:高速化ツールなどでフォーマットされたUSBメモリ)
4. USBメモリの利用 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

コンフィグレーションモードに移行し、USBメモリ機能を有効化

Router(config)# device USB0
Router(config-USB0)# no shutdown 
Router(config-USB0)# exit
Router(config)# usbmem enable
Router(config)# usbmem restore USB0

中身を確認する

show usbmem usbmem0:/
Directory is /
2024/09/06  22:05:28  <DIR>       SYSTEM~1      System Volume Information
2024/09/06  22:00:12       84130  RUNNIN~1.CFG  running-config.cfg
2024/09/06  22:07:04    10944304  IX2215~1.RAP  ix2215-boot-24.1-gate-ms-10.9.11.rap
2 files 11028434 bytes
1 directories

ファームウェアをアップデート

software-update usbmem0:/ix2215-boot-24.1-gate-ms-10.9.11.rap
show version
NEC Portable Internetwork Core Operating System Software
IX Series IX2215 (magellan-sec) Software, Version 10.9.11, RELEASE SOFTWARE
Compiled Dec 15-Fri-2023 13:35:51 JST #2 by sw-build, coregen-10.9(11)

このほか、usbmem restoreを使用した初期設定方法もある。
cf. USB メモリを使用した初期設定 UNIVERGE IX2000シリーズ 取扱説明書

基本操作 見出しにジャンプ

  • EXECモード
    IXはグローバルコンフィグモード、インタフェースコンフィグモードをはじめ様々なEXECモードがあり、投入できるconfigや使えるshowコマンドが異なる。
    実行可能なコマンドはTab補完される。
  • 設定の変更
    コンフィグ行を投入すると、多くは再起動なく即時反映される。先頭にnoをつけて実行すると、任意のconfig行を消去できる。実行中の内容はshow running-configで確認しよう。
    電源喪失後も保持されるよう、write memory/copy running-config startup-configで不揮発メモリへ保存する。
    アクセスリスト(ACL)など投入する順序が意味を持つconfigもあるため、TFTPを使ってファイルごと書き換えるのが確実だ。

実機演習資料(初級編) ~UNIVERGE IX2215~ - ix2k3k-learning-ver8.10_10.0.pdf
2.1. 基本操作 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

TFTPでconfig操作 見出しにジャンプ

RTXにはTFTP, SFTPサーバ機能があったが、IXにはTFTPサーバ機能がない。
ファームウェアアップデートや迅速なconfigの投入には、別途TFTPサーバを用意するとよい。

TFTPサーバのインストール

sudo dnf install tftp-server
sudo systemctl enable tftp.socket 
sudo systemctl start tftp.socket 
systemctl status tftp.socket

穴あけ

sudo firewall-cmd --add-service=tftp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

startup-configへの適用

copy 10.0.3.5:running-config.cfg startup-config
reload

startup-configの確認

write memory
copy startup-config 10.0.3.5:startup-config.cfg

上記コマンドを簡単に叩けるよう、ヘルパースクリプトを用意した。
nyanshiba/ixconfig: Tools to support the UNIVERGE IX router configuration

  • ./update-config.shできないのは、ownerの問題
ls -lad /var/lib/tftpboot
# drwxr-xr-x. 2 root root 6  7月 20 09:00 /var/lib/tftpboot

sudo chown user:user /var/lib/tftpboot/
  • ./get-config.shできないのは、ファイルがないTFTP error - File Not Foundのと、権限不足TFTP error - Unknown Errorだ。パケットキャプチャするとわかる。
Production.254	Production.5	TFTP	69	69		Write Request, File: startup-config.cfg, Transfer type: octet
Production.5	Production.254	TFTP	60734	64		Error Code, Code: Not defined, Message: Permission denied
sudo touch /var/lib/tftpboot/startup-config.cfg
sudo chmod 756 /var/lib/tftpboot/startup-config.cfg
# sudo chown user:user /var/lib/tftpboot/startup-config.cfg

sudo systemctl restart tftp.socket 

SELinuxを教育

sudo ausearch -c 'in.tftpd' --raw | sudo audit2allow -M my-intftpd
sudo semodule -X 300 -i my-intftpd.pp

CentOS7 vsftpdの導入 - Writing Appropriately
SELinuxトラブルシュート #CentOS - Qiita

Web GUI 見出しにジャンプ

セキュリティレベル2

右も左もわからないときは、Web設定マニュアルから進めるとよいだろう。
UNIVERGE IX2000/IX3000シリーズ Web設定マニュアル
2.26.7.1. パスワードの設定 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

  • http-serverをVLAN側インタフェースで有効化
    2.26. Webコンソールの設定 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
    • http-server ip access-list ACLを設定できるが、通常のパケットフィルタと異なりTCP RSTを返す点に注意したい。例えば(あり得ないと思うが)グローバルコンフィグモードで有効化した場合、NATのファイアウォールの廃棄動作と異なるため、インターネットにWebサーバの存在を知らせることになる。ポート開放あるいは気合で5tuple一致させた先のLinuxが、REJECT設定だった時と同じように攻撃者には見えるだろう。
    • MACアドレスを書けるリンクマネージャは便利だけど、ダメな使用例だよ
http-server authentication-method digest
http-server username admin secret-password himitsu
http-server ip access-list web-http-acl
!
ip access-list web-http-acl option optimize
ip access-list web-http-acl permit ip src 10.64.0.0/21 dest any linkmgr sg 43
!
interface GigaEthernet2.0
  http-server ip enable
!
  • Web GUIのトップページに表示されるインタフェースを設定。
    2枠なので、1枠はMAP-EインタフェースTunnel0.0をもってIPv6接続の確認とし、もう1枠はIPv4 PPPoEの主回線GigaEthernet0.1を設定。
system information wan 1 Tunnel0.0
system information wan 2 GigaEthernet0.1
!
web-console system information
  ...
!

SSH 見出しにジャンプ

ssh-server ip access-list web-http-acl
!
interface GigaEthernet2.0
  ssh-server ip enable
!
  • ssh-server ip access-list http-server ip access-listと同じくTCP RSTを返す。
  • sshdの設定を行うとpki private-key generate rsaが実行され、装置側の認証に公開鍵認証を用いるとあるが、端末側の認証はパスワードで行われる。外部からのアクセスに耐えうるものではないと判断し、インタフェースコンフィグモードで設定。
    5.2.1. SSHサーバーの設定 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
  • 最近のopenssh-clientsのデフォルトはIXと互換性がない。
Host ix
  User admin
  HostName 10.0.0.254
  HostkeyAlgorithms +ssh-rsa
  PubkeyAcceptedAlgorithms +ssh-rsa
  • このようなエラーが出たら、SSHバージョンとともに@shibanyan_1まで教えてほしい。
ssh ix
# ssh_dispatch_run_fatal: Connection to 10.64.0.254 port 22: error in libcrypto
ssh -V
# OpenSSH_9.8p1, OpenSSL 3.2.2 4 Jun 2024

syslog 見出しにジャンプ

ログを見ずに設定するのは無謀なので、syslogサーバを用意した。
Linuxのロギングソフトウェアの多くが、syslog514/udpに対応していない。古き良きrsyslogを使って、jounaldに教育を施した。

module(load="imudp")
module(load="omjournal")

ruleset(name="remote") {
       action(type="omjournal")
}

input(type="imudp" port="514" ruleset="remote")
sudo systemctl restart rsyslog

# 514/udpを許可
sudo firewall-cmd --add-service=syslog --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
syslog ip host 10.0.3.5

イベントログリファレンスから重要そうなイベントをピックアップして設定した。
最終的にはsyslogサーバに送ることになるので、logging bufferedは不要。

no logging buffered
logging subsystem arp warn
logging subsystem brs warn
logging subsystem env warn
logging subsystem eth warn
logging subsystem flt include 7 8
logging subsystem gw notice
logging subsystem http warn
logging subsystem icmp include 1 7 8 12 13 21
logging subsystem icp6 warn
logging subsystem icp6 include 52 54 60 62 126
logging subsystem ip warn
logging subsystem ip exclude 6 9
logging subsystem ip6 warn
logging subsystem ip6 exclude 9
logging subsystem ipwc include 3 4 10 11 28
logging subsystem l2tp warn
logging subsystem mape info
logging subsystem nat warn
logging subsystem nat include 61 86 89 109 111 112
logging subsystem nmc warn
logging subsystem ppp include 13 176 221
logging timestamp datetime
  • flt -- Traffic Filter
  • icmp -- Internet Control Message Protocol for IPv4
    • ICMP.001 Bad checksum 0xreceived_checksum received (expected 0xgood_checksum) in packet from source_IP_address to destination_IP_address (WARNING)
    • ICMP.007 Address mask request received (INFO)
      ICMP.008 Address mask reply received (DEBUG)
      ICMP.012 Sending redirect for packet (INFO)
      反応すべきでないICMPタイプをログる
    • ICMP.013 Sending parameter problem message (INFO)
    • ICMP.021 sending frag needed and DF bit set for packet (INFO)
      PMTUの問題の調査に使えるかもしれない
  • icp6 -- Internet Control Message Protocol for IPv6
    • ICP6.052 Packet too big received (INFO)
    • ICP6.054 Time exceeded received, fragment reassembly (INFO)
    • ICP6.060 Sending packet too big (INFO)
    • ICP6.062 Sending time exceeded, fragment reassembly (INFO)
    • ICP6.126 RA received, router ADDRESS, prefix PREFIX, prefix-len PREFIX-LEN, valid lifetime VALID-LIFETIME (DEBUG)
      Prefix変更に備えて、上位ルータからのRAで通知されたPrefixをログる。
    • ICP6.075 Neighbor solicitation received (INFO)
      ICP6.085 Sending neighbor advertisement (INFO)
      NDプロキシ環境では時にサイバー攻撃の受信とSSEへの転送要請ログ。これを無視する設定を行えばDoSを防げる。
  • ip -- Internet Protocol Version 4
    • IP.054 Re-assembly TTL expired
      NATがフラグメントを受信NAT.109したら、再構成を待機し、経過したらICMPで返答してしまう。OUT方向のアクセスリストで止められる。
  • ip6 -- Internet Protocol Version 6
  • ipwc -- Network Monitor
    • IPWC.003 [GROUP-NAME-PROFILE-SEQ] Changed watch group status, state is stand (WARNING)
    • IPWC.004 [GROUP-NAME-PROFILE-SEQ] Changed watch group status, state is normal (WARNING)
    • IPWC.010 [GROUP-NAME-PROFILE-SEQ, event-EVENT-SEQ] Detected variance event (WARNING)
    • IPWC.011 [GROUP-NAME-PROFILE-SEQ, event-EVENT-SEQ] Detected restoration event (WARNING)
    • IPWC.028 [GROUP-NAME-PROFILE-SEQ, event-EVENT-SEQ] Received IP-VER WATCH-DIR-EVENT-TYPE probing reply, seq PING-SEQ, rtt TRIPTIME (INFO)
  • l2tp -- Layer 2 Tunneling Protocol
    • L2TP.023 Discarded invalid header message (WARNING)
  • nat -- Network Address Translation
    • NAT.061 inbound packet dropped, PROTOCOL SOURCE > DESTINATION, INTERFACE (INFO)
      IXのNAPTはFWのため、インターネットからの攻撃ログはほぼこちらに。
    • NAT.086 destination address is NAPT address (INFO)
      STUNのログ、あるいはヘアピン?
    • NAT.089 CODE NAPT_PORT SRC_INFO > DEST_INFO (NOTICE)
      NAT変換のログ
    • NAT.101 inbound packet through, PROTOCOL REMOTE > LOCAL (DEBUG)
      NAT.102 outbound packet through, PROTOCOL LOCAL > REMOTE (DEBUG)
      逆NATのデバッグに役立つ
    • NAT.109 Received IP fragment, SOURCE > DESTINATION (DEBUG)
      NATがフラグメントパケットを受け取ったときに、再構成タイムアウトが経過IP.054したら問答無用でICMP Time Exceededを返すときのログ。
      IN方向でなくOUT方向のアクセスリストで止められる。
    • NAT.111 ICMP search failed PROTOCOL local LOCAL remote REMOTE, INTERFACE (DEBUG)
    • NAT.112 received Ident segment, send back RST (DEBUG)
      NATがIdentを受け取ったときに、問答無用でTCP RSTを返すときのログ。IN方向でなくOUT方向のアクセスリストで止められる。
  • pdns -- Proxy DNS for IPv4
    • PDNS.002 Received DNS response from server_address, port port_number, id id, fqdn (DEBUG)
      IPv4キャッシュDNSサーバからの応答
    • PDNS.029 No DNS servers (INFO)
      プロキシDNSの設定に不整合があったとき
  • pdn6 -- Proxy DNS for IPv6
    • PDN6.002 Received DNS response from server_address, port port_number, id id, fqdn (DEBUG)
      IPv6キャッシュDNSサーバからの応答
  • ppp -- Point-to-Point Protocol
    • PPP.013 Received packet with unsupported protocol 0xUNSUP_PROT, on INTERFACE (WARNING)
      Apple iPhoneとのL2TP/IPsecで、QUICが通らないときに出るログ
    • PPP.176 IPCP: making PROTOCOL address option, address SRC_ADDR (DEBUG)
      PPPoEのIPCPで通知されたDNSやグローバルIP、NTEのアドレスをロギング
    • PPP.221 IPCP: assign address ADDRESS (username USERNAME, profile PROFILE), on INTERFACE (WARNING)
      L2TP/IPsecの接続ユーザを通知

IPv6 見出しにジャンプ

IX2215で、複数インタフェースで/64プレフィクスを共有する環境のIPv6ネットワーク図

IPv6といっても千差万別なので一応まとめておくと、本項で触れるのは

  • ND Proxy
    • IPv4/IPv6キメラスタックVLAN (デュアルスタックとは言い難い)
  • IPv6セキュリティ
  • IPv6 PPPoEのDHCPv6-PD

触れないのは

  • IPv6ブリッジ
  • IPv6 IPoEのDHCPv6-PD
    • IPv4/IPv6デュアルスタックVLAN
  • IPv6シングルスタック
  • IPv6マルチプレフィクス

複数インタフェースへND Proxy 見出しにジャンプ

フレッツのひかり電話のない契約は、/64 Prefixがルータ広告(RA)によって1つだけ配られる(RA方式)。このような割り当てはIETF標準に違反し、RIPEは顧客LANを破壊すると指摘する。近隣探索プロトコル(NDP)の制約で、これ以上細かいPrefixに分割できず、自由にVLANを切れないためだ。幸いフレッツ光クロスからは是正され、契約ごとに/56 Prefixが配られるようになった。

第一の問題は、フレッツ網では原則として IPv6 の IP アドレス (群) を、1 つの回線について、/64 という単位でしか割当てない (前述の 1844 京 6744 兆 737 億 955 万 1616 個である。) という問題である。IPv4 では、1 つの部門用の最小の LAN を構築するためには、まさに /64 が 1 つ必要になる (つまり、1 つの部署ごとに、1844 京 6744 兆 737 億 955 万 1616 個必要になる。)
JANOG54 登 配布資料 2 - 秘密の NTT 電話局、フレッツ光、インターネット入門

IXでは、IPv6のみブリッジし、IPv4をルーティングするブルータ機能がある。これを用いれば、RA方式であってもIPv4 VLANが設定されたインタフェースにIPv6インターネット接続性を提供できる。VLANと同等とはいかないが、プライバシーセパレータ様に機能するインタフェース間フレーム転送抑止機能bridge-group port-protectedやMACアクセスリストで通信を制御できる。

bridge irb enable
no bridge 100 bridge ip
!
ipv6 dhcp client-profile dhcpv6-cl
  information-request
  option-request dns-servers
  option-request ntp-servers
!
ipv6 dhcp server-profile dhcpv6-sv
  ntp-server dhcp
!
ipv6 ufs-cache enable
ipv6 nd max-neighbors 16384
ipv6 route default GigaEthernet0.0 ra
ipv6 access-list wan-hosts option optimize
ipv6 access-list wan-hosts deny ip src any dest 2001:db8:b0ba:10ee::1/128
ipv6 access-list wan-hosts permit ip src any dest any
!
device GigaEthernet0
!
device GigaEthernet1
  shutdown
!
device GigaEthernet2
!
interface GigaEthernet0.0
  description ipoe
  no ip address
  ipv6 enable
  ipv6 dhcp client dhcpv6-cl
  no ipv6 redirects
  ipv6 nd proxy BVI0 wan-hosts
  ipv6 nd ns-interval 3000
  ipv6 nd garbage-time 7200
  ipv6 nd dad-attempts 0
  ipv6 filter in-ndp-nolog 1000 in suppress-logging
  ipv6 filter in-bogon-log 2000 in
  ipv6 filter in-atlas-nolog 3000 in suppress-logging
  ipv6 filter out-dns-nolog 1000 out suppress-logging
  ipv6 filter out-ndp-nolog 1010 out suppress-logging
  ipv6 filter out-bogon-log 2000 out
  ipv6 filter out-atlas-nolog 2010 out suppress-logging
  ipv6 filter out-dyn-nolog 3000 out suppress-logging
  ipv6 ufs-cache timeout tcp 300
  ipv6 ufs-cache timeout udp 300
  no shutdown
!
interface BVI0
  description ndproxy
  no ip address
  no ip redirects
  ipv6 enable
  ipv6 dhcp server dhcpv6-sv
  ipv6 nd static-neighbor fe80::53:ff:fe12:3456 00:53:00:12:34:56
  ipv6 nd static-neighbor 2001:db8:b0ba:10ee:53:ff:fe12:3456 00:53:00:12:34:56
  ipv6 nd ra enable
  ipv6 nd ra min-interval 1350
  ipv6 nd ra max-interval 1800
  ipv6 nd ra reachable-time 300
  ipv6 nd ra lifetime 5400
  ipv6 nd ra retrans-timer 10000
  ipv6 nd ra other-config-flag
  ipv6 nd ns-interval 3000
  ipv6 nd garbage-time 7200
  ipv6 nd dad-attempts 0
  ipv6 ufs-cache timeout others 120
  ipv6 ufs-cache timeout tcp 300
  ipv6 ufs-cache timeout udp 300
  bridge-group 100
  no shutdown
!
interface GigaEthernet2.0
  description admin
  bridge-group 100
  bridge-group 100 port-protected
  bridge ipv6 filter bvi0-in-200 200 in suppress-logging
  bridge ipv6 filter bvi0-out-ndp 200 out
  linkmgr enable
  no shutdown
!
interface GigaEthernet2:1.0
  description atlas
  bridge-group 100
  bridge-group 100 port-protected
  bridge ipv6 filter bvi0-in-210 200 in suppress-logging
  bridge ipv6 filter bvi0-out-ndp 200 out suppress-logging
  linkmgr enable
  no shutdown
!
...
  • GigaEthernet0.0でND Proxyを有効化ipv6 nd proxyして、全てのリンク解決にIXのMACアドレスを応答する。これにより、上位ルータからの通信はすべてIXに転送され、SPIが可能になる。
    ND ProxyのdownstreamにはBridge Virtual InterfaceBVI0を指定して、複数のインタフェースで利用できるようにする。

    • 全てのリンク解決に応答するということは、存在しないIPv6 Suffixへのサイバー攻撃を歓迎してしまう(ICP6.075, 085)。そこでACLwan-hostsに拒否ルールを書くと、攻撃パケットはただのNSに置き換えられる。IPv6ブリッジと同等に、ラストワンマイルの帯域を削減できるだろう。
      wan-hostsの宛先アドレスdestに近隣要請(NS)のTarget Addressを書くと、収容ルータの近隣不到達性検知(NUD)とリンク解決双方に対応できる(Solicited-Nodeマルチキャストff02::1:ff00:0/104には非対応)。
      2.12.8. NDプロキシの設定 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
      ipv6 nd max-neighbors 16384 同様の目的で近隣キャッシュも最大にした。

    You can limit your Neighbour Cache table to 8k/16k hosts, and then it really would not matter if someone is scanning your /64 VLAN segment, as the old entries that are unreachable will simply expire and those that are valid will remain cached.
    IPv6 Architecture and Subnetting Guide for Network Engineers and Operators | Daryll Swer

    • garbage-time 7200(秒) 近隣キャッシュが溢れない程度にガベージコレクションしていればよく、短いとNDが増えてよくないとのこと。
      RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
      0以外の設定値で増えるのはのはユニキャストのNUDなので、バッテリーへの影響なくマルチキャストを減らせる。
  • ブリッジを有効化bridge irb enableし、ND Proxyルータと端末が属するインタフェースを同じbridge-group 100に所属させる。
    no bridge 100 bridge ipIPv40x800とARP0x806をブリッジさせない(L3ルーティングさせる)。

  • フレッツのRA方式では、DHCPv6を使ってISPのキャッシュDNSやNTPサーバが提供される。GigaEthernet0.0のDHCPv6クライアントdhcpv6-clが取得し、ND ProxyルータのBVI0がDHCPv6サーバdhcpv6-svで端末に渡す。
    一つのDHCPv6サーバを複数で共有するため、どのインタフェースからであっても、通知するdns-serverntp-serverへの到達性がなければならない。
    IPv6 — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント

    • ra other-config-flag AdvOtherConfigFlag = 1 追加の情報があると伝えるOフラグを立てる
  • IPv6はNAPTのような保護がないため、必ずIPv6パケットフィルタipv6 filterでStateful Packet Inspection(SPI)を書く。

  • 各NDのlifetimeはヤマハルータで変更できなかったRFC 8273の推奨に倣った。これによりIPv6マルチキャストが減ったので、モバイル端末のバッテリーライフが向上するかもしれない。
    設定内容はshow ipv6 interface BVI0で確認できる。 RFC 8273: Unique IPv6 Prefix per Host

    A shorter neighbor reachable time enables a routing device to detect neighbor reachability more quickly. However, this consumes more network bandwidth and CPU resources. Therefore, a short neighbor reachable time is not recommended on an IPv6 network. The default value, 1200000 ms, is recommended.
    ipv6 nd nud reachable-time - CX320 Switch Module V100R001 Command Reference 12 - Huawei

    NUDはユニキャストで、上位プロトコルの通信時に発生するだけなのでバッテリーへの影響は少ないはずだが、無駄な確認だから減らした。

    The DELAY state is an optimization that gives upper-layer protocols additional time to providereachability confirmation in those cases whereReachableTime milliseconds have passed since the lastconfirmation due to lack of recent traffic. Withoutthis optimization, the opening of a TCP connectionafter a traffic lull would initiate probes even thoughthe subsequent three-way handshake would provide areachability confirmation almost immediately.
    RFC 4861 - Neighbor Discovery for IP version 6 (IPv6)

    • ra lifetime 5400(秒) AdvDefaultLifetime = 3 * MaxRtrAdvInterval
      MaxRtrAdvIntervalを大きくしたから、3倍でちょうどRFC 7772の例に収まった。
      RFC 7772: Reducing Energy Consumption of Router Advertisements
    • ra retrans-timer 10000(ミリ秒) AdvRetransTimer 効いていない気がする。そもそも要求していないRAは1回にしてほしい。ヤマハルータ(収容ルータ?)と同じ値に。
    • dad-attempts 0 重複アドレス検出(DAD)目的のSolicited-Nodeマルチキャストを打ってほしくない。
      プロフェッショナルIPv6 第2版 – 技術書出版と販売のラムダノート
      • ipv6 nd static-neighborも同様の考え。固定のIPv6アドレスをサーバに設定しているなら、近隣キャッシュ固定でいいよね。
    • ipv6 mld query-interval IX2215はMLD snoopingに対応せず、ひかりTVも契約していないので特にMLDプロキシの設定はしていない。必要ならRFC 3810を読んでQQIの計算をするとよい。
  • ipv6 ufs-cache UFSキャッシュのタイムアウトはIPv4と同様。UDPはSPIのタイムアウトに合わせた。

  • IPv6アドレスを持つのはRAを送るBVI0と端末だけで、各VLANインタフェースipv6 enable ipv6 ufs-cacheは不要。
    GigaEthernet0.0とBVI0ではIPv6しか扱わないため、IPv4ip address ip ufs-cacheは不要

Stateful Packet Inspection 見出しにジャンプ

IPv4では端末にプライベートアドレスのみが振られ、StatefulなNAPTキャッシュに該当しないパケットは廃棄される。一方IPv6は全ての端末にインターネット到達性があるため、ダイナミックアクセスリストを用いたSPIを挟んだ方がよい。
ACLの名前は15文字までと制約が厳しいため、命名規則は認知負荷が低くなるよう方向-用途-BLOCKログの有無とした。

  • アクセスリスト最適化option optimizeのキャッシュはUFSキャッシュと同値に。
    show ipv6 access-list cacheで溢れていないか確認し、必要ならタイムアウトを短くするかキャッシュサイズipv6 access-list cacheを増やす。
    IPv6 アクセスリスト — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント SPIのタイムアウトはNAPTタイムアウトと同じ。ポートに余裕があるので、UDPは最小値から推奨値に直した。
ipv6 access-list cache timeout 300
!
ipv6 access-list dynamic cache 65535
ipv6 access-list dynamic timer dns-timeout 5
ipv6 access-list dynamic timer icmp-timeout 60
ipv6 access-list dynamic timer tcp-fin-timeout 240
ipv6 access-list dynamic timer tcp-idle-timeout 7440
ipv6 access-list dynamic timer udp-idle-timeout 300
  1. IPv4と同様に、DNSでアクセスリストキャッシュを増やさない。
ipv6 access-list out-acs-dns option nocache
ipv6 access-list out-acs-dns option optimize
ipv6 access-list out-acs-dns permit udp src any sport any dest any dport eq 53
ipv6 access-list out-acs-dns permit udp src any sport any dest any dport eq 123 linkmgr sg 1
ipv6 access-list out-acs-dns permit ip src any dest 2404:1a8::/32
ipv6 access-list out-acs-dns permit ip src any dest 2001:418:3ff::/111
ipv6 access-list dynamic out-dns-nolog access out-acs-dns
  • 53/udp DNSクライアントlinkmgr mg 53。RIPE Atlas ProbeのDNS measurementsを含む。
  • 123/udp RIPE Atlas Probelinkmgr sg 1のNTP measurements
  • NTPはNGNかGINのものを強制したい。無法地帯なので、ACLやDNSシンクホールで防御する。
    • 2404:1a8::/32ならNGNのDNS2404:1a8:7f01:a/b::3とNTP2404:1a8:1102::a/b/cを含む。
    • 2001:418:3ff::/111 time.gin.ntt.net
  1. MAP-E BRとのIPIP, DHCPv6, NDを通す。
ipv6 access-list in-ndp-nolog option optimize
ipv6 access-list in-ndp-nolog permit 4 src 2001:380:a120::9/128 dest any
ipv6 access-list in-ndp-nolog permit udp src fe80::/10 sport eq 547 dest fe80::/10 dport eq 546
ipv6 access-list in-ndp-nolog permit icmp type 134 src fe80::/10 dest fe00::/7
ipv6 access-list in-ndp-nolog permit icmp type 135 src 2400:4000::/22 dest 2400:4000::/22
ipv6 access-list in-ndp-nolog permit icmp type 135 src fe80::/10 dest fe00::/7
ipv6 access-list in-ndp-nolog permit icmp type 136 src 2400:4000::/22 dest 2400:4000::/22
ipv6 access-list in-ndp-nolog permit icmp type 136 src fe80::/10 dest fe80::/10
ipv6 access-list in-ndp-nolog permit icmp type 3 src 2400:4000::/22 dest 2400:4000::/22
ipv6 access-list out-ndp-nolog option optimize
ipv6 access-list out-ndp-nolog permit 4 src any dest 2001:380:a120::9/128
ipv6 access-list out-ndp-nolog permit ip src fe80::/10 dest ff02::1:2/128
ipv6 access-list out-ndp-nolog permit icmp type 133 src fe80::/10 dest ff02::2/128
ipv6 access-list out-ndp-nolog permit icmp type 135 src any dest fe00::/7
ipv6 access-list out-ndp-nolog permit icmp type 135 src any dest 2400:4000::/22
ipv6 access-list out-ndp-nolog permit icmp type 136 src any dest fe80::/10
ipv6 access-list out-ndp-nolog permit icmp type 136 src any dest 2400:4000::/22

IPv6では、ICMPv6を使い近隣探索(ルータの検索、アドレス解決、近隣不能検知、リダイレクトなど)が行われているため、あらかじめNAとNSの通過フィルタを設定しておく必要があります。
2.19.1. スタティックフィルタ — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

  1. Bogonフィルタ
ipv6 access-list in-bogon-log option optimize
ipv6 access-list in-bogon-log deny ip src any dest any fragments
ipv6 access-list in-bogon-log deny ip src ::/3 dest any
ipv6 access-list in-bogon-log deny ip src 2001::/23 dest any
ipv6 access-list in-bogon-log deny ip src 2001:db8::/32 dest any
ipv6 access-list in-bogon-log deny ip src 2002::/16 dest any
ipv6 access-list in-bogon-log deny ip src 2400:4000::/22 dest any
ipv6 access-list in-bogon-log deny ip src 3ffe::/16 dest any
ipv6 access-list in-bogon-log deny ip src 4000::/2 dest any
ipv6 access-list in-bogon-log deny ip src 8000::/1 dest any
ipv6 access-list out-bogon-log option optimize
ipv6 access-list out-bogon-log deny ip src any dest ::/3
ipv6 access-list out-bogon-log deny ip src any dest 2001::/23
ipv6 access-list out-bogon-log deny ip src any dest 2001:db8::/32
ipv6 access-list out-bogon-log deny ip src any dest 2002::/16
ipv6 access-list out-bogon-log deny ip src any dest 2400:4000::/22
ipv6 access-list out-bogon-log deny ip src any dest 8000::/1

cf. SEC-1 IPv6家庭用ルータガイドライン(3.0版 2024年2月13日発行)
IANA IPv6 Special-Purpose Address Registry
Internet Protocol Version 6 Address Space

  1. ND以外のICMP, RIPE Atlas Probeを通す
ipv6 access-list in-atlas-nolog option optimize
ipv6 access-list in-atlas-nolog permit icmp type 129 src any dest 2001:db8:b0ba:10ee:53:ff:fe12:3456/128
ipv6 access-list in-atlas-nolog permit icmp type 1 src any dest any
ipv6 access-list in-atlas-nolog permit icmp type 2 src any dest any
ipv6 access-list in-atlas-nolog permit icmp type 3 src any dest any
ipv6 access-list in-atlas-nolog permit icmp type 4 src any dest any
ipv6 access-list in-atlas-nolog deny icmp src any dest 2001:db8:b0ba:10ee:53:ff:fe12:3456/128
ipv6 access-list out-atlas-nolog option optimize
ipv6 access-list out-atlas-nolog deny icmp port-unreachable src any dest any linkmgr sg 54
ipv6 access-list out-atlas-nolog permit udp src any sport any dest any dport range 33434 33534
ipv6 access-list out-atlas-nolog permit icmp type 128 src any dest any linkmgr sg 1
ipv6 access-list out-atlas-nolog permit icmp type 1 src any dest any
ipv6 access-list out-atlas-nolog permit icmp type 2 src any dest any
  1. 通常のトラフィックをダイナミックフィルタで許可する
ipv6 access-list out-acs-dyn option optimize
ipv6 access-list out-acs-dyn permit ip src any dest 2403:300::/32
ipv6 access-list out-acs-dyn permit ip src any dest 2620:149::/32
ipv6 access-list out-acs-dyn permit ip src any dest 2a01:b740::/32
ipv6 access-list out-acs-dyn permit ip src any dest 2a01:b747::/32
ipv6 access-list out-acs-dyn permit udp src any sport any dest any dport eq 443
ipv6 access-list out-acs-dyn permit tcp src any sport any dest any dport eq 80
ipv6 access-list out-acs-dyn permit tcp src any sport any dest any dport eq 443
ipv6 access-list out-acs-dyn permit tcp src any sport any dest any dport eq 22 linkmgr mg 53
ipv6 access-list out-acs-dyn permit tcp src any sport any dest any dport eq 43 linkmgr sg 43
ipv6 access-list out-acs-dyn permit tcp src any sport any dest any dport eq 53 linkmgr mg 53
ipv6 access-list out-acs-dyn permit tcp src any sport any dest any dport eq 853 linkmgr mg 53
ipv6 access-list out-acs-dyn permit tcp src any sport any dest any dport eq 873 linkmgr sg 1
ipv6 access-list out-acs-dyn permit tcp src any sport any dest any dport eq 9418 linkmgr mg 53
ipv6 access-list out-acs-dyn permit tcp src any sport any dest 2404:6800:4008:c00::/56 dport eq 993
ipv6 access-list out-acs-dyn permit tcp src any sport any dest 2404:6800::/32 dport range 5228 5230
ipv6 access-list out-acs-dyn permit tcp src any sport any dest 2a03:2880::/32 dport eq 5222
ipv6 access-list out-acs-dyn permit udp src any sport any dest 2404:3fc0::/44 dport range 27015 27050
ipv6 access-list out-acs-dyn permit udp src any sport any dest 2001::/20 dport gt 32767 linkmgr mg 53 sg 43
ipv6 access-list out-acs-dyn permit udp src any sport any dest 2400::/12 dport gt 32767 linkmgr mg 53 sg 43
ipv6 access-list out-acs-dyn permit icmp type 128 src any dest any
ipv6 access-list dynamic out-dyn-nolog access out-acs-dyn
  • IXのダイナミックアクセスリストでは、戻りパケットは(src/destを反転させて)5tuple一致したものだけが許可される。NAT BehaviorでいうところのAddress and Port-Dependent Filteringだ。

accessに指定したダイナミックアクセスリストにパケットがマッチすることにより、外部より許可されるパケットは、以下の条件にすべてマッチするパケットのみとなります。

  • 送信元アドレスと送信先アドレスを反転したパケット
  • 同一プロトコル
  • 送信元ポートと送信先ポートを反転したパケット(TCP, UDPの場合)

2.19.2.2.1. 内側からのみ通信を開始したい場合 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

このためNECの設定例dflt-listのようにpermit ip src any dest anyでも何ら問題はない。より強固なセキュリティポリシーでは、戻りパケットはInboundの静的アクセスリストより先に評価されるから、Outboundでホワイトリストを行うとよい。
OCNバーチャルコネクト(動的IP)設定ガイド : UNIVERGE IXシリーズ | NEC

ブリッジ間アクセスリスト 見出しにジャンプ

GigaEthernet0.0をはじめとするWAN側インタフェースと、GigaEthernet2.0やBVI0のようなLAN側インタフェースでは、IXを中心にIN/OUTが逆向きであることを念頭に置いて見ていこう。

  1. BVIインタフェースのIN側, 上り
ipv6 access-list bvi0-in-200 option optimize
ipv6 access-list bvi0-in-200 permit udp src any sport any dest any dport eq 53 linkmgr mg 53
ipv6 access-list bvi0-in-200 permit udp src any sport any dest any dport range 33434 33534 linkmgr mg 53
ipv6 access-list bvi0-in-200 permit ip src any dest 2001:4860:4840::/42 linkmgr mg 53
ipv6 access-list bvi0-in-200 permit ip src any dest 2606:4700:4700::/40 linkmgr mg 53
ipv6 access-list bvi0-in-200 deny ip src any dest 2001:4860:4840::/42
ipv6 access-list bvi0-in-200 deny ip src any dest 2606:4700:4700::/40
ipv6 access-list bvi0-in-200 deny ip src any dest ff02::c/128
ipv6 access-list bvi0-in-200 deny ip src any dest ff02::fb/128
ipv6 access-list bvi0-in-200 deny icmp type 134 src any dest any
ipv6 access-list bvi0-in-200 deny udp src any sport any dest any dport eq 53
ipv6 access-list bvi0-in-200 deny udp src any sport any dest any dport range 33434 33534
ipv6 access-list bvi0-in-200 permit ip src 2400:4000::/22 dest any
ipv6 access-list bvi0-in-200 permit ip src fe80::/10 dest ff02::1:2/128
ipv6 access-list bvi0-in-200 permit icmp src any dest any
ipv6 access-list bvi0-in-210 option nocache
ipv6 access-list bvi0-in-210 option optimize
ipv6 access-list bvi0-in-210 deny icmp type 134 src any dest any
ipv6 access-list bvi0-in-210 permit ip src 2400:4000::/22 dest any
ipv6 access-list bvi0-in-210 permit ip src fe80::/10 dest ff02::1:2/128
ipv6 access-list bvi0-in-210 permit icmp src any dest any
  1. BVIインタフェースのOUT側, 下り
ipv6 access-list bvi0-out-ndp option optimize
ipv6 access-list bvi0-out-ndp deny ip src 2001:db8:b0ba:10ee::fffe/128 dest any
ipv6 access-list bvi0-out-ndp deny ip src any dest ff02::1:ff00:0/128
ipv6 access-list bvi0-out-ndp deny ip src any dest ff02::1:ff00:100/128
ipv6 access-list bvi0-out-ndp deny ip src any dest ff02::1:ff00:fffe/128
ipv6 access-list bvi0-out-ndp deny ip src any dest ff02::1:ff34:5678/128
ipv6 access-list bvi0-out-ndp deny icmp type 133 src any dest any
ipv6 access-list bvi0-out-ndp permit ip src any dest any
  • deny ip src 2001:db8:b0ba:10ee::fffe/128 dest any RA方式では、収容ルータからのGUAなNUDが高頻度で届きバッテリーデバイスを消耗させる。収容ルータの設定は変えられないが、ND Proxyの性質上すべてIXが返答するのでLAN側に届かないようにはできる。
  • ND Proxyは全てのリンク解決に応答するため、LAN側のマルチキャスト増大を招く。WAN側でその軽減方法を説明したが、その他にもブロックしてよいリンク解決・DADがある。イベントログICP6.075, 085で確認できるが、IX自身がNAしているからだ。
    ND Proxyがリンク解決を(別インタフェースへ)代理する動作を止めたいが、5tupleが異なるためダイナミックアクセスリストで表現できない。これ以上はMLD snoopingに対応したL2スイッチを入れるべきなのだろう。
    • ff02::1:ff00:0/128 収容ルータ2001:db8:b0ba:10ee::fffe
    • ff02::1:ff00:100/128 GigaEthernet0.02001:db8:b0ba:10ee::
    • ff02::1:ff00:fffe/128 BVI02001:db8:b0ba:10ee:271:12ff:fe34:5678
    • ff02::1:ff34:5678/128 MAP IPv6アドレス2001:db8:b0ba:10ee:c6:3364:a300:0100
      MAP チュートリアル | JANOG31 Meeting

    2001:db8::/32 Documentation
    IANA IPv6 Special-Purpose Address Registry

  • deny icmp type 133 LAN側にRouter Solicitationするのはおかしい
  • permit ip src any dest any それ以外は素通し

IPv6 PPPoE 見出しにジャンプ

契約時期にもよるだろうが、IPv4 PPPoEのユーザIDにipv6.を付けるだけでIPv6 PPPoE接続が可能だった。時折切断されるようなのでIPv6 IPoEとの併用はやめたほうがいいとは思う。
OCN IPv6インターネット接続機能(PPPoE) | OCN
おかげで高速なキャッシュDNSホストを見つけられたので結果オーライだ。

  • IXがRAを吹く
ppp profile ppp-ocnv6
  authentication myname my-router@ipv6.ocn.ne.jp
  authentication password my-router@ipv6.ocn.ne.jp my-password
!
ipv6 dhcp client-profile dhcpv6-ppp-cl
  ia-pd subscriber GigaEthernet2:2.0 0:0:0:53::/64 eui-64
!
ipv6 dhcp server-profile dhcpv6-sv-ge220
  dns-server dhcp
!
route-map rmap-pbr-ge06 permit 10
  match ipv6 address access-list pass-list
  set interface GigaEthernet0.6
!
interface GigaEthernet0.6
  description ppp-ocnv6
  encapsulation pppoe
  auto-connect
  ppp binding ppp-ocnv6
  no ip address
  ipv6 enable
  ipv6 dhcp client dhcpv6-ppp-cl
  no ipv6 redirects
  ipv6 tcp adjust-mss auto
  ipv6 filter ge06-in-dh6 1000 in suppress-logging
  ipv6 filter ge06-out-dh6 1000 out suppress-logging
  shutdown
!
interface GigaEthernet2:2.0
  description dns
  ipv6 enable
  ipv6 dhcp server dhcpv6-sv-ge220
  ipv6 nd ra enable
  ipv6 nd ra min-interval 1350
  ipv6 nd ra max-interval 1800
  ipv6 nd ra reachable-time 600
  ipv6 nd ra lifetime 5400
  ipv6 nd ra other-config-flag
  ipv6 policy route-map rmap-pbr-ge06
  no shutdown
!
  • IXがPrefix DelegationのPEとして振る舞う
ipv6 dhcp client-profile dhcpv6-cpe-cl
  ia-pd redistribute pool dynamic_pool ::/60 nla-length 4
  shutdown-delay 100
!
ipv6 dhcp server-profile dhcpv6-sv
  ntp-server dhcp
!
ipv6 dhcp server-profile dhcpv6-pe-sv
  ia-pd redistribute-prefix pool dynamic_pool
  shutdown-delay 100
!
interface GigaEthernet0.6
  encapsulation pppoe
  auto-connect
  ppp binding ppp-ocnv6
  no ip address
  ipv6 enable
  ipv6 dhcp client dhcpv6-cpe-cl
  no ipv6 redirects
  ipv6 tcp adjust-mss auto
  ipv6 filter ge06-in-dh6 1000 in suppress-logging
  ipv6 filter ge06-out-dh6 1000 out suppress-logging
  shutdown
!
interface GigaEthernet2:3.0
  description server
  ipv6 enable
  ipv6 dhcp server dhcpv6-pe-sv
  ipv6 policy route-map rmap-pbr-ge06
  no shutdown
!

IPv4 見出しにジャンプ

IX2215で、PPPoEマルチセッションとMAP-Eを同時利用しつつ、VLANを提供するIPv4ネットワーク図

私が使っているISPの契約では、IPv4 over IPv6とIPv4 PPPoEを併用できる。これらを一つのIXに、高速なMAP-Eを主回線、PPPoEを副回線として設定した。

ip ufs-cache enable
ip multipath per-packet
ip route default GigaEthernet0.1 connected
ip route default GigaEthernet0.2 connected distance 200
ip route 210.231.212.50/32 GigaEthernet0.2 connected
ip route 210.231.212.50/32 Tunnel0.0 distance 200
ip route 210.231.212.52/30 GigaEthernet0.1 connected

MAP-E 見出しにジャンプ

IPv6 IPoE上にトンネルを張り、IPv4接続性を提供するMAP-E CEの設定を行う。
OCNバーチャルコネクト(動的IP)設定ガイド : UNIVERGE IXシリーズ | NEC

interface Tunnel0.0
  description ocn-v
  tunnel mode map-e ocn
  ip address map-e
  no ip redirects
  ip tcp adjust-mss auto
  ip napt enable
  ip napt eim-mode udp-only
  ip napt translation max-entries per-address 252
  ip napt translation tcp-timeout 7440
  ip napt translation udp-timeout 120
  ip napt translation dns-timeout 5
  ip napt translation finrst-timeout 240 1
  ip filter in-bogon-log 2000 in
  ip filter in-eif-log 3000 in
  ip filter out-bogon-log 2000 out
  ip filter out-dyn-nolog 3000 out suppress-logging
  ip filter out-japan-nolog 4000 out suppress-logging
  ip ufs-cache timeout tcp 300
  ip ufs-cache timeout udp 120
  no shutdown
!

IPv4 PPPoE 見出しにジャンプ

フレッツ 光ネクスト向け IPv6インターネット接続 設定ガイド(IPv4/IPv6 IPoE) : UNIVERGE IXシリーズ | NEC

ppp profile ppp-ocnv4
  authentication myname my-router@example.com
  authentication password my-router@example.com my-password
  lcp echo-interval 60
  lcp echo-retry 10
!
interface GigaEthernet0.1
  description ppp-ocnv4
  encapsulation pppoe
  auto-connect
  ppp binding ppp-ocnv4
  ip address ipcp
  ip mtu 1454
  no ip redirects
  ip tcp adjust-mss auto
  ip napt enable
  ip napt hairpinning
  ip napt translation tcp-timeout 7440
  ip napt translation udp-timeout 120
  ip napt translation dns-timeout 5
  ip napt translation finrst-timeout 240 1
  ip napt translation port-range 32768-65535
  ip napt static GigaEthernet0.1 udp 500
  ip napt static GigaEthernet0.1 udp 4500
  ip filter in-bogon-log 2000 in
  ip filter in-apdf-log 3000 in
  ip filter out-bogon-log 2000 out
  ip filter out-udp-nolog 3000 out suppress-logging
  ip ufs-cache timeout tcp 300
  ip ufs-cache timeout udp 120
  no shutdown
!
interface GigaEthernet0.2
  ppp binding ppp-ocnv4
  ...
!
  • MAP-Eの設定に同じ
  • LCP ECHOlcp echo-*は、HGWと同じ頻度に下げた。

PPPキープアライブ機能 (初期値:使用する)
LCP ECHO送信間隔(分) (初期値:1)
LCP ECHOリトライ回数(回) (初期値:10)
基本設定-接続先設定(IPv4 PPPoE)|「Web設定」の使いかた|RX-600KI / PR-600KI 機能詳細ガイド|NTT東日本

  • ppp binding PPPoEマルチセッションは同じppp profileを使える。そのISPが2セッションで接続できるかはshow pppoe statusで確認しよう。

特別な設定は必要ありません。別なインタフェースにそれぞれのセッションの設定を行ってください 2.8.2. PPPoEクライアントの応用 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

  • ip napt hairpinning 自アドレス宛の通信を外部に飛ばすのは誤りなので
  • ip napt translation port-range 32768-65535 デフォルトはWindowsのエフェメラルポート範囲49152-65535なので、Linuxも含める。
    無視されている気がする。
    内部にIPv4で問い合わせるDNSサーバがあれば、1024-49152を含む1024-65535にするとよい。
  • MAP-E設定との違いは、UDPもデフォルトのAPDF動作を変えていないため、IN方向のパケットフィルタip filter in-apdf-logでUDPをフィルタしなくてよい。これに伴ってOUT方向はstatic ACLを指定しているip filter out-udp-nolog

FirewallになるNAT Behavior 見出しにジャンプ

Web GUIでIPv4インターネットの設定を行うと、IN方向のパケットフィルタが微塵も設定されていないことに驚くと思う。
実際、PPPoE・MAP-Eいずれもデフォルト設定ならファイアウォールがなくても問題ないが、NAT動作をRFC 4787 Endpoint-Independent Mapping(EIM)に変更ip napt eim-modeするとセキュリティが甘くなる。どういうことか。

STUNによるポートパンチングでは、NAT越えのためNAT動作の検出が行われる。stunclientを利用し、NATとIPv4パケットフィルタの動作を確認した。stun-nat-behaviourでもよいだろう。
NAT Behavior Discovery Using Classic STUN (RFC 3489) | NETMANIAS
異なるNAPTを調査するとき、STUNの出口はpingトリガーのPBRを使って振り分けると楽だ。

  • PPPoEのNAT動作は、stunclientによるとEIM/APDF(RFC 3489 Port Restricted Cone, NATタイプB)。
    StuntmanのSTUNサーバstunserver2024.stunprotocol.orgを使用し、NAT越えを再現するためにInside Portを固定--localportした。stunclientはWSL1でも動くが、Windows FirewallのBehaviorが不明だったため、syslogを確認する必要があった。
    NATタイプ、ポートセービングIPマスカレード、UDPホールパンチング、STUN - turgenev’s blog

    ./stunclient stunserver2024.stunprotocol.org --mode full --protocol UDP --localport 50000
    Binding test: success
    Local address: 10.0.0.2:50000
    Mapped address: 198.51.100.1:50000
    Behavior test: success
    Nat behavior: Endpoint Independent Mapping
    Filtering test: success
    Nat filtering: Address and Port Dependent Filtering
    

    5tupleのいずれかが一致しないInbound通信は、NAPTのFilteringにより廃棄されている。PPPoEのNAPTは単体で5tupleのファイアウォールとして機能するため、追加のダイナミックフィルタは必要なさそうだ。

    NAT[089]: C udp:50000 10.0.0.2(00:53:00:12:34:56) > 3.135.212.85
    NAT[061]: inbound packet dropped, udp 3.132.228.249:3479 > 198.51.100.1:50000, GigaEthernet0.1
    NAT[061]: inbound packet dropped, udp 3.132.228.249:3479 > 198.51.100.1:50000, GigaEthernet0.1
    NAT[061]: inbound packet dropped, udp 3.135.212.85:3479 > 198.51.100.1:50000, GigaEthernet0.1
    NAT[089]: C udp:50000 10.0.0.2(00:53:00:12:34:56) > 3.132.228.249
    

    実際に、NAPTキャッシュには、stunclient発のOutbound通信の5tupleのみが存在する。異なるDestへのMappingに同じOutside Portを使うため、Address and Port-Dependent Mapping(APDM)でないことが伺える(例外があるため後述)。
    また、ポート制限がないことからInside Portを保持している。

    show ip napt translation GigaEthernet0.1
    Interface: GigaEthernet0.1
    NAPT Cache - 86 entries, 65449 frees, 449 peak, 2671047 creates, 0 overflows, 0 errors
    Codes: A - ALG, S - Static, Service
      Prot Inside Address:Port   Outside Address:Port  Dest Address:Port     Time
      udp  10.0.0.2:50000       198.51.100.1:50000  3.132.228.249:3478    103
      udp  10.0.0.2:50000       198.51.100.1:50000  3.135.212.85:3478     106
    
  • UDPをEIMに設定ip napt eim-mode udp-onlyしたMAP-Eには、追加のダイナミックフィルタout-dyn-nologを設定した。
    この状態はstunclientによると同じくEIM/APDF。

    ./stunclient stunserver2024.stunprotocol.org --mode full --protocol UDP --localport 50000
    Binding test: success
    Local address: 10.0.0.2:50000
    Mapped address: 198.51.100.0:9523
    Behavior test: success
    Nat behavior: Endpoint Independent Mapping
    Filtering test: success
    Nat filtering: Address and Port Dependent Filtering
    

    EIMのため、そのOutside Portを使用中のInsideへ一意にMappingされる。Inbound通信でNAPTキャッシュが生成されるということは、NAPTがEndpoint-Independent Filtering(EIF)動作し、そのOutside Portについてあらゆる送信元(Endpoint)が許可されていることになる。
    ip napt eim-modeを設定すると、NAT動作はEIM/EIF(RFC 3489 Full Cone, NATタイプA)になり、NATタイムアウトまでポート開放と同等のリスクを負う。
    2.10.6.3. EIMモードNAPTの注意事項 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
    また、利用可能ポートに制限があるため、Inside Portは保持できない。

    show ip napt translation Tunnel0.0
    Interface: Tunnel0.0
    NAPT Cache - 15 entries, 65520 frees, 100 peak, 22280 creates, 0 overflows, 0 errors
    Codes: A - ALG, S - Static, Service
      Prot Inside Address:Port   Outside Address:Port  Dest Address:Port     Time
      udp  10.0.0.2:50000       198.51.100.0:16690   3.132.228.249:3478    103
      udp  10.0.0.2:50000       198.51.100.0:16690   3.132.228.249:3479    103
      udp  10.0.0.2:50000       198.51.100.0:16690   3.135.212.85:3478     106
      udp  10.0.0.2:50000       198.51.100.0:16690   3.135.212.85:3479     97
    

    透過性の高いNAT動作からInsideを守るため、ダイナミックフィルタout-dyn-nologを併用すると、EIF NAPTを通過したパケットはInboundパケットフィルタin-eif-logに拒否される。
    このように、先に宛先アドレスのNAPT処理(Outside -> Inside)を行うから、NAPTが主たるファイアウォールであることに変わりはない。Inboundパケットフィルタは評価を5tupleに増やすだけの役割を果たす。
    NAPTの背後にあるInboundパケットフィルタに過度な期待は禁物で、サイバー攻撃の殆どはFLTでなくNATログに記録(頭痛が痛い?)されるし、NATが廃棄した攻撃元に返答してしまう動作を防げない。
    7. パケット評価フロー — IX-R/IX-V 機能説明書 1.1版 ドキュメント

    NAT[089]: C udp:16690 10.0.0.2(00:53:00:12:34:56) > 3.135.212.85
    FLT[007]: BLOCK udp 3.132.228.249:3479 > 10.0.0.2:50000, match in-eif-log, Tunnel0.0 in
    FLT[007]: BLOCK udp 3.135.212.85:3479 > 10.0.0.2:50000, match in-eif-log, Tunnel0.0 in
    NAT[089]: C udp:16690 10.0.0.2(00:53:00:12:34:56) > 3.132.228.249
    

敢えてセキュリティの低いEIM/EIF(NATタイプA)のNAPTを採用する理由に、ゲームやビデオ会議などのP2P通信の不調が挙げらえる。ダイナミックフィルタによりEIM/APDF(NATタイプB)に変更してもEIM相手なら問題ないが、非EIM(NATタイプC, D)な相手との接続に問題が生じやすい。
利用可能ポートに強い制限があるv6プラスの資料でも、オンラインゲームの接続性に関しては、NATタイプB(EIM/APDF)のCPEを例に挙げている。
cf. オンラインゲームには使い物にならない ← かなり間違い v6プラス を運用してみて ENOG76 Meeting
Nintendo Switch の「NATタイプ」判定条件 #Network - Qiita
実際のところ、NTTが貸与するHGWを含め日本ではEIM/EIFが多数派で、相手のNAT動作のお陰で繋がるケースも多い。

例えば、下記の様なパターンは通信が出来ない。

  • ISP A社のキャリアグレードNATがポート制限NAT
  • ユーザ宅内BのブロードバンドルータがシンメトリックNAT

ゲーム・エンタメネットワーク接続性 課題検討ワークグループ 振り返りと今後の方針について JAIPA一般公開版

IXのNAPTも、そのような非EIMに振る舞うことがある。その様子を観察するために、Linuxのnmapを使用してNAPTへ恣意的なパケットを送った。
タイムアウトを待たずにポートを再利用するのはTCP仕様に違反するが、だからこそポートパンチングがUDP(アプリケーション層でうまいことやるプロトコル)で行われる訳で、様々な条件でEIMか否かを判定するためにそうしている。

# 10.0.0.2
sudo nmap -4 -sS -p 80 -source-port 50000 203.0.113.0
sudo nmap -4 -sS -p 443 -source-port 50000 203.0.113.0
sudo nmap -4 -sS -p 80 -source-port 50000 203.0.113.1
sudo nmap -4 -sS -p 80 -source-port 50001 203.0.113.0

# 10.0.0.3
sudo nmap -4 -sS -p 80 -source-port 50000 203.0.113.0
sudo nmap -4 -sS -p 443 -source-port 50000 203.0.113.1
  • PPPoEは通常EIMだが、Dest Addressが異なれば、Outside Portを送信元とするPort Overlappingが行われる。
    cf. 3. Port Overlapping Behavior RFC 7857 - Updates to Network Address Translation (NAT) Behavioral Requirements
    実際のところDest Addressが同じでもOutside Port = Inside Portを保持するので、TCP仕様に準拠してポートを再利用するかはInsideの端末次第だ。4tuple(Protocol, Outside Address, Port, Dest Address)が被るときだけ、連番で空いているOutside Portが選ばれる。このようなDest Addressに依存したMappingをAddress-Dependent Mapping(ADM)という。

      Prot Inside Address:Port  Outside Address:Port  Dest Address:Port   Time
      tcp  10.0.0.2:40000       198.51.100.1:40000    203.0.113.0:80      230
      tcp  10.0.0.2:40000       198.51.100.1:40000    203.0.113.0:443     230
      tcp  10.0.0.2:40000       198.51.100.1:40000    203.0.113.1:80      230
      tcp  10.0.0.2:40001       198.51.100.1:40001    203.0.113.0:80      231
      tcp  10.0.0.3:40000       198.51.100.1:49163    203.0.113.0:443     233
      tcp  10.0.0.3:40000       198.51.100.1:49168    203.0.113.1:443     233
    
  • MAP-EはOutside Portに制限があるため、Inside Portに対応する任意のポートはまず使えず、常に連番で選ばれる。
    MAP-EのTCPはEIMに変更していない。一見Address-DependentにMappingされているように見えるが、Dest Addressが異なるときはPort Overlappingを行い、Endpoint-Independentに振る舞う。
    2.10.6. MAP-E(動的IPアドレス)トンネルでのNAPT動作モードについて
    Protocol, Dest Addressに被りがあるだけで次のOutside Portを使っているのは、ポートが枯渇しなければよく、Outside Portを減らすために余計なtupleを見る必要がないからだろう。Inside Portを保持しないから、TCP仕様に準拠する責任があるのかもしれない。

      Prot Inside Address:Port  Outside Address:Port  Dest Address:Port   Time
      tcp  10.0.0.2:50000       198.51.100.0:57656    203.0.113.0:80      227
      tcp  10.0.0.2:50000       198.51.100.0:57657    203.0.113.0:443     227
      tcp  10.0.0.2:50000       198.51.100.0:57657    203.0.113.1:80      229
      tcp  10.0.0.2:50001       198.51.100.0:57658    203.0.113.0:80      229
      tcp  10.0.0.3:50000       198.51.100.0:57659    203.0.113.0:80      231
      tcp  10.0.0.3:50000       198.51.100.0:57659    203.0.113.1:443     232
    

観察から、PPPoEとMAP-Eいずれも通常EIMで、異なるDestにRFC 5382で非推奨のPort Overlappingを行うRFC 4787で非推奨のNon-deterministic NATと分かった。
NAT動作をめぐる誤解まとめ - turgenev’s blog
しかしながらRFC 7857にあるように、EIMをDestが違う場合に拡張できることは明白で、今日のデファクトスタンダードだ。JPIXが想定するNAT動作でもある。

セッションは5tupleで識別
ポートを効率的に再利用して使用数を抑えるのはCEメーカのNAT実装ノウハウ
v6プラス を運用してみて ENOG76 Meeting

セッションの概念があるTCPがポート枯渇を引き起こすことは少ないが、half-closedのNATタイムアウトを4分に設定したように、Port Overlappingの恩恵はありそうだ。

では、UDPによるポート枯渇リスクはどう見積ればよいか。代表的なプロトコルに、DNSソースポートランダマイゼーションが挙げられる。

DNS query の proxy の際には IPv4 ではなく IPv6 を用いる
☞ UDP は connection-less なため NAPT の session を close してよい状態かどうかの判断 ができず一瞬で source port が枯渇する
MAP チュートリアル | JANOG31 Meeting

セッションの概念がないUDPでのランダムなInside Portは、利用可能ポートを食い尽くす。IXのようにDNSタイムアウトが分かれた機器なら軽減できるが、デュアルスタック(AAAA), ECH(HTTPS), Apple ITP(CNAME Scrubbing)によりクエリ量が増えているため足りるか分からない。
解決方法は単純で、IPv4延命技術を提供するVNEはIPv4キャッシュDNSサーバを通知しないから、DNSクエリはIPv6で送信すればよく、意図しないIPv4のDNSクエリを拒否しておくのが安全だ。一応NAPTキャッシュだけでなく、無効なアクセスリストキャッシュも肥大するため、除外した方がいい。

MAP-EのNAPTに限っては、常にInside Portを保持せず連番ポートを使うため、エントロピーが低下する問題もある。Chromiumのように、Inside Portのエントロピーを見ても検出できない。言わずもがな、IPv6でクエリすれば考えなくてよい。
Re: increasing DNS message entropy, a solution for NATs
連番ポートは非EIMのポートパンチングに一役買うこともあるが、NTTが貸与するHGWのよう(鶏?卵?)に難読化が望ましいとされている。
cf. 4.2.3. Port Contiguity RFC 4787 - Network Address Translation (NAT) Behavioral Requirements for Unicast UDP
cf. 9. Port Randomization RFC 7857 - Updates to Network Address Translation (NAT) Behavioral Requirements

ポート番号を1008で割ったもの(具体的には、余りがnなら利用可能なポートのうちn番目(ただし最初が0番目とする)のもの)が最優先の代替として使用
Linuxのnetfilterのconnection trackingとNAT動作の仕組み - turgenev’s blog

このほかNATにはApplication Level Gateway(ALG)機能があり、FTPやポートの概念がないICMPの変換はこれが行っている。FTP・TFTPはOUT方向のアクセスリストで許可していないし、攻撃に悪用されうるSIP-NAT ALGに対応していないので大丈夫そうだ。
cf. Q.2-4 NAT/NAPTで対応しているアプリケーションの種類を教えてください。 IPv4、NAT、DHCP : FAQ : UNIVERGE IXシリーズ | NEC

SIP-NAT 機能は Ver.8.3 でサポートを終了
cf. 3. NAT/NAPT 設定 UNIVERGE IXシリーズ 設定事例集

NAT Slipstreaming v2.0 | Armis

Inboundアクセスリスト 見出しにジャンプ

  1. IPv6同様にBogonの拒否と、PPPoE/MAP-E共通の許可。
    IANA IPv4 Special-Purpose Address Registry
    IANA IPv4 Address Space Registry
    denyとpermitが一緒くたなのは、syslogにはdenyしか記録されないことと、アクセスリストの高速化option optimizeの対象は連続したpermitまたはdenyブロック4つまでで、ブロックが少なければ少ないほどよいからだ。
ip access-list in-bogon-log option optimize
ip access-list in-bogon-log deny ip src 0.0.0.0/8 dest any 
ip access-list in-bogon-log deny ip src 10.0.0.0/8 dest any 
ip access-list in-bogon-log deny ip src 100.64.0.0/10 dest any 
ip access-list in-bogon-log deny ip src 127.0.0.0/8 dest any 
ip access-list in-bogon-log deny ip src 169.254.0.0/16 dest any 
ip access-list in-bogon-log deny ip src 172.16.0.0/12 dest any 
ip access-list in-bogon-log deny ip src 192.0.0.0/22 dest any 
ip access-list in-bogon-log deny ip src 192.88.99.0/24 dest any 
ip access-list in-bogon-log deny ip src 192.168.0.0/16 dest any 
ip access-list in-bogon-log deny ip src 198.18.0.0/15 dest any 
ip access-list in-bogon-log deny ip src 198.51.100.0/24 dest any 
ip access-list in-bogon-log deny ip src 203.0.113.0/24 dest any 
ip access-list in-bogon-log deny ip src 224.0.0.0/3 dest any 
ip access-list in-bogon-log permit tcp src any sport any dest any dport any
ip access-list in-bogon-log permit icmp type 3 src any dest any
ip access-list in-bogon-log permit icmp type 11 src any dest any
ip access-list in-bogon-log permit icmp type 12 src any dest any
  • IN方向のTCPを全て許可permit tcp src any sport any dest any dport anyしているが、PPPoEとMAP-EいずれもTCPのNAT Behaviorを変えておらず、5tuple一致したパケットしか流れないため問題ない。
    よりDeepにPacketをInspectionしたいなら、ACKフラグの立ったTCPパケットのみ許可permit tcp ackでもよいだろう。RFC5382 Connection-Dependent Filteringに相当する。
  • IPv6同様に、通すべきICMPだけ通す。
    Codeを書かないのは、ICMPはUFSキャッシュに乗らないため、ACLの判定は少ないほうがよいと判断したからだ。
    • icmp type 3 Destination Unreachable
      ダイナミックアクセスリストを試みたことがあるが、同一プロトコルの制約で表現できなかった(IPv4 NAPTのALGがあるから不要と思う)。
    • icmp type 11 Time Exceeded
    • icmp type 12 Parameter Problem
  1. PPPoEはUDPのNAT Behaviorを変更していないため、TCPと同じく全許可してよい。
ip access-list in-apdf-log option optimize
ip access-list in-apdf-log deny udp src any sport any dest any dport lt 4501
ip access-list in-apdf-log permit udp src any sport any dest any dport any
  1. MAP-EのUDPはNAT BehaviorをEIM/EIFに変更しているため、static ACLで全拒否し、OUT方向のダイナミックアクセスリストで動的に許可する。
ip access-list in-eif-log option optimize
ip access-list in-eif-log deny udp src any sport any dest any dport any

HTTPサーバやtelnetサーバの外部インターネット公開に関する注意事項 : UNIVERGE IXシリーズ | NEC

Outboundアクセスリスト 見出しにジャンプ

src 10.0.0.0/21のように、送信元アドレスにはNAPT変換前のInside Addressを書く。

IXルータは以下の順番で処理されます。
受信方向:NAPT処理→フィルタ処理
送信方向:フィルタ処理→NAPT処理
そのため、NAPTで変換されるアドレスは考慮せずに元々のIPアドレスで指定します。
Q.2-11 NAPTとフィルタを併用する際、フィルタで指定する宛先IPアドレスや 送信元IPアドレスはどのアドレスになりますか?

ただしルータ内部機能はOutside Addressを使うため、また予めVLAN間フィルタで送信元アドレスを限定しているため、WAN側インタフェースでBCP 38を行わずsrc anyとした。

  1. IPv6同様にBogonフィルタ。Web GUIのセキュリティ強度レベル2から削除されたルールなどを追記して、Bogon全体をカバーする。
    2.26.7.12. 通信セキュリティの設定 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
    送信元を詐称した通信を遮断する|Aterm®WX1800HP ユーザーズマニュアル
ip access-list cache timeout 300
ip access-list out-bogon-log option optimize
ip access-list out-bogon-log deny icmp port-unreachable src any dest any linkmgr sg 54
ip access-list out-bogon-log deny tcp src any sport eq 113 dest any dport any
ip access-list out-bogon-log deny ip src any dest 0.0.0.0/8
ip access-list out-bogon-log deny ip src any dest 10.0.0.0/8
ip access-list out-bogon-log deny ip src any dest 100.64.0.0/10
ip access-list out-bogon-log deny ip src any dest 127.0.0.0/8
ip access-list out-bogon-log deny ip src any dest 169.254.0.0/16
ip access-list out-bogon-log deny ip src any dest 172.16.0.0/12
ip access-list out-bogon-log deny ip src any dest 192.0.0.0/22
ip access-list out-bogon-log deny ip src any dest 192.88.99.0/24
ip access-list out-bogon-log deny ip src any dest 192.168.0.0/16
ip access-list out-bogon-log deny ip src any dest 198.18.0.0/15
ip access-list out-bogon-log deny ip src any dest 198.51.100.0/24
ip access-list out-bogon-log deny ip src any dest 203.0.113.0/24
ip access-list out-bogon-log deny ip src any dest 224.0.0.0/3
ip access-list out-bogon-log permit udp src any sport any dest any dport range 33434 33534
ip access-list out-bogon-log permit icmp type 3 src any dest any
ip access-list out-bogon-log permit icmp type 8 src any dest any linkmgr sg 1
ip access-list out-bogon-log permit tcp src any sport any dest any dport eq 53 linkmgr mg 53
ip access-list out-bogon-log permit tcp src any sport any dest any dport eq 80
ip access-list out-bogon-log permit tcp src any sport any dest any dport eq 443
ip access-list out-bogon-log permit tcp src any sport any dest any dport eq 587
ip access-list out-bogon-log permit tcp src any sport any dest any dport eq 993
ip access-list out-bogon-log permit tcp src any sport any dest any dport eq 22 linkmgr mg 53
ip access-list out-bogon-log permit tcp src any sport any dest any dport eq 43 linkmgr sg 43
ip access-list out-bogon-log permit tcp src any sport any dest any dport eq 9418 linkmgr mg 53
ip access-list out-bogon-log permit tcp src any sport any dest any dport eq 25565 linkmgr mg 53
ip access-list out-bogon-log permit tcp src any sport any dest 103.28.54.0/24 dport range 27015 27050
ip access-list out-bogon-log permit tcp src any sport any dest 155.133.224.0/19 dport range 27015 27050
ip access-list out-bogon-log permit tcp src any sport any dest 203.138.0.0/16 dport eq 8080
ip access-list out-bogon-log permit tcp src any sport any dest 68.67.73.20/32 dport eq 8080
  1. APDFのPPPoEで使ったout-udp-nologを流用し、UDPのみEIFのMAP-Eにはダイナミックアクセスリストを設定。
    UDPのダイナミックアクセスリストが機能するにはIN方向のアクセスリストでUDPを全拒否する必要がある。
    タイムアウトはNAPTタイムアウトと同じ。
ip access-list out-udp-nolog option optimize
ip access-list out-udp-nolog permit udp src any sport any dest any dport eq 123 linkmgr sg 1
ip access-list out-udp-nolog permit udp src any sport any dest any dport eq 53
ip access-list out-udp-nolog permit ip src any dest 17.0.0.0/8
ip access-list out-udp-nolog permit udp src any sport any dest any dport eq 443
ip access-list out-udp-nolog permit udp src any sport any dest any dport range 3478 3479
ip access-list out-udp-nolog permit udp src any sport any dest 141.101.90.0/24 dport eq 1473
ip access-list out-udp-nolog permit udp src any sport any dest any dport range 27000 27100 linkmgr mg 53 sg 43
ip access-list out-udp-nolog permit udp src any sport any dest 35.207.192.0/18 dport range 50001 50030
ip access-list out-udp-nolog permit udp src any sport any dest 35.212.0.0/14 dport range 50001 50030
ip access-list out-udp-nolog permit udp src any sport any dest 66.22.192.0/18 dport range 50001 50030
ip access-list out-udp-nolog permit icmp type 8 src any dest any
ip access-list dynamic timer dns-timeout 5
ip access-list dynamic timer icmp-timeout 60
ip access-list dynamic timer tcp-fin-timeout 240
ip access-list dynamic timer tcp-idle-timeout 7440
ip access-list dynamic timer udp-idle-timeout 120
ip access-list dynamic out-dyn-nolog access out-udp-nolog
  1. cidr-shortener.ps1を使って、ゲーム端末linkmgr mg 53 sg 43に日本のIPアドレス範囲へのアクセスを雑に許可する
ip access-list out-acs-japan option optimize
ip access-list out-acs-japan permit udp src any sport any dest 1.0.0.0/9 dport gt 4095 linkmgr mg 53 sg 43
~~
ip access-list out-acs-japan permit udp src any sport any dest 223.128.0.0/9 dport gt 4095 linkmgr mg 53 sg 43
ip access-list dynamic out-japan-nolog access out-acs-japan
  • 暗黙のdeny

IN方向のアクセスリストより前段のNATが、Censysから頂いたIdent113/tcpに対してTCP RSTを返し、これをout-bogon-logが拒否する様子。なぜかINFOレベルのNAT.061を忘れず有効にしよう。

FLT[007]: BLOCK tcp 198.51.100.1:113 > 199.45.154.182:52551, match out-bogon-log, GigaEthernet0.1 out
NAT[061]: inbound packet dropped, tcp 199.45.154.182:52551 > 198.51.100.1:113, GigaEthernet0.1
NAT[112]: received Ident segment, send back RST

Huawei Cloudから頂いたフラグメントパケットが再構成タイムアウトし、ICMP Time Exceededを返そうとするが、許可されていない様子

FLT[008]: BLOCK icmp 198.51.100.1 > 182.160.24.12, not match any filters, GigaEthernet0.1 out
IP[054]: Re-assembly TTL expired; protocol 6 from 182.160.24.12
NAT[109]: Received IP fragment, 182.160.24.12 > 198.51.100.1

NAPTアクセスログ 見出しにジャンプ

NATがファイアウォールとして機能することから、ACLの拒否ログFLT.007 FLT.008だけでなく、NATの廃棄ログNAT.061の必要性を確認した。
ただしロギングの観点では、同じAPDF動作でもNATはstateful、ACLはstatelessな性質を持つ。廃棄・拒否ログは大抵1行で出力されるから問題ないが、NAPTのアクセスログNAT.089はコネクションあたり1行なのに対し、ACLの許可ログFLT.006 FLT.009はパケット単位の膨大なログになってしまう。
また、suppress-loggingが抑制するのはACLの拒否ログに限り、許可ログは抑制できない。
2.19.5. パケットフィルタのロギング — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

logging subsystem nat include 89
!
syslog ip host 10.0.3.5
!
ip napt access-log type normal size 32 create-only
ip napt access-log access-list napt-log
ip access-list napt-log option optimize
ip access-list napt-log deny ip src 10.0.1.0/24 dest any
ip access-list napt-log deny ip src any dest 17.0.0.0/8
ip access-list napt-log deny ip src any dest 35.207.192.0/18
ip access-list napt-log deny ip src any dest 35.212.0.0/14
ip access-list napt-log deny ip src any dest 66.22.192.0/18
ip access-list napt-log deny tcp src any sport any dest any dport eq 80
ip access-list napt-log deny tcp src any sport any dest any dport eq 8883
ip access-list napt-log deny tcp src any sport any dest any dport eq 25565 linkmgr mg 53 sg 43
ip access-list napt-log deny tcp src any sport any dest 74.125.0.0/16 dport eq 993
ip access-list napt-log deny tcp src any sport any dest 142.250.0.0/15 dport eq 993
ip access-list napt-log deny tcp src any sport any dest 182.248.128.0/18 dport eq 993
ip access-list napt-log permit tcp src any sport any dest any dport neq 443
ip access-list napt-log permit udp src any sport any dest any dport neq 443

ip napt access-log sendはschedulerなどのバッチ処理での使用が想定される、無関係なコマンドだ。ip napt access-log typeだけでNAPTのアクセスログNAT.089は記録され、syslog ipでまとめてsyslogサーバへ送信できる。
レート制限に引っ掛かりそうなら、SYSLOG 抑制の設定no syslog rate-limitを設定する。
2.10.4.3. アクセスログのsyslog送信機能 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

静的NAPT 見出しにジャンプ

外部からサーバへアクセスできるようにするための、ポート開放の設定を行う。
2.10.2.4. 静的NAPT(Static NAPT)の設定 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
静的 NAPT 設定 — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント

interface Tunnel0.0
  ip napt enable
  ip napt static 10.0.2.5 tcp 25565
!

IPv4アドレス共有技術でも、CPEでNAPTするMAP-Eはポート開放できる。利用可能なOutside Portはshow map-e statusで確認する。

静的NAPT(ポートマッピング)を行うと、NAPTをファイアウォールのアテにしているため、ポート開放される。NAT Behaviorに当てはめると、NAPTキャッシュが常にあることを除けばEIM/EIFに相当する機能とも捉えられる。つまり、静的NAPT設定した3tuple(Inside Address, Outside Port, Protocol)に限り、追加のACLがあった方が良さそうだ。
例えば海外からのアクセスを制限し、残りは本邦の法執行機関に任せればよい。日本のIPv4アドレス範囲は膨大なのでcidr-shortener.ps1のようなツールで粒度を低くして登録するとよいし、IPv6は纏まっているので数行で済むだろう。

ip access-list in-mc-log permit tcp src 203.0.113.0/24 sport any dest any dport eq 25565
ip access-list in-mc-log deny tcp src any sport any dest any dport eq 25565

静的NAPTip napt staticではインタフェース指定、サーバサービスip napt serviceにはプリセットがあるという違いがある。
また、ip napt staticでは動的NAPTとポートを共有しないが、ip napt serviceでは制限がなさそうだ(動的マッピングで利用中の5tupleを除いて静的NAPT動作?)。動的・静的NAPTでOutside Portが被るから、ACLは区別するためにダイナミックアクセスリストキャッシュを必要とする。ポートが枯渇していなければip napt staticが手堅いと思う。

逆NAT 見出しにジャンプ

interface GigaEthernet2.0
  ip nat enable
  ip nat static 1.1.1.1 8.8.8.8

LAN側インタフェースでNATを有効化すると、インターネットや別VLANがNATのInside、LAN側がOutsideになる。
静的NATマッピングの設定 — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント
Inside Address1.1.1.1とOutside Address8.8.8.8を設定すると、Outsideから来た8.8.8.8へのDNSクエリはInside Address1.1.1.1に変換される。

dig @8.8.8.8 _dns.resolver.arpa svcb +noall +answer +additional
_dns.resolver.arpa.     300     IN      SVCB    1 one.one.one.one. alpn="h2,h3" port=443 ipv4hint=1.1.1.1,1.0.0.1 ipv6hint=2606:4700:4700::1111,2606:4700:4700::1001 key7="/dns-query{?dns}"
_dns.resolver.arpa.     300     IN      SVCB    2 one.one.one.one. alpn="dot" port=853 ipv4hint=1.1.1.1,1.0.0.1 ipv6hint=2606:4700:4700::1111,2606:4700:4700::1001
one.one.one.one.        300     IN      A       1.1.1.1
one.one.one.one.        300     IN      A       1.0.0.1
one.one.one.one.        300     IN      AAAA    2606:4700:4700::1111
one.one.one.one.        300     IN      AAAA    2606:4700:4700::1001

dig @1.1.1.1 _dns.resolver.arpa svcb +noall +answer +additional
;; communications error to 1.1.1.1#53: timed out

難点は幾つかある。プライベートアドレス間の通信もすべて評価され、オーバーヘッドが大きい。その様子はNAT.101, 102で確認できる。
また、ダイナミックアクセスリストでICMP Echo Requestを許可しても通らなくなってしまう。ICMPはポートの概念がないため、NATのALG処理は複雑だ。

VLAN 見出しにジャンプ

IXにおけるインタフェースの命名規則は以下の通り。

interface GigaEthernet基本.サブ
interface GigaEthernet基本:ポートVLAN基本.サブ

2.1.3.1. デバイスコンフィグモードとインタフェースコンフィグモード — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
IX2215のSW-HUBGigaEthernet2.0は、タグVLANとポートVLANを共存できる。
基本インタフェース・ポートVLANの基本インタフェースはネイティブVLANで、サブインタフェース(.1以降)があればトランクポートとして振る舞う。サブインタフェースは、タグ対応機器下で使用できる。逆に言えばサブインタフェースがあると、ネイティブVLANはトランクな基本インタフェースでしか利用できない。通常問題ないが、IPv6でNDの内容が異なるときに混線が起こった。
基本インタフェースと同一セグメントのアクセスポートを用意するにはブリッジ機能が有用だが、ND Proxyで既に使っているブリッジ機能とかち合ってしまうのと、IGMPやMLDが破棄されるので厳密には同一リンクとは言い難い。

上記を踏まえて、タグ対応L2SWやAP、管理端末はサブGigaEthernet2.1~2を抱える基本インタフェースGigaEthernet2.0、サーバはポートVLANの基本インタフェースGigaEthernet2:1~4.0に設定した。
Wiresharkを見ずにこのようなVLAN設定は不可能なので、併せてポートミラーリングの設定を行うとよい。

  • 基本インタフェース、タグ無し、管理VLAN
    • ip dhcp binding DHCPプロファイルを参照する。
    • DHCPで固定した端末なら、arp entryでマルチキャストを抑制できる。 ntp-serverはIP version変換のためグローバルコンフィグモード。
    • ip policy route-map rmap-pbr-vlan0 VPNと共存するためのPBR設定。
    • linkmgr enable リンクマネージャを使うと、セグメントと異なる単位でACLできて便利だ。
    • http-server, ssh-server, proxy-dnsはグローバルコンフィグモードで設定しない。内部向けに、インタフェースコンフィグモードで設定した。
interface GigaEthernet2.0
  description admin
  ip address 10.0.0.254/24
  no ip redirects
  ip dhcp binding dhcpv4-sv-0-0
  ip filter vlan0-in-nc 100 in suppress-logging
  ip filter vlan0-in-ssh 200 in suppress-logging
  ip filter vlan05-in-bjnp 210 in suppress-logging
  ip filter vlan-in-all 500 in
  ip filter vlan-out-nc 100 out suppress-logging
  ip filter vlan3-dyn-tenet 200 out suppress-logging
  ip filter vlan5-dyn-smb 201 out suppress-logging
  ip filter pass-list 500 out suppress-logging
  ip policy route-map rmap-pbr-vlan0
  ip ufs-cache timeout tcp 300
  ip ufs-cache timeout udp 300
  arp entry 10.0.0.2 00:53:00:12:34:56
  linkmgr enable
  proxy-dns ip enable
  ssh-server ip enable
  http-server ip enable
  no shutdown
!
interface GigaEthernet2.1
  description home
  encapsulation dot1q 101 tpid 8100
  dot1q min-frame-size 64
  no auto-connect
  ip address 10.0.5.254/24
  no ip redirects
  ip dhcp binding dhcpv4-sv-0-5
  ip filter vlan5-in-nc 100 in suppress-logging
  ip filter vlan5-in-smb 201 in suppress-logging
  ip filter vlan05-in-bjnp 210 in suppress-logging
  ip filter vlan-in-all 500 in
  ip filter vlan-out-nc 100 out suppress-logging
  ip filter vlan0-dyn-ssh 200 out suppress-logging
  ip filter pass-list 500 out suppress-logging
  ip policy route-map rmap-pbr-vlan57
  ip ufs-cache timeout tcp 300
  ip ufs-cache timeout udp 300
  linkmgr enable
  proxy-dns ip enable
  no shutdown
!
  • ポートVLANの基本インタフェース、タグ無し、サーバVLAN
    • show vlansを確認する
device GigaEthernet2
  port 8 shutdown
  vlan-group 1 port 4
  vlan-group 2 port 5
  vlan-group 3 port 6
  vlan-group 4 port 7
!
interface GigaEthernet2:1.0
...
!
interface GigaEthernet2:2.0
...
!
interface GigaEthernet2:3.0
  description production
  ip address 10.0.3.254/24
  no ip redirects
  ip dhcp binding dhcpv4-sv-0-3
  ip filter vlan3-in-nc 100 in suppress-logging
  ip filter vlan3-in-tenet 200 in suppress-logging
  ip filter vlan-in-all 500 in
  ip filter vlan23-out-nc 100 out suppress-logging
  ip filter vlan0-dyn-ssh 200 out suppress-logging
  ip filter vlan0-dyn-tftp 300 out suppress-logging
  ip filter pass-list 500 out suppress-logging
  ip ufs-cache timeout tcp 300
  ip ufs-cache timeout udp 300
  linkmgr enable
  proxy-dns ip enable
  no shutdown
!
interface GigaEthernet2:4.0
...
!

DHCP 見出しにジャンプ

ip dhcp enable
!
ip dhcp profile dhcpv4-sv-0-0
  assignable-range 10.0.0.2 10.0.0.127
  subnet-mask 255.255.255.0
  default-gateway 10.0.0.254
  dns-server 10.0.3.5 10.0.0.254
  lease-time 259200
  option 42 ip 10.0.0.254
  option 43 hex 010400000002020400000001
  option 100 ascii JST-9
  option 101 ascii Asia/Tokyo
  option 162 hex 28002700011104646f74076578616d706c6503636f6d00040a0003050001000403646f74000300020355
  fixed-assignment 10.0.0.2 00:53:00:12:34:56
!
ip dhcp profile dhcpv4-sv-0-1
  assignable-range 10.0.1.2 10.0.1.127
...

ヤマハルータと同様にDHCP設定。

MACアドレス制限のかかったネットワークでiOS端末に設定すべきこと | エンタープライズiOS研究所

VLAN間アクセスリスト 見出しにジャンプ

VLANインタフェースのip filterに適用するアクセスリストの詳解。

  1. 500.で拒否される前に、IX宛やVLAN間通信を静的に許可する
ip access-list vlan0-in-nc option nocache
ip access-list vlan0-in-nc option optimize
ip access-list vlan0-in-nc permit udp src 10.0.0.0/24 sport any dest 10.0.3.5/32 dport eq 53
ip access-list vlan0-in-nc permit ip src 10.0.0.0/24 dest 10.0.0.0/24
ip access-list vlan0-in-nc permit udp src any sport any dest any dport eq 53 linkmgr mg 53
ip access-list vlan0-in-nc permit udp src any sport any dest any dport range 33434 33534 linkmgr mg 53
...
ip access-list vlan3-in-nc option nocache
ip access-list vlan3-in-nc option optimize
ip access-list vlan3-in-nc permit udp src 10.0.3.5/32 sport eq 53 dest any dport any
ip access-list vlan3-in-nc permit tcp src 10.0.3.5/32 sport eq 53 dest any dport any
ip access-list vlan3-in-nc permit tcp src 10.0.3.5/32 sport eq 853 dest any dport any
ip access-list vlan3-in-nc permit udp src any sport any dest any dport eq 53 linkmgr mg 53
ip access-list vlan3-in-nc permit udp src any sport any dest any dport range 33434 33534
ip access-list vlan3-in-nc permit udp src 10.0.3.0/24 sport eq 68 dest 10.0.3.254/32 dport eq 67
..
ip access-list vlan5-in-nc option nocache
ip access-list vlan5-in-nc option optimize
ip access-list vlan5-in-nc permit udp src 10.0.5.0/24 sport any dest 10.0.3.5/32 dport eq 53
ip access-list vlan5-in-nc permit udp src 10.0.5.0/24 sport any dest 10.0.5.254/32 dport eq 53
ip access-list vlan5-in-nc permit udp src 10.0.5.0/24 sport eq 68 dest 10.0.5.254/32 dport eq 67
...
ip access-list vlan-out-nc option nocache
ip access-list vlan-out-nc option optimize
ip access-list vlan-out-nc permit udp src any sport eq 53 dest any dport any
ip access-list vlan-out-nc permit tcp src any sport eq 53 dest any dport any
ip access-list vlan-out-nc permit udp src any sport eq 123 dest any dport any
ip access-list vlan23-out-nc option nocache
ip access-list vlan23-out-nc option optimize
ip access-list vlan23-out-nc permit udp src any sport any dest any dport eq 53
ip access-list vlan23-out-nc permit tcp src any sport any dest any dport eq 53
ip access-list vlan23-out-nc permit udp src any sport eq 53 dest any dport any
ip access-list vlan23-out-nc permit udp src any sport eq 123 dest any dport any
  • 15文字に収めるため、命名規則はvlanの3オクテット目-方向-目的とする。
  • BCP38/84に基づき、ACLは各VLANインタフェースのIN側で行う。送信元アドレスが信頼できるのは、インタフェースに入力される時だけだからだ。
  • 53/udp 53/tcp ランダムなポートを使うDo53は、アクセスリストキャッシュが意味をなさない。オーバーフローの原因になるのでoption nocache
    同じくtraceroute33434-33534/udpやDHCP67-68/udpもキャッシュする意味がないので一緒くた。
    • 200.のダイナミックアクセスリストを使うインタフェースでは、ネガティブキャッシュのオーバーフローも発生する。show ip access-list cachen - Not foundで確認できる。OUT側でも、ダイナミックアクセスリストが評価される前にvlan-out-ncのようなアクセスリストでnocacheする必要がある。QoSも同様だ。
      Do53クエリはGE0 vlan0-in-nc -> GE2:3.0 vlan23-out-nc -> GE2:3.0 vlan3-in-nc -> GE0 vlan-out-ncの順で評価される。
interface GigaEthernet2.0
  ip filter vlan0-in-nc 100 in suppress-logging
  ip filter vlan0-in-ssh 200 in suppress-logging
  ip filter vlan05-in-bjnp 210 in suppress-logging
  ip filter vlan-in-all 500 in
  ip filter vlan-out-nc 100 out suppress-logging
  ip filter vlan3-dyn-tenet 200 out suppress-logging
  ip filter vlan5-dyn-smb 201 out suppress-logging
  ip filter pass-list 500 out suppress-logging
!
interface GigaEthernet2:3.0
  ip filter vlan3-in-nc 100 in suppress-logging
  ip filter vlan3-in-tenet 200 in suppress-logging
  ip filter vlan-in-all 500 in
  ip filter vlan23-out-nc 100 out suppress-logging
  ip filter vlan0-dyn-ssh 200 out suppress-logging
  • IX自身は動的なOutside Addressを持ち、リンクマネージャにも登録できないため、WAN側ではDo53やtracerouteをany許可している。その代わり、ここでは一部のVLAN・リンクマネージャでのみ許可されている。本来VLAN間をケアするACLだが、VLAN単位のACLをしたい場合にも有効だ。
  • DHCPの挙動は実装によるが、リース延長リクエストはユニキャスト10.0.5.254/32宛に、端末がIPアドレスを持っていないときブロードキャスト255.255.255.255宛に行われる。このように、前者をVLAN固有のvlanN-in-acsに、後者をVLAN共通のvlan-in-allに記述するとACLを集約できる。
  1. 500.で拒否される前に、IX宛やVLAN間通信を動的に許可する
ip access-list vlan0-in-ssh option optimize
ip access-list vlan0-in-ssh permit tcp src any sport any dest 10.0.0.0/21 dport eq 22 linkmgr sg 43
ip access-list vlan0-in-ssh permit tcp src any sport any dest 10.0.0.0/21 dport eq 5201 linkmgr sg 43
ip access-list vlan0-in-ssh permit tcp src any sport any dest 10.0.0.0/21 dport eq 9090 linkmgr sg 43
ip access-list vlan0-in-ssh permit icmp type 8 src any dest any
ip access-list vlan05-in-bjnp option optimize
ip access-list vlan05-in-bjnp permit udp src any sport any dest 10.0.4.62/32 dport range 8611 8612
ip access-list vlan05-in-bjnp permit tcp src any sport any dest 10.0.4.62/32 dport range 8611 8612
...
ip access-list dynamic vlan0-dyn-ssh access vlan0-in-ssh
ip access-list dynamic vlan0-dyn-tftp tftp src 10.0.3.254/32 dest 10.0.3.5/32
ip access-list dynamic vlan05-dyn-bjnp access vlan05-in-bjnp
  • VLAN間は常にL3ルーティングされる。show ip routeで確認。このため500.で拒否しているが、例外的に許可したい。
    ダイナミックアクセスリストを使うと、IPv6のSPIと同様にOUT側の通信をトリガーに、その戻りパケットをIN側で許可できる。つまり、送信先インタフェースのOUT側にダイナミックアクセスリストを設定し、送信元のインタフェースのIN側にその静的アクセスリストを適用することになる。
    例えばVLAN間のSSHはGE0 vlan0-in-ssh -> GE2:3.0 vlan0-dyn-ssh -> GE2:3.0 (dynamic cache) -> GE0 pass-listの順で評価される。
    • VLANに割り当てられたIP範囲は、CIDR表記で10.0.0.0/24から10.0.7.0/24までの10.0.0.0/21に収まる。
    • SSH22/tcp iperf35201/tcp Cockpit9090/tcpとICMP Echo Requesticmp type 8を管理端末linkmgr sg 43に許可する。
    • Canon製プリンタで使われるBJNPプロトコル8611-8612を許可する。
  • コンフィグ更新に使うTFTPでは、サーバは69/udpのほかエフェメラルポートを使うので、ポート制限が難しい。
    サービス指定の場合のダイナミックフィルタを使うと、簡単に記述できる。
    送信元は、TFTPサーバ10.0.3.5と同じセグメントの10.0.3.254
  1. VLAN間ルーティングを拒否する。
ip access-list vlan-in-all option optimize
ip access-list vlan-in-all permit udp src any sport any dest 10.0.3.5/32 dport eq 514 linkmgr sg 54
ip access-list vlan-in-all permit udp src 10.0.0.0/21 sport any dest 10.0.0.254/32 dport eq 123
ip access-list vlan-in-all permit tcp src 10.0.0.0/21 sport any dest 10.0.3.5/32 dport eq 53
ip access-list vlan-in-all permit tcp src 10.0.0.0/21 sport any dest 10.0.3.5/32 dport eq 853
ip access-list vlan-in-all permit udp src any sport eq 68 dest 255.255.255.255/32 dport eq 67
ip access-list vlan-in-all deny ip src any dest 1.0.0.0/24
ip access-list vlan-in-all deny ip src any dest 1.1.1.0/24
ip access-list vlan-in-all deny ip src any dest 8.8.4.0/24
ip access-list vlan-in-all deny ip src any dest 8.8.8.0/24
ip access-list vlan-in-all deny ip src any dest 10.0.0.0/21
ip access-list vlan-in-all deny ip src any dest 224.0.0.0/3
ip access-list vlan-in-all deny udp src any sport any dest any dport eq 53
ip access-list vlan-in-all deny udp src any sport eq 500 dest any dport any
ip access-list vlan-in-all deny udp src any sport eq 4500 dest any dport any
ip access-list vlan-in-all permit ip src 10.0.0.0/21 dest any
  • ACLの高速化のため、permit - deny - permitの3ブロックで表現している。
  • 514/udp syslogへのアクセスをsyslogグループlinkmgr sg 54に許可する
  • BCP38/84に基づき、src 10.0.0.0/21からの
  • 67-68/udp DHCP
    送信元は0.0.0.0(DHCP Request)や10.0.0.0/21(Inform: DHCPを使わない、固定アドレスの端末も使用)なのでany
  • 1.0.0.0/24 1.1.1.0/24 8.8.4.0/24 8.8.8.0/24 IPv6のブリッジ間フィルタと同じくPublic DNS
  • 10.0.0.0/21 VLAN間フィルタ。VLAN間に予期せぬ通信が発生した場合、FLT.007vlan-in-allの名前でロギングされる。
  • 224.0.0.0/3 IPv6のブリッジ間フィルタと同じく、マルチキャストも転送すべきでない。
  • 53/udp IPv6のブリッジ間フィルタに同じ
  • 500/udp 4500/udp IXのVPNサーバもOutside Addressが送信元になるため、WAN側ではsrc anyで許可した。VLANからは不要なのでブロック。
  • permit ip src 10.0.0.0/21 BCP38/84に基づき、VLANのIP範囲からの通信のみ許可するので、WAN側ではsrc anyで許可できる寸法だ。

Policy Based Routing 見出しにジャンプ

通常の静的ルーティングip routeでは宛先IPアドレスを条件にするが、PBRでは送信元を含む5tupleを条件にルーティングできる。
IXでは、アクセスリストip access-listを元にルートマップroute-mapを定義し、インタフェースに適用ip policy route-mapする。
2.14.4. ポリシールーティング — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

route-map rmap-pbr-vlan0 deny 10
  match ip address access-list pbr-exclude
!
route-map rmap-pbr-vlan0 permit 30
  set interface Tunnel0.0
!
route-map rmap-pbr-vlan1 deny 10
  match ip address access-list pbr-exclude
!
route-map rmap-pbr-vlan1 permit 15
  match ip address access-list pbr-ip-echo
  set interface Tunnel0.0
!
route-map rmap-pbr-vlan57 deny 10
  match ip address access-list pbr-exclude
!
route-map rmap-pbr-vlan57 permit 30
  set interface Tunnel0.0
!
!
interface GigaEthernet2.0
  ip policy route-map rmap-pbr-vlan0
!
interface GigaEthernet2.1
  ip policy route-map rmap-pbr-vlan57
!
interface GigaEthernet2.2
  ip policy route-map rmap-pbr-vlan57
!
interface GigaEthernet2:1.0
  ip policy route-map rmap-pbr-vlan1
!
  • 送信元だけでなく、IPv4 VLANインタフェース毎にルーティングを変えられる。
  • route-map rmap-pbr-vlan0 deny ip routeにルーティングさせたい5tupleは、route-mapでdenyする
  • SEQ番号の低いroute-mapを飛ばして、後続のroute-mapで評価したい5tupleは、ACLでdenyする
  • インタフェースへ適用後、要reload
ip access-list pbr-exclude option optimize
! Private Range
ip access-list pbr-exclude permit ip src any dest 10.0.0.0/21
! ipinfo.io
ip access-list pbr-exclude permit ip src any dest 34.116.0.0/14
! Discord ICE
ip access-list pbr-exclude permit ip src any dest 35.207.192.0/18
ip access-list pbr-exclude permit ip src any dest 35.212.0.0/14
ip access-list pbr-exclude permit ip src any dest 66.22.192.0/18
! guzzoni.apple.com
ip access-list pbr-exclude permit ip src any dest 54.95.128.0/17
! api.twitter.com api.x.com
ip access-list pbr-exclude permit ip src 10.0.0.0/24 dest 104.244.42.2/32
ip access-list pbr-exclude permit ip src 10.0.0.0/24 dest 104.244.42.66/32
ip access-list pbr-exclude permit ip src 10.0.0.0/24 dest 104.244.42.130/32
ip access-list pbr-exclude permit ip src 10.0.0.0/24 dest 104.244.42.194/32
! api-n-n-n.twitter.com
ip access-list pbr-exclude permit ip src any dest 69.195.160.0/19
ip access-list pbr-exclude permit ip src any dest 209.237.192.0/20
! inonius.net
ip access-list pbr-exclude permit ip src any dest 210.231.212.0/22
  • pbr-excludeのようなACLを設けてプライベートIP範囲10.0.0.0/21を除外しないと、誤ってWAN側インタフェースにルーティングされ、Bogonフィルタに拒否される。
  • 35.207.192.0/18 35.212.0.0/14 66.22.192.0/18 Discord通話はショートパケットの権化なので、ご?家庭ルータには荷が重いと判断し、PPPoEへ
  • 54.95.128.0/17 Apple翻訳guzzoni.apple.comはEnvoyを使っているためか、IPv4共有アドレスからのアクセスが遅いときがある。
    DNSルーティングは現在壊れているし、高速化も効かないので使わないで、粒度を低くしたIP範囲を指定した。
whois -h whois.cymru.com -v  54.95.240.153
# Warning: RIPE flags used with a traditional server.
# AS      | IP               | BGP Prefix          | CC | Registry | Allocated  | AS Name
# 16509   | 54.95.240.153    | 54.95.128.0/17      | US | arin     | 2014-06-20 | AMAZON-02, US

cf. 2.22.7 ポリシールーティング (b)DNS ルーティング IX2000/IX3000シリーズ 機能説明書

DNS 見出しにジャンプ

多くのCPEに搭載されているDNSフォワーダは、IX語ではプロキシDNSと呼ぶ。フレッツ系のVNEではIPv4 DNSが提供されないし、使うべきでもないため、IPv4シングルスタック端末には欠かせない存在だ。
IXのプロキシDNSでは色々と事足りないので、プライマリDNSはUnboundに移行したが、IXをプライマリのDNSシンクホールとして利用する場合の設定例も紹介する。

  • ACLのドメイン名指定機能を無効化
    遅いし使えないので
no dns cache address-database
  1. シンプルなIX用・セカンダリDNSとして設定する
no dns cache enable
no dns cache max-records 1024
!
proxy-dns ip request both
proxy-dns ip max-sessions 1024
proxy-dns ip query-response 20
proxy-dns ip query-retries 1
proxy-dns ip query-interval 1
proxy-dns interface GigaEthernet0.0
proxy-dns interface GigaEthernet0.1 ignore
proxy-dns interface GigaEthernet0.2 ignore
proxy-dns server 2404:1a8:7f01:a::3
!
ipv6 dhcp client-profile dhcpv6-cl
  information-request
  option-request dns-servers
!
ipv6 dhcp server-profile dhcpv6-sv
!
interface GigaEthernet2.0
  proxy-dns ip enable
!
  • dns cache セカンダリDNS程度の用途なので、DNSキャッシュは無効化した。
    cf. DNS リゾルバ UNIVERGE IX2000/IX3000シリーズ コマンドリファレンスマニュアル
  • IPv4プロキシDNSではproxy-dns ip request ipv4-only/bothしか選べないことから分かるように、
    同じpriorityなら、proxy-dns ipではIPv4、proxy-dns ipv6ではIPv6が優先される。
    その中ではproxy-dns serverが優先され、タイムアウトquery-*後にproxy-dns interfaceにクエリする。dns transport-priority ipの動作に似ているが、プロキシDNSに関係ないconfigなので混同しないように。
  • interface GigaEthernet0.0 DHCPv6クライアントが動作するインタフェースを指定すると、DHCPv6で取得したキャッシュDNSサーバを参照する。
    • ただし妙にクエリ時間が長いので、(同じ優先度priorityなら)優先度が高いproxy-dns serverに静的に設定した。
      show ipv6 dhcp client show proxy-dnsで確認できる。
    • a/bで東西が変わったりするので要確認
    • ND Proxyでは、DNSクエリの送信元はBVI0になる。
  • interface GigaEthernet0.1 ignore IPv4 PPPoEのIPCPで通知されたキャッシュDNSサーバを無効化する。IPv4 PPPoEならポートが枯渇することはないし、かなり高速だったが、IPv6には及ばないということで。
  • ipv6 dhcp client-profile DHCPv6でキャッシュDNSサーバを取得する。
  • ipv6 dhcp server-profile 複数インタフェースへND Proxyするデメリットの一つに、IPv6でVLAN間ルーティングが行えないことがある。幸い、DNSはIPv4とIPv6を橋渡しするから、DNSの記事でdisったキメラスタックを甘んじて構築した。
    WindowsはDHCPよりDHCPv6で通知されたDNSサーバを優先し、Apple iOSでもDHCPv6のDNSを使う時があるから、セカンダリの通知に使えなかった。
  • パケットレベルでACLできていれば問題にならないが、オープンリゾルバになる可能性を排除したいため、インタフェースコンフィグモードでプロキシDNSを有効化proxy-dns ip enableした。要reload
    • HTTPサーバと異なり、proxy-dns ip access-listはDROP動作のためセキュリティに寄与しそうだ。
  1. proxy-dnsはECMPip multipath per-packetしないが、NEXTHOPにLoopbackインタフェースを指定すると通常のルーティングになり、複数のインタフェースにECMPする。
    MAP-EインタフェースのNAPTではエントロピーが低下するため、NEXTHOP以外では使用しない。
    IPv6ならマルチプレフィクス問題を考慮する必要があるが、そもそもNEXTHOP指定に非対応。
    また、ECMP先のインタフェースで逆NATを行えば、異なるキャッシュDNSにラウンドロビンされる。
    DNS サーバーのアドレス登録 — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント
ip route 203.0.113.35/32 GigaEthernet0.1 connected
ip route 203.0.113.35/32 GigaEthernet0.2 connected
ip route 203.0.113.53/32 GigaEthernet0.1 connected
ip route 203.0.113.53/32 GigaEthernet0.2 connected
ip route 203.0.113.53/32 Loopback1.0
...
!
no ip name-server dynamic fixed-interface
!
proxy-dns server 203.0.113.53 Loopback0.0
!
interface Loopback0.0
  ip address 127.0.7.1/31
!
interface Loopback1.0
  ip address 127.0.5.1/31
  ip nat enable
  ip nat static 203.0.113.35 203.0.113.53
!
  1. ローカル DNS レコードの設定dns hostはDNSシンクホールとして機能する。
    ヤマハルータの静的DNSレコードdns staticに似ているが、dns static a/aaaaが応答タイプを示すのに対し、IXのdns host ip/ipv6はクエリを受信したproxy-dnsのIPバージョンを示す。このためproxy-dnsをデュアルスタック対応すると、1FQDNに対し最大4行の記述が必要だ。
    dns-host-helper.shを使うと簡単にブロックルールを追加できる。AAAAに付随するCNAMEは::でブロックできるが、HTTPS RRやそれに付随するCNAMEには非対応。
...
dns host pagead2.googlesyndication.com ip 0.0.0.0
dns host pagead2.googlesyndication.com ip ::
...

Public DNSでDNSシンクホールを回避させないために、FQDNをproxy-dnsに向ける。
各インタフェース毎にプロキシDNSのIPアドレスが異なるため自動設定autoする。

dns host dns.google.com ip auto
dns host dns.google ip auto
dns host 8888.google ip auto
dns host google-public-dns-a.google.com ip auto
dns host google-public-dns-b.google.com ip auto
dns host one.one.one.one ip auto
dns host cloudflare-dns.com ip auto
...
  1. Windows然り、Linux然り、リアルワールドのNTPはDHCPv6もDHCPも参照せず、各OSが身勝手にNTPサーバへ問い合わせることが殆どだ。
    IXをDNSシンクホールとして設定するなら、NTPの向け先も設定しておこう。
dns host 1.fedora.pool.ntp.org ip 2404:1a8:1102::a
dns host 2.fedora.pool.ntp.org ip 2404:1a8:1102::b
dns host 3.fedora.pool.ntp.org ip 2404:1a8:1102::c
dns host time.windows.com ip 2404:1a8:1102::c
dns host time-ios.apple.com ip 2404:1a8:1102::c
dns host time-macos.apple.com ip 2404:1a8:1102::c
dns host time.apple.com ip 2404:1a8:1102::c
dns host time1.apple.com ip 2404:1a8:1102::a
dns host time2.apple.com ip 2404:1a8:1102::b
dns host time3.apple.com ip 2404:1a8:1102::c
dns host time4.apple.com ip 2404:1a8:1102::a
dns host time5.apple.com ip 2404:1a8:1102::b
dns host time6.apple.com ip 2404:1a8:1102::c
dns host time7.apple.com ip 2404:1a8:1102::a
dns host time.euro.apple.com ip 2404:1a8:1102::c
dns host time.google.com ip 2404:1a8:1102::c
dns host time1.google.com ip 2404:1a8:1102::a
dns host time2.google.com ip 2404:1a8:1102::b
dns host time3.google.com ip 2404:1a8:1102::c
dns host time4.google.com ip 2404:1a8:1102::a
  1. DNSシンクホールのHTTPS RR対応。
    ヤマハルータにおけるdns server selectではA/AAAAを別のキャッシュDNSにフォワードしたり、それを以って非対応のHTTPS RRを対応したキャッシュDNSでブロックする動作が可能だった。しかしproxy-dnsはクエリタイプを区別できないため、HTTPS RRのブロックに対応した一つのキャッシュDNSですべてのクエリタイプを処理する必要がある。
  • url-pdns-ngn NGNのキャッシュDNSにクエリする必要のあるドメイン名を設定。
    • edge.apple. Apple Edge Cache
    • *flets-east.jp サービス情報サイトflets-east.jpやNetMeister*.netmeister.cloudgw.e-ntt.cast.flets-east.jp
    • *iptvf.jp ひかりTV
    • 4over6.info 国内標準プロビジョニング方式のプロビジョニングサーバ
    • rule.map.ocn.ad.jp OCNバーチャルコネクトのマップルール配信サーバ(外部DNSでもおk) HTTPS RRに応答する性質から、HTTPS RRを活用しているサービスも一緒くたにしている。denyルールを用いると簡単に動作確認できるだろう。
  • url-pdns-block 全てのクエリタイプやFQDNでなくワイルドカードでブロックしたいドメイン名を記述。 否定応答やdenyしたドメイン名は、同じ優先度・下の優先度のキャッシュDNSへ再クエリされる。
  • url-pdns-allは最も優先度の低いため、否定応答やdenyしたドメイン名がタイムアウトする性質を持つ。外部のキャッシュDNSで対応せずIXでタイムアウトさせたいドメイン名はここに書く。
    DDR_dns.resolver.arpaを、否定応答を返すであろうurl-pdns-ngnにフォワードしていないのはこのためだ。
    dig @10.0.0.254 crypto.cloudflare.com https
    
proxy-dns interface GigaEthernet0.0 ignore
proxy-dns interface GigaEthernet0.1 ignore
proxy-dns interface GigaEthernet0.2 ignore
proxy-dns server 2404:1a8:7f01:a::3 url-list url-pdns-ngn priority 235
proxy-dns server 3fff:3ac:8a:1a:10e:35 url-list url-pdns-block priority 210
proxy-dns server 3fff:3ac:8a:1a:10e:53 url-list url-pdns-all priority 200
!
url-list url-pdns-all deny domain *.arpa
url-list url-pdns-all permit domain *
url-list url-pdns-block permit domain mask.icloud.com
url-list url-pdns-block permit domain mask-api.icloud.com
url-list url-pdns-block permit domain *.duckdns.org
url-list url-pdns-block permit domain *.ddns.net
url-list url-pdns-block permit domain *.dyndns.net
url-list url-pdns-block permit domain *.onion
url-list url-pdns-block permit domain *.su
url-list url-pdns-block permit domain *.ru
url-list url-pdns-ngn permit domain *.edge.apple
url-list url-pdns-ngn permit domain *flets-east.jp
url-list url-pdns-ngn permit domain *iptvf.jp
url-list url-pdns-ngn permit domain 4over6.info
url-list url-pdns-ngn permit domain rule.map.ocn.ad.jp
no url-list url-pdns-ngn deny domain crypto.cloudflare.com
url-list url-pdns-ngn permit domain *cloudflare*
url-list url-pdns-ngn permit domain *nyanshiba.com

clear proxy-dns sessionしないと反映されないときがある?確実なのはreload

ntp master 見出しにジャンプ

ローカルNTPサーバーの設定ntp masterはグローバルコンフィグモードのみ設定可能。NTPの精度としては十分に思うが、利用は推奨されていないため、DHCPにのみ設定している。

ntp ip enable
ntp server dhcpv6 retry 1 version 4 timeout 1 priority 10
ntp master
ntp source BVI0
ntp interval 25200
!
ipv6 dhcp client-profile dhcpv6-cl
  information-request
  option-request ntp-servers
!

装置の時刻合わせに使うNTPサーバはDHCPv6のオプションで通知された、フレッツ東のNGN網内NTPサーバに向けた。NTPクエリの送信元アドレスは、ND ProxyインタフェースのBVI0
ntp intervalは時刻が変動するように7時間。

ポートモニタ 見出しにジャンプ

異なる端末のトラフィックをパケットキャプチャするには、何かしらの機器でポートに流れるパケットを複製する必要がある。
IXのポートモニタ機能では、device GigaEthernet2.0内の全てのポートを同時に(IX2215のみ)モニタポートにし、特定のミラーポートへミラーリングできる。
ミラーポートはポートモニタ専用となり、通常の通信は行えないため、ヤマハルータのように一つのEthernetポートでパケットキャプチャできない。

GigaEthernet2:1.0をモニタポートに、GigaEthernet2:8.0をミラーポートに設定し、送受信bothをモニタする例。

device GigaEthernet2
  port 1 mirror-port 8 both
  vlan-group 8 port 8
!

モニタポートをサクッと切り替えるアクションリスト設定
cf. アクションリスト UNIVERGE IX2000/IX3000シリーズ コマンドリファレンスマニュアル

command-action execute mir1
command-action execute nomir
command-action list mir1
  command 1 device GigaEthernet2
  command 2 no port 8 shutdown
  command 3 port 1 mirror-port 8 both
!
command-action list mir2
  command 1 device GigaEthernet2
  command 2 no port 8 shutdown
  command 3 port 2 mirror-port 8 both
!
command-action list mir3
  command 1 device GigaEthernet2
  command 2 no port 8 shutdown
  command 3 port 3 mirror-port 8 both
!
command-action list mir4
  command 1 device GigaEthernet2
  command 2 no port 8 shutdown
  command 3 port 4 mirror-port 8 both
!
command-action list mir5
  command 1 device GigaEthernet2
  command 2 no port 8 shutdown
  command 3 port 5 mirror-port 8 both
!
command-action list mir6
  command 1 device GigaEthernet2
  command 2 no port 8 shutdown
  command 3 port 6 mirror-port 8 both
!
command-action list nomir
  command 1 device GigaEthernet2
  command 2 port 8 shutdown
  command 3 no port 1 mirror-port
  command 4 no port 2 mirror-port
  command 5 no port 3 mirror-port
  command 6 no port 4 mirror-port
  command 7 no port 5 mirror-port
  command 8 no port 6 mirror-port
!

Wake on LAN 見出しにジャンプ

WoLパケットが送れるのはIX直下の機器のみ。
cf. Wake on LAN UNIVERGE IX2000/IX3000シリーズ コマンドリファレンスマニュアル

wol terminal nuc mac 00:5e:b0:ba:10:ee interface GigaEthernet2:2.0
wol send terminal nuc

IX再起動後に反応しない場合あり。

リンクマネージャ 見出しにジャンプ

MACアドレスの信憑性程度のセキュリティを提供する。VLANセグメント単位に縛られないアクセスコントロールを表現する際に非常に便利だ。
cf. リンクマネージャ UNIVERGE IX2000/IX3000シリーズ コマンドリファレンスマニュアル

linkmgr profile
  default-action permit ignore-auth
  group-main 11 ascii ieee
  group-main 53 ascii dns
  group-sub 1 ascii ntp
  group-sub 43 ascii whois
  group-sub 54 ascii syslog
!
linkmgr terminal group-main 11 group-sub 43
  terminal 00:5e:b0:ba:10:ee permit ignore-auth desc-ascii iPhone13
!
linkmgr terminal group-main 11 group-sub 54
  terminal 00:5e:b0:ba:10:ee permit ignore-auth desc-ascii Aruba1930
  terminal 00:5e:b0:ba:10:ee permit ignore-auth desc-ascii WLX212
  terminal 00:5e:b0:ba:10:ee permit ignore-auth desc-ascii WLX212c
!
linkmgr terminal group-main 53 group-sub 1
  terminal 00:5e:b0:ba:10:ee permit ignore-auth desc-ascii Probe
!
linkmgr terminal group-main 53 group-sub 43
  terminal 00:5e:b0:ba:10:ee permit ignore-auth desc-ascii Main
!
linkmgr terminal group-main 53 group-sub 54
  terminal 00:5e:b0:ba:10:ee permit ignore-auth desc-ascii NucBox5
  terminal 00:5e:b0:ba:10:ee permit ignore-auth desc-ascii i5

例えばACLでDNSクライアントlinkmgr mg 53を指定すれば、下記が含まれる

  • group-main 53 group-sub 1
  • group-main 53 group-sub 43
  • group-main 53 group-sub 54

syslogクライアントlinkmgr sg 54を指定すれば、下記が含まれる

  • group-main 11 group-sub 54
  • group-main 53 group-sub 54

管理端末linkmgr mg 53 sg 43を指定すれば、下記が含まれる

  • group-main 53 group-sub 43

このように、メイングループとサブグループのORやANDが取れるため、多くの組み合わせを表現できる。それを念頭にグループ分けをするとよい。

リモートアクセスVPN 見出しにジャンプ

L2TP/IPsec 見出しにジャンプ

モバイルデバイスからの接続のため、トランスポートモードのVPNを設定した。
NAT64/DNS64に対応させるとなるとIXでは完結しないので、IPv4のみ対応のL2TP/IPsecで問題なかった。
2.23. スマートデバイス対応(L2TP LNS機能)の設定 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
設定を行った後、構成プロファイルに設定すれば自動接続できる。

ike nat-traversal
!
ike proposal web_l2tp_ikeprop5 encryption aes-256 hash sha2-256 group 2048-bit
!
ike policy web_l2tp_ikepolicy peer any key himitsu web_l2tp_ikeprop5
ike keepalive web_l2tp_ikepolicy 20 2
!
ipsec autokey-proposal web_l2tp_secprop4 esp-aes-256 esp-sha2-256
!
ipsec dynamic-map web_l2tp_secpolicy web_vpnlist web_l2tp_secprop4 pfs 2048-bit
!
!
ip access-list web_vpnlist option nocache
ip access-list web_vpnlist permit ip src any dest any
  • ike nat-traversal NATトラバーサルを有効化する。モバイル網のCGNATやフリーWi-FiのNATを想定。
  • IKEプロポーザルike proposal、自動鍵プロポーザルipsec autokey-proposalはApple iOSが対応する最も強度の高い組み合わせを設定した。
  • ike keepalive web_l2tp_ikepolicy 20 2 端末のバッテリーライフの都合でIKEキープアライブ間隔を倍に、切断後に再接続しやすくするためリトライを少なめにした。
  • web_vpnlist セキュリティは通常のACLで担保する。アクセスリストキャッシュは無効。

IKEv1/IPSec 機能
IPsec で設定するアクセスリストは通常 any を 1 行設定するのみのため、キャッシュなしで高速判定可能です。アクセスリストキャッシュを無効化し、キャッシュの消費を抑制することで、キャッシュのオーバーフロー発生頻度を抑制できます。
2.52.1.7 アクセスリストキャッシュの無効化 IX2000/IX3000シリーズ 機能説明書

IKE — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント
IPsec — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント

...
ip access-list in-bogon-log permit udp src 203.0.113.0/24 sport any dest any dport eq 500
ip access-list in-bogon-log permit udp src 203.0.113.0/24 sport any dest any dport eq 4500
ip access-list in-apdf-log option optimize
ip access-list in-apdf-log deny udp src any sport any dest any dport lt 4501
ip access-list in-apdf-log permit ...
...
ip access-list out-udp-nolog permit udp src any sport eq 500 dest any dport any
ip access-list out-udp-nolog permit udp src any sport eq 4500 dest any dport any
!
ppp profile web-ppp-l2tp
  authentication request chap
  authentication password user secret
  lcp pfc
  lcp acfc
  ipcp provide-remote-dns 10.0.3.5
  ipcp provide-ip-address range 10.0.0.12 10.0.0.12
  ipcp provide-static-ip-address user 10.0.0.12
!
interface GigaEthernet0.1
  ip napt enable
  ip napt static GigaEthernet0.1 udp 500
  ip napt static GigaEthernet0.1 udp 4500
  ip filter in-bogon-log 2000 in
  ip filter in-apdf-log 3000 in
  ...
!
interface Tunnel126.0
  description L2TP_#1
  ppp binding web-ppp-l2tp
  tunnel mode l2tp-lns ipsec
  ip unnumbered Loopback0.0
  no ip redirects
  ip tcp adjust-mss auto
  ip filter vlan0vpn-in-nc 100 in suppress-logging
  ip filter vlan0-in-ssh 200 in suppress-logging
  ip filter vlan-in-all 500 in
  ipsec policy transport web_l2tp_secpolicy
  no shutdown
!
  • 静的NAPTはPPPoEインタフェースのOutside AddressGigaEthernet0.1 GigaEthernet0.2に行う。L2TP/IPsecはOutside Portには500/udp4500/udpを使う。NATトラバーサルのためESP50は不要。
  • ppp profile web-ppp-l2tp PPPプロファイルにユーザ名と事前共有鍵を書き、Tunnelインタフェースに適用ppp binding web-ppp-l2tpすることでクライアント認証が機能する。
    PPPプロファイル内で割り振るIPアドレスやDNSサーバを提供できる。
    PPP — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント
  • ip proxy-arp VLANと重複するIP範囲をVPNで利用するなら、L2 ARPをそのVLANインタフェースにプロキシしなければならない。
  • ip tcp adjust-mss auto TCP MSSクランプの設定。VPNでは、MTUだけでなく暗号・認証プロトコルによっても最適なTCP MSSが異なり、これを自動設定する。
    2.9.4. TCP MSS調整 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
    tunnel adjust-mtuはデフォルトで有効だ。
  • VLAN間フィルタしているなら、同様にTunnelインタフェースにもACLが必要。
ip access-list vlan0vpn-in-nc option nocache
ip access-list vlan0vpn-in-nc option optimize
ip access-list vlan0vpn-in-nc permit udp src 10.0.0.0/24 sport any dest 10.0.3.5/32 dport eq 53
ip access-list vlan0vpn-in-nc permit ip src 10.0.0.0/24 dest 10.0.0.0/24
ip access-list vlan0vpn-in-nc deny udp src any sport any dest any dport eq 443
  • dest 10.0.0.0/24 Proxy ARPが必要なように、同セグメントでもL3ルーティングのためACLの許可が必要。
  • Apple iOS 17以降Google検索などのQUICが通らないため、仕方なく443/udpをブロック。
  • 他はVLAN間フィルタと同じ

IKEv2 見出しにジャンプ

IKEv2では、事前共有鍵方式ikev2 authentication pskが人気だ。しかしApple iPhoneの接続ではid fqdn, id rfc822-addr共にIKE SAまで確立するものの、Child SAが折衝しなかった。

IKE2[149]: Payload type 34(KE)
IKE2[149]: DH group type 19(ECP256), data 64 byte
...
IKE2[020]: Negotiation error. Invalid KE (DH group 19). 203.0.113.43.
IKE2[037]: No proposal chosen for 203.0.113.43(user) Child SA.

1章 インターネットVPNでの障害切り分け方法(事例2) : 障害切り分けガイドライン : UNIVERGE IXシリーズ | NEC

Appleのドキュメントに対応したプロポーザルが記載されているが、iPhone 13の設定AppからのIKEv2では、上記の通りDH group 19を要求していた。構成プロファイルでなら任意のDH groupを設定できたが、Child SAでコケるのは変わらなかった。
VPN.IKEv2.ChildSecurityAssociationParameters | Apple Developer Documentation
IKEv2 Certificate Based on iOS 17.03 — Zyxel Community iPhone XではDH14, iPhone 15ではDH19

Apple iOSはSharedSecretとRemoteIdentifier(FQDNのみ)か、CertificateとAuthName・AuthPasswordあるいはEAPの組み合わせのみ対応。
IX2215は相互にSharedSecretかCertificate、EAP-MD5に対応。
実のところ、IX2000シリーズにおいてApple iOSと相互接続性があるのは、サーバ認証・クライアント認証共に2組の中間CA・サーバ証明書を用いたデジタル認証方式。クライアント認証にEAP-MD5方式を使うとあるが、別途RADIUSサーバが必要なことから却下した。
NEC UNIVERGE IX2000/IX3000 運用構築スレ Part9 - 5ちゃんねる掲示板
Apple IKEv2 Configuration Profile :: strongSwan Documentation
cf. 2.38.1.1 IKEv2/IPsec のサポート機能一覧 IX2000/IX3000シリーズ 機能説明書

結論から言うと、これもChild SAでコケた。

因みにAndroidなら簡単に設定できるらしい。しかもトンネルモードだし。
NEC IXルータで新しいAndroid(IKEv2)からのリモートアクセスVPNを受ける(不完全→一応成功) | お名前.com、さくらのVPS等のサーバーでの開発・設定メモ

NetMeister 見出しにジャンプ

NetMeisterのダッシュボード

NetMeisterに登録すると、装置の遠隔操作やDDNSを利用できる。
2.27. NetMeisterの設定 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
NetMeister Ver13.0 操作ガイド — NetMeister操作ガイド ドキュメント
登録の際にはおそらく独自ドメインが必要だ。

nm ipv6 enable ngn-private east mqtt force
nm account nm-group password plain nm-password
nm sitename tokyo
nm ddns hostname ddns-host
nm ddns notify interface GigaEthernet0.1 protocol ip
nm ddns notify interface BVI0 protocol ipv6
nm ddns notify seq 1 interface Tunnel0.0 protocol ip
nm ddns notify seq 2 interface GigaEthernet0.2 protocol ip
nm standby ddns notify interface GigaEthernet0.2 protocol ip
nm suppress-feature alarm
nm suppress-feature vpn
nm suppress-feature metrics
nm suppress-feature disapproval
nm suppress-feature port-metrics
nm source-address Tunnel0.0 protocol ip
nm outgoing-interface Tunnel0.0 auto protocol ip
  • nm ipv6 enable ngn-private east mqtt force NGN網内折り返し・MQTT通信を強制……できなくなった(フレッツ・キャストが高額すぎて破破産しかけた?)。
    nm source-address, nm outgoing-interfaceにMAP-EインタフェースTunnel0.0を指定して、IPv6で完結するようにした。
    このためIPv4・IPv6共に8883/tcp宛の通信が発生するが、ACLに関係なく許可されるため考えなくてよい。

Ver10.4 以降、UTM サーバおよび NetMeister サーバ宛の通信はスタティックフィルタおよびダイナミックフィルタでフィルタリングされません。
2.30 パケットフィルタの設定 IX2000/IX3000シリーズ 機能説明書

  • hostname/nm ddns hostname, nm accountがDDNSホスト名を構成するため、それを考慮してアカウントを作成しよう。
ddns-host.nm-group.nmddns.jp
ddns-host.nm-group.v6.nmddns.jp
ddns-host-1.nm-group.nmddns.jp
ddns-host-2.nm-group.nmddns.jp

ネットワークモニタ 見出しにジャンプ

ping打ってる間だけ経路変える 見出しにジャンプ

PPPoE・MAP-Eを切り替えて通信したいとあるSTUNサーバ3.132.228.249, Mojangの認証サーバsessionserver.mojang.com 13.104.0.0/14, Minecraftサーバ25565/tcpをACLpbr-mcに設定。その他のPBR設定は前述の通り。

特定の端末から、IXが解釈できるコマンド以外の方法で経路制御できないか考えた。経路制御なので、アクションリストcommand-acntionのような不確実な方法はとりたくなかった。
パッシブモードを使うと、IXでなく監視対象からのICMP Echo Requestをトリガーにイベント発生させられる。このwatch-groupは、特定の端末にpingを10秒に1回の頻度で打たれている限り、特定のPBRシーケンスを有効化するように書かれている。
2.18.6.1. パッシブモード — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

ip access-list pbr-mc option optimize
ip access-list pbr-mc permit ip src any dest 3.132.228.249/32
ip access-list pbr-mc permit ip src any dest 3.135.212.85/32
ip access-list pbr-mc permit ip src any dest 13.104.0.0/14
ip access-list pbr-mc permit tcp src any sport any dest any dport eq 25565
!
watch-group watch-pbr-mc 10
  event 10 always stand
  action 10 ip shutdown-policy GigaEthernet2.0 route-map-seq 11
!
watch-group watch-pbr-mc 20
  event 10 ip reach-host 10.0.0.2 GigaEthernet2.0 10.0.0.254 source GigaEthernet2.0
  probe-mode passive event 10
  action 10 ip resume-policy GigaEthernet2.0 route-map-seq 11
  action 20 turn-BAK-LED-on
  probe-counter variance 10 percent 90
  probe-counter restorer 3 percent 100
  probe-timer variance 11
  probe-timer restorer 11
!
network-monitor watch-pbr-mc enable
!
route-map rmap-pbr-vlan0 deny 10
  match ip address access-list pbr-exclude
!
route-map rmap-pbr-vlan0 deny 11
  match ip address access-list pbr-mc
!
route-map rmap-pbr-vlan0 permit 30
  set interface Tunnel0.0
!
interface GigaEthernet2.0
  ip address 10.0.0.254/24
  ip policy route-map rmap-pbr-vlan0
!
  • IPv4 到達可能ホスト監視event ip reach-hostの監視先IPv4アドレスにpingを打つ端末10.0.0.2、送受信に端末が属するVLANインタフェースGigaEthernet2.0、ネクストホップにVLANのデフォルトゲートウェイ10.0.0.254を指定した。
# WSL
sudo ping -i 10 10.0.0.254
  • probe-timer variance/restorer VARIANCE-WATCH-INT/RESTORE-WATCH-INT
    10秒に1回を表現するために、イベント復旧/発生状態のプローブ間隔を11秒間隔にした。
    • 不用意に経路が変わらないよう、イベント発生は約10回(90%)のpingを条件とした。
    • RESTORE-WATCH-INT x 3秒間pingが来なければイベント復旧で、PBRシーケンスは再び無効になる。
  • watch-group 10は常にイベント発生するため、IPv4 ポリシー無効の設定GigaEthernet2.0に適用されたPBRのSEQ 11は常に無効化される。
    これをIPv4 ポリシー有効の設定で有効化した。
  • 装置起動後に端末から10回pingを受け取って、それが止んでからでないと機能しない点に留意したい。
    show watch-group watch-pbr-mcで動作状況を確認できるが、success時にIPv4 到達可能ホスト監視event ip reach-hostが発生するので混乱しないように。

NTEガチャ 見出しにジャンプ

ヤマハルータではLuaで書いたが、IXではネットワークモニタ機能で表現した。
公式にパフォーマンス目的の使用が想定されており、機能に何ら不足がなかった。
2.18.7.1. RTT(Round Trip Time)監視の例 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

  • 2セッション方式
    GigaEthernet0.1と0.2のPPPoEマルチセッションで、1セッションずつ評価する。GigaEthernet0.2を評価し終わってから、GigaEthernet0.1を評価するため可用性を維持しやすい。
    2セッション分のガチャは結構時間がかかるため、日をまたぐことはザラだ。また、サイバー攻撃の頻度はIPアドレス2つ分、v6プラス比で約546倍になる点に留意しよう。
watch-group watch-nte1 10
  event 19800 ip reach-route 198.51.100.252/32 GigaEthernet0.1
  event 19801 ip reach-route 198.51.100.242/32 GigaEthernet0.1
  event 19802 ip reach-route 198.51.100.249/32 GigaEthernet0.1
  event 20300 ip reach-route 203.0.113.104/32 GigaEthernet0.1
  event 20301 ip reach-route 203.0.113.105/32 GigaEthernet0.1
  probe-counter variance 1
  probe-timer variance 60
  probe-timer restorer 1200
!
watch-group watch-nte1 20
  event 10 sub 10 interface-up GigaEthernet0.2
  event 10 sub 20 interface-down Tunnel126.0
  action 10 turn-BAK-LED-on
  action 20 shutdown-interface GigaEthernet0.1
  action 30 netmeister-switch-mode standby suppress-restration
  probe-counter variance 1
  probe-timer variance 60
  probe-timer restorer 1200
!
network-monitor watch-nte1 enable
network-monitor watch-nte1 startup-delay 200
!
watch-group watch-nte2 10
  event 19800 ip reach-route 198.51.100.252/32 GigaEthernet0.2
  event 19801 ip reach-route 198.51.100.242/32 GigaEthernet0.2
  event 19802 ip reach-route 198.51.100.249/32 GigaEthernet0.2
  event 20300 ip reach-route 203.0.113.104/32 GigaEthernet0.2
  event 20301 ip reach-route 203.0.113.105/32 GigaEthernet0.2
  probe-counter variance 1
  probe-timer variance 60
  probe-timer restorer 1200
!
watch-group watch-nte2 20
  event 10 sub 10 interface-up GigaEthernet0.1
  event 10 sub 20 interface-down Tunnel126.0
  action 10 turn-BAK-LED-on
  action 20 shutdown-interface GigaEthernet0.2
  action 30 netmeister-switch-mode primary suppress-restration
  probe-counter variance 1
  probe-timer variance 60
  probe-timer restorer 1200
!
network-monitor watch-nte2 enable
network-monitor watch-nte2 startup-delay 120
  1. ハズレを引いたらPPPoEセッションを切断し、1200秒寝かせて再接続という流れを、アタリを引くまで繰り返すように書かれている。
    startup-delayで実行順を決め、GigaEthernet0.2を先にガチャする。

ハズレの評価には、PPPoEセッションが確立すると追加されるConnected経路を利用する。

Router# show ip route
...
     198.0.0.0/8 is subnetted, 1 subnets
C      198.51.100.252/32 [0/0] is directly connected, GigaEthernet0.1, 19d22h54m42s
Router(config)# show ppp GigaEthernet0.1
Interface GigaEthernet0.1 is up
  ...
  IPCP status:
    ...
    Peer option(s):
      IP address is 198.51.100.252, compression protocol is disabled
      Primary DNS server is none, secondary DNS server is none

これをIPv4 到達可能経路監視event ip reach-routeで引っ掛ける。show watch-groupでどのPeerアドレスに何回ヒットしたか確認できる。
event SEQ番号で複数イベントを設定すると、イベント発生はOR、復旧はANDで評価される。

  1. PPPoEの切断はインタフェースのシャットダウンaction shutdown-interfaceで行う。
    watch-group watch-nte1とwatch-nte2で対になっており、もう一方のインタフェースがガチャの最中でないことをインタフェースアップ状態監視event interface-upで、VPN接続中のユーザがいないことをインタフェースダウン状態監視event interface-downで確認する。これらをAND条件にするために、ハズレの評価とwatch-group SEQを分けて、sub SEQ番号を使用した。
    既存の接続は切れてしまうが、いずれのインタフェースをデフォルトゲートウェイにしても動作するようにルーティング設定すると、円滑に回線を切り替えられる。同じFQDNで外部からの接続できるよう、NetMeister モード変更netmeister-switch-modeを行う。BAK-LEDを点灯する。

PPPoEセッションを切った瞬間に、問題のPeer経路はなくなるためwatch-group 10は復旧している。切断後1200秒待つために、probe-timer restorer RESTORE-WATCH-INTで評価を遅らせている。
clear watch-group session watch-nte1で、NTEガチャを手動で実行できる。

watch-group 10が復旧すると同時に、watch-group 20はイベント発生中かに関係なく復旧扱いになる。これによりインタフェースのシャットダウンが解かれauto-connectにより再接続される。

  • 1セッション方式
    GigaEthernet0.1と0.2のPPPoEマルチセッションを用いるのは同じだが、常にいずれか1セッションのみ維持する点が異なる。到達性のあるIPv4アドレスは格好の的なので、セッション数を減らしたかった。
    resume-interfacesuppress-restrationが指定できないため、ガチャ中は20分間隔でコネクションが切断され、可用性が低い。切ったセッションに再度繋がってしまうことがあるので、地域やISPによって機能しないかもしれない。
watch-group watch-nte1 10
  event 10 always stand
  action 10 shutdown-interface GigaEthernet0.2
!
watch-group watch-nte1 20
  event 19800 ip reach-route 198.51.100.252/32 GigaEthernet0.1
  event 19801 ip reach-route 198.51.100.242/32 GigaEthernet0.1
  event 19802 ip reach-route 198.51.100.249/32 GigaEthernet0.1
  event 20300 ip reach-route 203.0.113.104/32 GigaEthernet0.1
  event 20301 ip reach-route 203.0.113.105/32 GigaEthernet0.1
  probe-counter variance 1
  probe-timer variance 2
  probe-timer restorer 1200
!
watch-group watch-nte1 30
  event 10 interface-down Tunnel126.0
  action 10 resume-interface GigaEthernet0.2
  action 20 netmeister-switch-mode standby suppress-restration
  action 30 shutdown-interface GigaEthernet0.1
  action 40 turn-BAK-LED-on
  probe-counter variance 1
  probe-timer variance 2
  probe-timer restorer 1200
!
network-monitor watch-nte1 enable

SSEガチャ 見出しにジャンプ

ルータを再起動すると、時折妙に遅いIPv6を掴まされることがある。ガチャ要素があるのはPPPoEだけではないようだ。
公開情報から推測するほかないが、接続の度に変動しているのは最寄りの電話局にある収容ルータ(SSE)と呼ばれる設備だろう。時にRAルータとして一部のサイバー攻撃から顧客を守り、あるいはDHCPv6-PDのPEとして振る舞う多忙なSSEに、感謝の気持ちを込めて再接続したい。

IPoE 方式における収容ルータにおけるユーザー収容の方法は 2 つあり、直接収容方式 (RA (Router Advertisement) と呼ばれるプロトコルを用いて制御する。) と、ルーティング方式 (DHCPv6-PD (Prefix Delegation) と呼ばれるプロトコルを用いて制御する。) がある。この 2 つの方式は、ひかり電話ルータの有無によって使い分けられている (宅内にひかり電話ルータがある場合、収容ルータは RA を話さず...
JANOG54 登 配布資料 2 - 秘密の NTT 電話局、フレッツ光、インターネット入門

IPv6アドレスは変わらないし、リンクマネージャに登録すると分かるが対向の物理アドレスも変わらずあららって感じだし、NGN区間はtracerouteに反応しないため、定量的な評価が難しい。
幸い東日本フレッツ網内のスピードテストサーバで、80/tcpへのHandshakeを用いてRTT計測が可能だ。

# 旧(使用不可)
ping6 www1.syutoken-speed.flets-east.jp
# 新
nmap -6 -Pn -p 80 www1.speed-test.flets-east.jp

このほか、網内のキャッシュDNSやNTPサーバはそれぞれのプロトコルを使用してRTTを計測できる。特にNTPはRTTを加味しなければならないほど精度を求められるため、計測にはもってこいだ。

ntpdはnqpq --peersで簡単にRTTを確認できるが、最近のLinuxはchronydに移行しているので、任意の計測を得にくくなっている。

  1. chronydの計測機能を有効化
# Select which information is logged.
- # log measurements statistics tracking
+ log measurements
sudo systemctl restart chronyd
  1. 計測
    chrony – chronyc(1)
sudo chronyc burst 1/2
sudo tail -F /var/log/chrony/measurements.log

Peer del.を見ればよい。指数表記で10^(-03)がms、10^(-02)が2桁ms程度と覚えておくと読みやすいかも。

========================================================================================================================================
   Date (UTC) Time     IP Address   L St 123 567 ABCD  LP RP Score    Offset  Peer del. Peer disp.  Root del. Root disp. Refid     MTxRx
========================================================================================================================================
2024-09-05 03:21:43 10.0.0.254     N  8 111 111 1111   6  6 0.00  3.301e-03  3.226e-04  9.885e-07  0.000e+00  0.000e+00 821B6E94 4B K K
2024-09-05 03:21:48 2404:1a8:1102::b N  2 111 111 1111   6  6 0.56 -5.642e-03  2.225e-02  2.536e-05  4.791e-03  9.918e-04 85F3EC13 4B K K
2024-09-05 03:21:49 2404:1a8:1102::a N  2 111 111 1111   6  6 0.56 -8.014e-05  8.488e-03  2.326e-05  4.852e-03  9.918e-04 85F3EC13 4B K K
2024-09-05 03:22:47 10.0.0.254     N  8 111 111 1111   6  6 0.00 -9.056e-04  2.062e-04  9.974e-07  0.000e+00  0.000e+00 821B6E94 4B K K
2024-09-05 03:22:53 2404:1a8:1102::b N  2 111 111 1111   6  6 0.47  9.643e-04  8.139e-03  1.290e-05  4.807e-03  9.918e-04 85F3EC13 4B K K
2024-09-05 03:22:54 2404:1a8:1102::a N  2 111 111 1111   6  6 0.47  6.764e-04  8.082e-03  4.079e-06  4.852e-03  9.918e-04 85F3EC13 4B K K
  1. ガチャ
clear interface BVI0

QoS 見出しにジャンプ

高速なconfig表現NTEガチャなどの施策は、ひとえにVDSL環境のQoEを改善するためだ。最後にQoSを設定して、もう一段階ギアを上げたい。

例えばRTT 20msの回線より、RTT 15msの回線の方がQoEは高い。前者が2Gbpsで後者が50Mbpsだったとしてもだ。
第2回 ネットワーク遅延と高速化 | gihyo.jp
この前提を踏まえると、スループットに関係なく、中間機器のパケットバッファの肥大(Bufferbloat)はQoE悪化に直結するといえる。
Bufferbloat – Communications of the ACM

QoSを設定すると、VDSL環境でもWaveformのBufferbloatテストでグレードAが取れる

Bufferbloat and Internet Speed Test - Waveform

Bufferbloatの低減に役立つ技術として、サーバや端末で行われるTCP・UDPの輻輳制御(BBR)から、LinuxのAQMであるfq_codel、ネットワーク機器が介入するRandom Early Detection(RED)が挙げられる。

Cubic will try to fill the bottleneck buffer on the network path, increasing connection latency.
BBR Congestion Control in QUIC and HTTP/3 ⋆ LiteSpeed Blog

Active Queue Management

Bufferbloatは、ボトルネックリンクとなっている中間機器で発生する。ISP側の設備で発生すれば手出しできないかに思われるが、帯域制限を行うことで管理下のIXにボトルネックリンクをつくることができる。
『招待講演3/Rubyで作る最強ゲーミングルータ』奥一穂(Fastly Sr. Principal Engineer)The 30th Anniversary of Ruby - プログラミング言語Ruby30周年記念イベント-

IXは帯域効率の悪いTail Drop Bufferqueue-limitによるロスベースQoSのみ対応している。REDやfq_codelの考え方を参考にしながら、Class-Based Weighted Fair Queueing(CBWFQ)を表現する必要があった。

interface GigaEthernet0.0
  service-policy enable
  service-policy output policy-shape-ge00
  traffic-shape rate 96000000 2400000 2400000
  qos rate-accounting ethernet-overhead
!
interface GigaEthernet2.0
  service-policy enable
  service-policy output policy-shape-ge20
  qos rate-accounting ethernet-overhead
!
interface GigaEthernet0.1
  qos rate-accounting ethernet-overhead
!
interface GigaEthernet0.2
  qos rate-accounting ethernet-overhead
!
interface GigaEthernet2.1
  qos rate-accounting ethernet-overhead
!
interface GigaEthernet2.2
  qos rate-accounting ethernet-overhead
!
interface GigaEthernet2:1.0
  qos rate-accounting ethernet-overhead
!
interface GigaEthernet2:2.0
  qos rate-accounting ethernet-overhead
!
interface GigaEthernet2:3.0
  qos rate-accounting ethernet-overhead
!
interface GigaEthernet2:4.0
  qos rate-accounting ethernet-overhead
!
interface Tunnel0.0
  service-policy output policy-mark-tu00
!
  • 以下を踏まえてpolicy-mapの適用位置を決めた。
    • QoSしたいのはインターネットとの通信だけ
      できればGigaEthernet0.0に設定したいが、実際は……
    • 上りpolicy-shape-ge00: シェーピングtraffic-shape rate & 全てのL3マーキングを剥がすip/ipv6 dscp 0
      • IPv6 IPoEは送信インタフェースGigaEthernet0.0でクラス分け・シェーピングできる。
        cf. 12.1 IPv4 パケット評価 IX2000/IX3000シリーズ 機能説明書
      • IPv4 PPPoEはサブインタフェースGigaEthernet0.1を使うのでGigaEthernet0.0でシェーピングできる

      QoSをベースインタフェースで有効にした場合、同じデバイスに属するすべてのサブインタフェースにも適用されます。QoSをサブインタフェースで有効にした場合、インタフェースごとに設定が有効になります。
      2.25.2. 優先制御/帯域制御の設定方法

      • policy-mark-tu00 IPv4 over IPv6はトンネルインタフェースTunnel0.0を使う。送信インタフェースGigaEthernet0.0では、既に同一のIPIPパケットにカプセル化されているため、トンネルインタフェースTunnel0.0で事前にクラス分けする。
        cf. 12.2 IKEv1/IPsec 送信評価フロー IX2000/IX3000シリーズ 機能説明書
    • 下りpolicy-shape-ge20: シェーピングshape & 一部にL3マーキングip/ipv6 dscp 48/32/8
      • 送信インタフェースGigaEthernet2.0でのみシェーピングできる。受信インタフェース(GigaEthernet0.0, GigaEthernet0.1, Tunnel0.0)ではクラス分け、L3マーキングしか行えない。
        cf. 12.3 IKEv1/IPsec 受信評価フロー IX2000/IX3000シリーズ 機能説明書
        GigaEthernet2.0に設定すると、GigaEthernet2.1はもちろん、GigaEthernet2:1.0のようなポートVLANにも適用される。

      ポートVLAN利用時の基本インタフェースはQoSではサブインタフェースとして扱います。
      2.25.3.2.1. 基本インタフェースにおける帯域制御と優先制御 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

  • 設定変更時はclear policy-map interfaceshow policy-map summaryを見ると歯抜けになっていたりするので、再起動が確実。

policy-map、class-map等に変更があった場合は、従来と同様に即時反映ではありません。設定変更後clear policy-map interfaceを実行
cf. 2.40.3 帯域制御/優先制御設定の注意事項 IX2000/IX3000シリーズ 機能説明書

  • traffic-shape rate 96000000 2400000 2400000 上りの帯域制限。
show policy-map interface GigaEthernet0.0
...
    CIR 96 Mbps, Bc 2400000 bits, Be 2400000 bits, Tc 25 ms

Tc0.025(秒) = Bc2400000(bps) / CIR96000000(bps)
Tcのウィンドウは1ミリ秒までいけるらしいが、パフォーマンスに難がありそうだったので許容できるバーストを鑑みて25ミリ秒程度に。
キリのいいBcをとる中で、CIRはボトルネックリンクがつくられるよう上り回線速度より若干低い値に設定。
2.25.1.3.1. トラフィックシェーピングの動作原理 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
2.25.3.1. 帯域制御の調整 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント

  • 下りのシェーピングはpolicy-mapで設定
  • qos rate-accounting ethernet-overhead

qos rate-accounting 帯域計算対象のフレームサイズ変更 QoS をベースインタフェースのみで設定してサブインタフェースに適用した場合でも、本コマンドは送信インタフェース全てで設定する必要があります
cf. シェーピングの計算に使用するフレームサイズ IX2000/IX3000シリーズ 機能説明書

policy-map 見出しにジャンプ

RFC 4594のクラス分け例RFC 8325のDSCP-to-UP Mapping表を参考に、QoSクラスpolicy-map class、クラスマップclass-map、アクセスリストip/ipv6 access-listを作成した。

IETF Diffserv Service Class DSCP 802.11 User Priority 802.11 Access Category GE0.0 out
policy-shape-ge00
Tunnel0.0 out
policy-mark-tu00
GE2.0 out
policy-shape-ge20
大まかな用途
Network Control CS7 56 0 AC_VO class-up7 セキュリティ, NTP, DNS(in)
CS6 48 class-vo6cs class-vo6cs-tu00 Push通知, NTP
Telephony EF 46 6 class-vo5ef class-vo5ef-tu00 class-up6 STUN・ICE
Signaling CS5 40 5 AC_VI class-vi5cs class-vi5cs-tu00 class-up5 DNS(out), Discord
Multimedia Conferencing AF4 34, 36, 38 4 class-vi4af class-vi4af-tu00 ゲーム(UDP)
Real-Time Interactive CS4 32 class-vi4cs class-vi4cs-tu00 ゲーム(TCP)
Multimedia Streaming AF3 26, 28, 30 class-vi3af class-vi3af-tu00 動画視聴
Broadcast Video CS3 24 class-vi3cs class-vi3cs-tu00

HLSでのYouTube配信

Low-Latency Data AF2 18, 20, 22 3 AC_BE class-be2af class-be2af-tu00 TCPハンドシェイク, SNSのAPI
OAM CS2 16 0 class-be2cs class-be2cs-tu00 class-ipv4
class-ipv6
VPN
High-Throughput Data AF1 10, 12, 14 0 class-be1af (パケットは0にマーキングされている) IPv4とIPv6を同時にtail dropさせない
Standard DF 0 0 class-be0df
Low-Priority Data CS1 8 1 AC_BK class-bk1cs class-bk1cs-tu00 class-up1 OSのアップデート, SNSの画像
policy-map policy-mark-tu00
  class class-be2cs-tu00
    set qos-group 16
  class class-be2af-tu00
    set qos-group 18
  class class-vi3cs-tu00
    set qos-group 24
  class class-vi3af-tu00
    set qos-group 26
  class class-bk1cs-tu00
    set qos-group 8
  class class-vi5cs-tu00
    set qos-group 40
  class class-vo5ef-tu00
    set qos-group 46
  class class-vi4cs-tu00
    set qos-group 32
  class class-vi4af-tu00
    set qos-group 34
  class class-local
  class class-default
!
policy-map policy-shape-ge00
  class class-vo6cs
    bandwidth 58
    set ipv6 dscp 0
  class class-vi5cs
    bandwidth 50
    set ip dscp 0
    set ipv6 dscp 0
  class class-vi3cs
    bandwidth 34
    set ip dscp 0
    set ipv6 dscp 0
  class class-vi3af
    bandwidth 40
    queue-limit 1 1 88 1
    set ip dscp 0
    set ipv6 dscp 0
  class class-bk1cs
    bandwidth 10
    queue-limit 1 1 163 1
    set ip dscp 0
    set ipv6 dscp 0
  class class-be2cs
    bandwidth 26
    set ip dscp 0
    set ipv6 dscp 0
  class class-be2af
    bandwidth 32
    queue-limit 1 1 52 1
    set ip dscp 0
    set ipv6 dscp 0
  class class-vi4cs
    bandwidth 42
    set ip dscp 0
    set ipv6 dscp 0
  class class-vo5ef
    bandwidth 56
    set ip dscp 0
    set ipv6 dscp 0
  class class-vi4af
    bandwidth 48
    set ip dscp 0
    set ipv6 dscp 0
  class class-be1af
    bandwidth 24
    queue-limit 1 1 87 1
    set ip dscp 0
    set ipv6 dscp 0
  class class-be0df
    bandwidth 18
    queue-limit 1 1 78 1
    set ipv6 dscp 0
  class class-local
  class class-default
!
policy-map policy-shape-ge20
  class class-up7
    set ip dscp 0
    set ipv6 dscp 0
  class class-up6
    set ip dscp 48
    set ipv6 dscp 48
  class class-up5
    set ip dscp 32
    set ipv6 dscp 32
  class class-up1
    shape 84000000 2100000 2100000
    queue-limit 1 1 87 1
    set ip dscp 8
    set ipv6 dscp 8
  class class-ipv4
    shape 84000000 2100000 2100000
    queue-limit 1 1 87 1
  class class-ipv6
    shape 84000000 2100000 2100000
    queue-limit 1 1 78 1
  class class-local
  class class-default
!
  • 判定を少しでも高速化するため、DSCP順を崩して、class-map上で矛盾がないような順序で並んでいる。
    疎な構成も可能だが、表の通りCSに対してAFのDSCP値は3つあるので、少なくともCSを先に判定して残りはPrecedenceで扱ったほうが楽だ。

  • CBQの最小予約帯域bandwidthは同時に、重み付けでもある。帯域の予約は最小限とし、重み付けの目的で値を設定した。class-out-be0dfで10 bpsになるように、上の表にある本来のDSCP値に10を足した値にしている。計算されたWeightはshow policy-map interfaceで確認できる。
    2.25. QoSの設定 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
    最小予約帯域割合の設定 — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント

  • 12ものクラスを設け、特に上下ともIPv4class-be1af class-ipv4とIPv6class-be0df class-ipv6でキューを分けているのは、同時刻のバッファオーバーフローを避けるためだ。例えばIXでQoSクラスのないシェーピングを行った場合、デファクトなCUBICが単一のキューを埋めては溢れてFast Recoveryを繰り返すため、帯域を有効に使えない。fq_codelはうまいことやっているが、IXのtail drop bufferで表現するために、デュアルスタックを逆手に取った。
    bandwidth - Why would I need fq_codel? - Network Engineering Stack Exchange

    • IPv6: queue-limit 1 1 78 1 78 BDP/pkts ≒ 96000000 / 8 bytes * RTT 0.010 秒 / 1538 bytes(peak bytes/pkts)
      IPv4: queue-limit 1 1 87 1 87 BDP/pkts ≒ 96000000 / 8 bytes * RTT 0.010 秒 / 1380.14778325123 bytes(peak bytes/pkts)
      帯域とRTTを仮定してBDPを計算し、show policy-map summaryのpeak pkts, bytesを元にパケットサイズで割って、パケット数指定のqueue-limitに記述。海外と国内ではBDPが、ショートパケットとMTUいっぱいのパケットでも違うので、RTT 10msの仮定に意味はなく、異なる条件でもバッファアンダフローが起こらなさそうな値を選んだ。
      前からhigh, medium, normal, lowで、CBQで使うnormal以外は最小値の1
      Updating the Theory of Buffer Sizing - YouTube
      TCP analysis | CS-224-Lectures
  • set ip/ipv6 dscp 0 NGNのQoSに帯域制御されてしまうため、上りではDSCP値は0に戻さなければならない。
    IP通信網 アプリケーションサーバ・網インタフェース(SNI)次世代ネットワークに関する情報 | 公開情報 | 企業情報 | NTT東日本

  • 下りの帯域制限はクラスのトラフィックシェーピングの設定shape 84000000 2100000 2100000で行う。GigaEthernet2.0のout側にはIX発・VLAN間通信も含まれるからだ。WANとLAN共に1Gbpsの帯域を保証できるなら、上りと同様にtraffic-shape rateしてもよい。
    class-up5/6/7はシェーピングされないが、影響は軽微と考えた。上りと違い、下りは既に到着したパケットをベストエフォートで処理するほかなく、Bufferbloatが低減されればそれでよいからだ。

show policy-map interface GigaEthernet2.0
Interface GigaEthernet2.0
...
    Class class-ipv4
...
        CIR 84 Mbps, Bc 2100000 bits, Be 2100000 bits, Tc 25 ms
...
    Class class-ipv6
...
        CIR 84 Mbps, Bc 2100000 bits, Be 2100000 bits, Tc 25 ms
...

class-map 見出しにジャンプ

policy-mapに適用するclass-mapと、class-mapに適用するアクセスリストを定義する。

system qos max-classes 32
!
class-map match-any class-be0df
  match ipv6 access-list pass-list normal
!
class-map match-any class-be1af
  match ip access-list pass-list normal
  match ipv6 access-list class-out-be1af normal
!
class-map match-any class-be2af
  match qos-group 18 normal
  match ipv6 access-list class-out-be2af normal
  match ip access-list class-out-be2af normal
!
class-map match-any class-be2af-tu00
  match ip access-list class-out-be2af normal
!
class-map match-any class-be2cs
  match qos-group 16 normal
  match ipv6 access-list class-out-be2cs normal
  match ip access-list class-out-be2cs normal
!
class-map match-any class-be2cs-tu00
  match ip access-list class-out-be2cs normal
!
class-map match-any class-bk1cs
  match qos-group 8 normal
  match ipv6 access-list class-out-bk1cs normal
  match ip access-list class-out-bk1cs normal
!
class-map match-any class-bk1cs-tu00
  match ip access-list class-out-bk1cs normal
!
class-map match-any class-ipv4
  match ip access-list pass-list normal
!
class-map match-any class-ipv6
  match any normal
!
class-map match-any class-up1
  match ip access-list class-in-up1 normal
  match ipv6 access-list class-in-up1 normal
!
class-map match-any class-up5
  match ip access-list class-in-up5 normal
  match ipv6 access-list class-in-up5 normal
!
class-map match-any class-up6
  match ip access-list class-in-up6 normal
  match ipv6 access-list class-in-up6 normal
!
class-map match-any class-up7
  match ip access-list class-in-up7 normal
  match ipv6 access-list class-in-up7 normal
!
class-map match-any class-vi3af
  match qos-group 26 normal
  match ipv6 access-list class-out-vi3af normal
  match ip access-list class-out-vi3af normal
!
class-map match-any class-vi3af-tu00
  match ip access-list class-out-vi3af normal
!
class-map match-any class-vi3cs
  match qos-group 24 normal
  match ipv6 access-list class-out-vi3cs normal
  match ip access-list class-out-vi3cs normal
!
class-map match-any class-vi3cs-tu00
  match ip access-list class-out-vi3cs normal
!
class-map match-any class-vi4af
  match qos-group 34 normal
  match ipv6 access-list class-out-vi4af normal
  match ip access-list class-out-vi4af normal
!
class-map match-any class-vi4af-tu00
  match ip access-list class-out-vi4af normal
!
class-map match-any class-vi4cs
  match qos-group 32 normal
  match ipv6 access-list class-out-vi4cs normal
  match ip access-list class-out-vi4cs normal
!
class-map match-any class-vi4cs-tu00
  match ip access-list class-out-vi4cs normal
!
class-map match-any class-vi5cs
  match qos-group 40 normal
  match ipv6 access-list class-out-vi5cs normal
  match ip access-list class-out-vi5cs normal
!
class-map match-any class-vi5cs-tu00
  match ip access-list class-out-vi5cs normal
!
class-map match-any class-vo5ef
  match qos-group 46 normal
  match ipv6 access-list class-out-vo5ef normal
  match ip access-list class-out-vo5ef normal
!
class-map match-any class-vo5ef-tu00
  match ip access-list class-out-vo5ef normal
!
class-map match-any class-vo6cs
  match ipv6 access-list class-out-vo6cs normal
!
  • 上りのシェーピングpolicy-shape-ge00では、先にBest EffortなIPv4クラスclass-be1afを評価し、残りをBest EffortのIPv6クラスclass-be0dfとする。
    下りのシェーピングpolicy-shape-ge20では、予め内部トラフィックを除外class-up7し、あとは同じようにIPv4クラスclass-ipv4を先に評価し、残りをIPv6クラスclass-ipv6とする。
    • Best EffortなIPv4クラスclass-be1afでは、IPアクセスリストmatch ip access-listのほか、IPv4 over IPv6match ipv6 access-list class-out-be1afも含む。IPv4 over IPv6のIPIPパケットがすべて含まれるのでなく、MAP-Eインタフェースでの上りのマーキングpolicy-mark-tu00を経てもなおBest Effortだったパケットに限られる。
      • MAP-Eインタフェースでのクラス分けpolicy-mark-tu00qos-groupによってpolicy-shape-ge00へ伝えられる。このためpolicy-shape-ge00のclass-mapのmatch ip access-listはIPv4 PPPoE、match qos-groupはIPv4 over IPv6を引っ掛ける。
    • match input-interfaceの検索処理は高速ではなさそうなので、できる限りアクセスリストキャッシュが効くmatch ip access-listで表現したい。policy-shape-ge00のclass-mapではそのようになっている。アクセスリストキャッシュがどっと増えるので、溢れないようにする
      しかしBVIの性質上、GigaEthernet2.0のpolicy-shape-ge20のclass-mapではIPv6パケットを引っかけられないので、class-ipv6ではmatch anyを使用した。
    インターネット <- [GE0.0 (policy-shape-ge00)] - [Forwarder] - [BVI0 - GE2.0 (policy-shape-ge20)] -> 端末
    

    BVI で受信し、他のインタフェースへ出力する際にQoS 設定で match input-interface を使用する場合、入力インタフェースは GigaEthernet0.0 ではなく、BVI インタフェースとなります。
    出力インタフェースにおいて、入力インタフェースを GigaEthernet0.0 として扱いたい場合は、GigaEthernet0.0 での受信時に QoS グループを設定し、出力インタフェースでは QoS グループを match 条件として使用してください。
    2.9.5.1 クラスベースキューイング(CBQ)/プライオリティキューイング(PQ)(c) 注意事項 IX2000/IX3000シリーズ 機能説明書

  • 意図したクラスに分類されているか、上りはshow policy-map interface GigaEthernet0.0、下りはshow policy-map GigaEthernet2.0を経時的に確認する。WLANを想定した下りの一部パケットはL3マーキングされるため、パケットキャプチャでDSCP値を確認できる。
ip access-list class-in-up1 option optimize
! oura-data-production.s3.amazonaws.com
ip access-list class-in-up1 permit ip src 3.5.0.0/16 dest any
ip access-list class-in-up1 permit ip src 52.216.0.0/14 dest any
! gdmf.apple.com
ip access-list class-in-up1 permit ip src 17.32.0.0/12 dest any
! sync-1-us-west1-g.sync.services.mozilla.com
ip access-list class-in-up1 permit ip src 35.186.227.140/32 dest any
ip access-list class-in-up5 option optimize
! ttvnw.net
ip access-list class-in-up5 permit ip src 45.113.128.0/22 dest any
! profile.accounts.firefox.com
ip access-list class-in-up5 permit ip src 34.110.207.168/32 dest any
! api.accounts.firefox.com
ip access-list class-in-up5 permit ip src 34.117.14.220/32 dest any
! guzzoni.apple.com
ip access-list class-in-up5 permit ip src 54.95.240.153/32 dest any
! Discord ICE
ip access-list class-in-up5 permit udp src any sport gt 1023 dest any dport any
ip access-list class-in-up6 option optimize
ip access-list class-in-up6 permit ip src any dest any dscp 44
ip access-list class-in-up6 permit ip src any dest any dscp 46
! STUN
ip access-list class-in-up6 permit udp src any sport range 3478 3479 dest any dport any
! Discord ICE
ip access-list class-in-up6 permit udp src any sport range 50001 50030 dest any dport any
ip access-list class-in-up6 permit tcp syn src any sport any dest any dport any
ip access-list class-in-up7 option nocache
ip access-list class-in-up7 option optimize
ip access-list class-in-up7 permit udp src any sport eq 53 dest any dport any
ip access-list class-in-up7 permit tcp src any sport eq 53 dest any dport any
ip access-list class-in-up7 permit ip src 0.0.0.0/8 dest any
ip access-list class-in-up7 permit ip src 10.64.0.0/21 dest any
ip access-list class-in-up7 permit ip src 224.0.0.0/3 dest any
ip access-list class-in-up7 permit ip src any dest any precedence 6
ip access-list class-in-up7 permit ip src any dest any precedence 7
ip access-list pass-list option optimize
ip access-list pass-list permit ip src any dest any
ip access-list class-out-be2af option optimize
ip access-list class-out-be2af permit tcp syn src any sport any dest any dport any
! twitter.com x.com
ip access-list class-out-be2af permit ip src any dest 104.244.42.1/32
ip access-list class-out-be2af permit ip src any dest 104.244.42.65/32
ip access-list class-out-be2af permit ip src any dest 104.244.42.129/32
ip access-list class-out-be2af permit ip src any dest 104.244.42.193/32
! api-n-n-n.twitter.com
ip access-list class-out-be2af permit ip src any dest 209.237.192.0/20
ip access-list class-out-be2af permit ip src any dest any precedence 2
! gateway.discord.gg
ip access-list class-out-be2af permit tcp src any sport any dest 162.159.128.0/20 dport any
ip access-list class-out-be2af permit icmp src any dest any
ip access-list class-out-be2cs option optimize
ip access-list class-out-be2cs permit udp src any sport eq 4500 dest any dport any
ip access-list class-out-be2cs permit udp src any sport eq 500 dest any dport any
ip access-list class-out-be2cs permit ip src any dest any dscp 16
ip access-list class-out-bk1cs option optimize
! oura-data-production.s3.amazonaws.com
ip access-list class-out-bk1cs permit ip src any dest 3.5.0.0/16
ip access-list class-out-bk1cs permit ip src any dest 52.216.0.0/14
! Apple backgrounds
ip access-list class-out-bk1cs permit ip src any dest 17.32.0.0/12
! sync-1-us-west1-g.sync.services.mozilla.com
ip access-list class-out-bk1cs permit ip src any dest 35.186.227.140/32
! api-nn-0-0.twitter.com
ip access-list class-out-bk1cs permit ip src any dest 69.195.160.0/19
! Discord
ip access-list class-out-bk1cs permit ip src any dest 162.159.128.0/21
ip access-list class-out-bk1cs permit ip src any dest any dscp 8
ip access-list class-out-vi3af option optimize
ip access-list class-out-vi3af permit ip src any dest any precedence 3
! ttvnw.net
ip access-list class-out-vi3af permit ip src any dest 45.113.128.0/22
! Twitter Live
ip access-list class-out-vi3af permit ip src any dest 146.75.114.164/32
ip access-list class-out-vi3af permit ip src any dest 151.101.110.164/32
ip access-list class-out-vi3af permit ip src any dest 151.101.230.164/32
ip access-list class-out-vi3cs option optimize
ip access-list class-out-vi3cs permit tcp src any sport any dest any dport eq 1935
ip access-list class-out-vi3cs permit ip src any dest any dscp 24
ip access-list class-out-vi4af option optimize
ip access-list class-out-vi4af permit udp src any sport any dest any dport gt 1023
ip access-list class-out-vi4af permit ip src any dest any precedence 4
ip access-list class-out-vi4cs option optimize
ip access-list class-out-vi4cs permit ip src any dest any dscp 32
! profile.accounts.firefox.com
ip access-list class-out-vi4cs permit ip src any dest 34.110.207.168/32
! api.accounts.firefox.com
ip access-list class-out-vi4cs permit ip src any dest 34.117.14.220/32
! guzzoni.apple.com
ip access-list class-out-vi4cs permit ip src any dest 54.95.240.153/32
! Discord ICE
ip access-list class-out-vi4cs permit udp src any sport any dest any dport range 50010 50030
ip access-list class-out-vi4cs permit tcp psh src any sport any dest any dport gt 1023
ip access-list class-out-vi5cs option nocache
ip access-list class-out-vi5cs option optimize
! Do53
ip access-list class-out-vi5cs permit udp src any sport any dest any dport eq 53
ip access-list class-out-vi5cs permit tcp src any sport any dest any dport eq 53
ip access-list class-out-vi5cs permit ip src any dest any dscp 40
ip access-list class-out-vo5ef option optimize
ip access-list class-out-vo5ef permit ip src any dest any precedence 5
! Discord ICE
ip access-list class-out-vo5ef permit udp src any sport any dest any dport range 50001 50030
ip access-list class-out-vo5ef permit udp src any sport any dest any dport range 3478 3479
  • IPv4の上り policy-shape-tu00, policy-shape-ge00
    • class-out-be2af: Prec 2(CS2/AF2), TCP handshake, Web版Twitterのツイート取得, Twitter App API, Discordのメッセージ取得, ICMP
    • class-out-be2cs: DSCP 16(CS2), L2TP/IPsec VPN
    • class-out-bk1cs: DSCP 8(CS1), Oura App, Appleの諸々のバックグラウンド通信, Firefox Send, Twitter App API, Discord
    • class-out-vi3af: Prec 3(CS3/AF3), Twitch, Twitter Live
    • class-out-vi3cs: DSCP 24(CS3), RTMP1935/tcp
    • class-out-vi4af: Prec 4(CS4/AF4), Cloudflare Calls ICE1473/udpやSteam4379-4380/udp 27000-27100/udpを含む1024-65535/udp
      How Cloudflare Glares at WebRTC with WHIP and WHEP - webrtcHacks
      Steamサポート :: Steam接続に必要なポート
      AS32590 Valve Corporation - bgp.he.net
    • class-out-vi4cs: DSCP 32(CS4), Firefox Send, Apple翻訳, Discord画面共有(を期待)50001-50030/udp, 1024-65535/tcp psh
      • Firefoxの「タブを送る」機能はprofile.accounts.firefox.comの後api.accounts.firefox.comの中でaccounts.firefox.comが呼び出されていた。このため特に優先すべきは前2つと考えた。
    • class-out-vi5cs: DSCP 40(CS5) 例: Discordの「サービス品質向上のためパケット優先度設定を有効にする」, Do53のアクセスリストキャッシュ除外
    • class-out-vo5ef: Prec 5(CS5/VA/EF), Discord音声(を期待)50001-50030/udp

スマートデバイスでのVoIPの難しさ 4.アプリケーションに応じたQoS設計 | ネットワンシステムズ
スマートデバイスが抱えるVoIP通信の難しさ ~新たなる潮流「メーカー連携による改善」~ | ネットワンシステムズ

ipv6 access-list class-in-up1 option optimize
! gateway.icloud.com
ipv6 access-list class-in-up1 permit ip src 2403:300:a41:80::/64 dest any
! Microsoft
ipv6 access-list class-in-up1 permit ip src 2603:1030::/36 dest any
! nrt.7.download.windowsupdate.com
ipv6 access-list class-in-up1 permit ip src 2a01:111::/32 dest any
! iosapps.itunes.apple.com updates.cdn-apple.com
ipv6 access-list class-in-up1 permit tcp src 2403:300:a0c::/46 sport any dest any dport any
! Google TCP (Fonts, Backgounds...)
ipv6 access-list class-in-up1 permit tcp src 2404:6800::/32 sport any dest any dport any
! Facebook QUIC Images/Videos
ipv6 access-list class-in-up1 permit udp src 2a03:2880::/32 sport any dest any dport any
ipv6 access-list class-in-up5 option optimize
ipv6 access-list class-in-up5 permit ip src any dest any precedence 3
! googlevideo.com
ipv6 access-list class-in-up5 permit ip src 2001:380::/48 dest any
ipv6 access-list class-in-up5 permit ip src 2404:6800:4004::/53 dest any
ipv6 access-list class-in-up6 option optimize
! NGN NTP
ipv6 access-list class-in-up6 permit ip src 2404:1a8::/34 dest any
! time.gin.ntt.net
ipv6 access-list class-in-up6 permit ip src 2001:418:3ff::/111 dest any
ipv6 access-list class-in-up6 permit ip src any dest any dscp 44
ipv6 access-list class-in-up6 permit ip src any dest any dscp 46
ipv6 access-list class-in-up6 permit tcp syn src any sport any dest any dport any
! courier2.push.apple.com
ipv6 access-list class-in-up6 permit tcp src any sport eq 5223 dest any dport any
! STUN
ipv6 access-list class-in-up6 permit udp src any sport range 3478 3479 dest any dport any
ipv6 access-list class-in-up7 option nocache
ipv6 access-list class-in-up7 option optimize
! Do53
ipv6 access-list class-in-up7 permit udp src any sport eq 53 dest any dport any
ipv6 access-list class-in-up7 permit tcp src any sport eq 53 dest any dport any
! ND
ipv6 access-list class-in-up7 permit ip src 8000::/1 dest any
ipv6 access-list class-in-up7 permit ip src any dest any precedence 6
ipv6 access-list class-in-up7 permit ip src any dest any precedence 7
  • IPv6の下り policy-shape-ge20
    • class-in-up7: Prec 6(CS6), Prec 7(CS7), Do53のアクセスリストキャッシュ除外 実際はほぼDNSなので、アクセスリストキャッシュを無効option nocache
    • class-in-up6: DSCP 44(VA), DSCP 46(EF), STUN, NGNのNTPサーバ, NTT-GINのNTPサーバ, TCP handshake, IPv6化されたAppleプッシュ通知
      • 2404:1a8::/34ならNGNのNTP2404:1a8:1102::a/b/cを含むが、ギリギリDNS2404:1a8:7f01:a/b::3を含まない。
        フィルタ用ACLと違ってセキュリティを担保しないので、ガバガバでよい。
    • class-in-up5: Prec 3(CS3/AF3), YouTube動画, Firefox Send
      • YouTube動画を提供するgooglevideo.comには、ISPキャッシュが存在する。国内で人気の動画やYouTube Liveはここから配信される。
        下記はNTTComのキャッシュサーバで、urlscan.ioで2001:380::/48に向いたホストの不存在を確認した。厳密にはオフラインマップ配信が含まれるrr1---sn-vjoouujvhh-ioql.offline-maps.gvt1.com
      2001:380:0:1600::c # rr1---sn-vjoouujvhh-3pme.googlevideo.com
      2001:380:0:1601::c # rr1---sn-vjoouujvhh-3pml.googlevideo.com
      2001:380:0:1200::c # rr1---sn-vjoouujvhh-hhwe.googlevideo.com
      2001:380:0:1201::c # rr1---sn-vjoouujvhh-hhwl.googlevideo.com
      2001:380:0:1404::c # rr1---sn-vjoouujvhh-ioq6.googlevideo.com
      2001:380:0:1400::c # rr1---sn-vjoouujvhh-ioqe.googlevideo.com
      2001:380:0:1401::c # rr1---sn-vjoouujvhh-ioql.googlevideo.com
      2001:380:0:1402::c # rr1---sn-vjoouujvhh-ioqs.googlevideo.com
      2001:380:0:1403::c # rr1---sn-vjoouujvhh-ioqz.googlevideo.com
      2001:380:0:1900::c # rr1---sn-vjoouujvhh-ipwe.googlevideo.com
      2001:380:0:1901::c # rr1---sn-vjoouujvhh-ipwl.googlevideo.com
      2001:380:0:1100::c # rr1---sn-vjoouujvhh-nqwe.googlevideo.com
      2001:380:0:1101::c # rr1---sn-vjoouujvhh-nqwl.googlevideo.com
      
      Google持ちの2404:6800:4004::/53(東京)は、Google検索などを除外した。
      メモ:Youtubeの国内リクエストナビゲーション(非公式情報) | www.kosho.org
    • class-in-up1: iCloud同期, Windowsアップデート, Appleのアップデート, Googleのバックグラウンド関係, Facebookのメディア
      • WLANのWindowsが帯域を埋めないようにする。Windows Updateはnrt.7.download.windowsupdate.comだけでなく様々なCDNを使うが、DNSシンクホールでうまいことやってるのでこれだけ。
ipv6 access-list class-out-be1af option optimize
ipv6 access-list class-out-be1af permit 4 src any dest any
ipv6 access-list class-out-be2af option optimize
ipv6 access-list class-out-be2af permit ip src any dest any precedence 2
ipv6 access-list class-out-be2af permit tcp syn src any sport any dest any dport any
! ja.wikipedia.org
ipv6 access-list class-out-be2af permit ip src any dest 2001:df2:e500:ed1a::/111
! cdnjs.cloudflare.com
ipv6 access-list class-out-be2af permit ip src any dest 2606:4700::6811:1800/119
! cdn.jsdelivr.net
ipv6 access-list class-out-be2af permit ip src any dest 2a04:4e42::485/128
! Facebook TCP = without Images/Videos
ipv6 access-list class-out-be2af permit tcp src any sport any dest 2a03:2880:f200::/40 dport eq 443
ipv6 access-list class-out-be2af permit icmp src any dest any
ipv6 access-list class-out-be2cs option optimize
ipv6 access-list class-out-be2cs permit ip src any dest any dscp 16
ipv6 access-list class-out-bk1cs option optimize
ipv6 access-list class-out-bk1cs permit ip src any dest any linkmgr sg 1
ipv6 access-list class-out-bk1cs permit ip src any dest any dscp 8
! gateway.icloud.com
ipv6 access-list class-out-bk1cs permit ip src any dest 2403:300:a41:80::/64
! Microsoft
ipv6 access-list class-out-bk1cs permit ip src any dest 2603:1030::/36
ipv6 access-list class-out-bk1cs permit ip src any dest 2606:2800::/32
! media.discordapp.net
ipv6 access-list class-out-bk1cs permit ip src any dest 2606:4700:3032::a29f:8000/116
! nrt.7.download.windowsupdate.com
ipv6 access-list class-out-bk1cs permit ip src any dest 2a01:111::/32
! Facebook QUIC Images/Videos
ipv6 access-list class-out-bk1cs permit ip src any dest 2a03:2880::/32
! iosapps.itunes.apple.com. updates.cdn-apple.com
ipv6 access-list class-out-bk1cs permit tcp src any sport any dest 2403:300:a0c::/46 dport any
! Google TCP (Fonts, Backgounds...)
ipv6 access-list class-out-bk1cs permit tcp src any sport any dest 2404:6800::/32 dport any
! Microsoft Store?
ipv6 access-list class-out-bk1cs permit tcp src any sport any dest 2603:1000::/25 dport any
! Microsoft Bing?
ipv6 access-list class-out-bk1cs permit tcp src any sport any dest 2620:1ec::/36 dport any
! Fastly HTTP/2 (Twitter Images, Videos)
ipv6 access-list class-out-bk1cs permit tcp src any sport any dest 2a04:4e42::/32 dport any
ipv6 access-list class-out-vi3af option optimize
ipv6 access-list class-out-vi3af permit ip src any dest any precedence 3
! googlevideo OCN
ipv6 access-list class-out-vi3af permit ip src any dest 2001:380::/48
! googlevideo.com
ipv6 access-list class-out-vi3af permit ip src any dest 2001:4860::/32
ipv6 access-list class-out-vi3af permit ip src any dest 2404:6800:4003::/53
ipv6 access-list class-out-vi3af permit ip src any dest 2404:6800:4004::/53
ipv6 access-list class-out-vi3af permit ip src any dest 2404:6800:400f::/53
ipv6 access-list class-out-vi3af permit ip src any dest 2607:f8b0:4007::/53
ipv6 access-list class-out-vi3cs option optimize
ipv6 access-list class-out-vi3cs permit ip src any dest any dscp 24
! a.upload.youtube.com
ipv6 access-list class-out-vi3cs permit ip src any dest 2404:6800:4004:80c::200f/128
ipv6 access-list class-out-vi3cs permit ip src any dest 2404:6800:4004:812::200f/128
ipv6 access-list class-out-vi4af option optimize
ipv6 access-list class-out-vi4af permit ip src any dest any precedence 4
ipv6 access-list class-out-vi4af permit udp src any sport any dest any dport gt 1023
ipv6 access-list class-out-vi4cs option optimize
ipv6 access-list class-out-vi4cs permit ip src any dest any dscp 32
ipv6 access-list class-out-vi4cs permit tcp psh src any sport any dest any dport gt 4095
ipv6 access-list class-out-vi5cs option nocache
ipv6 access-list class-out-vi5cs option optimize
ipv6 access-list class-out-vi5cs permit ip src any dest any dscp 40
ipv6 access-list class-out-vi5cs permit udp src any sport any dest any dport eq 53
ipv6 access-list class-out-vi5cs permit tcp src any sport any dest any dport eq 53
ipv6 access-list class-out-vo5ef option optimize
ipv6 access-list class-out-vo5ef permit ip src any dest any precedence 5
! STUN
ipv6 access-list class-out-vo5ef permit udp src any sport any dest any dport range 3478 3479
ipv6 access-list class-out-vo6cs option optimize
! NGN NTP
ipv6 access-list class-out-vo6cs permit ip src any dest 2404:1a8::/34
! time.gin.ntt.net
ipv6 access-list class-out-vo6cs permit ip src any dest 2001:418:3ff::/111
! courier2.push.apple.com
ipv6 access-list class-out-vo6cs permit tcp src any sport any dest any dport eq 5223
  • IPv6の上り policy-shape-ge00
    • class-out-be1af: IPv4 over IPv6のIPIP4
      別途IPv6にIPIPを流している環境で、絞り込む必要があるならBRのアドレスを指定すればよい。
    • class-out-be2af: Prec 2(CS2/AF2), TCP handshake, Wikipedia, cdnjs, jsDelivr, Facebookのメディア以外, ICMPv6
      • 2001:df2:e500:ed1a::/111 ja.wikipedia.orgを含み、ギリギリupload.wikimedia.orgを含まない範囲になっている
    • class-out-be2cs: DSCP 16(CS2)
    • class-out-bk1cs: DSCP 8(CS1), iCloud同期, Windowsアップデート, Appleのアップデート, Googleのバックグラウンド関係, DiscordとFacebookのメディア, Fastly HTTP/2(Twitterのメディアなど色々)
      • 2606:4700:3032::a29f:8000/116 IPv6化したDiscord。media.discordapp.netがHTTP/3に対応し、Protocolで見分けられなくなってしまったため、3ヘクステット目にリージョンコードっぽいものを入れて対応した(IPv6 Hop-Limitを確認)。
      • Twitterの画像・動画CDNは複数社あるが、DNSシンクホールでFastlyを選択したためこれだけ。Twitterの画像を高速に表示したいから、画像の取得を遅らせて、Twitter APIを優先している。
    • class-out-vi3af: Prec 3(CS3/AF3), YouTube動画
    • class-out-vi3cs: DSCP 24(CS3), YouTube HLS
    • class-out-vi4af: Prec 4(CS4/AF4), 1024-65535/udp
    • class-out-vi4cs: DSCP 32(CS4), 4096-65535/tcp
    • class-out-vi5cs: DSCP 40(CS5), Do53のアクセスリストキャッシュ除外
    • class-out-vo5ef: Prec 5(CS5/VA/EF), STUN
    • class-out-vo6cs: NGNのNTPサーバ, NTT-GINのNTPサーバ, Appleプッシュ通知
    • pass-list: Best Effort: それ以外のすべて
ip type-of-service dhcp dscp 8
ip type-of-service dns dscp 40
ip type-of-service ntp dscp 48
!
ipv6 traffic-class dhcp dscp 8
ipv6 traffic-class dns dscp 40
ipv6 traffic-class ntp dscp 48
!
  • 内部機能のQoSはL3マーキングによってのみ行える。
    • 例えばproxy-dnsのDNSクエリを優先させるためには、まずdscp 40(CS5)でマーキングし、上りのシェーピングpolicy-shape-ge00class-out-vi5csが引っ掛けて、CBQされる。
      NGNのQoSにかからないよう、上りのシェーピングpolicy-shape-ge00でマーキングを剝がさなければならない。
      端末への応答もマーキングされ、下りのシェーピングpolicy-shape-ge20(でのマーキング)は素通しできるので、ここでのUP値への変換なしにAC_VIになるDSCP値が望ましい。
    • NTPはdscp 48(CS6), AC_VO