Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

vsftpd, ip dynamique, routeur et mode passif

9 réponses
Avatar
erion
Bonjour à tous,
voilà, j'ai monté un petit serveur ftp chez moi sur une woody, j'ai une
inscription chez dyndns et jusque-là, tout se passe bien (j'ai un petit
script qui me permet d'envoyer si besoin est mon IP à dyndns avec
ez-ipupdate (source dispo ici :
http://www.gusnet.cx:8080/gus/proj/ez-ipupdate/userdoc.php?userdoc_action=fullcomment&commentid=110

).
Mais voilà, avec le mode passif rendu nécessaire par mon routeur, je
dois masquer l'IP locale de mon poste (ex. : 192.168.1.1) et indiquer
celle du routeur dans le fichier de conf de vsftpd pour que le client
sache où se connecter (principe du mode passif) . Sauf que voilà,
justement l'IP est dynamique... est-ce que qqun saurait faire un script
qui va comparer à intervalle de 10 mn par exemple, les deux ip des 2
fichiers dans /tmp (old_ip et new_ip, à la base du script ez-ipupdate),
changer dynamiquement l'option pasv_address=new_IP à la fin du fichier
de conf (c'est-à-dire plus ou moins enlever l'ancienne ligne pour en
mettre une nouvelle) et redémarrer le daemon ?
Sinon, peut-être y a-t-il une option de vsftpd qui me permettrait de ne
pas utiliser cette méthode ?
Si qqun pouvait m'aider, ça m'ôterait une belle épine du pied...
Merci d'avance ! :-)

NB : posté chez debian-user-french mais pas de réponse.

9 réponses

Avatar
Thomas Nemeth
Le ven 28 mai 2004 à 11:10, erion a tapoté :
| Bonjour à tous,

Bonjour.


[...]
| sache où se connecter (principe du mode passif) . Sauf que voilà,
| justement l'IP est dynamique... est-ce que qqun saurait faire un script
| qui va comparer à intervalle de 10 mn par exemple, les deux ip des 2
| fichiers dans /tmp (old_ip et new_ip, à la base du script ez-ipupdate),
| changer dynamiquement l'option pasv_address=new_IP à la fin du fichier
| de conf (c'est-à-dire plus ou moins enlever l'ancienne ligne pour en
| mettre une nouvelle) et redémarrer le daemon ?

Pourquoi ne pas faire ça à chaque reconnexion ppp ?
Tu récupères l'IP simplement dans la variable adéquate et tu
modifie le fichier de config avec sed, puis tu relances le service.

Extrait de /etc/ppp/ip-up :

# This script is run by the pppd after the link is established.
# It uses run-parts to run scripts in /etc/ppp/ip-up.d, so to add
# routes,
# set IP address, run the mailq etc. you should create script(s) there.
#
# Be aware that other packages may include /etc/ppp/ip-up.d scripts
# (named
# after that package), so choose local script names with that in mind.
#
# This script is called with the following arguments:
# Arg Name Example
# $1 Interface name ppp0
# $2 The tty ttyS1
# $3 The link speed 38400
# $4 Local IP number 12.34.56.78
# $5 Peer IP number 12.34.56.99
# $6 Optional ``ipparam'' value foo

Tu as donc ton IP ($4 ou plutôt $PPP_LOCAL plus loin dans le script
ce qui est préférable) et il te suffit de créer un fichier dans
/etc/ppp/ip-up.d faisant un :

sed -e "s/IP_PAR_DÉFAUT/$PPP_LOCAL/g" fichier-config > tmpfile
mv tmpfile fichier-config
/etc/init.d/ton-service restart

En adaptant, bien sûr, les noms de fichiers et commandes.



| Merci d'avance ! :-)

Avec plaisir.


| NB : posté chez debian-user-french mais pas de réponse.

Pas vu passer...


Thomas
Avatar
erion

Le ven 28 mai 2004 à 11:10, erion a tapoté :
| Bonjour à tous,

Bonjour.


[...]
| sache où se connecter (principe du mode passif) . Sauf que voilà,
| justement l'IP est dynamique... est-ce que qqun saurait faire un script
| qui va comparer à intervalle de 10 mn par exemple, les deux ip des 2
| fichiers dans /tmp (old_ip et new_ip, à la base du script ez-ipupdate),
| changer dynamiquement l'option pasv_address=new_IP à la fin du fichier
| de conf (c'est-à-dire plus ou moins enlever l'ancienne ligne pour en
| mettre une nouvelle) et redémarrer le daemon ?

Pourquoi ne pas faire ça à chaque reconnexion ppp ?
Tu récupères l'IP simplement dans la variable adéquate et tu
modifie le fichier de config avec sed, puis tu relances le service.



Et oui, ça serait parfait ! Sauf que je suis derrière un modem-routeur
ADSL... :-( et mon IP est non routable sur le net...(réseau local)

Avatar
TiChou
Dans le message <news:40b70c76$0$13937$,
*erion* tapota sur f.c.o.l.configuration :


erion a tapoté :

[...]
|>> sache où se connecter (principe du mode passif) . Sauf que voilà,


|>> justement l'IP est dynamique... est-ce que qqun saurait faire un script
|>> qui va comparer à intervalle de 10 mn par exemple, les deux ip des 2
|>> fichiers dans /tmp (old_ip et new_ip, à la base du script ez-ipupdate),
|>> changer dynamiquement l'option pasv_address=new_IP à la fin du fichier
|>> de conf (c'est-à-dire plus ou moins enlever l'ancienne ligne pour en
|>> mettre une nouvelle) et redémarrer le daemon ?

Oui, c'est tout simple mais on verra plus tard (après le repas quoi ;-)).

Pourquoi ne pas faire ça à chaque reconnexion ppp ?
Tu récupères l'IP simplement dans la variable adéquate et tu
modifie le fichier de config avec sed, puis tu relances le service.

Et oui, ça serait parfait ! Sauf que je suis derrière un modem-routeur

ADSL... :-( et mon IP est non routable sur le net...(réseau local)


Quel modèle de routeur ? Ce routeur ne sait pas nater le protocole ftp (de
la même manière que Linux avec son module ip_nat_ftp) ?

--
TiChou


Avatar
erion



|>> sache où se connecter (principe du mode passif) . Sauf que voilà,
|>> justement l'IP est dynamique... est-ce que qqun saurait faire un script
|>> qui va comparer à intervalle de 10 mn par exemple, les deux ip des 2
|>> fichiers dans /tmp (old_ip et new_ip, à la base du script ez-ipupdate),
|>> changer dynamiquement l'option pasv_address=new_IP à la fin du fichier
|>> de conf (c'est-à-dire plus ou moins enlever l'ancienne ligne pour en
|>> mettre une nouvelle) et redémarrer le daemon ?

Oui, c'est tout simple mais on verra plus tard (après le repas quoi ;-)).


Quel modèle de routeur ? Ce routeur ne sait pas nater le protocole ftp (de
la même manière que Linux avec son module ip_nat_ftp) ?



Salut,

ouaip, c important de bien manger :-) D'aileurs j'y vais, je vais voir
si tout se passe bien au self .
Et mon routeur est un Olitec SX200. Qu'est-ce que tu entends par "nater
le protocole ftp" ?
Bon app' et merci.

Avatar
Thomas Nemeth
Le ven 28 mai 2004 à 12:17, erion a tapoté :
|
| > Quel modèle de routeur ? Ce routeur ne sait pas nater le protocole ftp (de
| > la même manière que Linux avec son module ip_nat_ftp) ?
|
| Et mon routeur est un Olitec SX200. Qu'est-ce que tu entends par "nater
| le protocole ftp" ?

NATer.
Faire du NAT (Network Address Translation) : faire en sorte que,
dans ton cas, les requêtes ftp reçues sur le routeur arrivent
sur la babasse hébergeant le serveur FTP.


| Bon app' et merci.

Merci :)


Thomas
--
Ta mère elle se demande si le pentium 133 c'est radioactif.
Avatar
[Sauron De Mordor]
erion wrote:
Bonjour à tous,
voilà, j'ai monté un petit serveur ftp chez moi sur une woody, j'ai une
inscription chez dyndns et jusque-là, tout se passe bien (j'ai un petit
script qui me permet d'envoyer si besoin est mon IP à dyndns avec
ez-ipupdate (source dispo ici :
http://www.gusnet.cx:8080/gus/proj/ez-ipupdate/userdoc.php?userdoc_action=fullcomment&commentid0

).
Mais voilà, avec le mode passif rendu nécessaire par mon routeur, je
dois masquer l'IP locale de mon poste (ex. : 192.168.1.1) et indiquer
celle du routeur dans le fichier de conf de vsftpd pour que le client
sache où se connecter (principe du mode passif) . Sauf que voilà,
justement l'IP est dynamique... est-ce que qqun saurait faire un script
qui va comparer à intervalle de 10 mn par exemple, les deux ip des 2
fichiers dans /tmp (old_ip et new_ip, à la base du script ez-ipupdate),
changer dynamiquement l'option pasv_address=new_IP à la fin du fichier
de conf (c'est-à-dire plus ou moins enlever l'ancienne ligne pour en
mettre une nouvelle) et redémarrer le daemon ?
Sinon, peut-être y a-t-il une option de vsftpd qui me permettrait de ne
pas utiliser cette méthode ?
Si qqun pouvait m'aider, ça m'ôterait une belle épine du pied...
Merci d'avance ! :-)

NB : posté chez debian-user-french mais pas de réponse.




comme ecrit precedement, il faut faire de nat et masqureading pour le
protocole ftp.
de plus les routeur sont intelligent maintenant, alors bizare qu il ne
suporte que le mode passif ?

as tu des module du genre contract ? ou qq chose d avoisinant ?

Avatar
erion



NATer.
Faire du NAT (Network Address Translation) : faire en sorte que,
dans ton cas, les requêtes ftp reçues sur le routeur arrivent
sur la babasse hébergeant le serveur FTP.



Thomas


Ben si, c ce qui se passe et c bien ce que j'avais cru comprendre : les
ports ad-hoc sont forwardés du routeur vers mon ordi (ftp et ftp_data,
21 et 20). Mais le pb vient du fonctionnement mm du mode passif : la
connexion data est initiée par le serveur, qui envoie au client, entre
autres, deux choses :
- le port sur lequel initier la connexion data
- l'adresse IP sur laquelle il faut appliquer la connexion
Bon, ce n'est pas forcément dans l'ordre ni très complet, mais l'idée
est là.
Et donc, si je ne passe pas cette option (pasv_address=x.x.x.x, adresse
à communiquer au Pc distant pour initier cette connexion) à vsftpd (ou
tt autre logiciel serveur ftp), le serveur va envoyer l'adresse locale
au client, du genre 192.168.1.1 par exemple. Et donc celui-ci va être
dans les choux... c'est logique !
Donc voilà pourquoi, à cause de mon ip dynamique, j'ai besoin de
modifier le fichier de conf de vsftpd.
Et si marche, je ferai dès que je pourrai une petite page web avec des
trucs et des astuces comme celle-là parce que ça m'étonnerait que je
sois le seul à avoir eu le pb. Et j'ai rien trouvé sur le net, à part de
la théorie. C bien la théorie, mais parfois, ça ne suffit pas.
Merci à tous ceux qui voudront bien m'aider ou me lire. :-)

Avatar
erion


Comme promis, je vous propose le script suivant :

#!/bin/sh
#
# TiChou fr.comp.os.linux.configuration

# Paramètres DynDNS

USERNAME="login"
PASS="pass"
HOST="host.dyndns.org"
#WILDCARD=OFF
#MX="mx.domain.tld"
#MXBAK=NO


# Adresse mail

EMAIL="postmaster"


# Fichier de configuration vsftpd

VSFTPDCONF=/etc/vsftpd/vsftpd.conf


# Récupération de l'IP Internet

IP=$(/usr/bin/lynx -dump http://checkip.dyndns.org |
/usr/bin/awk '/Current IP Address/ { print $4 }')


# Récupération de l'ancienne IP

IPOLD=$(/usr/bin/awk 'END {print $6}' /var/log/dyndns 2>/dev/null)

if [ -n "$IP" -a "$IPOLD" != "$IP" ]
then

# Mise à jour de vsftpd

if [ -f $VSFTPDCONF ]
then
/usr/bin/sed -i -e "s/^(pasv_address=).*/1$IP/" $VSFTPDCONF
/bin/killall -HUP vsftpd 2>/dev/null
fi


# Mise à jour DynDNS

URL="http://members.dyndns.org/nic/update?system=dyndns&offline=NO"
URL="$URL&hostname=$HOST&myip=$IP"

[ -n "$WILDCARD" ] && URL="$URL&wildcard=$WILDCARD"
[ -n "$MX" ] && URL="$URL&mx=$MX"
[ -n "$MXBAK" ] && URL="$URL&backmx=$MXBAK"

RESULT=$(/usr/bin/lynx -source -auth="$USERNAME":"$PASS" "$URL" 2>&1
| /usr/bin/perl -p -e 's/n///;s/s+/_/g')


# Log de la mise à jour

date +"%b %e %k:%M:%S dyndns[$$]: %s $IP $RESULT" >> /var/log/dyndns


# Envoit mail

[ -n "$EMAIL" ] && echo -e "Adresse IP : $IPnRésultat : $RESULT"
| /usr/bin/mail -s "Mise a jour DynDNS" $EMAIL

fi


Le même mais en utilisant ez-update :

#!/bin/sh
#
# TiChou fr.comp.os.linux.configuration

# Fichier de configuration vsftpd

VSFTPDCONF=/etc/vsftpd/vsftpd.conf


# Récupération de l'IP Internet

IP=$(/usr/bin/lynx -dump http://checkip.dyndns.org |
/usr/bin/awk '/Current IP Address/ { print $4 }')


# Récupération de l'ancienne IP

IPOLD=$(/usr/bin/awk 'END {print $6}' /var/log/dyndns 2>/dev/null)

if [ -n "$IP" -a "$IPOLD" != "$IP" ]
then

# Mise à jour de vsftpd

if [ -f $VSFTPDCONF ]
then
/usr/bin/sed -i -e "s/^(pasv_address=).*/1$IP/" $VSFTPDCONF
/bin/killall -HUP vsftpd 2>/dev/null
fi


# Mise à jour DynDNS

ez-ipupdate --address $IP -c /etc/ez-ipupdate.conf


# Log de la mise à jour

date +"%b %e %k:%M:%S dyndns[$$]: %s $IP" >> /var/log/dyndns


# Envoit mail

[ -n "$EMAIL" ] && echo -e "Adresse IP : $IP"
| /usr/bin/mail -s "Mise a jour DynDNS" $EMAIL

fi



De rien.



Ah ben ça !!!!!!!!
Si c'est pas un spécialiste ! Bon en fréquentant le forum, on s'en rend
vite compte... mais tout de même ! Ca reste impressionant de maîtrise et
de connaissance. C'est pas pour vous jeter beaucoup de fleurs, mais
comme je ne maîtrise pas ce domaine, ça m'épate.
Un merci s'impose, bien-sûr, du fond du coeur, très sincèrement.
Et un très bon week-end. Je vais tester ça dès que possible.
Encore merci.

Avatar
TiChou
Dans le message <news:40b727cf$0$26913$,
*erion* tapota sur f.c.o.l.configuration :


Quel modèle de routeur ? Ce routeur ne sait pas nater le protocole ftp
(de la même manière que Linux avec son module ip_nat_ftp) ?


Et mon routeur est un Olitec SX200.




Je ne connais pas ce routeur et je n'ai rien trouvé d'intéressant à son
sujet concernant ses possibilités de « natage ».

Qu'est-ce que tu entends par "nater le protocole ftp" ?




NATer.
Faire du NAT (Network Address Translation) : faire en sorte que,
dans ton cas, les requêtes ftp reçues sur le routeur arrivent
sur la babasse hébergeant le serveur FTP.


Ben si, c ce qui se passe et c bien ce que j'avais cru comprendre


Non, ce n'est pas exactement ce qui se passe.

les ports ad-hoc sont forwardés du routeur vers mon ordi (ftp et ftp_data,
21 et 20).


Justement il ne devrait y avoir de configuré qu'un seul port, le port 21. Le
port 20/ftpdata, si le routeur sait « nater » le protocole ftp, doit être
forwardé dynamiquement quand il le faut.

Mais le pb vient du fonctionnement mm du mode passif : la
connexion data est initiée par le serveur, qui envoie au client, entre
autres, deux choses :
- le port sur lequel initier la connexion data
- l'adresse IP sur laquelle il faut appliquer la connexion
Bon, ce n'est pas forcément dans l'ordre ni très complet, mais l'idée
est là.
Et donc, si je ne passe pas cette option (pasv_address=x.x.x.x, adresse
à communiquer au Pc distant pour initier cette connexion) à vsftpd (ou
tt autre logiciel serveur ftp), le serveur va envoyer l'adresse locale
au client, du genre 192.168.1.1 par exemple. Et donc celui-ci va être
dans les choux... c'est logique !


Justement, si le routeur savait « nater » correctement le protocole ftp, il
changerait dynamiquement l'adresse IP interne envoyer au client en l'adresse
IP Internet et activerait automatiquement le forwarding du routeur vers la
machine interne pour la connexion ftpdata.
Il semble donc que ce routeur n'est pas cette fonctionnalité.

Donc voilà pourquoi, à cause de mon ip dynamique, j'ai besoin de
modifier le fichier de conf de vsftpd.


Comme promis, je vous propose le script suivant :

#!/bin/sh
#
# TiChou fr.comp.os.linux.configuration

# Paramètres DynDNS

USERNAME="login"
PASS="pass"
HOST="host.dyndns.org"
#WILDCARD=OFF
#MX="mx.domain.tld"
#MXBAK=NO


# Adresse mail

EMAIL="postmaster"


# Fichier de configuration vsftpd

VSFTPDCONF=/etc/vsftpd/vsftpd.conf


# Récupération de l'IP Internet

IP=$(/usr/bin/lynx -dump http://checkip.dyndns.org |
/usr/bin/awk '/Current IP Address/ { print $4 }')


# Récupération de l'ancienne IP

IPOLD=$(/usr/bin/awk 'END {print $6}' /var/log/dyndns 2>/dev/null)

if [ -n "$IP" -a "$IPOLD" != "$IP" ]
then

# Mise à jour de vsftpd

if [ -f $VSFTPDCONF ]
then
/usr/bin/sed -i -e "s/^(pasv_address=).*/1$IP/" $VSFTPDCONF
/bin/killall -HUP vsftpd 2>/dev/null
fi


# Mise à jour DynDNS

URL="http://members.dyndns.org/nic/update?system=dyndns&offline=NO"
URL="$URL&hostname=$HOST&myip=$IP"

[ -n "$WILDCARD" ] && URL="$URL&wildcard=$WILDCARD"
[ -n "$MX" ] && URL="$URL&mx=$MX"
[ -n "$MXBAK" ] && URL="$URL&backmx=$MXBAK"

RESULT=$(/usr/bin/lynx -source -auth="$USERNAME":"$PASS" "$URL" 2>&1
| /usr/bin/perl -p -e 's/n///;s/s+/_/g')


# Log de la mise à jour

date +"%b %e %k:%M:%S dyndns[$$]: %s $IP $RESULT" >> /var/log/dyndns


# Envoit mail

[ -n "$EMAIL" ] && echo -e "Adresse IP : $IPnRésultat : $RESULT"
| /usr/bin/mail -s "Mise a jour DynDNS" $EMAIL

fi


Le même mais en utilisant ez-update :

#!/bin/sh
#
# TiChou fr.comp.os.linux.configuration

# Fichier de configuration vsftpd

VSFTPDCONF=/etc/vsftpd/vsftpd.conf


# Récupération de l'IP Internet

IP=$(/usr/bin/lynx -dump http://checkip.dyndns.org |
/usr/bin/awk '/Current IP Address/ { print $4 }')


# Récupération de l'ancienne IP

IPOLD=$(/usr/bin/awk 'END {print $6}' /var/log/dyndns 2>/dev/null)

if [ -n "$IP" -a "$IPOLD" != "$IP" ]
then

# Mise à jour de vsftpd

if [ -f $VSFTPDCONF ]
then
/usr/bin/sed -i -e "s/^(pasv_address=).*/1$IP/" $VSFTPDCONF
/bin/killall -HUP vsftpd 2>/dev/null
fi


# Mise à jour DynDNS

ez-ipupdate --address $IP -c /etc/ez-ipupdate.conf


# Log de la mise à jour

date +"%b %e %k:%M:%S dyndns[$$]: %s $IP" >> /var/log/dyndns


# Envoit mail

[ -n "$EMAIL" ] && echo -e "Adresse IP : $IP"
| /usr/bin/mail -s "Mise a jour DynDNS" $EMAIL

fi

Merci à tous ceux qui voudront bien m'aider ou me lire. :-)


De rien.

--
TiChou