家の回線をv6プラスにしたところ、外側から特定のポートへアクセスさせたいような用途、つまりこのブログを自宅サーバーから提供することができないことに変更してから気が付いた。 しばらくは FreeBSD で PPPoE を終端して遊んでいたが、うっかりご家庭用のルータであるところの Cisco C891FJを買ってしまった。
とりあえずIOSのバックアップをすべく copy コマンドで自宅のサーバへ IOS をアップロードしようとした。しかし、Permission denied と怒られてアップロードに成功しなかった。
tftp (具体的には tftpd-hpa) サーバでの tftp 127.0.0.1 によるアップロード/ダウンロードはできる。何かがおかしい……
状況を整理
tftpd は 0.0.0.0:69/udp で listen している。 (systemctl start で動かない問題もあったが、それはまた別の問題)
# sudo lsof -i:69
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
in.tftpd 29780 root 4u IPv4 xxxxxxx 0t0 UDP *:tftp
in.tftpd 29780 root 5u IPv6 xxxxxxx 0t0 UDP *:tftp
tftpd root は /srv/tftpboot。こういう挙動をする。
# tftp 127.0.0.1
tftp> get something
Error code 2: Only absolute filenames allowed
tftp> get /something
Error code 2: Forbidden directory
tftp> get /srv/tftpboot/something
Received 7 bytes in 0.0 seconds
IOSでのエラーメッセージはこんな感じ。tftpd は verbose フラグを付けてもだんまり。
#copy flash:c800-universalk9-mz.SPA.153-3.M3.bin tftp://10.0.0.1/srv/tftpboot/ios/
Address or name of remote host [10.0.0.1]?
Destination filename [srv/tftpboot/ios/c800-universalk9-mz.SPA.153-3.M3.bin]?
%Error opening tftp://10.0.0.1/srv/tftpboot/ios/c800-universalk9-mz.SPA.153-3.M3.bin (Permission denied)
なるほど……?
解決方法
ホスト名とパスの間にもう1つ / を足せばよい。つまり tftp://[ホスト名]//パス とすればよい。
#copy flash:c800-universalk9-mz.SPA.153-3.M3.bin tftp://10.0.0.1//srv/tftpboot/ios/
Address or name of remote host [10.0.0.1]?
Destination filename [/srv/tftpboot/ios/c800-universalk9-mz.SPA.153-3.M3.bin]?
!!!!!!!!!!!!!!(snip)!!
68176296 bytes copied in 129.832 secs (525112 bytes/sec)
気付いたきっかけは Destination filename の確認プロンプトだが、まさかこんなところでハマるとは思わなかった。 自宅インフラはトラブルシューティングが99%
最近はご家庭用の Wi-Fi AP であるところの Meraki Go も導入したが、こちらはコンソールに入る必要がないどころかそもそもコンソールポートが存在しない。 なんならインターネットに接続しないと初期セットアップすらできないし、Web設定画面はおまけでメインの設定は iOS / Android アプリから行うハイテク仕様。これがクラウドネイティブアクセスポイントってやつか〜
必要十分に高速で、かつ最高に安定している。おすすめです。