TFTP のブロックサイズ

暫く Cisco 製品を導入していなかったので,最近の IOS の扱いに手間取ってしまいました.設定が出来ない?のではなく,設定後の Config を TFTP サーバーへ転送しようとしてハマりましたw.

c9200l#copy startup-config tftp:
Address or name of remote host []? 
TFTP Server IP_ADDRESS
Destination filename [c9200l-confg]?
!.....
%Error writing tftp://IP_ADDRESS/c9200l-confg (Timed out)!


現役稼働中の 2960X や 4507 (もちろん他ベンダー製品全て)では同じサーバーへ tftp 出来ていたので IOS 17.3.4b で実装が変わったのだと推測.古い tftp サーバーが悪いのかとも思い,切り分けのため急遽 Photon 4.0 に別 tftp サーバーを立てて確認してみることにしました.


tftp サーバーの Install

tdnf でパッケージを確認すると Photon 4.0 では atftp が利用できるのでこれを使ってみます.

root@photon4 [ ~ ]# tdnf list | grep tftp
atftp.x86_64                                0.7.5-1.ph4         photon-updates
atftp-client.x86_64                         0.7.5-1.ph4         photon-updates
atftp.x86_64                                0.7.2-2.ph4         photon-release
atftp-client.x86_64                         0.7.2-2.ph4         photon-release
root@photon4 [ ~ ]# tdnf install atftp

Installing:
atftp                                                x86_64                     0.7.5-1.ph4                         photon-updates                  76.84k 78689

Total installed size:  76.84k 78689
Is this ok [y/N]: y

Downloading:
atftp                                    44904   100%
Testing transaction
Running transaction
Installing/Updating: atftp-0.7.5-1.ph4.x86_64
Created symlink /etc/systemd/system/sockets.target.wants/atftpd.socket → /usr/lib/systemd/system/atftpd.socket.

Complete!


Enable にして,起動させます.

root@photon4 [ / ]# systemctl enable atftpd.socket 
Created symlink /etc/systemd/system/sockets.target.wants/atftpd.socket → /usr/lib/systemd/system/atftpd.socket.
root@photon4 [ / ]# systemctl start atftpd.socket 


Status を確認しましょう.

root@photon4 [ ~ ]# systemctl status atftpd.socket
● atftpd.socket - Tftp Server Socket
     Loaded: loaded (/usr/lib/systemd/system/atftpd.socket; enabled; vendor preset: enabled)
     Active: active (listening) since Wed 2022-04-13 03:38:48 UTC; 1min 59s ago
   Triggers: ● atftpd.service
     Listen: [::]:69 (Datagram)
     CGroup: /system.slice/atftpd.socket

Apr 13 03:38:48 conf-repo systemd[1]: Listening on Tftp Server Socket.
root@photon4 [ ~ ]# systemctl status atftpd.service
● atftpd.service - The tftp server serves files using the trivial file transfer protocol.
     Loaded: loaded (/usr/lib/systemd/system/atftpd.service; indirect; vendor preset: enabled)
     Active: inactive (dead)
TriggeredBy: ● atftpd.socke


systemd はソケットへの接続をトリガーにサービスユニットを起動します.2960X などから tftp すると以下のように tftp server が起動して正しく処理されます.

root@photon4 [ ~ ]# systemctl status atftpd.service 
● atftpd.service - The tftp server serves files using the trivial file transfer protocol.
     Loaded: loaded (/usr/lib/systemd/system/atftpd.service; indirect; vendor preset: enabled)
     Active: active (running) since Wed 2022-04-13 03:44:50 UTC; 1min 22s ago
TriggeredBy: ● atftpd.socket
   Main PID: 669 (atftpd)
      Tasks: 1 (limit: 2382)
     Memory: 356.0K
     CGroup: /system.slice/atftpd.service
             └─669 /usr/sbin/atftpd --user tftp --group tftp /var/lib/tftpboot

Apr 13 03:44:50 photon4 systemd[1]: Started The tftp server serves files using the trivial file transfer protocol..
Apr 13 03:44:50 photon4 atftpd[669]: Advanced Trivial FTP server started (0.7.5)
Apr 13 03:44:50 photon4 atftpd[669]: Fetching from ::ffff:IP_ADDRESS_C2960X to c2960x-confg


ところが,IOS 17 系からだとタイムアウトしていまいます.

root@photon4 [ ~ ]# systemctl status atftpd.service 
( 省略 )
Apr 13 03:45:41 photon4 atftpd[669]: Fetching from ::ffff:IP_ADDRESS_C9200L to c9200l-confg
Apr 13 03:45:46 photon4 atftpd[669]: timeout: retrying...
Apr 13 03:45:51 photon4 atftpd[669]: timeout: retrying...
Apr 13 03:45:56 photon4 atftpd[669]: timeout: retrying...
Apr 13 03:46:01 photon4 atftpd[669]: timeout: retrying..


TFTP のブロックサイズ

Google で検索すると IOS の TFTP ブロックサイズの Default 値は 512 と出てくるものが多かったので完全に騙されていました.IOS 17 系の Default 値はどうも 8192 に変わっているようです.
そこで,9200L で以下の通り設定変更することで漸く config 転送することが出来ました.

c9200l(config)#ip tftp blocksize 512


ただ,Default 値が大きくなったという事は,今後 tftp での転送効率を上げる前提で製品が提供されるはずなので,ブロックサイズの変更無しで tftp したくなるのが管理者の性です./etc/sysconfig/atftpd 内でブロックサイズを指定してみたりしましたが,起動するプロセスを見る限り引数が渡ってないようです.

             └─669 /usr/sbin/atftpd --user tftp --group tftp /var/lib/tftpboot


しかし,よくよく考えると,そもそも Photon の MTU が小さいという事に(やっとここでw)気づきました.

root@photon4 [ / ]# ip address
( 省略 )
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:50:56:aa:52:ed brd ff:ff:ff:ff:ff:ff

( 省略 )


ifconfig で MTU 値を大きくしたらすんなり tftp 成功( atftpd 側での設定は特に不要)!
パーマネントに jumbo frame を受けられるよう,/etc/systemd/network/10-static-en.network に以下追記しました.

[Link]
MTUBytes=9000


これで新しい Catalyst 君たちに 1 行設定追加しなくて良くなりました.Default 値変更程度の情報すら満足に探せない自分の検索スキルに辟易してきたので,今日はこのくらいにしておきます(Photon 以外 VMware 製品全く関係ないし).