🐙

Arch Linux で TFTP サーバーを動かす

4 min read

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...
 617 13:02:20 archlinux in.tftpd[1738126]: cannot open IPv6 socket, disable IPv6: Address family not supported by protocol
 617 13:02:20 archlinux in.tftpd[1738126]: Cannot set nonblock flag on socket: Bad file descriptor
 617 13:02:20 archlinux systemd[1]: tftpd.service: Control process exited, code=exited, status=71/OSERR
 617 13:02:20 archlinux systemd[1]: tftpd.service: Failed with result 'exit-code'.
 617 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 ファイルを見ます

https://git.kernel.org/pub/scm/network/tftp/tftp-hpa.git/tree/tftpd/tftpd.8.in

なんだか記号がたくさんありますが、これは 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...
 617 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