10 min read

基幹L2スイッチをL3スイッチにリプレースした

事の発端

メイン PC から NAS への iPerf3 が同 VLAN では速いが異 VLAN になると速度が落ち込んだ。
具体的には同 VLAN だと 10Gbps 弱出るが、異 VLAN だと 6Gpbs 程度だった。
また、異 VLAN で通信している最中はルーターである IX3315 の CPU 使用率が 97% にも上っていた。

以下にログを貼るが、iPerf3 はメイン PC である実機の Windows ではなく仮想環境の Linux のもの。
そのため仮想化のオーバーヘッドが若干あるかもしれない。

同 VLAN
$ iperf3 -c 10.0.0.4
Connecting to host 10.0.0.4, port 5201
[  5] local 10.0.0.80 port 51236 connected to 10.0.0.4 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  1.07 GBytes  9.20 Gbits/sec  9729   2.39 MBytes       
[  5]   1.00-2.00   sec  1.08 GBytes  9.25 Gbits/sec  5377   1.69 MBytes       
[  5]   2.00-3.00   sec  1.10 GBytes  9.41 Gbits/sec  2409   1.70 MBytes       
[  5]   3.00-4.00   sec  1.09 GBytes  9.36 Gbits/sec  2379   1.09 MBytes       
[  5]   4.00-5.00   sec  1.10 GBytes  9.43 Gbits/sec  513   1.18 MBytes       
[  5]   5.00-6.00   sec  1.10 GBytes  9.42 Gbits/sec  1043   1.44 MBytes       
[  5]   6.00-7.00   sec  1.10 GBytes  9.42 Gbits/sec  1741   1.07 MBytes       
[  5]   7.00-8.00   sec  1.10 GBytes  9.43 Gbits/sec  780   1.33 MBytes       
[  5]   8.00-9.00   sec  1.09 GBytes  9.41 Gbits/sec  1530   1.06 MBytes       
[  5]   9.00-10.00  sec  1.10 GBytes  9.46 Gbits/sec  645   1.15 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  10.9 GBytes  9.38 Gbits/sec  26146            sender
[  5]   0.00-10.00  sec  10.9 GBytes  9.38 Gbits/sec                  receiver

iperf Done.
異 VLAN
$ iperf3 -c 10.0.2.4
Connecting to host 10.0.2.4, port 5201
[  5] local 10.0.0.80 port 55096 connected to 10.0.2.4 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   691 MBytes  5.79 Gbits/sec  1749   2.91 MBytes       
[  5]   1.00-2.00   sec   669 MBytes  5.61 Gbits/sec  1699   3.16 MBytes       
[  5]   2.00-3.00   sec   674 MBytes  5.65 Gbits/sec    0   3.16 MBytes       
[  5]   3.00-4.00   sec   666 MBytes  5.59 Gbits/sec    0   3.17 MBytes       
[  5]   4.00-5.00   sec   799 MBytes  6.70 Gbits/sec    0   3.17 MBytes       
[  5]   5.00-6.00   sec   768 MBytes  6.44 Gbits/sec  1767   2.34 MBytes       
[  5]   6.00-7.00   sec   672 MBytes  5.64 Gbits/sec    0   2.54 MBytes       
[  5]   7.00-8.00   sec   800 MBytes  6.71 Gbits/sec  1417   1.95 MBytes       
[  5]   8.00-9.00   sec   794 MBytes  6.66 Gbits/sec    0   2.24 MBytes       
[  5]   9.00-10.00  sec   900 MBytes  7.55 Gbits/sec    0   2.52 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  7.26 GBytes  6.24 Gbits/sec  6632            sender
[  5]   0.00-10.00  sec  7.26 GBytes  6.24 Gbits/sec                  receiver

iperf Done.
異 VLAN 中の IX3315 負荷
Router# show utilization 
System utilization 97 (description: violent storm)
  868679569 ticks ran last one second
  1366233 worker threads ran last one second
