Plusieurs versions de serveurs TFTP 1) sont disponibles sur la majorité des distributions GNU/Linux :
Le service TFTP est largement utilisé par PXE pour charger des images via le réseau et démarrer des systèmes sans disques, automatiser des installations, charger des programmes de diagnostic etc.
De nombreux matériels réseau permettent de charger/exporter leurs configurations via TFTP.
Via le gestionnaire de paquetage, installer le paquet tftp-hpa :
sudo apt-get install tftpd-hpa
Pour vérifier l'état du service :
systemctl status tftpd-hpa.service netstat -anpe | grep :69
Le fichier de configuration par défaut est minimaliste :
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
L'installateur crée un dossier /srv/tftp
c'est le dossier racine du serveur (l'option --secure active un chroot). Le dossier appartient à root, l'utilisateur tftp qui exécute le service n'a qu'un accès en lecture.
Avec la configuration par défaut, l'utilisateur pourra downloader les fichiers disponibles sur le serveur mais ne pourra pas uploader des fichiers.
# Désactive le démarrage automatique du service
systemctl disable tftpd-hpa.service
Pour limiter l'accès au service TFTP, selon le mode de compilation du programme, il faudra utiliser :
# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
# See the manual pages hosts_access(5) and hosts_options(5).
#
# Example: ALL: some.host.name, .some.domain
# ALL EXCEPT in.fingerd: other.host.name, .other.domain
#
# If you're going to protect the portmapper use the name "rpcbind" for the
# daemon name. See rpcbind(8) and rpc.mountd(8) for further information.
#
# The PARANOID wildcard matches any host whose name does not match its
# address.
#
# You may wish to enable this to ensure any programs that don't
# validate looked up hostnames still leave understandable logs. In past
# versions of Debian this has been the default.
# ALL: PARANOID
# Tout service non explicitement autorisé est bloqué
ALL: ALL
# /etc/hosts.allow: list of hosts that are allowed to access the system.
# See the manual pages hosts_access(5) and hosts_options(5).
#
# Example: ALL: LOCAL @some_netgroup
# ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
#
# If you're going to protect the portmapper use the name "rpcbind" for the
# daemon name. See rpcbind(8) and rpc.mountd(8) for further information.
#
in.tftpd: LOCAL 192.168.1.0/24
Par défaut le serveur TFTP rend accessible ses fichiers aux clients mais ne permet pas la création de nouveau contenu/l'écriture de fichiers. Il est cependant possible d'autoriser l'upload de fichiers sur le serveur TFTP.
Si le serveur n'est pas paramétré pour accepter la création de nouveaux fichiers, lors de l'utilisation de la commande put
une erreur avec le message File not found
est retournée:
tftp> put prise-A10.txt Error code 1: File not found
Modifier le fichier de configuration /etc/default/tftp-hpa, ajouter l'option --create à la variable TFTP_OPTIONS:
... TFTP_OPTIONS="--secure --ipv4 --verbose --create"
Modifier les droits sur le dossier racine du serveur TFTP, l'utilisateur tftp doit avoir les droits d'écriture. Si les droit ne sont pas correctement positionnés, on obtient un message Error code 0: Permission denied
:
sudo chown tftp:tftp /srv/tftp/
Relancer le service
systemctl restart tftpd-hpa.service
Modifier le masque associé à l'utilisateur tftp pour que les fichiers créés ne soient accessibles qu'en lecture aux utilisateurs du système (other).
Il est possible de spécifier une plage de ports
TFTP_OPTIONS="--secure --ipv4 --verbose --create --port-range 53000:55000"
Pour pouvoir gérer correctement les connexions, le module ip_conntrack_tftp doit être chargé :
modprobe ip_conntrack_tftp # Vérifier que le module est bien chargé lsmod | grep -i tftp
# Autorise le trafi
table ip ipfilter { comment "Firewall" ct helper tftp-standard { type "tftp" protocol udp l3proto ip } chain PRE { type filter hook prerouting priority filter; policy accept; udp dport 69 ct helper set "tftp-standard" } chain inbound { comment "Filtrage des paquets entrants" type filter hook input priority filter; policy drop; ct state invalid counter drop ct state established,related counter accept iif "lo" counter accept comment "Accepte le trafic local sur l'interface loopback" udp dport 69 counter accept ct helper "tftp" accept log prefix "[FW] [REJECT] [RID=666] " counter reject comment "Rejette tout trafic entrant non explicitement autorise" } chain outbound { comment "Filtrage des paquets sortants" type filter hook output priority filter; policy drop; ct state established,related counter accept comment "Autorise tout trafic sortant en lien avec les connexions explicitement autorisees" log prefix "[FW] [REJECT] [RID=667] " counter reject comment "Rejette tout trafic sortant non explicitement autorise" } chain forward { type filter hook forward priority filter; policy drop; log prefix "[FW] [REJECT] [RID=668] " counter reject comment "Rejette tout transfert non explicitement autorise" } }
Le service ne démarre pas à la fin du processus d'installation.
systemctl status tftpd-hpa.service
juil. 02 14:31:57 node-7c87 systemd[1]: Starting tftpd-hpa.service - LSB: HPA's tftp server... juil. 02 14:31:57 node-7c87 tftpd-hpa[16693]: * Starting HPA's tftpd in.tftpd juil. 02 14:31:57 node-7c87 systemd[1]: tftpd-hpa.service: Control process exited, code=exited, status=71/OSERR juil. 02 14:31:57 node-7c87 systemd[1]: tftpd-hpa.service: Failed with result 'exit-code'. juil. 02 14:31:57 node-7c87 systemd[1]: Failed to start tftpd-hpa.service - LSB: HPA's tftp server.
Le journal indique également :
journalctl --priority err
juil. 02 14:31:57 node-7c87 in.tftpd[16700]: cannot open IPv6 socket, disable IPv6: Address family not supported by protocol juil. 02 14:31:57 node-7c87 in.tftpd[16700]: Cannot set nonblock flag on socket: Bad file descriptor juil. 02 14:31:57 node-7c87 systemd[1]: Failed to start tftpd-hpa.service - LSB: HPA's tftp server.
Modifier le fichier /etc/default/tftpd-hpa
ajouter l'option --ipv4 :
TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS="192.168.1.10:69" TFTP_OPTIONS="--secure --ipv4"
Toute tentative d'upload (copie d'un fichier sur le serveur TFTP) échoue. Les messages suivants peuvent être retournés au client :
Error code 1: File not found
ERROR: transfer fail.
TFTP_OPTIONS
du fichier /etc/default/tftpd-hpa
.voir section Autoriser l'upload sur le serveur TFTP