TFTP-Server unter CentOS 6.x einrichten

Für unseren Installationsserver benötigen wir einen TFTP-Server, der die Auslieferung der nötigen Dateien für den PXE-Bootvorgang bereitstellt und ausliefert.

TFTP-Server

Als erstes installieren wir uns die für den TFTP-Server notwendigen Pakete via yum.

 #  yum install syslinux tftp-server -y

Bei Bedarf informieren wir was bei der Installation der einzelnen Pakete im System installiert wurde.

syslinux

 # rpm -qil syslinux
Name        : syslinux                     Relocations: (not relocatable)
Version     : 3.86                              Vendor: CentOS
Release     : 1.1.el6                       Build Date: Wed 18 May 2011 06:44:12 AM CEST
Install Date: Mon 21 Nov 2011 02:55:49 PM CET      Build Host: c6b6.bsys.dev.centos.org
Group       : Applications/System           Source RPM: syslinux-3.86-1.1.el6.src.rpm
Size        : 2663825                          License: GPLv2+
Signature   : RSA/8, Sun 03 Jul 2011 07:02:39 AM CEST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://syslinux.zytor.com/
Summary     : Simple kernel loader which boots from a FAT filesystem
Description :
SYSLINUX is a suite of bootloaders, currently supporting DOS FAT
filesystems, Linux ext2/ext3 filesystems (EXTLINUX), PXE network boots
(PXELINUX), or ISO 9660 CD-ROMs (ISOLINUX).  It also includes a tool,
MEMDISK, which loads legacy operating systems from these media.
/sbin/extlinux
/usr/bin/gethostip
/usr/bin/isohybrid
/usr/bin/keytab-lilo
/usr/bin/lss16toppm
/usr/bin/md5pass
/usr/bin/mkdiskimage
/usr/bin/ppmtolss16
/usr/bin/pxelinux-options
/usr/bin/sha1pass
/usr/bin/syslinux
/usr/bin/syslinux2ansi
/usr/share/doc/syslinux-3.86
/usr/share/doc/syslinux-3.86/COPYING
/usr/share/doc/syslinux-3.86/CodingStyle.txt
/usr/share/doc/syslinux-3.86/NEWS
/usr/share/doc/syslinux-3.86/README
/usr/share/doc/syslinux-3.86/SubmittingPatches.txt
/usr/share/doc/syslinux-3.86/TODO
/usr/share/doc/syslinux-3.86/comboot.txt
/usr/share/doc/syslinux-3.86/distrib.txt
/usr/share/doc/syslinux-3.86/extlinux.txt
/usr/share/doc/syslinux-3.86/gpt.txt
/usr/share/doc/syslinux-3.86/isolinux.txt
/usr/share/doc/syslinux-3.86/keytab-lilo.txt
/usr/share/doc/syslinux-3.86/mboot.txt
/usr/share/doc/syslinux-3.86/memdisk.txt
/usr/share/doc/syslinux-3.86/menu.txt
/usr/share/doc/syslinux-3.86/pxelinux.txt
/usr/share/doc/syslinux-3.86/rfc5071.txt
/usr/share/doc/syslinux-3.86/sample
/usr/share/doc/syslinux-3.86/sample/Makefile
/usr/share/doc/syslinux-3.86/sample/README
/usr/share/doc/syslinux-3.86/sample/atou.c
/usr/share/doc/syslinux-3.86/sample/c32echo.c
/usr/share/doc/syslinux-3.86/sample/c32echo.c32
/usr/share/doc/syslinux-3.86/sample/c32entry.S
/usr/share/doc/syslinux-3.86/sample/c32exit.S
/usr/share/doc/syslinux-3.86/sample/comecho.asm
/usr/share/doc/syslinux-3.86/sample/comecho.com
/usr/share/doc/syslinux-3.86/sample/conio.c
/usr/share/doc/syslinux-3.86/sample/fd.c
/usr/share/doc/syslinux-3.86/sample/fd.c32
/usr/share/doc/syslinux-3.86/sample/filetest.c
/usr/share/doc/syslinux-3.86/sample/filetest.c32
/usr/share/doc/syslinux-3.86/sample/hello.c
/usr/share/doc/syslinux-3.86/sample/hello.c32
/usr/share/doc/syslinux-3.86/sample/hello2.c
/usr/share/doc/syslinux-3.86/sample/hello2.c32
/usr/share/doc/syslinux-3.86/sample/m16-640x640-syslinux.jpg
/usr/share/doc/syslinux-3.86/sample/printf.c
/usr/share/doc/syslinux-3.86/sample/sample.msg
/usr/share/doc/syslinux-3.86/sample/skipatou.c
/usr/share/doc/syslinux-3.86/sample/syslinux_splash.jpg
/usr/share/doc/syslinux-3.86/sample/syslogo.lss
/usr/share/doc/syslinux-3.86/sample/syslogo.ppm.gz
/usr/share/doc/syslinux-3.86/sdi.txt
/usr/share/doc/syslinux-3.86/syslinux.txt
/usr/share/doc/syslinux-3.86/usbkey.txt
/usr/share/man/man1/extlinux.1.gz
/usr/share/man/man1/gethostip.1.gz
/usr/share/man/man1/lss16toppm.1.gz
/usr/share/man/man1/ppmtolss16.1.gz
/usr/share/man/man1/syslinux.1.gz
/usr/share/man/man1/syslinux2ansi.1.gz
/usr/share/syslinux
/usr/share/syslinux/altmbr.bin
/usr/share/syslinux/altmbr_c.bin
/usr/share/syslinux/altmbr_f.bin
/usr/share/syslinux/chain.c32
/usr/share/syslinux/cmd.c32
/usr/share/syslinux/com32
/usr/share/syslinux/com32/com32.ld
/usr/share/syslinux/com32/include
/usr/share/syslinux/com32/include/alloca.h
/usr/share/syslinux/com32/include/assert.h
/usr/share/syslinux/com32/include/bitsize
/usr/share/syslinux/com32/include/bitsize/limits.h
/usr/share/syslinux/com32/include/bitsize/stddef.h
/usr/share/syslinux/com32/include/bitsize/stdint.h
/usr/share/syslinux/com32/include/bitsize/stdintconst.h
/usr/share/syslinux/com32/include/bitsize/stdintlimits.h
/usr/share/syslinux/com32/include/colortbl.h
/usr/share/syslinux/com32/include/com32.h
/usr/share/syslinux/com32/include/console.h
/usr/share/syslinux/com32/include/cpufeature.h
/usr/share/syslinux/com32/include/ctype.h
/usr/share/syslinux/com32/include/dev.h
/usr/share/syslinux/com32/include/dirent.h
/usr/share/syslinux/com32/include/dprintf.h
/usr/share/syslinux/com32/include/elf.h
/usr/share/syslinux/com32/include/endian.h
/usr/share/syslinux/com32/include/errno.h
/usr/share/syslinux/com32/include/fcntl.h
/usr/share/syslinux/com32/include/gplinclude
/usr/share/syslinux/com32/include/gplinclude/README
/usr/share/syslinux/com32/include/gplinclude/cpuid.h
/usr/share/syslinux/com32/include/gplinclude/disk
/usr/share/syslinux/com32/include/gplinclude/disk/bootloaders.h
/usr/share/syslinux/com32/include/gplinclude/disk/common.h
/usr/share/syslinux/com32/include/gplinclude/disk/errno_disk.h
/usr/share/syslinux/com32/include/gplinclude/disk/error.h
/usr/share/syslinux/com32/include/gplinclude/disk/geom.h
/usr/share/syslinux/com32/include/gplinclude/disk/mbrs.h
/usr/share/syslinux/com32/include/gplinclude/disk/msdos.h
/usr/share/syslinux/com32/include/gplinclude/disk/partition.h
/usr/share/syslinux/com32/include/gplinclude/disk/read.h
/usr/share/syslinux/com32/include/gplinclude/disk/swsusp.h
/usr/share/syslinux/com32/include/gplinclude/disk/util.h
/usr/share/syslinux/com32/include/gplinclude/disk/write.h
/usr/share/syslinux/com32/include/gplinclude/dmi
/usr/share/syslinux/com32/include/gplinclude/dmi/dmi.h
/usr/share/syslinux/com32/include/gplinclude/dmi/dmi_base_board.h
/usr/share/syslinux/com32/include/gplinclude/dmi/dmi_battery.h
/usr/share/syslinux/com32/include/gplinclude/dmi/dmi_bios.h
/usr/share/syslinux/com32/include/gplinclude/dmi/dmi_cache.h
/usr/share/syslinux/com32/include/gplinclude/dmi/dmi_chassis.h
/usr/share/syslinux/com32/include/gplinclude/dmi/dmi_ipmi.h
/usr/share/syslinux/com32/include/gplinclude/dmi/dmi_memory.h
/usr/share/syslinux/com32/include/gplinclude/dmi/dmi_processor.h
/usr/share/syslinux/com32/include/gplinclude/dmi/dmi_system.h
/usr/share/syslinux/com32/include/gplinclude/memory.h
/usr/share/syslinux/com32/include/gplinclude/vpd
/usr/share/syslinux/com32/include/gplinclude/vpd/vpd.h
/usr/share/syslinux/com32/include/inttypes.h
/usr/share/syslinux/com32/include/klibc
/usr/share/syslinux/com32/include/klibc/archsetjmp.h
/usr/share/syslinux/com32/include/klibc/compiler.h
/usr/share/syslinux/com32/include/klibc/diverr.h
/usr/share/syslinux/com32/include/klibc/endian.h
/usr/share/syslinux/com32/include/klibc/extern.h
/usr/share/syslinux/com32/include/klibc/sysconfig.h
/usr/share/syslinux/com32/include/libansi.h
/usr/share/syslinux/com32/include/limits.h
/usr/share/syslinux/com32/include/math.h
/usr/share/syslinux/com32/include/minmax.h
/usr/share/syslinux/com32/include/netinet
/usr/share/syslinux/com32/include/netinet/in.h
/usr/share/syslinux/com32/include/png.h
/usr/share/syslinux/com32/include/pngconf.h
/usr/share/syslinux/com32/include/setjmp.h
/usr/share/syslinux/com32/include/stdarg.h
/usr/share/syslinux/com32/include/stdbool.h
/usr/share/syslinux/com32/include/stddef.h
/usr/share/syslinux/com32/include/stdint.h
/usr/share/syslinux/com32/include/stdio.h
/usr/share/syslinux/com32/include/stdlib.h
/usr/share/syslinux/com32/include/string.h
/usr/share/syslinux/com32/include/sys
/usr/share/syslinux/com32/include/sys/cpu.h
/usr/share/syslinux/com32/include/sys/elf32.h
/usr/share/syslinux/com32/include/sys/elf64.h
/usr/share/syslinux/com32/include/sys/elfcommon.h
/usr/share/syslinux/com32/include/sys/fpu.h
/usr/share/syslinux/com32/include/sys/gpxe.h
/usr/share/syslinux/com32/include/sys/io.h
/usr/share/syslinux/com32/include/sys/pci.h
/usr/share/syslinux/com32/include/sys/stat.h
/usr/share/syslinux/com32/include/sys/time.h
/usr/share/syslinux/com32/include/sys/times.h
/usr/share/syslinux/com32/include/sys/types.h
/usr/share/syslinux/com32/include/syslinux
/usr/share/syslinux/com32/include/syslinux/adv.h
/usr/share/syslinux/com32/include/syslinux/advconst.h
/usr/share/syslinux/com32/include/syslinux/align.h
/usr/share/syslinux/com32/include/syslinux/boot.h
/usr/share/syslinux/com32/include/syslinux/bootpm.h
/usr/share/syslinux/com32/include/syslinux/bootrm.h
/usr/share/syslinux/com32/include/syslinux/config.h
/usr/share/syslinux/com32/include/syslinux/features.h
/usr/share/syslinux/com32/include/syslinux/idle.h
/usr/share/syslinux/com32/include/syslinux/io.h
/usr/share/syslinux/com32/include/syslinux/keyboard.h
/usr/share/syslinux/com32/include/syslinux/linux.h
/usr/share/syslinux/com32/include/syslinux/loadfile.h
/usr/share/syslinux/com32/include/syslinux/memscan.h
/usr/share/syslinux/com32/include/syslinux/movebits.h
/usr/share/syslinux/com32/include/syslinux/pxe.h
/usr/share/syslinux/com32/include/syslinux/reboot.h
/usr/share/syslinux/com32/include/syslinux/resolve.h
/usr/share/syslinux/com32/include/syslinux/vesacon.h
/usr/share/syslinux/com32/include/syslinux/video.h
/usr/share/syslinux/com32/include/syslinux/zio.h
/usr/share/syslinux/com32/include/time.h
/usr/share/syslinux/com32/include/tinyjpeg.h
/usr/share/syslinux/com32/include/unistd.h
/usr/share/syslinux/com32/include/zconf.h
/usr/share/syslinux/com32/include/zlib.h
/usr/share/syslinux/com32/libcom32.a
/usr/share/syslinux/com32/libcom32gpl.a
/usr/share/syslinux/com32/libutil_com.a
/usr/share/syslinux/com32/libutil_lnx.a
/usr/share/syslinux/config.c32
/usr/share/syslinux/cpuid.c32
/usr/share/syslinux/cpuidtest.c32
/usr/share/syslinux/disk.c32
/usr/share/syslinux/dmitest.c32
/usr/share/syslinux/dosutil
/usr/share/syslinux/dosutil/copybs.com
/usr/share/syslinux/dosutil/eltorito.sys
/usr/share/syslinux/dosutil/mdiskchk.com
/usr/share/syslinux/elf.c32
/usr/share/syslinux/ethersel.c32
/usr/share/syslinux/gfxboot.c32
/usr/share/syslinux/gfxboot.com
/usr/share/syslinux/gptmbr.bin
/usr/share/syslinux/gptmbr_c.bin
/usr/share/syslinux/gptmbr_f.bin
/usr/share/syslinux/gpxecmd.c32
/usr/share/syslinux/gpxelinux.0
/usr/share/syslinux/hdt.c32
/usr/share/syslinux/ifcpu.c32
/usr/share/syslinux/ifcpu64.c32
/usr/share/syslinux/int18.com
/usr/share/syslinux/isohdpfx.bin
/usr/share/syslinux/isohdpfx_c.bin
/usr/share/syslinux/isohdpfx_f.bin
/usr/share/syslinux/isohdppx.bin
/usr/share/syslinux/isohdppx_c.bin
/usr/share/syslinux/isohdppx_f.bin
/usr/share/syslinux/isolinux-debug.bin
/usr/share/syslinux/isolinux.bin
/usr/share/syslinux/kbdmap.c32
/usr/share/syslinux/linux.c32
/usr/share/syslinux/mboot.c32
/usr/share/syslinux/mbr.bin
/usr/share/syslinux/mbr_c.bin
/usr/share/syslinux/mbr_f.bin
/usr/share/syslinux/memdisk
/usr/share/syslinux/memdump.com
/usr/share/syslinux/meminfo.c32
/usr/share/syslinux/menu.c32
/usr/share/syslinux/pcitest.c32
/usr/share/syslinux/pmload.c32
/usr/share/syslinux/poweroff.com
/usr/share/syslinux/pxechain.com
/usr/share/syslinux/pxelinux.0
/usr/share/syslinux/reboot.c32
/usr/share/syslinux/rosh.c32
/usr/share/syslinux/sanboot.c32
/usr/share/syslinux/sdi.c32
/usr/share/syslinux/sysdump.c32
/usr/share/syslinux/syslinux.com
/usr/share/syslinux/syslinux.exe
/usr/share/syslinux/vesainfo.c32
/usr/share/syslinux/vesamenu.c32
/usr/share/syslinux/vpdtest.c32

