タイトル: TFTP
SEOタイトル: TFTP (Trivial File Transfer Protocol) 完全ガイド
| この記事の要点 |
|
TFTP とは
TFTP (Trivial File Transfer Protocol) は、1981 年 RFC 783、現行版 RFC 1350 で定義された極めて軽量なファイル転送プロトコルです。UDP/69 上で動き、認証や暗号化を持たず、コードサイズが非常に小さいためROM に直接焼けるほどです。
| 項目 | TFTP | FTP | SFTP |
|---|---|---|---|
| プロトコル | UDP/69 | TCP/21 (制御), 20 (データ) | TCP/22 (SSH) |
| 認証 | 無し | パスワード / 匿名 | SSH 鍵 / パスワード |
| 暗号化 | 無し | 無し | あり |
| コード規模 | ★ 極小 | 中 | 大 |
| 用途 | 組込み・PXE | ファイル共有 | 安全な転送 |
TFTP の利用シーン
- PXE (Preboot Execution Environment) Boot: ネットワークから OS をブート(DHCP 経由で next-server / filename を取得 → TFTP でロード)
- ネットワーク機器: Cisco / Juniper の設定ファイル (running-config / startup-config) のバックアップ / リストア
- 組込み機器のファームウェア更新: WAP / VoIP 電話 / プリンタ
- VoIP 電話 (Cisco IP Phone): 起動時に
SEPを TFTP 取得.cnf.xml - シンクライアント: イメージのダウンロード
プロトコル詳細
TFTP は 5 種類のパケット (オペコード) で構成されます。
| Opcode | 名前 | 用途 |
|---|---|---|
| 1 | RRQ (Read Request) | クライアント → サーバ。ファイル取得要求 |
| 2 | WRQ (Write Request) | クライアント → サーバ。ファイル送信要求 |
| 3 | DATA | 512 byte ブロック (最後だけ 0-511 byte) |
| 4 | ACK | 各 DATA への確認応答 |
| 5 | ERROR | エラー通知 |
転送シーケンス例 (Read)
Client Server (UDP/69)
| RRQ "boot.img" "octet" |
|--------------------------------->|
| DATA block#1 (512 byte) | (動的ポート, 以後 UDP/N で通信)
|<---------------------------------|
| ACK block#1 |
|--------------------------------->|
| DATA block#2 (512 byte) |
|<---------------------------------|
| ACK block#2 |
|--------------------------------->|
| ... |
| DATA block#N (< 512 byte) | ← 最後のブロックは 512 未満
|<---------------------------------|
| ACK block#N |
|--------------------------------->|
サイズ制限と拡張
ブロック番号が 16bit で 1 ブロック 512 byte のため、最大 65535 × 512 ≒ 32MB。これを超えるファイルは原則送れません。
| 拡張 | RFC | 機能 |
|---|---|---|
| blksize オプション | RFC 2348 | ブロックサイズを 512 → 65464 まで拡大 |
| timeout オプション | RFC 2349 | タイムアウト値交渉 |
| tsize オプション | RFC 2349 | ファイルサイズ事前通知 |
| windowsize | RFC 7440 | 複数 DATA をまとめて送ってから ACK = スループット向上 |
Linux での TFTP サーバ構築 (tftpd-hpa)
# インストール
sudo apt-get install tftpd-hpa tftp-hpa
# 設定ファイル
sudo vi /etc/default/tftpd-hpa
# TFTP_USERNAME="tftp"
# TFTP_DIRECTORY="/srv/tftp"
# TFTP_ADDRESS=":69"
# TFTP_OPTIONS="--secure --create" # --create で WRQ 受付
# 公開ディレクトリ
sudo mkdir -p /srv/tftp
sudo chown tftp:tftp /srv/tftp
sudo chmod 755 /srv/tftp
# サービス起動
sudo systemctl restart tftpd-hpa
sudo systemctl enable tftpd-hpa
# 動作確認 (クライアント)
tftp 192.168.1.10
tftp> get boot.img
tftp> put config.txt
tftp> quit
# ファイアウォール
sudo ufw allow 69/udp
xinetd 版 (古い RHEL 系)
sudo yum install xinetd tftp-server
sudo vi /etc/xinetd.d/tftp
# disable = no
# server_args = -s /var/lib/tftpboot
sudo systemctl restart xinetd
Windows での TFTP サーバ
| ソフト | 特徴 |
|---|---|
| SolarWinds TFTP Server | 無償。GUI 設定。商用機器ベンダー推奨多数 |
| Tftpd64 / Tftpd32 | 軽量。DHCP / Syslog 機能も統合 |
| WinAgents TFTP Server | 商用、Windows サービス化 |
| Windows 標準 TFTP クライアント | 「プログラムと機能」→ Windows 機能の有効化 で追加 |
Cisco 機器での TFTP 活用
# 設定をバックアップ
Router# copy running-config tftp:
Address or name of remote host []? 192.168.1.10
Destination filename [router-confg]? r1-2026-06-11.cfg
# 設定を投入
Router# copy tftp: running-config
Address or name of remote host []? 192.168.1.10
Source filename []? r1-2026-06-11.cfg
# IOS イメージのアップグレード
Router# copy tftp: flash:
Source filename []? c2900-universalk9-mz.SPA.157-3.M5.bin
# 失敗時の確認
Router# debug tftp
Router# show version
セキュリティの問題
| リスク | 内容 |
|---|---|
| 認証なし | 同一ネットワークから誰でもファイル取得可 |
| 平文転送 | 盗聴で全データ漏洩 |
| UDP のため改ざん検知弱 | 中間者攻撃が容易 |
| WRQ 受付時の上書き | 悪意ある設定ファイル投入 |
対策: 管理 LAN セグメントに限定 / ファイアウォール厳格化 / 一時的起動のみ / 機微情報は置かない。
代替プロトコル
| 用途 | 推奨代替 |
|---|---|
| 機器設定転送 | SCP / SFTP (SSH ベース) |
| 大量ファイル | SFTP / HTTPS |
| PXE Boot 強化 | iPXE 経由で HTTPS Boot |
| 組込み更新 | HTTPS + 署名検証 |
FAQ
Q: TFTP が「Timeout」で繋がらない
A: 多くはファイアウォール。TFTP は最初 UDP/69 → サーバが動的ポートで応答する特殊仕様のため、conntrack 用ヘルパーモジュール (nf_conntrack_tftp) を読み込まないと NAT 越えで失敗します。
Q: ファイルが 32MB を超えて転送できない
A: blksize オプションでブロックサイズを上げる、または windowsize 拡張対応サーバ / クライアントを使います。Cisco IOS は基本的に対応。
Q: TFTP と FTP の名前は似ているが互換性はある?
A: ありません。FTP は TCP 認証ありの全く別プロトコル。TFTP は名前のとおり「Trivial (簡素化)」版で別仕様です。