UNIVERGE IX2215で、ひかり電話のない環境にデュアルスタックVLANをつくる
ひかり電話契約がない環境(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 |
|
2024-09-18 |
|
2024-09-23 |
|
2024-09-30 |
|
2024-11-11 |
|
ハードウェアの準備 見出しにジャンプ
- 電源ケーブル
IX2215は奥行きが297mmあるため、スペースの都合上L字型を選んだ。
IX2000シリーズ : ハードウェア仕様 : UNIVERGE IXシリーズ | NEC
アイネックス AINEX AC電源ケーブル 極細L型タイプ ACP-15L-BK
- サーマルパッド
製造年が古いものは、PHYチップのサーマルパッドがオイルブリードし、ヒートシンクに接していないものが多い。
大した発熱ではないのだが、それなりに発熱はあるので、メーカー推奨の範囲に収まるようにエアフローなりサーマルパッド交換なりで対応するのが望ましい。私は余っていたアルミ板と熱伝導テープで対処した。
IX2215のサーマルパッド、横から見るとチップから浮いていたので、開けてみたらオイルブリードしてた。 pic.twitter.com/0NT9OHJUXK
— しばにゃん (@shibanyan_1) July 6, 2024
uxcell サークルパッド シリコーン製パッド 熱伝導 ギャップフィラー用 ブルー 2W サイズ100 x 100 x 4mm
温度はWeb GUIやshow environment (history)
で確認できる。IX2215の内部温度上昇分を考慮すると、センサ読みで50°Cを上限としたい。縦置きするか、ちょっとしたエアフローをつくるだけでも改善するだろう。
cf. 動作保証温度範囲内で使用する UNIVERGE IX2000シリーズ 取扱説明書
- シリアルコンソールケーブル
初期コンフィグにsshdも何も入っていないため、シリアルコンソールケーブルが必須。
cf. Web設定マニュアル
どうやらWindowsの標準ドライバで動くのはFTDIチップで、FTDIのコピー品やCH340などはドライバが必要らしい。カーネルモードで下手なドライバが動いていいことなど微塵もないので避けた。
下記は私が使っているもので、追加のインストールなしで認識した。
KAUMO CONSOLE(RJ45) USB変換 コンソールケーブル (パープル 2.0m FTDIチップ)
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
中身を確認する
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 reload
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 見出しにジャンプ
右も左もわからないときは、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.0.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
...
!
- Web GUIの拡張ページにイベントログリファレンスを追加する
cf. 7. 拡張ページ UNIVERGE IX2000/IX3000シリーズ Web設定マニュアル
cf. 2.43.9 拡張ページ IX2000/IX3000シリーズ 機能説明書
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.0.0.254 port 22: error in libcrypto
ssh -V
# OpenSSH_9.8p1, OpenSSL 3.2.2 4 Jun 2024
syslog 見出しにジャンプ
ログを見ずに設定するのは無謀なので、syslogサーバを用意した。
- 古き良き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
- Promtai+Loki+Grafanaで、NATが廃棄したサイバー攻撃を可視化できる。
可視化はGrafanaでって言ったよね - 俺の外付けHDD
- syslogサーバへ送信
syslog ip host 10.0.3.5
- イベントログリファレンスから重要そうなイベントをピックアップ。
syslogを使うなら、IX側にバッファ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 64 65 86 89 94 109 111 112
logging subsystem nmc warn
logging subsystem ppp include 13 176 221
logging timestamp datetime
- flt -- Traffic Filter
- FLT.007 (WARNING)
ACLのdenyログ。suppress-logging
で抑制される - FLT.008 (WARNING)
暗黙のdenyのログ
- FLT.007 (WARNING)
- 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.075 Neighbor solicitation received (INFO)
ICP6.085 Sending neighbor advertisement (INFO)
NDプロキシ環境では時にサイバー攻撃の受信とSSEへの転送要請ログ。これを無視する設定を行えばDoSを防げる。 - ICP6.126 RA received, router ADDRESS, prefix PREFIX, prefix-len PREFIX-LEN, valid lifetime VALID-LIFETIME (DEBUG)
Prefix変更に備えて、上位ルータからのRAで通知されたPrefixをログる。
- ip -- Internet Protocol Version 4
- IP.054 Re-assembly TTL expired
NATがフラグメントを受信NAT.109
したら、再構成を待機し、経過したらICMPで返答してしまう。OUT方向のアクセスリストで止められる。
- IP.054 Re-assembly TTL expired
- ip6 -- Internet Protocol Version 6
- IP6.003 Packet transmission error
QoSでtail dropしたとき。意図しているならおk。
1章 インターネットVPNでの障害切り分け方法(事例2) : 障害切り分けガイドライン : UNIVERGE IXシリーズ | NEC
- IP6.003 Packet transmission error
- 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.054 DIRECTION packet hit ALG service, PROTOCOL SOURCE > DESTINATION on LOCALE
- NAT.061 inbound packet dropped, PROTOCOL SOURCE > DESTINATION, INTERFACE (INFO)
IXのNAPTはFWのため、インターネットからの攻撃ログはほぼこちらに。 - NAT.064 Overlapped static NAT address (INFO)
NAT.065 Overlapped dynamic NAT address (INFO)
ip napt service (staticではない)特有のログ?(未観測) - NAT.072 NAPT Cache API found existing NAPT cache overlapped LOCAL_OR_REMOTE information (INFO)
- NAT.079 ALG service entry overlapped outside port on TARGET (INFO)
- NAT.084 ALG_TYPE released reserve entry, PROTOCOL port START_PORT-END_PORT (INFO)
- NAT.086 destination address is NAPT address (INFO)
STUNのログ、あるいはヘアピン? - NAT.089 CODE NAPT_PORT SRC_INFO > DEST_INFO (NOTICE)
NAT変換のログ - NAT.094 EIM mode entry, PROTOCOL local LOCAL(OUTSIDE) remote REMOTE, INTERFACE (INFO)
ip napt eim-mode
のEIF動作で、Endpointが一致しないパケットが許可されるログ - 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の設定に不整合があったとき
- PDNS.002 Received DNS response from server_address, port port_number, id id, fqdn (DEBUG)
- pdn6 -- Proxy DNS for IPv6
- PDN6.002 Received DNS response from server_address, port port_number, id id, fqdn (DEBUG)
IPv6キャッシュDNSサーバからの応答
- PDN6.002 Received DNS response from server_address, port port_number, id id, fqdn (DEBUG)
- 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の接続ユーザを通知
- PPP.013 Received packet with unsupported protocol 0xUNSUP_PROT, on INTERFACE (WARNING)
sFlow 見出しにジャンプ
可視化はGrafanaでって言ったよね - 俺の外付けHDD
トラフィックをGrafanaで可視化するために、sFlow Agentの設定を行う。
RFC 3176 sFlowは、定期的にサンプルしたパケットを6343/udp宛に送り付けるだけのシンプルなプロトコルなので、SNMPのようにカウンタを初期化したりManagerからのクエリに応答する必要もなく、扱いやすい。
sflow collector ip 10.0.5.14
sflow agent ip 10.0.5.254
!
!
device GigaEthernet0
sflow sampling-rate 2000 in
!
device GigaEthernet2
sflow sampling-rate 2000 in
!
- インターネットとのトラフィックを可視化したいだけなら、GigaEthernet0のin/outに設定すればよい。VLAN間のトラフィックにも対応するには、片方をGigaEthernet2などに設定する必要がある。
sflow sampling-rate 2000
1/2000パケットをsflow collector
に送信
当方VDSLで100Mbps回線だが、装置負荷はどのくらいのトラフィック、正確にはppsか次第だろう。数十Mbpsはザラなので、頻度を上げすぎないようにした。
- 回線速度が 100Mbps で数 Mbps 以上のトラフィックを監視したい
- サンプリングレートは 1/200 以下(設定値 200 以上)を設定してください。
- 回線速度が 1Gbps で数十 Mbps 以上のトラフィックを監視したい
- サンプリングレートは 1/2000 以下(設定値 2000 以上)を設定してください
cf. 2.51.3.1 フローサンプルの調整 IX2000/IX3000シリーズ 機能説明書
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 1200
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 1200
ipv6 nd ra lifetime 5400
ipv6 nd ra retrans-timer 10000
ipv6 nd ra other-config-flag
ipv6 nd ns-interval 1200
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)。そこでACL
wan-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 Swergarbage-time 7200
(秒) 近隣キャッシュが溢れない程度にガベージコレクションしていればよく、短いとNDが増えてよくないとのこと。
RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
0以外の設定値で増えるのはのはユニキャストのNUDなので、バッテリーへの影響なくマルチキャストを減らせる。
- 全てのリンク解決に応答するということは、存在しないIPv6 Suffixへのサイバー攻撃を歓迎してしまう(ICP6.075, 085)。そこでACL
-
ブリッジを有効化
bridge irb enable
し、ND Proxyルータと端末が属するインタフェースを同じbridge-group 100
に所属させる。
no bridge 100 bridge ip
でIPv40x800
とARP0x806
をブリッジさせない(L3ルーティングさせる)。- BVI0で
ipv6 filter
するとIPv6 ACLは一括設定になるが、bridge ipv6 filter
はインタフェース毎に適用できる。
ただし、IPv60x86dd
以外もブリッジングされる点に留意しよう。そのため確実なのはルーティングはIPv4シングルスタックに任せて、ブリッジグループ間の通信をインタフェース単位で拒否するbridge-group 100 port-protected
ことだ。
一応MAC アクセスリストaccess-list
で細かく制御できるが、本分はルータなためか無視できない遅延が発生した。
ブリッジ — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント- IX2215では、bridge-group当たりのインタフェース数は10とある。
cf. 1.2.2.1 Ver.9.6 以降のソフトウェア諸元 IX2000/IX3000シリーズ 機能説明書
しかしbridge-group 100
を10個(BVI0を除く9個)のインタフェースまで設定できるのではなく、若番インタフェースから数えて10個まで対応しているという意味らしい。このため、GigaEthernet2:8.1以降はIPv4シングルスタックとなる。
上限に達すると、Router Solicitation(RS)に返答しなくなる上、ネイティブVLANまでも不安定になる。 bridge 100 aging-time 1200
ラーニングしたソースアドレスの削除IRB.026
が頻発するため、ns-interval
と同値に。show bridge
で各端末のタイムアウトを確認できる。
- IX2215では、bridge-group当たりのインタフェース数は10とある。
- BVI0で
-
フレッツのRA方式では、DHCPv6を使ってISPのキャッシュDNSやNTPサーバが提供される。GigaEthernet0.0のDHCPv6クライアント
dhcpv6-cl
が取得し、ND ProxyルータのBVI0がDHCPv6サーバdhcpv6-sv
で端末に渡す。
一つのDHCPv6サーバを複数で共有するため、どのインタフェースからであっても、通知するdns-server
やntp-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 Hostra min-interval 1350
(秒) MinRtrAdvInterval = 0.75 * MaxRtrAdvInterval
ra max-interval 1800
(秒) MaxRtrAdvIntervalの最大値
これらがルータのRA(端末のRS)間隔を決める。RFC 7772の意図に反しないと思うので最大値。
RFC 4861 IPバージョン6 (IPv6) の近隣探索ra reachable-time 1200
(秒) AdvReachableTimeとND ProxyインタフェースのNUD間隔。IXのデフォルトは0秒、RFCでは30秒が示され、収容ルータは恐らく300秒。
ns-interval 1200
(秒) もNUD間隔に影響してそうだ。IXは0秒、Huaweiの推奨は1200秒、Ciscoの変更例は1700秒、NECの変更例は3000秒。
近隣要請メッセージ送信間隔の設定 — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメント
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 - HuaweiNUDはユニキャストで、上位プロトコルの通信時に発生するだけなのでバッテリーへの影響は少ないはずだが、無駄な確認だから減らした。
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 Advertisementsra 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
- 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
- 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 fe00::/7
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版 ドキュメント
- OCNバーチャルコネクトのMAP BR
2001:380:a120::9
経由のIPIP4
を許可する。
https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
恐らくIXはRFC 7597 Forwarding Mapping Rule(FMR)でのVNE網内折り返しに対応していないが、相手CEが対応している場合、非対称ルーティングが行われる場合がある。FLT\[008\]: BLOCK ipv4
が出るようなら、in-ndp-nolog
でISPの範囲を静的に許可し、ブリッジ間フィルタbvi0-out-ndp
で拒否するとよいと思う。
cf. CEのMesh実装不備による不具合の例 v6プラス を運用してみて ENOG76 Meeting - Outboundでは収容ルータへのDHCPv6 Requestを許可し、InboundではDHCPv6 Replyを許可する。
Requestでは専用のマルチキャストアドレスff02::1:2
宛に通信するため、UDPではなくIPアクセスリストを用いることで処理を減らしている。
IPv6 Multicast Address Space Registry - 近隣探索プロトコル(NDP)のうち、ルータ要請(RS)はOutbound、ルータ広告(RA)はInboundだけ想定すればよい。
近隣要請(NS)ではリンクローカルユニキャストfe80::/10
のほか、Solicited-Nodeマルチキャストアドレスはff02::1:ff00:0/104
も含むようfe00::/7
とした。
IPv6基礎解説 - 20230209-yamanashi-ipv6-okadams.pdf Router Access-listの例
- 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
deny ip src any dest any fragments
フラグメントパケットによる攻撃をロギングする
IPv6 Security Best Practices – The Internet Protocol Blog2400:4000::/22
Bogonには自アドレスも含まれるが、フィルタしようにもPrefixは半固定だ。
ヤマハルータのようにニーモニック指定ra-prefix@lan2::/64
できないので、Hurricane Electric BGP Toolkitなどを利用して程よい粒度で指定しておくとよい。
cf. SEC-4 IPv6家庭用ルータガイドライン(3.0版 2024年2月13日発行)
- 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
- 通すべきICMPv6のみ許可する。
ACLの判定が多いと考えられるから、codeまで指定しなかった。type 1
Destination Unreachabletype 2
Packet Too Bigtype 3
Time Exceeded
IPv4同様に返答はしない。
cf. 4.3.2. Traffic That Normally Should Not Be Dropped RFC 4890: Recommendations for Filtering ICMPv6 Messages in Firewalls
Internet Control Message Protocol version 6 (ICMPv6) Parameterstype 4
Parameter Problem
port-unreachable
Linuxで動くDNSサーバlinkmgr sg 54
のためのSAD DNS対策。うちのUnboundはキャッシュDNSでないため意味ないと思うが、DNSフォワーダがPort Unreachableを返す理由もない。
SAD DNSのICMP rate limitを用いたサイドチャネル攻撃について - knqyf263's blogudp src any sport any dest any dport range 33434 33534
traceroute6の戻りパケットもICMPv6 Time Exceededtype 3
のため、ダイナミックアクセスリストには不要。IPv6ではTCPもSPIするので、意味合いの似たこちらのACLに含めた。type 128
type 129
deny icmp src any dest 2001:db8:b0ba:10ee:53:ff:fe12:3456/128
ICMPv6 Echo Requesttype 128
, Replytype 129
はout-acs-dyn
で許可されているため必要ないが、RIPE Atlas Probeのdenyログを無視するため事前に許可する。
高速化を犠牲にすればローカルDNSレコードのインタフェース指定という手もあるが、たかがログなのでそうしていない。
- 通常のトラフィックをダイナミックフィルタで許可する
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の場合)
このためNECの設定例dflt-list
のようにpermit ip src any dest any
でも何ら問題はない。より強固なセキュリティポリシーでは、戻りパケットはInboundの静的アクセスリストより先に評価されるから、Outboundでホワイトリストを行うとよい。
OCNバーチャルコネクト(動的IP)設定ガイド : UNIVERGE IXシリーズ | NEC
8883/tcp
NetMeisterのMQTTはACLに関係なく許可される2403:300::/32
2620:149::/32
2a01:b740::/32
2a01:b747::/32
Apple443/udp
QUIC80/tcp
HTTP443/tcp
HTTPS22/tcp
諸々のサーバlinkmgr mg 53
のSSH43/tcp
管理者linkmgr sg 43
のWHOIS53/tcp
DNSクライアントlinkmgr mg 53
IXのproxy-dnsはTCPフォールバックしないため、IPv6のブリッジあるいはIPv4のVLAN間フィルタでなく、WAN側で防御する。853/tcp
DNSクライアントlinkmgr mg 53
のDoT。ブリッジ間フィルタで制限がある。873/tcp
RIPE Atlas Probelinkmgr sg 1
のrsync9418/tcp
RIPE Atlas Probelinkmgr mg 53
のGit2404:6800:4008:c00::/56
Gmail IMAPS993/tcp
5228-5230/tcp
FCM メッセージについて | Firebase Cloud Messaging5222/tcp
ネットワークの設定とデバッグ - WhatsApp BusinessプラットフォームオンプレミスAPI27015-27050/tcp
Steam
Steamサポート :: Steam接続に必要なポート2001::/20
2400::/12
日本のIPv6アドレス範囲へのゲーム端末linkmgr mg 53 sg 43
の許可
JPNICが管理を行っているIPv6アドレス一覧 - JPNICicmp type 128
ICMPv6 Echo Request
ブリッジ間アクセスリスト 見出しにジャンプ
GigaEthernet0.0をはじめとするWAN側インタフェースと、GigaEthernet2.0やBVI0のようなLAN側インタフェースでは、IXを中心にIN/OUTが逆向きであることを念頭に置いて見ていこう。
- 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
- DHCPv6-PD環境のIPv6 VLANやIPv4 VLANと同様に、本来ブリッジ間ACLのIN側では、下記のように同セグメント宛の通信をブロックする必要がある。
ipv6 access-list bvi0-in-200 deny ip src any dest 2001:db8:b0ba:10ee::/64
しかしIPv6以外もブリッジされる性質からブリッジ間通信を諦めているため必要ない。ここで解説するACLは、IPv4 VLANのACLと協調した、インターネットへのアクセスコントロールを目的とする。
- 命名規則は
bvi0-方向-インタフェース名から:と.を除いたもの
。管理者・ご家庭向けにbvi0-in-200
、サーバ向けにbvi0-in-210
を用意。- サーバ向けでは、5tupleが一致しないパケットが多かったため、アクセスリストキャッシュを無効化
option nocache
した。
- サーバ向けでは、5tupleが一致しないパケットが多かったため、アクセスリストキャッシュを無効化
linkmgr mg 53
DNSクライアント・サーバにのみ外部のキャッシュDNSへのクエリdport eq 53
とtraceroutedport range 33434 33534
を許可するポリシー。
DNSシンクホールによるセキュリティにおいて、Public DNSを使ったブレークアウトを考慮しなければならないプロトコルはDo5353/udp
, DoT853/tcp
, DoH443/tcp
, DoQ443/udp
。
このうちWAN側のSPIでany許可されているのは、リンクマネージャに登録できないIXのために許可されたDo53と、HTTPSと同じポートを使うDoH。Google2001:4860:4840::/42
やCloudflare2606:4700:4700::/40
のDoHはIPアドレス証明書を使うため、DNSシンクホールでなくIXのL3 FWで対処する。
ChamelDoH インプラント ~DNSトンネリング or DNS over HTTPS (DoH) ?~: NECセキュリティブログ | NEC- SSDP
ff02::c
mDNSv6ff02::fb
のログ抑制
IPv6 Multicast Address Space Registry
もしport-protected
に頼らない設定をする際は、このようなACLを真面目に書いていくことになる。
ERNW WHITEPAPER 62 RA GUARD EVASION REVISITED deny icmp type 134 src any dest any
RA Guard。といっても同一リンク上の詐称を防ぐのはL2のお仕事なので、IXにはどうしようもない。同一ブリッジ別インタフェースの端末には届かないし、IXのND Proxyが騙されることはないと思うが一応。
世界で進むIPv4の品質劣化とIPv6の導入、ところで企業のIPv6対応は? - nakagawa.pdfpermit ip src 2400:4000::/22 dest any
IPv4と同じ考え方で、BVIインタフェースに入る時点で送信元アドレス検証を行い、WAN側のACLをsrc anyで書けるようにした。
cf. SEC-5 IPv6家庭用ルータガイドライン(3.0版 2024年2月13日発行)permit ip src fe80::/10 dest ff02::1:2/128
DHCPv6permit icmp src any dest any
NDP
- 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 見出しにジャンプ
私が使っている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 ufs-cache enable
UFSキャッシュを有効化する
高速アクセスルータ「UNIVERGE IX1000,2000,3000 シリーズ
アクセスルータ「UNIVERGE IX2000/3000シリーズ」
省電力と高性能を両立する小型ルータ「UNIVERGE IX2105- PPPoE
GigaEthernet0.1
GigaEthernet0.2
は副回線のほか、利用可能ポートに制限がないためVPNサーバにも使用する。これがポリシールーティング(PBR)に対応していないため、スタティックルート追加によるデフォルト経路設定ip route default
はVPN用に譲り、VLAN内の端末はPBRによってMAP-ETunnel0.0
にルーティングする。- IPv4はVRFが使えるが、デフォルトゲートウェイを共有したり、異なるVRF間でVLAN間ルーティングができないため、ソースルーティングを選択した。
- 経路優先度
distance 200
を設定すると、NTEガチャによりPPPoEマルチセッションのプライマリGigaEthernet0.1
が落ちたとき、セカンダリGigaEthernet0.2
にルーティングされる。外部からの接続先は、NetMeister DDNS等で制御できる。 ip route
を同じ経路に対して複数書くと、デフォルトip multipath per-packet
でパケット単位にイコールコストマルチパス(ECMP)する。
per-flow
は5tupleが一致しないICMP Unreachableに対応できず、per-flow-fix-interface
は安定性に難があることからおすすめしない。
パケット単位のECMPはDNSクエリを、複数のインタフェースやDNSサーバに分散させるのに使えるが、インタフェース毎に送信元アドレスが異なる以上そのくらいの用途しかない。
cf. 14.9 マルチパス IX2000/IX3000シリーズ 機能説明書
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
- PBRに関係なくiNoniusスピードテストは
GigaEthernet0.2
に、Wi-FiミレルをGigaEthernet0.1
へルーティングした。後者はデュアルスタックのため、IPv4の計測にはDNS設定が必要。
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はISPの契約に合わせてOCNバーチャルコネクト(MAP-E, 動的アドレス)を設定
tunnel mode map-e ocn
ip address map-e
。 -
ICMPリダイレクト
ip redirects
は無効 -
ip tcp adjust-mss auto
IPv6上でカプセル化する都合上、MAP-EのMTU = IPv6のMSSとなる。PMTUDが機能しない殆どのユースケースにおいて、フラグメントを回避するためにMSSクランプを行う。下記でMSSクランプの動作を確認できる。
SpeedGuide.net :: TCP Analyzer
BGP.Tools (MSSが小さく表示される前科あり)
2.9.4. TCP MSS調整 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント -
ip napt enable
MAP-EはCPE側で44 NAPTを行う。no ip napt hairpinning
FMRに基づいた動作ではなく、利用可能ポート外でも自分にヘアピンする。IXにつき1インタフェースにしか設定できないので、私はPPPoEに譲った。
Outside Addressを用いたLANへのアクセスにはヘアピンが必要だし、同じOutside Addressを共有する隣人(同VNE、同収容ルータ)とビデオ通話するなら設定しないほうがよいだろう。
MAP チュートリアル | JANOG31 Meeting
cf. (2) フレッツ光の収容ルータ・中継ルータ・IPv6 関係図 JANOG54 登 配布資料 2 - 秘密の NTT 電話局、フレッツ光、インターネット入門 https://ipv4.web.fc2.com/map-e.htmlip napt eim-mode udp-only
MAP-E(動的アドレス)ではNAT動作が変わり、接続性が低下するため、UDPのみEndpoint-Independent Mapping(EIM)に変えた。- IXのNAPTはFWとして機能するため過度に恐れなくてよいが、NATの外側からの通信をすべて許可する静的NAPT
ip napt static
に限りIN方向のパケットフィルタip filter in
で防御した方がいい。
NATの内側からの通信をトリガーに外側からの通信をすべて許可するEIM/EIFにも同様のリスクがあるため、IN方向のパケットフィルタip filter in-eif-log
とOUT方向のダイナミックアクセスリストip filter out-dyn-nolog
を組み合わせて防御した。
suppress-logging
を用いると拒否ログを省ける。許可ログは制御できないので、NAPTアクセスログを使うとよい。
「suppress-logging」により抑制することが可能なログは「廃棄」のメッセージのみです。「許可」のメッセージの抑制は行いません。
Q.1-7 特定の条件に一致するパケットのみログ出力させることはできますか? -
ip napt translation max-entries per-address 252
RFC 5382が想定する、リソース枯渇攻撃を抑制する。ニチバンベンチttps://www.nichiban.co.jp/product_brand/
やあいち航空ミュージアムttps://aichi-mof.com/
(いずれもCPI-NET)のような、短命なHTTP/1.xコネクションを使うサービスへの対策になる。
OCNバの1008ポートを4で割った値にしているが、セッション単位のカウントなので、EIMでなければ利用可能ポート数を超えてオーバーコミットできる。
NAPTキャッシュのひっ迫状況はshow ip napt translation
やshow ip napt record
で確認できる。
2.10.2.7. NAPTキャッシュ数の制限の設定 - ホスト単位での制限 — IX-R/IX-V 機能説明書 1.1a版 ドキュメント -
ip napt translation *-timeout
NATタイムアウト値はRFC 7857の推奨に合わせた
2.10.2.9. NAPT変換テーブルの保持時間 — IX-R/IX-V 機能説明書 1.1a版 ドキュメントtcp-timeout 7440
ESTABLISHEDなTCPコネクションは、律儀にKeep-Alive間隔の2時間に2MSLを加えた2時間4分。APDMなTCPでポート枯渇するとは考えづらいし、プッシュ通知に影響しない程度の変更では効果がないからだ。- 一時的なフローであるSYN-SENTとCLOSE-WAIT、TIME-WAITは2MSL(4分)が推奨されるが、SYN-SENTはデフォルトの30秒
syn-timeout 30
、TIME-WAITはNEC IXやXG-100NE(v6プラス)のデフォルトの1秒まで減らしたfinrst-timeout 240 1
。終了したTCPコネクションでポートを浪費したくない。
close_waitだとリスクがあるので、time_waitのタイミングでNATテーブルを消去するようにして、新しいコネクションに対してはSO_REUSEADDRをセットしておくことでなんとかなるんじゃないかと思うんですが。
— Yoshifumi Nishida (@nsd) July 16, 2021RFC 9293 - Transmission Control Protocol (TCP)
udp-timeout 120
UDPはEIMにしたので、OCNバの1008ポートとあってもやや心配だ。またNTP123/udp
のタイムアウトが分かれていないのもあり、最低限の2分とした。RFC 6092 REC-14によると、ウェルノ……システムポートなら30秒でもいけるかもしれないが、CloudflareのHTTP/3が切れそうだから。dns-timeout 5
IPv4延命技術においてDo5353/udp
は脅威でしかないので、RFC 6092 REC-15が想定するように、各社CPEおよびCGNATでタイムアウトの短縮が行われている。
特に、DNS トラフィックは通信ごとに発生するため、DNS パケットのタイムアウト値が長いと CGN の性能に影響を与えてしまうことが検証で実証されている。それに対する対策として、DNS 通信については、ポート番号(UDP/53)に基づいてタイムアウト値小さくすることで性能への影響を抑えられることが実証された。
IPv4アドレスの枯渇時に生じる諸課題に適切に対処するための手順書(Vol.2) | IPv4枯渇に係るインターネット新技術導入に向けた検討WG -
ip ufs-cache timeout
UFSキャッシュのタイムアウトはTCPは5分、UDPはNATタイムアウトと同じく2分。show ip ufs-cache
を見るにHits数 / Uptime時間
が大体5分以内に収まっていたので。
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 ECHO
lcp 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 NAT[094]: EIM mode entry, udp local 10.0.0.2:50000(198.51.100.0:12345) remote 3.132.228.249:3479, Tunnel0.0 FLT[007]: BLOCK udp 3.135.212.85:3479 > 10.0.0.2:50000, match in-eif-log, Tunnel0.0 in NAT[094]: EIM mode entry, udp local 10.0.0.2:50000(198.51.100.0:12345) remote 3.135.212.85:3479, Tunnel0.0 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
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アクセスリスト 見出しにジャンプ
- 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 Exceededicmp type 12
Parameter Problem
- 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 icmp type 0 src any dest any
ip access-list in-apdf-log permit udp src any sport any dest any dport any
out-dyn-nolog
を使わないので、ICMP Echo Replyを許可する必要がある
- 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
とした。
- 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
- 説明のない行はIPv6のSPIに同じ
113/tcp
Ident (後述)icmp type 3
ICMP Unreachableicmp type 8
RIPE Atlas Probelinkmgr sg 1
のICMP Echo Request587/tcp
SMTP submission25565/tcp
ゲーム端末linkmgr mg 53
のMinecraftクライアント203.138.0.0/16:8080
Bufferbloatの様子が分かりやすいスピテス
速度測定システム Radish Networkspeed Testing68.67.73.20:8080
TCP MSS教えてくれる子
SpeedGuide.net :: TCP Analyzer
- 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
- 説明のない行はIPv6のSPIに同じ
17.0.0.0/8
世界のIPv4アドレスの1/256を牛耳るApple
エンタープライズネットワークで Apple 製品を使う - Apple サポート (日本)3478-3479/udp
STUN
19302-19309/udp
もあるが、変な用途に使われてそうなので通していない。
Meet の会議とライブ配信用にネットワークを準備する - Google Workspace 管理者 ヘルプ141.101.90.0/24
Cloudflare Calls ICEstun.cloudflare.com
27000-27100/udp
ゲーム端末linkmgr mg 53 sg 43
のSteam50001-50030/udp
Discord ICEicmp type 8
ICMP Echo Request
- 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
- 静的NAPTはNAPTログから除外される
同様に、OUT方向のアクセスリストと重複するログも無駄なので除外deny
する - HTTPS以外のTCP
neq 443/tcp
、QUIC以外のUDPneq 443/udp
をロギングpermit
neqを有効活用して計算量を減らしたい。
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が被る(NAT.064, 065?)から、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 見出しにジャンプ
2.1.3.1. デバイスコンフィグモードとインタフェースコンフィグモード — IX-R/IX-V 機能説明書 1.1a版 ドキュメント
- 基本インタフェース
.0
、タグ無し、管理VLAN
サブインタフェースがあると、そのポートはトランクになる。ネイティブとタグでIPv6 NDの内容が異なるときに、意図せずマルチプレフィクスになってしまったことがあるが、一概にトランクの問題とは言えない。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 vlan02-in-praf 210 in suppress-logging
ip filter vlan-in-all 500 in
ip filter vlan-out-nc 100 out suppress-logging
ip filter vlan5-dyn-telok 111 out suppress-logging
ip filter vlan2-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
!
- サブインタフェース
.2
、タグ付き2
、ご家庭VLAN
サブインタフェースを設定すると、そのポートはトランクになる。802.1qタグに対応したL2スイッチと繋ぐとき、VM環境にトランクで出したいときに使う。アクセスポートにも同じセグメントを割り当てるにはブリッジが使えなくもないが、この記事の趣旨とトレードオフなのと、mDNSは使えない。
ひかり電話なしVLANをつくる際、IPv6ブリッジを併用できるインタフェース番号に制限があるため、IPv6を基準にIPv4をセグメンテーションした方がよい。encapsulation dot1q 101 tpid 8100
IEEE 802.1Qタグを、VID101
で設定。
データリンク設定 — IX-R/IX-V コマンドリファレンス 1.1.55 ドキュメントip policy route-map rmap-pbr-vlan57
管理VLANとは異なるPBRポリシ。
interface GigaEthernet2.2
description home
encapsulation dot1q 2 tpid 8100
no auto-connect
ip address 10.0.2.254/24
no ip redirects
ip dhcp binding dhcp-sv-2
ip filter vlan2-in-nc 100 in suppress-logging
ip filter vlan2-in-smb 201 in suppress-logging
ip filter vlan02-in-praf 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-vlan23
ip ufs-cache timeout tcp 300
ip ufs-cache timeout udp 300
linkmgr enable
proxy-dns ip enable
no shutdown
!
- ポートVLAN
:1-4
のサブインタフェース.1
、タグ付き5
、サーバVLAN
SW-HUB搭載機種は、タグVLANとポートVLANを共存できる。ポートVLANにもサブインタフェースを設定でき、上図のようにVMにトランクで出せる。
タグL2スイッチと違いインタフェースに依存し、VIDを搔い摘んだトランクやアクセスポートは作成できない。
ポートVLANvlan-group
が正しく設定されているか、show vlans
を確認する。
device GigaEthernet2
port 2 shutdown
port 7 shutdown
vlan-group 1 port 1
vlan-group 4 port 2 3 4
vlan-group 7 port 7
vlan-group 8 port 8
!
interface GigaEthernet2:4.0
description pve
...
!
interface GigaEthernet2:4.1
description infra
encapsulation dot1q 5 tpid 8100
no auto-connect
ip address 10.0.5.254/24
no ip redirects
ip filter vlan5-in-nc 100 in suppress-logging
ip filter vlan5-in-telok 111 in suppress-logging
ip filter vlan-in-all 500 in
ip filter vlan5-out-nc 100 out suppress-logging
ip filter vlan0-dyn-ssh 200 out suppress-logging
ip filter vlan5-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
!
...
おうちにサーバ飼ってる人、割と気軽にメンテ出来る鯖はAnsibleとかで一括でアプデ出来るようにしておき、そうではない、アプデがあまり期待が出来ないIoT端末などは別セグメントに隔離して何かしらのFirewallで制御しておきましょう。それが出来ないなら飼うなって保健所の人が言っていました。
— メイラード反応 (@meyskld) July 1, 2024
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設定。
assignable-range
10.0.0.0/24が使えるが、10.0.0.0/25に収まるように設定。lease-time
3日option 42
NTPoption 43
WindowsのNetBIOS over TCP/IPを無効化option 100
TZ Stringoption 101
TZ Databaseoption 162
暗号化DNSを自動設定するDNR。執筆時点でWiresharkが対応していないので自信ない。
RFC 9463: DHCP and Router Advertisement Options for the Discovery of Network-designated Resolvers (DNR)
Draft: Dissector for DHCPv6 DNR (RFC9463) option (!16781) · マージリクエスト · Wireshark Foundation / Wireshark · GitLab
a2
OPTION_V4_DNR 162
28
Length 39 + 1 = 40
00 27
DNR Instance Data Length 2 + 1 + 17 + 1 + 4 + 8 + 6 = 39
00 01
Service Priority
11
ADN Length 17
04 64 6f 74 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00
"dot.example.com." | Format-Hex
の2E
を適宜置き換え
04
Addr Length 4
0a 00 03 05
10.0.3.5
00 01 00 04 03 64 6f 74
SvcParam alpn=dot
00 03 00 02 03 55
SvcParam port=853fixed-assignment
assignable-range
の範囲内で固定割り当てアドレスの追加が可能
MACアドレス制限のかかったネットワークでiOS端末に設定すべきこと | エンタープライズiOS研究所
VLAN間アクセスリスト 見出しにジャンプ
VLANインタフェースのip filter
に適用するアクセスリストの詳解。
Wiresharkを見ずにこのようなVLAN設定は不可能なので、ポートミラーリングを設定してから手を付けよう。
- 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 cache
のn - 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を集約できる。
- 200.のダイナミックアクセスリストを使うインタフェースでは、ネガティブキャッシュのオーバーフローも発生する。
- 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
に収まる。 - SSH
22/tcp
iperf35201/tcp
Cockpit9090/tcp
とICMP Echo Requesticmp type 8
を管理端末linkmgr sg 43
に許可する。 - Canon製プリンタで使われるBJNPプロトコル
8611-8612
を許可する。
- VLANに割り当てられたIP範囲は、CIDR表記で
- コンフィグ更新に使うTFTPでは、サーバは
69/udp
のほかエフェメラルポートを使うので、ポート制限が難しい。
サービス指定の場合のダイナミックフィルタを使うと、簡単に記述できる。
送信元は、TFTPサーバ10.0.3.5
と同じセグメントの10.0.3.254
- 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
からの- グローバルコンフィグモードで設定したNTPサーバ
10.0.0.254/32
- Unbound
10.0.3.5/32
のDo53(TCPフォールバック)53/tcp
とDoT853/tcp
を許可する
- グローバルコンフィグモードで設定したNTPサーバ
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 DNS10.0.0.0/21
VLAN間フィルタ。VLAN間に予期せぬ通信が発生した場合、FLT.007にvlan-in-all
の名前でロギングされる。224.0.0.0/3
IPv6のブリッジ間フィルタと同じく、マルチキャストも転送すべきでない。
こんな夜中にオフィスに出社してトラブルシュート
— たきび | 創意ラボ株式会社 (@tadkinos) February 25, 2024
UniFiのmDNSってデフォルトで有効だったかと思うんだけど、この機能セグメント超えのavahiなんで
15VLANで有効になっててロードアベレージが上がってAPのTxが凶悪な数値になっててチャンネル使用率が殆どTxでbusy
多分不具合の原因これだわー😰
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シリーズ 機能説明書
210.231.212.0/22
iNoniusはip routeで処理するので除外
DNS 見出しにジャンプ
多くのCPEに搭載されているDNSフォワーダは、IX語ではプロキシDNSと呼ぶ。フレッツ系のVNEではIPv4 DNSが提供されないし、使うべきでもないため、IPv4シングルスタック端末には欠かせない存在だ。
IXのプロキシDNSでは色々と事足りないので、プライマリDNSはUnboundに移行したが、IXをプライマリのDNSシンクホールとして利用する場合の設定例も紹介する。
- ACLのドメイン名指定機能を無効化
遅いし使えないので
no dns cache address-database
- シンプルな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動作のためセキュリティに寄与しそうだ。
- HTTPサーバと異なり、
- proxy-dnsはECMP
ip 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
!
- ローカル 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
...
- 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
- 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
ひかりTV4over6.info
国内標準プロビジョニング方式のプロビジョニングサーバrule.map.ocn.ad.jp
OCNバーチャルコネクトのマップルール配信サーバ(外部DNSでもおk) HTTPS RRに応答する性質から、HTTPS RRを活用しているサービスも一緒くたにしている。deny
ルールを用いると簡単に動作確認できるだろう。
url-pdns-block
Cloudflare Zero Trustなど、ブロックに対応した外部のキャッシュDNSへフォワードpermit
することで機能する。
否定応答やdeny
したドメイン名はブロックできない。同じ優先度・下の優先度のキャッシュDNSへ再クエリされるためだ。url-pdns-all
は最も優先度の低いため、否定応答やdeny
したドメイン名がタイムアウトする性質を持つ。外部のキャッシュDNSで対応せずIXでタイムアウトさせたいドメイン名はここに書く。
DDR_dns.resolver.arpa
を、否定応答を返すであろうurl-pdns-ngn
にフォワードしていないのはこのためだ。- OpenDNSはHTTPS RRに応答するようになったため、Cloudflare Zero Trustを設定した。Cloudflare Zero Trustの否定応答はNOERROR ANSWER:1のため、Appleの推奨からはややズレる。
iCloudプライベートリレーに向けたネットワークやWebサーバの準備 - iCloud - Apple Developer
dig @10.0.0.254 crypto.cloudflare.com https
- OpenDNSはHTTPS RRに応答するようになったため、Cloudflare Zero Trustを設定した。Cloudflare Zero Trustの否定応答はNOERROR ANSWER:1のため、Appleの推奨からはややズレる。
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
をモニタポートに、port 7
をミラーポートに設定し、送受信both
をモニタする例。
cf. 2.4.3.2 ポートモニタ設定 IX2000/IX3000シリーズ 機能説明書
device GigaEthernet2
port 1 mirror-port 7 both
vlan-group 7 port 7
!
モニタポートをサクッと切り替えるアクションリスト設定
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 Address
GigaEthernet0.1
GigaEthernet0.2
に行う。L2TP/IPsecはOutside Portには500/udp
と4500/udp
を使う。NATトラバーサルのためESP50
は不要。- アクセス制御はPPPoEインタフェースのIN・OUTで行う。NATのドロップログNAT.061を見るとかなり攻撃が来てるので、自分が使うであろうIP範囲だけ許可することをおすすめする。
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に登録すると、装置の遠隔操作や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
nm ddns notify interface
とnm standby ddns notify interface
は同じDDNSホスト名を共有し、ネットワークモニタで切り替えて使う。nm suppress-feature
ダイナミックDNSddns
があればよかったので、他は無効化。alarm
アラーム送信vpn
ダイナミックVPN設定metrics
メトリクス送信disapproval
不正端末検知port-metrics
SW-HUBのポート毎メトリクス設定
nm logging enable
イベントログをsyslogサーバでなくNetMeisterに送れる。要Prime
イベントログを管理する — NetMeister操作ガイド ドキュメント
ネットワークモニタ 見出しにジャンプ
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
- ハズレを引いたら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で評価される。
- 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-interface
にsuppress-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に移行しているので、任意の計測を得にくくなっている。
- chronydの計測機能を有効化
# Select which information is logged.
- # log measurements statistics tracking
+ log measurements
sudo systemctl restart chronyd
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
- ガチャ
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
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
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シリーズ 機能説明書
- IPv6 IPoEは送信インタフェースGigaEthernet0.0でクラス分け・シェーピングできる。
- 下り
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版 ドキュメント - 送信インタフェースGigaEthernet2.0でのみシェーピングできる。受信インタフェース(GigaEthernet0.0, GigaEthernet0.1, Tunnel0.0)ではクラス分け、L3マーキングしか行えない。
- QoSしたいのはインターネットとの通信だけ
- 設定変更時は
clear policy-map interface
。show 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 | ||||
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ものクラスを設け、特に上下ともIPv4
class-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
「教科書」たとえば RFC 5681 (TCP Congestion Control) はVan Jacobsonの仕事に基づくものですが、参照として挙げられている彼の仕事 (JAC90) にもルータのバッファサイズはBDP以上にしろって書いてあります https://t.co/adXHL1BVoF pic.twitter.com/sKjRWViyB6
— Kazuho Oku (@kazuho) May 10, 2024 - IPv6:
-
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 ...
ip/ipv6 dscp 48/32/8
下りのWLAN向けに、L3マーキングも行う。何もしなければ全て802.11e AC_BEに割り当てられてしまうところ、WMM-EDCAに対応したWi-Fi APにAC_VOやAC_VIへ割り当ててもらい、低遅延を実現する。
例えばDSCP 8にマーキングして大きく遅延するなら、AC_BKに割り当てられているはずだ。
スマートデバイスでのVoIPの難しさ 1.NWでのQoSについて | ネットワンシステムズ
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-tu00
はqos-group
によってpolicy-shape-ge00
へ伝えられる。このためpolicy-shape-ge00
のclass-mapのmatch ip access-list
はIPv4 PPPoE、match qos-group
はIPv4 over IPv6を引っ掛ける。
- MAP-Eインタフェースでのクラス分け
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シリーズ 機能説明書 - Best EffortなIPv4クラス
- 意図したクラスに分類されているか、上りは
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.0.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
- IPv4の下り
policy-shape-ge20
class-in-up7
: Prec 6(CS6), Prec 7(CS7)をDFにマークする、セキュリティ対策
cf. 8.2. Security Recommendations for WLAN QoS RFC 8325 - Mapping Diffserv to IEEE 802.11
VLAN間アクセスリストと同様に、Do53のアクセスリストキャッシュ除外class-in-up6
: DSCP 44(VA), DSCP 46(EF), STUN, Discordの通話, Apple翻訳, TCP handshake
UPではVA/EFはVIからVOに格上げ。
一部のDiscord ICEが確かCS3にマーキングして送ってくることがあるので、その前にマーキング。class-in-up5
: Prec 3(CS3/AF3), Twitch, Firefox Send
UPではPrec 3はBEからVIに格上げ。class-in-up1
: Appleのアップデートカタログ, Firefox Sync, Oura App
エンタープライズネットワークで Apple 製品を使う - Apple サポート (日本)
RFC9632 Geofeedpass-list
: Best Effort: それ以外のすべて
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のメッセージ取得, ICMPclass-out-be2cs
: DSCP 16(CS2), L2TP/IPsec VPNclass-out-bk1cs
: DSCP 8(CS1), Oura App, Appleの諸々のバックグラウンド通信, Firefox Send, Twitter App API, Discordclass-out-vi3af
: Prec 3(CS3/AF3), Twitch, Twitter Liveclass-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.netclass-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つと考えた。
- Firefoxの「タブを送る」機能は
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
Google持ちの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
2404:6800:4004::/53
(東京)は、Google検索などを除外した。
メモ:Youtubeの国内リクエストナビゲーション(非公式情報) | www.kosho.org- YouTube動画を提供するgooglevideo.comには、ISPキャッシュが存在する。国内で人気の動画やYouTube Liveはここから配信される。
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のメディア以外, ICMPv62001: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 HLSclass-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), STUNclass-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-ge00
のclass-out-vi5cs
が引っ掛けて、CBQされる。
NGNのQoSにかからないよう、上りのシェーピングpolicy-shape-ge00
でマーキングを剝がさなければならない。
端末への応答もマーキングされ、下りのシェーピングpolicy-shape-ge20
(でのマーキング)は素通しできるので、ここでのUP値への変換なしにAC_VIになるDSCP値が望ましい。 - NTPは
dscp 48
(CS6), AC_VO
- 例えばproxy-dnsのDNSクエリを優先させるためには、まず