Arch Linux で TFTP サーバーを動かす
TFTP とは
Trivial File Transfer Protocol - Wikipedia
Trivial File Transfer Protocol(トリビアル ファイル トランスファー プロトコル、TFTP)は、UDPを用いてコンピュータ間でファイルを転送するためのプロトコルである。FTPに比べて軽量・単純なプロトコルである。認証機能が無いためにユーザ名やパスワードを必要としない。ポート番号69をデフォルトとして使用する。
TFTP はファイル転送に使います。
FTP が比較対象となってますが、2021 年にもなって FTP かよというツッコミはあるかもしれませんが、 FTP や TFTP は組み込み機器などでは現役で使われています。たとえば YAMAHA のルータでも使われています TFTPによるリビジョンアップ
インストール
Arch Linux の wiki https://wiki.archlinux.jp/index.php/TFTP によると実装はいくつかあるらしいですが、ここでは tftp-hpa を使います。 tftp-hpa は kernel.org で提供されている Linux 公式の tftp 実装です https://git.kernel.org/pub/scm/network/tftp/tftp-hpa.git/tree/tftpd
インストールはこれだけです。
% yay -S tftp-hpa
Arch Linux のパッケージ管理は pacman ですが AUR も使いたいので AUR ヘルパーの yay を使っています。pacman でも -S でインストールできるかと。
クライアントとサーバーがインストールされます。
- クライアント tftp
- サーバー tftpd
tftpd の設定ファイルはこれ。引数もシンプルです。
% cat /etc/conf.d/tftpd
TFTPD_ARGS="--secure /srv/tftp/"
起動
systemctl で起動します。
% sudo systemctl start tftpd
ホストで IPv6 を無効にしている場合
ホストで IPv6 を無効にしていると tftpd を起動するときに怒られます。
% sudo systemctl start tftpd
Job for tftpd.service failed because the control process exited with error code.
See "systemctl status tftpd.service" and "journalctl -xeu tftpd.service" for details.
status を見ろといってるので見てます。 IPv6 が無効にされているぞ云々と言っています。
% sudo systemctl status tftpd
× tftpd.service - hpa's original TFTP daemon
Loaded: loaded (/usr/lib/systemd/system/tftpd.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Thu 2021-06-17 13:02:20 JST; 17s ago
Process: 1738126 ExecStart=/usr/bin/in.tftpd --listen $TFTPD_ARGS (code=exited, status=71)
CPU: 2ms
6月 17 13:02:20 archlinux systemd[1]: Starting hpa's original TFTP daemon...
6月 17 13:02:20 archlinux in.tftpd[1738126]: cannot open IPv6 socket, disable IPv6: Address family not supported by protocol
6月 17 13:02:20 archlinux in.tftpd[1738126]: Cannot set nonblock flag on socket: Bad file descriptor
6月 17 13:02:20 archlinux systemd[1]: tftpd.service: Control process exited, code=exited, status=71/OSERR
6月 17 13:02:20 archlinux systemd[1]: tftpd.service: Failed with result 'exit-code'.
6月 17 13:02:20 archlinux systemd[1]: Failed to start hpa's original TFTP daemon.
都合によりこのホストでは IPv6 を無効にしているので怒られています。
というわけでtftp は IPv6 を使わないようにします。
が、 man tftpd しても引数の説明がありません。 (追記) info tftpd
で info ファイルが読めます。が、いずれにせよ ipv4 についてのオプションなどは書かれていないようです。
なので kernel.org の man ファイルを見ます
なんだか記号がたくさんありますが、これは roff フォーマットというものです( Roffの文法 ) 。このファイルを整形すると man で読めるようになりますが、まだ roff のままなので雰囲気で読みます。
すると IPv4 云々という言葉が見えます。
\fB\-\-ipv4\fP, \fB\-4\fP
Connect with IPv4 only, even if IPv6 support was compiled in.
-4
を指定すればよさそうなので指定します。
% cat /etc/conf.d/tftpd
TFTPD_ARGS="-4 --secure /srv/tftp/"
起動させます。
% sudo systemctl start tftpd
問題無さそうです。
% sudo systemctl status tftpd
● tftpd.service - hpa's original TFTP daemon
Loaded: loaded (/usr/lib/systemd/system/tftpd.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2021-06-17 13:12:56 JST; 28s ago
Process: 1746393 ExecStart=/usr/bin/in.tftpd --listen $TFTPD_ARGS (code=exited, status=0/SUCCESS)
Main PID: 1746394 (in.tftpd)
Tasks: 1 (limit: 19033)
Memory: 220.0K
CPU: 1ms
CGroup: /system.slice/tftpd.service
└─1746394 /usr/bin/in.tftpd --listen -4 --secure /srv/tftp/
6月 17 13:12:56 archlinux systemd[1]: Starting hpa's original TFTP daemon...
6月 17 13:12:56 archlinux systemd[1]: Started hpa's original TFTP daemon.
動作確認
tftp サーバーにファイルを用意します。
% sudo sh -c 'echo hogehoge > /srv/tftp/hogehoge'
別のホストか tftp クライアントを実行します。 同じホストから tftp localhost
で接続してもよいかと。
$ tftp 192.168.1.100
tftp> get hogehoge
Received 10 bytes in 0.0 seconds
tftp> quit
ファイルの中身はあっているようです。
$ cat hogehoge
hogehoge
Discussion