tftp-server

 # rpm -qil tftp-server
Name        : tftp-server                  Relocations: (not relocatable)
Version     : 0.49                              Vendor: CentOS
Release     : 5.1.el6                       Build Date: Wed 18 Aug 2010 11:44:33 PM CEST
Install Date: Mon 21 Nov 2011 02:55:52 PM CET      Build Host: c6b2.bsys.dev.centos.org
Group       : System Environment/Daemons    Source RPM: tftp-0.49-5.1.el6.src.rpm
Size        : 58742                            License: BSD
Signature   : RSA/8, Sun 03 Jul 2011 07:03:43 AM CEST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.kernel.org/pub/software/network/tftp/
Summary     : The server for the Trivial File Transfer Protocol (TFTP)
Description :
The Trivial File Transfer Protocol (TFTP) is normally used only for
booting diskless workstations.  The tftp-server package provides the
server for TFTP, which allows users to transfer files to and from a
remote machine. TFTP provides very little security, and should not be
enabled unless it is expressly needed.  The TFTP server is run from
/etc/xinetd.d/tftp, and is disabled by default.
/etc/xinetd.d/tftp
/usr/sbin/in.tftpd
/usr/share/doc/tftp-server-0.49
/usr/share/doc/tftp-server-0.49/CHANGES
/usr/share/doc/tftp-server-0.49/README
/usr/share/doc/tftp-server-0.49/README.security
/usr/share/doc/tftp-server-0.49/README.security.tftpboot
/usr/share/man/man8/in.tftpd.8.gz
/usr/share/man/man8/tftpd.8.gz
/var/lib/tftpboot

