TFTP サーバーを構築する。
SERVER
TFTP サーバーをインストールする
たとえばアライドテレシス社の L3 スイッチ CentreCOM 8624EL で、内部に保存している設定ファイルなどを外部サーバーへアップロードしたりダウンロードしたりするときに、TFTP サーバーが必要になります。
今回は CentOS 5.5 で TFTP サーバーを構築する方法について記してみたいと思います。
CentOS 5.5 では TFTP サーバーを構築するためのパッケージとして "tftp-server" が用意されていますので、次のようにして "tftp-server" をインストールします。
yum install tftp-server
これで、平成 23 年 2 月 27 日現在、tftp-server 0.49-2.el5.centosをインストールすることができました。
この時、あわせて "xinetd" パッケージがインストールされました。どうやら "tftp-server" は "xinetd" にネットワーク周りの待ち受けを任せているようです。
既に "xinetd" がインストールされている場合は必要ありませんが、今回のように "xinetd" をインストールしたばかりの場合には、まだ "xinetd" が起動していないと思いますので、次のようにして "tftp-server" が機能するように、"xinetd" を起動させておきます。
chkconfig xinetd on
service xinetd start
"tftp-server" 自体は、次のようにして有効化しておきます。
chkconfig tftp on
これで、とくに "xinetd" を再起動しなくても、TFTP による待ち受けが有効になったようでした。
TFTP サーバーを設定する
"tftp-server" の設定方法としては次のような感じです。
まず、ファイルの保存場所を確認しておきます。インストール直後の環境では、設定ファイル "/etc/xinetd.d/tftp" ファイルを編集すると、"server_args" の値は次のようになっていました。
server_args = -s /tftpboot
TFTP サーバーが扱うファイルは -s オプションで指定した "/tftpboot" ディレクトリー内に保存されることになります。必要に応じてここを編集しておくことで、場所を変更することができます。このディレクトリー自体は、root 所有のパーミッション 755 で問題ないような感じでした。
また、TFTP で通信を行える IP アドレスの許可設定は "/etc/hosts.allow" の中で行います。
in.tftpd: 127.0.0.1
in.tftpd: 192.168.0.0/24
例えば上記のようにすることで、127.0.0.1 (localhost) と 192.168.0.0/24 からのアクセスを許可するという設定になります。
ただ、CentOS 5.5 の場合、標準では "/etc/hosts.deny" が空の設定の様でしたので、上記の設定の有無を問わず、基本的には誰もが "xinetd" 経由でアクセスできるようになっているようでした。
上記のホスト以外のアクセスを禁止したい場合には、"/etc/hosts.deny" に次のように記載しておきます。
in.tftpd: ALL
もし tftp-server だけでなく、原則すべての xinetd へのアクセスを禁止にしておきたい場合には "ALL: ALL" と記載しておきます。
なお、これら "hosts.allow" や "hosts.deny" を編集すると、保存したタイミングで即座に次回から、設定したアクセス制限が有効になります。
それと、注意しておきたいのがパケットフィルターによるファイアーウォールです。
TFTP は 69/UDP でリクエストを待った後、任意のポート番号をつかって接続元と通信を行う仕組みになっているようでした。そのため、ファイアーウォールが設定されている場合には、サーバー上の任意の UDP ポートと外部の任意の UDP ポートとが通信できるようにする必要があります。
つまり、パケットフィルターを利用する場合、自分自身とある IP との双方向で全ての UDP 通信を許可するというとても広い制限を設定しないといけなくなってきてしまいます。
インターネット経由で TFTP アクセスしたい場合などには、アクセス可能なホストを最小限に絞ったり、必要な時だけ UDP を開放するなどの配慮も必要になるかもしれません。
CentreCOM 8624EL で TFTP を使用する
tftp-server の設定が整ったので、L3 スイッチ "CentreCOM 8624EL" から TFTP でファイルを転送してみたいと思います。
CentreCOM 8624EL では、次のコマンドを使用して、本体内のファイルを TFTP サーバーへアップロードすることができるようになっています。
upload file=XXXX.txt server=TFTP-SERVER
このようにすることで、保存されているファイル "XXXX.txt" を "TFTP-SERVER" へアップロードすることができます。
このとき tftp-server の性質上、上記コマンドを実行する前に、TFTP サーバーの -s オプションで指定した "/tftpboot" ディレクトリーに同じ名前のファイルをパーミッション 777 で用意しておく必要があります。
touch /tftpboot/XXXX.txt
chmod 777 /tftpboot/XXXX.txt
このようにして、事前に同名のファイルを準備をしておかないと、TFTP サーバーへのアップロード時に "Error (3048273): File transfer failed with TFTP error 1, File not found (file creation failed)." というエラーが帰ってきてしまいます。
パーミッションが 777 になっていない場合には "Error (3048273): File transfer failed with TFTP error 0, Permission denied (file creation failed)." というエラーが返されました。
もし CentreCOM 8624EL 内にないファイルをアップロードしようとしてしまった場合は "Error (3048288): The specified file was not found on the system." というエラーが返されました。
アップロードに成功した場合には "Info (1048270): File transfer successfully completed." というメッセージが表示されて、TFTP サーバー上に予め用意しておいた同名のファイルが、CentreCOM 8624EL に保存してあった内容で上書きされます。
ちなみに、アップロードコマンド実行時に "Info (1048310): Upload initiated." が表示された後、6 秒ほどして "Error (3048261): No response was received from the TFTP server." というメッセージが帰ってくる場合には、TFTP の通信がどこかで遮断されている可能性があります。
TFTP は 69/UDP で要求を受け付けた後、任意の UDP ポートを使ってファイルのやり取りをする仕組みになっているので、その辺りにも注意しながら、通信経路が開通しているかどうか、調べてみると良いと思います。