Core utilization
  CPU#0  48%
  CPU#1  21%
  CPU#2  76%
  CPU#3  20%
  CPU#4  97%
  CPU#5  46%
  CPU#6   0%
  CPU#7   6%
Device GigaEthernet2
  Mean transmit util 0%, last transmit util 0%, high transmit util 16%
  Mean receive util 0%, last receive util 0%, high receive util 23%
  Total intervals 112821
Device GigaEthernet3
  Mean transmit util 0%, last transmit util 0%, high transmit util 49%
  Mean receive util 0%, last receive util 0%, high receive util 48%
  Total intervals 112821
(未使用 Device は省略)

現状の構成

ONU → IX3315 → JL682A(L2SW)→ 各機器
という感じの Router on a stick 構成である。

┌───────┐      ┌──────────┐      ┌───────┐
│       │      │          │      │       │─────────▶ 10.0.0.0/24
│  ONU  │─────▶│  IX3315  │─────▶│ L2SW  │─────────▶ 10.0.1.0/24
│       │      │          │      │       │─────────▶ 10.0.2.0/24
└───────┘      └──────────┘      └───────┘─────────▶ 10.0.10.0/24
                    │
                    │ - WAN Routing
                    │ - Inter-VLAN Routing
                    │ - VLAN Tagging
                    │ - DNS Server
                    │ - DHCP Server
                    │ - DHCPv6 Server (DNS only)

異 VLAN 間のルーティングも IX3315 が担っており、その処理性能が完全に足を引っ張っていた。

公式が出している IX3315 のスループット性能を見てみると、フレームサイズ 1,000 bytes で 10Gbps は出ていそう。
しかし実際には出ていない。
公式のスループットはおそらく「ポート to ポート」であり、単一ポートの Router on a stick 構成が悪いのではないだろうかという結論になった。(一緒に調査してくれたオタクありがとう!)

解決策

そのオタクはルーターに古河電工の F310 を使用しており、そちらも Router on a stick 構成なのだが 10Gbps 出ていた。
しかしそれはジャンボフレームが有効の時の話であり、1500 バイトにすると 8.6Gbps 程度になってしまうらしい。

そしてそもそもルーターはソフトウェアでルーティングをしているから遅いらしい。
ハードウェアでルーティングをするものは…?
L3 スイッチだよなぁ?

┌───────┐      ┌──────────┐      ┌───────┐
│       │      │          │      │       │─────────▶ 10.0.0.0/24
│  ONU  │─────▶│  IX3315  │─────▶│ L3SW  │─────────▶ 10.0.1.0/24
│       │      │          │      │       │─────────▶ 10.0.2.0/24
└───────┘      └──────────┘      └───────┘─────────▶ 10.0.10.0/24
                    │                 │
                    │ - WAN Routing   │ - Inter-VLAN Routing
                    │ - DNS Server    │ - VLAN Tagging
                                      │ - DHCP Server
                                      │ - RA (RDNSS)

こうする。
ルーターを本来あるべき WAN と LAN の境界だけに使い、LAN のほうはすべて L3 スイッチに任せる。
こうすればルーティングはハードウェアで行われ、LAN 向けの DHCP なども任せられるため機器の役割をはっきりと分離できる。
あとついでに Android に対応するために DNS サーバーの配り方を DHCPv6 から RDNSS に移行する。

選定

  • 1G RJ45 x8
  • 10G SFP+ x4

最低でもこれらのポートが欲しかった。
メーカーは大手がいいが特に拘りはなく、とりあえず Cisco なら安心じゃね?程度で考えていた。

そんなものをヤフオクで探していると以下のものが出品されており、価格も 99,000 円とお手頃だったためこれを買うことにした。

  • Cisco Catalyst 9300-24T-E V02
    • Firmware: IOS XE 16.09.02
    • 1G RJ45 x24
    • 冗長化電源搭載済み
  • モジュール C9300-NM-8X 付き
    • 10G SFP+ x8

