Haproxy - настройка для FTP

Материал из support.qbpro.ru

НАСТРОЙКА

  • Предварительно настроенный Vsftp сервер имеет следующие настройки:
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=300
data_connection_timeout=120
nopriv_user=ftp
ftpd_banner=Welcome.
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd

rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

utf8_filesystem=YES

pasv_enable=YES
pasv_min_port=17000
pasv_max_port=17500

guest_enable=YES
guest_username=ftp
virtual_use_local_privs=YES
user_sub_token=$USER
local_root=/srv/ftp/$USER
hide_ids=YES
seccomp_sandbox=NO
allow_writeable_chroot=YES
max_clients=20
max_per_ip=3
user_config_dir=/etc/vsftpd/vsftpd_user_conf
pasv_address=*.*.*.* # Здесь обязательно указывается ip внешнего интерфейса с которого сделан проброс порта в NAT шлюза
  • На сервере Haproxy*
    • у нас кластер с keepalived, где входной ip 10.33.33.11, а выходной ip: 10.1.2.21 (нода1)
    • С учетом того, что сервер FTP является активным ip:10.1.2.5:

1. Вносим в /etc/haproxy/haproxy.conf:

...
 ##  - pubftp
frontend ftp-acl
    bind *:21,:17000-17500 name ftp
    mode tcp
    use_backend ftp_host
#
backend ftp_host
    option tcp-check
    server ftp.host.ru 10.1.2.5 check port 21
 ...

2. В правилах iptables вносим правила для обратного прохождения пакетов сервера ftp к клиенту:

iptables -t nat -A POSTROUTING -s 10.1.2.21 -o enp6s18:1 -j SNAT --to-source 10.33.33.11  /
-m comment --comment 'acl_for_active_ftp'
iptables -t nat -A PREROUTING -d 10.33.33.11/32 -i enp6s18:1 -p tcp -m tcp --dport 17000:17500 /
-j DNAT --to-destination 10.1.2.21 -m comment --comment 'acl2_for_active_ftp'

3. Для того, чтобы эти правила стартовали при запуске 1ноды Haproxy, добавляем это в виде скрипта в автозагрузку:

  • скрипт который добавляет правила:
/etc/scripts/startnat.sh
...
#!/bin/bash

function clearNat(){
iptables -t nat -F
iptables -t nat -X
}

function addRules(){
if [ $(iptables -L -nv -t nat|grep acl_for_active_ftp|wc -l) == "0" ]; then
 iptables -t nat -A POSTROUTING -s 10.1.2.21 -o enp6s18:1 -j SNAT --to-source 10.33.33.11 /
 -m comment --comment 'acl_for_active_ftp'
 iptables -t nat -A PREROUTING -d 10.33.33.11/32 -i enp6s18:1 -p tcp -m tcp --dport 17000:17500 /
 -j DNAT --to-destination 10.1.2.21 -m comment --comment 'acl2_for_active_ftp'
fi
}
clearNat;
addRules;
...
    • для запуска скрипта при старте вносим:
в /etc/rc.local
..
/etc/scripts/startnat.sh
..
в случае перезапуска сети:
в /etc/networks/interfaces
...
auto eth1
allow-hotplug eth1
...
post-up /etc/scripts/startnat.sh
...
  • все сервер Haproxy (нода1) готов, далее все повторить на второй ноде, только указать ее ip:10.1.2.22