TFTP-Client

Zum Testen unserer Konfiguration greifen wir auf das Clientpaket TFTP zurück. So können wir mit einfachen Mitteln leicht testen, ob der Zugriff und die Datenübertragung klappen. Falls das Paket tftp noch nicht installiert wurde, können wir dies mittels yum ins system einbinden.

 # yum install tftp -y

Clientpaket tftp

Wie immer können wir uns hier auch vergewissern, was genau installiert wurde.

 # rpm -qil tftp
Name        : tftp                         Relocations: (not relocatable)
Version     : 0.49                              Vendor: CentOS
Release     : 5.1.el6                       Build Date: Wed 18 Aug 2010 11:44:33 PM CEST
Install Date: Wed 23 Nov 2011 01:59:56 PM CET      Build Host: c6b2.bsys.dev.centos.org
Group       : Applications/Internet         Source RPM: tftp-0.49-5.1.el6.src.rpm
Size        : 46554                            License: BSD
Signature   : RSA/8, Sun 03 Jul 2011 07:03:42 AM CEST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.kernel.org/pub/software/network/tftp/
Summary     : The client for the Trivial File Transfer Protocol (TFTP)
Description :
The Trivial File Transfer Protocol (TFTP) is normally used only for
booting diskless workstations.  The tftp package provides the user
interface for TFTP, which allows users to transfer files to and from a
remote machine.  This program and TFTP provide very little security,
and should not be enabled unless it is expressly needed.
/usr/bin/tftp
/usr/share/doc/tftp-0.49
/usr/share/doc/tftp-0.49/CHANGES
/usr/share/doc/tftp-0.49/README
/usr/share/doc/tftp-0.49/README.security
/usr/share/doc/tftp-0.49/README.security.tftpboot
/usr/share/man/man1/tftp.1.gz

