Dockerでtftpサーバ


はじめに

Dockerでtftpサーバを構築。
特別なことはしてません。

対象機器および環境

検証環境

  • CentOS8(8.1.1911)
  • Docker(19.03.5)
  • tftp-server(5.2)
  • xinetd(2.3.15)

作業内容

firewallでポート許可

tftpサービスを待ち受けるようにサービスを許可しておきます

firewall-cmd --add-service=tftp --zone=public --permanent
firewall-cmd --reload

Dockerイメージの準備

再利用できるようにイメージをつくっておきます。
Dockerfileと設定ファイルを置くための適当なディレクトリを作成しておきます

mkdir -p /opt/docker/tftp
cd /opt/docker/tftp

Dockerfileを作成

/opt/docker/tftp/tftp.df
FROM centos:centos8
RUN dnf -y update ; dnf -y install tftp-server xinetd
COPY tftp /etc/xinetd.d/tftp
CMD [ "/usr/sbin/init" ]

xinetdの設定

tftpをxinetd経由で起動するために、設定ファイルを作成しておきます

/opt/docker/tftp/tftp
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -c -u root -s /var/lib/tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

Dockerfileからイメージをビルドしてコンテナ作成

Dockerfileが作成できたら、ビルドします。
tftpは最初に69/udpで接続しますが、その後ポート番号をネゴってデータ転送するので、bridgeだとポート転送しにくい。
ので、hostネットワークに接続してしまいます。

docker build --force-rm -t infraserv:tftp . -f ./tftp.df && \
docker run --cap-add sys_admin --security-opt seccomp:unconfined  -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
  --network host -it -d --name tftp --hostname tftp   infraserv:tftp

動作確認

手元にあったCiscoのルータで確認

Rdc01#copy run tftp://10.254.10.251/rdc01-config
Address or name of remote host [10.254.10.251]?
Destination filename [rdc01-config]?
!!
11944 bytes copied in 1.112 secs (10741 bytes/sec)

Rdc01#copy tftp://10.254.10.251/rdc01-config flash:
Destination filename [rdc01-config]?
Accessing tftp://10.254.10.251/rdc01-config...
Loading rdc01-config from 10.254.10.251 (via Vlan10): !
[OK - 11944 bytes]

11944 bytes copied in 0.652 secs (18319 bytes/sec)

Rdc01#