TFTP
Trivial File Transfer Protocol (TFTP)
Bei TFTP handelt es sich um ein einfaches Netzwerk-Protokoll für den Transport von Dateien, welches auf Basis von UDP arbeitet. Es ist für schnelle Datenübertragung innerhalb eines gesicherten Netzwerkes konzipiert.
Inhaltsverzeichnis
Abgrenzung zu FTP
Im Gegensatz zum Protokoll FTP arbeitet es verbindungslos und beinhaltet keine Sicherungsmaßnahmen für die Zustellung von Datenpaketen, welche bei FTP im verwendeten Basisprotokoll TCP implizit enthalten ist. Durch den Verzicht auf diese Kontrollstrukturen kann sich bei günstiger Netzwerkauslastung eine erheblich höhere Performance im Vergleich zu TCP-basierten Netzwerk-Protokollen einstellen.
Außerdem beinhaltet TFTP kein Sicherheitskonzept für eine Authentifizierung (Benutzername, Passwort).
Anwendungsgebiete
Das Protokoll ist weniger gedacht für den Einsatz durch den Endanwender. Die Haupteinsatzgebiete liegen vielmehr in der Bereitstellung von Softwarepaketen oder Konfigurationen auf Netzwerk-Komponenten (wie z.B. Switches, Routern, Firewalls o.ä.).
Auch der Download von Systemsoftware zum Booten über das Netzwerk (PXE) wird im allgemeinen über TFTP umgesetzt.
Architektur
Es handelt sich um eine klassische Client-/Server-Architektur.
Die Server-Komponente ist meist als Daemon implementiert und übernimmt die Aufgabe, Anfragen (Requests) von den Clients entgegen zu nehmen und Datenpakete zu verschicken. Dazu lauscht der Daemon auf einem festen Port (Standard: 69).
Die Aufgabe der Client-Komponente ist die Steuerung durch den Anwender und der Empfang von Datenpaketen.
Konfiguration
Die Konfiguration der beiden Komponenten soll an einem konkreten Beispiel-Szenario verdeutlicht werden:
- Server 'j4' (172.16.11.8) ist ein Linux-Server auf Basis von CentOS 6.2
- Client 'j2' (172.16.11.6) ist ein Linux-PC auf Basis von OpenSUSE 13.1
Beide Systeme befinden sich im selben Netzwerk.
Serverseitige Konfiguration
Die Installation der Server-Komponente erfolgt über yum:
[root@j4 ~]# yum install tftp-server
Für die Konfiguration muss lediglich der Wert des Parameters 'disable' auf 'no' gesetzt werden:
[root@j4 ~]# cat /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 { disable = no socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpboot per_source = 11 cps = 100 2 flags = IPv4 }
Abschließend wird sichergestellt, dass sowohl der Daemon xinetd als auch tftp selbst läuft.
[root@j4 ~]# /sbin/chkconfig --level 345 xinetd on [root@j4 ~]# /sbin/chkconfig --level 345 tftp on
Für den Zugriff auf den Dienst kann es notwendig sein, den Regelsatz der vorgeschalteten Firewalls zu ergänzen. In diesem Fall ist es notwendig, den Port 69 für das Protokoll UDP zu öffnen. Dies sollte auf die minimale Menge an Source-IPs eingeschränkt werden.
Um im konkreten Fall den Zugriff auf den Dienst in der lokalen iptables-Firewall zu erlauben, müssen entsprechende Firewall-Regeln angelegt und die Firewall neu gestartet werden:
[root@j4 etc]# grep '69' /etc/sysconfig/iptables -A INPUT -s 172.16.11.0/24 -m udp -p udp --dport 69 -j ACCEPT [root@j4 ~]# service iptables restart iptables: Firewall-Regeln leeren: [ OK ] iptables: Ketten auf Richtlinie ACCEPT setzen: filter [ OK ] iptables: Module entladen: [ OK ] iptables: Firewall-Regeln anwenden: [ OK ]
Hinweis: Auch zusätzliche Security-Frameworks wie SELinux oder AppArmor können hier noch einen dedizierten Regelsatz erfordern. Im vorliegenden Beispiel war das nicht notwendig, obwohl SELinux im Einsatz ist.
Clientseitige Konfiguration
Die Installation der Client-Komponente erfolgt unter OpenSUSE mit YaST:
j2:~ # yast --install tftp
Auch auf dem Client muss explizit eine Freigabe in der lokalen Firewall erfolgen (kann ebenfalls unter YaST unter Custom Rules durchgeführt werden). Hier wird für die Source-IP des Servers das Protokoll UDP auf allen Ports ermöglicht:
j2:~ # grep '172.16.11.' /etc/sysconfig/SuSEfirewall2 FW_SERVICES_ACCEPT_EXT="172.16.11.8,udp"
Hinweis: Die Antwort erfolgt hier nicht auf einem dedizierten Port, daher muss der gesamte Bereich geöffnet werden.
Test der Funktionalität
Testdatei auf dem Server bereitstellen:
[root@j4 ~]# echo "42" > /var/lib/tftpboot/test.txt
Request auf dem Client:
user@j2:~> f=test.txt; tftp j4 -c get $f; cat $f; rm $f 42
Als Ergebnis wird eine Testdatei vom Server geladen, angezeigt und direkt wieder gelöscht.