У нас есть процесс Java, который содержит встроенный FTP-сервер, который я хотел бы запустить на машине RHEL5. Я не хочу запускать процесс от имени пользователя root и не хочу, чтобы клиенты указывали порт при подключении. Похоже, я смогу настроить vsftpd для прослушивания альтернативного порта (например, 20000), а затем настроить ipchains для перенаправления всего трафика с порта 21 на порт 20000. Я думаю, что конкретно мне нужно:
ip_conntrack_ftp
для перенаправления трафика с порта 21 на 20000Итак, мой первоначальный вопрос: кажется ли это разумным подходом?
Для выполнения шага 1 я изменил свой vsftpd.conf, добавив в него следующую строку:
listen_port=20000
Затем я могу перезапустить vsftpd и убедиться, что он прослушивает 20000, выполнив следующие действия:
> ftp tstweb1 20000
Connected to tstweb1.pulseenergy.com.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (tstweb1:cclark):
И я перехожу к логину без проблем. Шаг 1 завершен.
Что касается шага 2, я не вижу загруженного модуля:
> /sbin/lsmod | grep ftp
>
Поэтому я пытаюсь загрузить его с правильной информацией о перенаправлении портов:
> /sbin/modprobe ip_conntrack_ftp ports=21,20000
И я проверяю, что он загрузился:
> /sbin/lsmod | grep ftp
ip_conntrack_ftp 41489 0
ip_conntrack 91109 3 ip_conntrack_ftp,iptable_nat,ip_nat
Но я получаю отказ в соединении, когда пытаюсь его использовать:
> ftp tstweb1
ftp: connect: Connection refused
Я знаю, что FTP - это сложный протокол с активным и пассивным режимами и связью через несколько портов, но у меня сложилось впечатление, что ip_conntrack_ftp
модуль скроет для меня многое из этого. Нужно ли мне дополнительно писать какие-то особые правила iptables?
Я думаю, что то, что вы ищете, ПРАВИЛЬНО:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 21 -j REDIRECT --to-port 20000
И вам нужно использовать пассивный ftp.