xinet-Daemon

Die Auslieferung des Bootmenüs und der hierzu notwendigen Dateien erfolgt mit Unterstützung des TFTP-Servers, der mit Hilfe des xinetd-Daemon gestartet wird. Hierzu passen wir die Konfigurationsdatei des Daemon wie folgt an.

 # vim /etc/xinetd.d/tftp
# vim /etc/xinetd.d/tftp
# default: off
# description: The tftp server serves files using the trivial file transfer \
#       protocol.  The tftp protocol is often used to boot diskless \
#       workstations, download configuration files to network-aware printers, \
#       and to start the installation process for some operating systems.
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /var/lib/tftpboot
        # Django 2011-11-21 TFTP-server aktiviert
        # default : disable = yes
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

Damit der xinetd bei jedem Systemstart automatisch gestartet werden kann, setzen wir noch die notwendigen Syslinks im Pfad /etc/init.d/.

 # chkconfig xinetd on

Ob der xinted beim Systemstart gestartet wird und dieser den tftp-Server auch anstartet können wir mittels folgendem Aufruf überprüfen.

 # chkconfig --list | tail -n 16
xinetd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off

xinetd based services:
	chargen-dgram: 	off
	chargen-stream:	off
	daytime-dgram: 	off
	daytime-stream:	off
	discard-dgram: 	off
	discard-stream:	off
	echo-dgram:    	off
	echo-stream:   	off
	rsync:         	off
	tcpmux-server: 	off
	tftp:          	on
	time-dgram:    	off
	time-stream:   	off

