10 min read

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

事の発端

メインPCからNASへのiPerf3が同VLANでは速いが異VLANになると速度が落ち込んだ。
具体的には同VLANだと10Gbps弱出るが、異VLANだと6Gbps程度だった。
また、異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,000bytesで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の製品は本当に壊れないことで有名なのでこの先何年だろう、十年単位の時間でよろしく頼むぞ!