Отличающийся почти параноидальной безопасностью vsftp server имеет одно неприятное ограничение:
когда он работает за NAT при динамическом выделении IP (как это у меня под СТРИМ-ом) он неправильно сообщает клиентам IP-адрес для пассивных подключений (500 PORT command illegal).
Т.е. вместо внешенго реального IP (например, 215.23.67.12) он передает NAT-овый внутренний адрес (например, 192.168.1.2) для параметра pasv_address, что вызывает указанную ошибку.
Даже продвинутый параметр pasv_addr_resolve не спасает ситуацию, т.к. он резолвится только при перезагрузке vsftp сервера, что никак, увы, не связано с моментом, когда внешний IP вдруг поменяется.
2 приведенных ниже скрипта позволяют исправить это ограничение vsftpd и заставить его работать в пассивном режиме при динамическом IP за NAT-ом.
Создайте в каталоге /usr/sbin/ следующего содержания файл
vsftpd.ip:
#!/bin/sh
# Script is dedicated for setting real (external) IP-address in pasv_address=
# parameter in vsftpd.conf.
# It's neccessary for running vsftp in dynamic DNS environment
# behind NAT in passive mode. It checks external IP every 5 minutes, then sleeps.
# Wriiten by: ais77 (https://forum.ubuntu.ru)
# Configure these settings:
CONFIG_FILE=/etc/vsftpd.conf # Location of vsftpd.conf
CONFIG_FILE_TMP=/etc/vsftpd.conf.tmp # Location of temporary file
DOMAIN=ais77.homeftp.net # Your external domain (i.e. from DynDNS.com)
LOG_FILE=~/vsftpd.ip.log
touch $CONFIG_FILE_TMP
touch $LOG_FILE
while :
do
realIP=`dig $DOMAIN +short`
vsftpdIP=`sed -n "/pasv_address=/s/pasv_address=//p" $CONFIG_FILE`
if [ $realIP != $vsftpdIP ]; then
sed "s/$vsftpdIP/$realIP/" $CONFIG_FILE > $CONFIG_FILE_TMP
mv -f $CONFIG_FILE_TMP $CONFIG_FILE
/etc/init.d/vsftpd restart
echo "["`date`"] IP changed: from "$vsftpdIP" to "$realIP >> $LOG_FILE
fi
sleep 5m
done
exit 0
Тоже делаем его исполняемым:
~$ sudo chmod +x /etc/init.d/ipftp
Запускаем демон командой:
~$ sudo /etc/init.d/ipftp start
Чтобы он запускался атоматически при старте:
~$ sudo update-rc.d ipftp defauts
Все.
updated 07.01.10: скрипт vsftpd.ip обновлён, исправлена ошибка цикла и добавлено ведение лога обновлений.