Paketfilter

Damit sowohl unser TFTP-Server im Netz erreichbar ist und auch seine Pakete ausliefern kann werden wir nun den Paketfilter noch erweitern und anpassen.

Als erstes überprüfen wir unsere aktuelle iptables-Regeln.

 # iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Die Konfigurationsdatei unseres Paketfilters passen wir nun wie folgt an.

 # vim /etc/sysconfig/iptables
/etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# Django : 2011-11-16 htpp für Apache Webserver freigeschaltet
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
#
# Django : 2011-11-16 Freischalten des TFTP-servers
-A INPUT -m state --state NEW -m udp -p udp --dport 69 -j ACCEPT
#
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Anschließend starten wir den Paketfilter 1x durch.

 # service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
iptables: Loading additional modules: ip_conntrack_tftp ip_[  OK  ] 

Überprüfen wir anschließend unseren Paketfilter, werden unsere neuen Regeln entsprechend angezeigt.

 # iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http 
ACCEPT     udp  --  anywhere             anywhere            state NEW udp dpt:tftp 
LOG        all  --  anywhere             anywhere            LOG level warning 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Nun ist es an der Zeit unseren TFTP Server das erste mal über den xinetd zu starten.

 # service xinetd start

Im Syslog wird uns der Start des Daemon entsprechend protokolliert.

