| この記事の要点 |
|
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<MAC>.cnf.xmlを TFTP 取得 - シンクライアント: イメージのダウンロード
プロトコル詳細
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 (簡素化)」版で別仕様です。
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15