Переслать FTP с IPTables

9

Я пытаюсь переслать FTP-сервер с IPTables. FTP-сервер работает на Windows 2008 (Цербер).

Образ

Подробности Win Box:

  • IP: 192.168.220.51
  • FTP-порт: 21
  • PASV-порты: 11000-13000

FTP-сервер прекрасно работает в локальной сети.

Маршрутизатор работает нормально для других клиентов (Обслуживание NAT, DHCP, Брандмауэр, ...). Мне нужно перенаправить FTP-сервис во внешний мир, но я не могу использовать порты 20-21 (уже заняты).

Я попробовал это, но это не сработало:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21

Текущая конфигурация IPTables:

[root@router ~]# service iptables status
Table: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           
2    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  127.0.0.1            0.0.0.0/0           
2    DROP       all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:68 
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:1194 
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 
8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3128 
10   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
11   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53 
12   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
13   ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
14   DROP       udp  --  0.0.0.0/0            0.0.0.0/0           
15   DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Любая помощь будет отличной :-).

Баунти-Edit : я не смог понять это, любая помощь будет принята с благодарностью.

EDIT2

Теперь я могу подключиться к своему FTP-серверу после запуска команд:

modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21

Я начинаю добираться ... Я думаю, что мне просто нужно, чтобы мои PASV-порты работали сейчас ...

EDIT3: дополнительная информация

[root@router ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 3251 packets, 154K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  540 48534 ACCEPT     all  --  *      *       127.0.0.1            0.0.0.0/0           
4270K 5625M ACCEPT     all  --  *      *       192.168.220.0/24     0.0.0.0/0           
    0     0 DROP       all  --  eth1   *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:68 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:1194 
   65  8487 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
    8   404 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:3128 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
63870   81M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
  974  224K DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           
  638 34956 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 

Chain FORWARD (policy ACCEPT 3578K packets, 3355M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 2275K packets, 703M bytes)
 pkts bytes target     prot opt in     out     source               destination  



[root@router ~]# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 33954 packets, 2595K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2121 to:192.168.220.51:21 

Chain POSTROUTING (policy ACCEPT 5925 packets, 699K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      eth1    0.0.0.0/0            0.0.0.0/0           
27170 1785K MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 5777 packets, 457K bytes)
 pkts bytes target     prot opt in     out     source               destination  

Решение

Вот как я это сделал, может быть, не очень красиво, но это работает.

[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 11000:13000 -j DNAT --to 192.168.220.51:11000-13000
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 11000:13000 -j ACCEPT

Некоторые дополнительные замечания: FTP-сервер прослушивает бота 21 и 2121, а диапазон PASV установлен от 11000 до 13000

Барт Де Вос
источник
Загружены ли модули ядра ftp conntrack и nat? Какой выход lsmod | grep -i ftp?
Steven Monday
Пусто, я не загружал никаких дополнительных модулей ядра. Мне нужно немного?
Барт Де Вос
1
@TiZon: Да. Iptables нужны модули conntrack для отслеживания номеров портов и адресов, которые FTP использует в командах PASV и PORT. Кроме того, когда вы делаете NAT, модули NAT необходимы для перезаписи номеров портов и адресов, чтобы протокол FTP мог работать правильно.
Steven Monday
2
+1 за хорошее и полное объяснение.
Гопой
3
@TiZon: а Стивен Monai уже упоминалось, для того , чтобы FTP для правильной работы за NAT шлюза, вам потребуется ip_conntrack_ftpи ip_nat_ftpмодули ядра загружены. FTP является интересным протоколом, с которым приходится иметь дело за межсетевым экраном / шлюзом NAT. Возможно, вам будет проще просто использовать sftp (SSH FTP), который использует только порт 22 и зашифрован (гораздо более безопасный). FileZilla - отличный бесплатный FTP-клиент, поддерживающий SFTP.
Шон С.

Ответы:

7

Чтобы заставить работать пассивную поддержку, вам нужно перенаправить пассивные порты на внутренний ftp-сервер с теми же номерами портов .

Простое решение: переслать их все время

InternetIP: 11000-13000 -> 192.168.220.51:11000-13000

Более сложное решение:

Вам понадобится специальный агент отслеживания соединений, который читает протокол FTP и своевременно делает правильные сопоставления NAT. Похоже, что ip_conntrack_ftp может сделать это.

e_tothe_ipi
источник
Я сделал это так Я перенаправил все порты навсегда. Возможно, это не лучшее решение, но оно работает. Первый пост отредактирован с помощью howto.
Барт Де Вос
0
iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
modprobe nf_conntrack_ftp 
modprobe nf_nat_ftp

должно быть достаточно

Ялок Ий
источник
Не следует 2121ли заменить номер порта на 21? Как модули ftp распознают соединение как управление ftp? Будет ли оно применяться к каждому соединению, использующему порт 21, до или после NAT?
Касперд
Некоторое объяснение было бы неплохо, поэтому мы знаем, что вы не просто груз, культивирующий ответ
Том О'Коннор
Вы выбираете, какой порт отправлять на какой порт назначения. Это может быть любой подходящий для вас. Он будет применяться к каждому соединению с портом, который вы укажете, в нашем случае 2121, в таблице nat "PREROUTING". Как работает ftp модуль netfilter, вы можете прочитать здесь en.wikipedia.org/wiki/Netfilter#Connection_tracking_helpers
Yalok Iy