Nov 22 09:11:51 vml000050 xinetd[6177]: xinetd Version 2.3.14 started with libwrap loadavg labeled-networking options compiled in.
Nov 22 09:11:51 vml000050 xinetd[6177]: Started working: 1 available service

Ob auf unserem Server nun der TFTP Server läuft und auf Port 69 horcht können wir bei Bedarf auch noch überprüfen.

 # netstat -tulpen | grep xinetd
 udp        0      0 0.0.0.0:69                  0.0.0.0:*                               0          75579      6177/xinetd

Den automatischen Start unseres Serverdienstes haben wir bereits im Absatz xinet-Daemon eingestellt.

Testdatei für die Übertragung anlegen

Für unseren Test legen wir uns einfach eine kleine Textdatei im Arbeitsverzeichnis /var/lib/tftpboot/ an, die wir uns dann vom TFTP-Server herunterladen werden.

 # echo "Dies ist ein ganz einfacher Text für den Test unseres TFTP-Servers" > /var/lib/tftpboot/test

Testdatei transferieren

Anschließend wechseln wir ins Homeverzeichnis unseres Benutzers.

 # cd ~

Dann bauen wir mit dem TFTP-Clientprogramm eine Verbiundung zu unserem Server auf und holen uns die zuvor angelegte Datei test mit dem Befehl get. Nach dem Herunterladen verlassen wir das Programm mit dem Befehl quit.

 # tftp -v 10.0.0.50
 Connected to 10.0.0.50 (10.0.0.50), port 69
 tftp> get test
 getting from 10.0.0.50:test to test [netascii]
 Received 69 bytes in 0.1 seconds [8714 bit/s]
 tftp> quit

