Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/04/2007, à 14:30

nicolas_serre

[How to] Proftpd derrière une livebox (ip dynamique)

Pour commencer un peu de lecture:
http://doc.ubuntu-fr.org/proftpd
et http://allyana.info/TSSI-LINUX-pdf/TSSI … HCP-v2.pdf
(http://arnofear.free.fr/linux/template. … o=7&page=1)

En ip dynamique, il faut vous créer un compte sur http://www.dyndns.com/ et créer un nom de domaine qui pointra sur votre ip wan actuelle (DNS Service = Dynamic DNS).
Ensuite il faut configurer la livebox ou la box_qc pour qu'elle transmette la nouvelle ip (lors de chaque changement)  à votre compte dynDNS:
http://www.siteduzero.com/tuto-3-6144-1 … vebox.html


Voilà mon fichier proftpd.conf :

# This is a basic ProFTPD configuration file (rename it to 
# 'proftpd.conf' for actual use.  It establishes a single server
# and a single anonymous login.  It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.

ServerName			"Name ftp server"
ServerType standalone


# Port 21 is the standard FTP port.
Port	21

MasqueradeAddress nom_de_domaine.org

# les logs des connection et transfert
SystemLog /var/log/proftpd.log
TransferLog /var/log/xfer.log

# To prevent DoS attacks, set the maximum number of child processes
# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances 30

MultilineRFC2228 on

<Global>

AllowForeignAddress off
AllowRetrieveRestart on
# Allow FTP resuming.
# Remember to set to off if you have an incoming ftp for upload.
AllowStoreRestart on
PassivePorts 6000 6100

DefaultChdir	/mnt/120Go/ftp
DefaultRoot	/mnt/120Go/ftp/dir1 user1
DefaultRoot	/mnt/120Go/ftp/dir2 user2
DefaultRoot	/mnt/120Go/ftp

# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask				022

# Set the user and group under which the server will run.
User				nobody
Group				nobody

MaxClients 20
MaxClientsPerHost 5

AccessGrantMsg "Connexion reussie pour %u"

DeferWelcome off

# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
#DefaultRoot ~

# Normally, we want files to be overwriteable.
AllowOverwrite		on
# Bar use of SITE CHMOD by default
<Directory /mnt/120Go/ftp>

<Limit WRITE>
  AllowUser adminftp
  DenyAll
</Limit>

</Directory>


#############
<Directory /mnt/120Go/ftp/dir1>

<Limit WRITE>
  AllowUser adminftp
  AllowUser user1
  DenyAll
</Limit>

</Directory>

############
<Directory /mnt/120Go/ftp/dir2>

<Limit WRITE>
  AllowUser adminftp
  AllowUser user2
  DenyAll
</Limit>

</Directory>
############

#<Limit SITE_CHMOD>
#  DenyAll
#</Limit>

</Global>

# Needed for NIS.
PersistentPasswd              off

# Default root can be used to put users in a chroot environment.
# As an example if you have a user foo and you want to put foo in /home/foo
# chroot environment you would do this:
#
# DefaultRoot /home/foo foo
Include			/etc/proftpd-anonymous.conf

Voilà mon fichier proftpd-anonymous.conf:

# A basic anonymous configuration, no upload directories.
<Anonymous ~ftp>
  User				ftp
  Group				ftp
  # We want clients to be able to login with "anonymous" as well as "ftp"
  UserAlias			anonymous ftp

  # Limit the maximum number of anonymous logins
  MaxClients			10

  # Don't make it require a valid password or shell.
  RequireValidShell		off
  AnonRequirePassword		off

  # We want 'welcome.msg' displayed at login, and '.message' displayed
  # in each newly chdired directory.
  DisplayLogin			welcome.msg
  DisplayFirstChdir		.message

  # Limit WRITE everywhere in the anonymous chroot
  <Limit WRITE>
    DenyAll
  </Limit>

</Anonymous>
<VirtualHost 192.168.1.110>
Port 21
MasqueradeAddress nom_de_domaine.org
PassivePorts 6000 6100
DefaultServer on
</VirtualHost>

Il faut bien sûr ouvrir les bons ports dans la livebox:
20 à 21 en TCP
6000 à 6100 en TCP

Pour tester votre serveur ftp vous pouvez utiliser ce site:
http://www.net2ftp.com/

Mais les vrais ennuis commencent après, vous vous apercevrez que après 24h de fonctionnement, votre serveur ftp renvoie l'ancienne ip wan en réponse PASV, d'où un dysfonctionnement du mode passif. Si vous redémarrez ProFTPd, l'adresse ip du MasqueradeAddress va se mettre à jour et le serveur fonctionnera à nouveau en mode passif.

Pour palier à ce problème, il faut faire un script qui détecte le changement d'ip wan et redémarre le service Proftpd, ce script étant lancé toutes les 5 minutes à l'aide de cron.

Nom du script: update_ip.sh, il faut bien sûr le rendre exécutable. J'ai placé le script dans mon home.

!/bin/sh
# Constantes globales
SITE=nom_de_domaine.org;
DEAMON=proftpd;

# Script de relancement de deamon

OLD=/home/user/old.txt;
NEW=/home/user/new.txt;
DIFF=/home/user/diff.txt;

if [ -s $OLD ] ; then
	echo
	echo "Old exists, do nothing !"
	echo
else
	echo
	echo "Installing..."
	echo
	/usr/bin/host $SITE > $OLD;
	echo "	... done!"
fi

/usr/bin/host $SITE > $NEW;
/usr/bin/cmp $OLD $NEW > $DIFF;

if [ -s $DIFF ] ; then
	echo
	echo "Restarting Deamon !"
	echo
	
	/sbin/service $DEAMON restart;

	echo "	... done!"
fi

# updating
mv -f $NEW $OLD;
# cleanning
rm -f $DIFF;

Remplacez user par votre nom d'utilisateur.
Il faut ensuite configurer cron, lancer dans un terminal :

sudo crontab -e

En fait cette commande édite le fichier de configuration de cron pour root avec vi
Insérer ces lignes :

#
SHELL = /bin/bash
PATH = /sbin:/bin:/usr/sbin:/usr/bin
HOME = /
#
0,5,10,15,20,25,30,35,40,45,50,55 * * * * sh /home/user/update_ip.sh

Avec cron il vaut mieux mettre tout en chemin absolu, y compris les commandes et faire attention au PATH sinon ça ne fonctionne pas. Pour connaitre le chemin absolu d'une commande (exemple : host), il faut utiliser which dans une console, exemple :

sudo which host
Password:
/usr/bin/host

Voilà et merci à Anthony pour son aide précieuse big_smile

Dernière modification par nicolas_serre (Le 16/04/2007, à 23:14)

Hors ligne