購入と着弾

内部の埃などを吹き飛ばしたいと思って分解したが、すでに清掃されているのか元からなのか、非常に綺麗だった。

ファームウェア

16.09.02 は 2018 年 11 月のバージョンであり非常に古い。
最新の安定版(推奨版)である 17.15.04 にアップグレードする。

Catalyst 9200/9300/9400/9500/9600 プラットフォームの推奨リリース
このドキュメントは、エンタープライズ スイッチング プラットフォーム用の安定したソフトウェアリリースを見つけるのに役立ちます。
Catalyst 9300スイッチのアップグレード
このドキュメントでは、Catalyst 9300スイッチのアップグレード方法について説明します。

といってもここに書いてあることをすればいい。
ただし USB フラッシュメモリから IOS を転送する際は 8GB 以下のものを使わないときちんとファイルを認識してくれなかった。

Switch# install remove inactive
Switch# copy usbflash0:cat9k_iosxe.17.15.04.SPA.bin flash:
Switch# dir flash:
! ファームのダウンロードページに書いてある MD5 ハッシュと比較する
Switch# verify /md5 flash:cat9k_iosxe.17.15.04.SPA.bin
Switch# configure terminal
Switch(config)# no boot system
Switch(config)# boot system flash:packages.conf
Switch(config)# no boot manual
Switch(config)# end
Switch# write memory
Switch# show boot system
! この後勝手に再起動する
Switch# install add file flash:cat9k_iosxe.17.15.04.SPA.bin activate commit
Switch# show version
! 上記のサイトには書いていないがお掃除
Switch# install remove inactive

これだけで 17.15.04 にアップグレードすることができた。

コンフィグ

ルーターでフレッツ網から受け取った /56/60 などで L3SW に再移譲し、L3SW でそれを /64 に分割して各 VLAN に配るだけ。
IX3315 が再移譲に対応していてよかった。ルーターの選定時に正しい選択をしていたようだ…

そこまで難しいコンフィグは書いていないので特に詰まった箇所だけを書いておく。

トランクポート

interface TenGigabitEthernet1/1/4
 switchport trunk native vlan 102
 switchport trunk allowed vlan 102,110
 switchport mode trunk
 switchport nonegotiate
  • native vlan の VLAN であっても allowed vlan に追加しないといけない
  • nonegotiate がないと DTP(Dynamic Trunking Protocol)を送信しやがって繋がらない

IPv4 固定アドレス

ネットの情報では固定したい一つのホストに対して一つのプールを作成しないといけないというのが多く出てくる。
だがそれは嘘。これでいい。

ip dhcp use hardware-address client-id

ip dhcp pool SAMPLE-DHCP-POOL
 network 10.0.0.0 255.255.255.0
 default-router 10.0.0.1
 dns-server 10.0.255.1
 address 10.0.0.10 hardware-address 1234.5678.90ab
 address 10.0.0.11 hardware-address 1a2b.3c4d.5e6f

MAC アドレスは Cisco 特有の 4 桁のドット区切りなので気を付けるべし。

ACL

IoT 機器用の VLAN から他の VLAN にアクセスさせないけど逆はできるやつ。
前に IX2215 で書いたバージョンはここ。

interface Vlan110
 description IoT Network
 ip address 10.0.10.1 255.255.255.0
 ip access-group ACL-IoT-IN in
 ip access-group ACL-IoT-OUT out

ip access-list extended ACL-IoT-IN
 remark === Allow return packets ===
 evaluate IoT-SESSIONS
 remark === Allow DNS server access ===
 permit udp any host 10.0.255.1 eq domain
 permit tcp any host 10.0.255.1 eq domain
 remark === Deny access to internal VLANs ===
 deny ip any 10.0.0.0 0.0.0.255
 deny ip any 10.0.1.0 0.0.0.255
 deny ip any 10.0.2.0 0.0.0.255
 deny ip any 10.0.255.0 0.0.0.3
 remark === Allow Internet access ===
 permit ip any any