Das Ganze geht natürlich auch schneller als „Einzeiler“:

 # tftp 10.0.0.50 -c get test

Fehlerbehandlung

Klappt der Download von unserem Clientrechners nicht, trotz funktionierendem Zugriff nicht, liegt es an den Paketfilterregelungen auf unserem Clientrechner! Wie man in folgendem Beispiel sieht laufen wir hier in einen timeout:

 # tftp -v 10.0.0.50 -c get test
 Connected to 10.0.0.50 (10.0.0.50), port 69
 getting from 10.0.0.50:test to test [netascii]
 Transfer timed out.

Was ist nun passiert? Auf dem Client gibt es doch keine iptables-Regel, die den Datentransfer beschneidet:

 # iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh 
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Auf unserem TFTP-Server haben wir doch Port 69 freigeschaltet:

# Django : 2011-11-16 Freischalten des TFTP-servers
-A INPUT -m state --state NEW -m udp -p udp --dport 69 -j ACCEPT
#

Im Syslog des TFTP-Servers sehen wir nur die Folgende Fehlermeldung:

 Nov 24 07:49:14 vml000050 in.tftpd[10031]: tftpd: read(ack): No route to host

Die Ursache ist ganz einfach erklärt. TFTP nutzt für die Steuerung Port 69, für die Datenübertragung werden dann aber über beliebige highports. Damit diese nun unseren Paketfilter passieren können, müssen wir an dem betreffenden (Test-)Clientsystem, oder einem internen Paketfilter der unterschiedliche Sicherheitszonen trennt, die folgenden iptables-Module laden.

  • ip_conntrack_tftp
  • ip_nat_tftp

Dies geschiet über die Konfigurationsdatei iptables-config des Paketfilter-Regelwerkes iptables. Dort tragen wir bei den nat helpers die beiden Module nach:

 # vim /etc/sysconfig/iptables-config
# Django 2011-11-24 Freischaltungen für TFTP-Transfers
# default : IPTABLES_MODULES=""
IPTABLES_MODULES="ip_conntrack_tftp ip_nat_tftp"

Anschließend starten wir unseren iptables-Paketfilter einmal durch.

 # service iptables restart
 iptables: Flushing firewall rules:                         [  OK  ]
 iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
 iptables: Unloading modules:                               [  OK  ]
 iptables: Applying firewall rules:                         [  OK  ]
 iptables: Loading additional modules: ip_conntrack_tftp ip_[  OK  ]

Nun versuchen wir erneut unsere Testdatei vom TFTP-Server herunterzuladen , was natürlich Dank unserer Anpassungen nun erfolgreich funktioniert.

 $ tftp 10.0.0.50 -v -c get test
 Connected to 10.0.0.50 (10.0.0.50), port 69
 getting from 10.0.0.50:test to test [netascii]
 Received 69 bytes in 0.1 seconds [6073 bit/s]

Im Syslog unseres TFTP-Servers wird der erfolgreiche Dateitransfer entsprechend protokolliert.

Nov 24 09:14:30 vml000050 xinetd[7708]: START: tftp pid=10145 from=10.0.0.40
Nov 24 09:14:30 vml000050 in.tftpd[10146]: RRQ from 10.0.0.40 filename test

Links

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
  • centos/pxe/tftp.txt
  • Zuletzt geändert: 20.04.2018 10:35.
  • (Externe Bearbeitung)