Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
centos:pxe_c7:tftp [05.01.2017 11:20. ] – [TFTP-Server unter CentOS 7.x einrichten] djangocentos:pxe_c7:tftp [22.07.2019 14:54. ] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 ====== TFTP-Server unter CentOS 7.x einrichten ====== ====== TFTP-Server unter CentOS 7.x einrichten ======
 Ein wesentlicher Baustein für unseren Installationsserver ist der TFTP-Server, der die Auslieferung der nötigen Dateien für den PXE-Bootvorgang bereitstellt und ausliefert. Ein wesentlicher Baustein für unseren Installationsserver ist der TFTP-Server, der die Auslieferung der nötigen Dateien für den PXE-Bootvorgang bereitstellt und ausliefert.
-Eine genaue Beschreibung zu **[[https://tools.ietf.org/html/rfc1350|Server]]** findet man auf der gut beschriebenen [[https://de.wikipedia.org/wiki/Trivial_File_Transfer_Protocol|Wikipedia-Seite]].+Eine genaue Beschreibung zu **[[https://tools.ietf.org/html/rfc1350|TFTP]]** findet man auf der gut beschriebenen [[https://de.wikipedia.org/wiki/Trivial_File_Transfer_Protocol|Wikipedia-Seite]].
 ===== Installation ===== ===== Installation =====
 ==== TFTP-Server ==== ==== TFTP-Server ====
Zeile 222: Zeile 222:
  
 ===== Konfiguration ===== ===== 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 **xinetd**-Daemon wie folgt an.
 +   # vim /etc/xinetd.d/tftp
 +<file bash /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 : 2016-01-08 TFTP-Server aktiviert
 +        # default: disable      = yes
 +        disable                 = no
 +        per_source              = 11
 +        cps                     = 100 2
 +        flags                   = IPv4
 +}
 +</file>
 +
 +Damit der **xinetd** bei jedem Systemstart automatisch gestartet werden kann, aktivieren wir diesen mit folgendem Befehl.
 +   # systemctl enable xinetd.service
 +
 +Die Überprüfung de Autostart vom xinetd können wir bei Bedarf wie folgt prüfen.
 +   # systemctl is-enabled xinetd.service
 +
 +  enabled
 +
 +Alternativ dazu können wir auf folgenden Aufruf verwenden:
 +   # systemctl list-unit-files | grep xinetd.service
 +
 +  xinetd.service                                enabled
 +
 +
 +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 14
 +<code>Note: This output shows SysV services only and does not include native
 +      systemd services. SysV configuration data might be overridden by native
 +      systemd configuration.
 +
 +      If you want to list systemd services use 'systemctl list-unit-files'.
 +      To see services enabled on particular target use
 +      'systemctl list-dependencies [target]'.
 +
 + chargen-dgram: off
 + chargen-stream: off
 + daytime-dgram: off
 + daytime-stream: off
 + discard-dgram: off
 + discard-stream: off
 + echo-dgram:    off
 + echo-stream:    off
 + tcpmux-server: off
 + tftp:          on
 + time-dgram:    off
 + time-stream:    off
 +</code>
  
  
  
 ==== Paketfilter/Firewall ==== ==== Paketfilter/Firewall ====
-Damit unsere Besucher Verbindungen zu den geöffneten Ports **http/80** UND **https/443** unseres Apache-Webserver aufbauen können müssen wir für diese noch Änderungen am Paketfilter **firewalld** vornehmen.+Damit die Clients später Verbindungsanfragen zu dem geöffneten Port **tftp/6980**unseres TFTP-Servers stellen könnenmüssen wir für diese noch Änderungen am Paketfilter **firewalld** vornehmen.
  
 Unter **CentOS 7** wird als Standard-Firewall die dynamische **firewalld** verwendet. Ein großer Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbiundungen kurz getrennt werden. Sondern unsere Änderungen können **//on-the-fly//** aktiviert oder auch wieder deaktiviert werden. Unter **CentOS 7** wird als Standard-Firewall die dynamische **firewalld** verwendet. Ein großer Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbiundungen kurz getrennt werden. Sondern unsere Änderungen können **//on-the-fly//** aktiviert oder auch wieder deaktiviert werden.
  
-Mit Hilfe des Programms **firewall-cmd** legen wir nun eine **permanente** Regel in der Zone **public**, dies entspricht in unserem Beispiel das Netzwerk-Interface **eth0** mit der IP **10.0.0.70** an. Als Source-IP geben geben wir keine speziellen IP-Adressen an, was entsprechend **0.0.0.0** entspricht. Genug der Vorrede, mit nachfolgendem Befehl werden die beiden Ports **80** und **443** geöffnet.+Mit Hilfe des Programms **firewall-cmd** legen wir nun eine **permanente** Regel in der Zone **public** für den Service ***TFTP** für Port **69** an.
    # firewall-cmd --permanent --zone=public --add-service=tftp    # firewall-cmd --permanent --zone=public --add-service=tftp
  
   success   success
  
-Anschließend können wir den Firewall-Daemon einmal durchstarten und anschließend überprüfen, ob die Regeln auch entsprechend unserer Definition, gezogen haben. +Anschliessend können wir den Firewall-Daemon einmal durchstarten und überprüfen, ob die Regeln auch entsprechend unserer Definition, gezogen haben. 
    # firewall-cmd --reload    # firewall-cmd --reload
  
   success   success
  
-Anschließend können wir abfragen, welche Dienste in der Zone **public** geöffnet sind. +Zu guter letzt fragen wir ab, welche Dienste in der Zone **public** geöffnet sind. 
    # firewall-cmd --zone=public --list-services    # firewall-cmd --zone=public --list-services
  
Zeile 254: Zeile 317:
     0     0 ACCEPT     tcp  --  *      *       0.0.0.0/           0.0.0.0/           tcp dpt:22 ctstate NEW</code>     0     0 ACCEPT     tcp  --  *      *       0.0.0.0/           0.0.0.0/           tcp dpt:22 ctstate NEW</code>
  
 +===== Systemstart =====
 +Nun ist es an der Zeit unseren TFTP Server das erste mal über den **xinetd** zu starten.
 +   # systemctl start xinetd
 +
 +Im Syslog wird uns der Start des Daemon entsprechend protokolliert.
 +  Jan  5 14:16:24 vml000057 xinetd[22639]: xinetd Version 2.3.15 started with libwrap loadavg labeled-networking options compiled in.
 +  Jan  5 14:16:24 vml000057 xinetd[22639]: 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:                                       75579      6177/xinetd
 +
 +Den automatischen Start unseres Serverdienstes haben wir bereits im [[centos:pxe_c7:tftp#xinet-daemon|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.57
 +
 +   Connected to 10.0.0.57 (10.0.0.57), port 69
 +   tftp> get test
 +   getting from 10.0.0.57: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.57 -c get test
 +
 +==== Fehlerbehandlung ====
 +Klappt der Download von unserem Clientrechners nicht, trotz funktionierendem Zugriff nicht, liegt es an den Paketfilterregelungen auf dem **Clientrechner**! Wie man in folgendem Beispiel sieht laufen wir hier in einen timeout: 
 +   # tftp -v 10.0.0.57 -c get test
 +
 +   Connected to 10.0.0.57 (10.0.0.57), port 69
 +   getting from 10.0.0.57: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
 +<code>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
 +</code>
 +
 +Auf unserem TFTP-Server haben wir doch auch Port **69** freigeschaltet:
 +   # firewall-cmd --zone=public --list-services
 +
 +  tftp dhcpv6-client http ssh
 +
 +Im Syslog des TFTP-Servers sehen wir nur die Folgende Fehlermeldung:
 +   Jan 8 07:49:14 vml000057 in.tftpd[10031]: tftpd: read(ack): No route to host
 +
 +<WRAP center round tip 90%>
 +Die Ursache ist ganz einfach erklärt. TFTP nutzt für die Steuerung Port **69**, für die Datenübertragung werden dann aber beliebige highports genutzt. 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**
 +</WRAP>
 +
 +Auf einem **//CentOS 7 System//** benutzen wir zur Aktivierung der beiden Module die Datei //**/etc/modules-load.d/iptables.conf**//.
 +   # vim /etc/modules-load.d/iptables.conf
 +<file bash /etc/modules-load.d/iptables.conf># Django : 2016-01-08 - Zum Testen des TFTP-Servers nötige Änderungen
 +# default: none
 +ip_nat_tftp
 +ip_conntrack_tftp</file>
 +
 +Zum Aktivieren starten wir den betreffenden Host einmal durch.
 +   # systemctl reboot
 +
 +Auf einem **//CentOS 6 System//** geschieht dies ü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
 +<code bash>
 +# Django 2011-11-24 Freischaltungen für TFTP-Transfers
 +# default : IPTABLES_MODULES=""
 +IPTABLES_MODULES="ip_conntrack_tftp ip_nat_tftp"
 +</code>
 +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.57 -v -c get test
 +
 +   Connected to 10.0.0.57 (10.0.0.57), port 69
 +   getting from 10.0.0.57: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 vml000057 xinetd[7708]: START: tftp pid=10145 from=10.0.0.107
 +  Nov 24 09:14:30 vml000057 in.tftpd[10146]: RRQ from 10.0.0.107 filename test
  
 +====== Links ======
 +  * **[[centos:pxe_c7:start|Zurück zum Kapitel >>PXE-Boot-Server unter CentOS 7.x einrichten<<]]**
 +  * **[[wiki:start|Zurück zu Projekte und Themenkapitel]]**
 +  * **[[http://dokuwiki.nausch.org/doku.php/|Zurück zur Startseite]]**
  
  
  • centos/pxe_c7/tftp.1483615213.txt.gz
  • Zuletzt geändert: 05.01.2017 11:20.
  • von django