ip access-list extended ACL-IoT-OUT
 permit tcp any any reflect IoT-SESSIONS timeout 300
 permit udp any any reflect IoT-SESSIONS timeout 120
 permit icmp any any reflect IoT-SESSIONS timeout 60
 permit ip any any

解説は remark に書いてある通り。
IX2215 時代は「他 VLAN から通信があった時に時限的にそのホストに対してはなんでも許可する」といった緩い ACL だったが、今回から「他 VLAN から通信があった時にその戻りパケットだけは許可する」というかなり厳格な ACL にすることができた。
これだけでそれが実現できる Reflexive ACL とかいうやつはすごい。

トランシーバーについて

Cisco はサードパーティ製の SFP+ のトランシーバーを使うことができる。
具体的にはコンフィグに以下の 2 行を投入することで警告すら出さずに使わせてくれる。

service unsupported-transceiver
no errdisable detect cause gbic-invalid

当初これを使って L2SW から流用した FS 製の HPE Aruba 互換の SFP+ トランシーバー(#92098)を使っていた。
しかし何気なくヤフオクを見ていると、Cisco 純正の SFP+ のトランシーバーが 10 個 1 万円で出ていた。
コンフィグに余計な 2 行があるのも気になるので買って換装し、2 行は削除した。

そして換装後に気付いたことではあるが、FS の HPE Aruba 互換だと光パワーが強すぎるという警告が 10 分おきにずっと出ていた。
換装後には一度も出ていないため、やはり純正(または Cisco 互換)のトランシーバーを使うべきかと思う。

Feb  7 15:19:15.490: %SFF8472-3-THRESHOLD_VIOLATION: Te1/1/1: Rx power high warning; Operating value:  -0.76 dBm, Threshold value:  -1.00 dBm.
Feb  7 15:29:17.850: %SFF8472-3-THRESHOLD_VIOLATION: Te1/1/1: Rx power high warning; Operating value:  -0.74 dBm, Threshold value:  -1.00 dBm.
Feb  7 15:39:20.199: %SFF8472-3-THRESHOLD_VIOLATION: Te1/1/1: Rx power high warning; Operating value:  -0.74 dBm, Threshold value:  -1.00 dBm.
Feb  7 15:49:22.560: %SFF8472-3-THRESHOLD_VIOLATION: Te1/1/1: Rx power high warning; Operating value:  -0.74 dBm, Threshold value:  -1.00 dBm.

設置

速度

一番上でやったのと同じ条件で再度 iPerf3 をやってみる。

同 VLAN
$ iperf3 -c 10.0.0.4
Connecting to host 10.0.0.4, port 5201
[  5] local 10.0.0.80 port 49198 connected to 10.0.0.4 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  1.08 GBytes  9.24 Gbits/sec  8300   1.24 MBytes       
[  5]   1.00-2.00   sec  1.10 GBytes  9.42 Gbits/sec  2241   1.36 MBytes       
[  5]   2.00-3.00   sec  1.10 GBytes  9.48 Gbits/sec    0   1.63 MBytes       
[  5]   3.00-4.00   sec  1.09 GBytes  9.35 Gbits/sec  4023   1.46 MBytes       
[  5]   4.00-5.00   sec  1.10 GBytes  9.46 Gbits/sec  1220   1.23 MBytes       
[  5]   5.00-6.00   sec  1.10 GBytes  9.47 Gbits/sec  401   1.53 MBytes       
[  5]   6.00-7.00   sec  1.10 GBytes  9.43 Gbits/sec  1727   1.26 MBytes       
[  5]   7.00-8.00   sec  1.10 GBytes  9.49 Gbits/sec    0   1.77 MBytes       
[  5]   8.00-9.00   sec  1.09 GBytes  9.34 Gbits/sec  2756   1.38 MBytes       
[  5]   9.00-10.00  sec  1.11 GBytes  9.49 Gbits/sec    0   1.79 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  11.0 GBytes  9.42 Gbits/sec  20668            sender
[  5]   0.00-10.00  sec  11.0 GBytes  9.42 Gbits/sec                  receiver

iperf Done.
異 VLAN
$ iperf3 -c 10.0.2.4
Connecting to host 10.0.2.4, port 5201
[  5] local 10.0.0.80 port 46232 connected to 10.0.2.4 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  1.09 GBytes  9.39 Gbits/sec  3846    989 KBytes       
[  5]   1.00-2.00   sec  1.10 GBytes  9.45 Gbits/sec  212    954 KBytes       
[  5]   2.00-3.00   sec  1.10 GBytes  9.46 Gbits/sec    7    880 KBytes       
[  5]   3.00-4.00   sec  1.10 GBytes  9.47 Gbits/sec    5    977 KBytes       
[  5]   4.00-5.00   sec  1.10 GBytes  9.47 Gbits/sec    4   1008 KBytes       
[  5]   5.00-6.00   sec  1.10 GBytes  9.47 Gbits/sec    6   1.14 MBytes       
[  5]   6.00-7.00   sec  1.09 GBytes  9.40 Gbits/sec  2199    988 KBytes       
[  5]   7.00-8.00   sec  1.10 GBytes  9.47 Gbits/sec    6   1.09 MBytes       
[  5]   8.00-9.00   sec  1.10 GBytes  9.47 Gbits/sec    7   1.10 MBytes       
[  5]   9.00-10.00  sec  1.10 GBytes  9.46 Gbits/sec    9   1001 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  11.0 GBytes  9.45 Gbits/sec  6301            sender
[  5]   0.00-10.00  sec  11.0 GBytes  9.45 Gbits/sec                  receiver

iperf Done.

すばらしい。
どちらでも全く同じ速度が出ており、どこもボトルネックになっていそうな箇所がない。

L3SW の使用率も見てみたかったのだが、コマンドがありすぎてどれを見たら良いのかがわからなかった。
ハードウェアルーティングなので CPU 使用率はもちろんアイドル時と同じ 0% ~ 1% だった。
ASIC の使用率を知りたくていろんなコマンドを叩いてみたが、どれもそんなに値が変化していないように見え、これもうわかんねえな。
誰か良さげなコマンドを知ってたら至急、連絡くれや。

というかもしかすると 10Gbps なんてゴミレベルの通信すぎて見えるような負荷ではないかもしれない。
そもそも SFP+ のポートが 8 つもあるので、それをフルロードしてやっと負荷が見えてくるのかも。

おわり

異 VLAN でも速度が低下することがなくなって非常によかった。
また副次的ではあるが、ルーターにすべてが集中してしまう Router on a stick 構成から脱却することができたのもよかった。(むしろこちらが主であるべきなのかもしれない)
やはり餅は餅屋でルーターと L3SW でそれぞれの得意分野があるのだなということを実感した。
10Gbps をきちんと処理しきれるルーターはほぼ?存在しないようなので、これから 10G 環境にする人やうちもそんな構成だ…と感じる人がいたらぜひ L3SW の導入を検討、というか導入してほしい。

そういえば Twitter でも報告を忘れていたが、安定稼働時の Catalyst 9300 の動作音は 1m 弱離したところで約 50dB だった。
静音化したルーターのほうがこれよりも若干うるさいくらいなので、一般家庭にも置けるように作られているのは非常に高ポイントである。

そんな感じで騒音も思っていたほどではなく、約 100W の電力を消費し続ける点だけが気になりポイントになった。
なので悪あがきとして家中の白熱電球を LED 電球にリプレースし始めた。
ネットワークの最適化が家の最適化にまで影響するなんて…
みんなもネットワークを見直してみると新しい発見があるかもしれないよ。おすすめ。

最後に、Cisco の製品は本当に壊れないことで有名なのでこの先何年だろう、十年単位の時間でよろしく頼むぞ!