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.
Installation
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
Konfiguration
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
Systemstart
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.
Systemtest
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