Главная > Linux > Разрешение доступа к ФТП средствами iptables

Разрешение доступа к ФТП средствами iptables


16 апреля 2009. Разместил: dimon
Есть локальная сеть компьютеры которой вылазят в инте через сервер с Линуксом.
Необходимо средствами iptables разрешить доступ компьютерам локальной сети к ФТП серверам в интернете.

Для этого добавим в файл /etc/sysconfig/iptables правила:

#FTP
-A INPUT -s 192.168.0.0/255.255.255.0 -p tcp --dport 21 -j ACCEPT


Теперь в таблице NAT нужно добавить правило (в файле /etc/sysconfig/iptables после строки *nat):

-A POSTROUTING -s 192.168.0.0/255.255.255.0 -p tcp --dport 21 -j MASQUERADE


где 192.168.0.0/255.255.255.0 - наша локальная сеть.

Однако, после добавления этих правил доступ к FTP серверами из локальной сети получить так и не удалось.

Все дело оказалось в том, что протокол ФТП несет дополнительную информацию о соединении в области данных пакета. Соответственно корректная трассировка таких соединений требует подключения дополнительных вспомогательных модулей.

Протокол FTP сначала открывает одиночное соединение, которое называется "сеансом управления FTP" (FTP control session). При выполнении команд в пределах этого сеанса, для передачи сопутствующих данных открываются дополнительные порты. Эти соединения могут быть активными или пассивными. При создании активного соединения клиент передает FTP серверу номер порта и IP адрес для соединения. Затем клент открывает порт, сервер подключает к заданному порту клиента свой порт с номером 20 (известный как FTP-Data) и передает данные через установленное соединение.

Проблема состоит в том, что iptables ничего не знает об этих дополнительных подключениях, поскольку вся информация о них передается через область данных пакета. Из-за этого iptables не позволит серверу соединиться с указанным портом клиента.

Решение проблемы состоит в добавлении специального вспомогательного модуля трассировки, который отслеживает, специфичную для данного протокола, информацию в области данных пакетов, передаваемых в рамках сеанса управления. При создании такого соединения, вспомогательный модуль корректно воспримет передаваемую информацию и создаст соответствующую запись в таблице трассировщика со статусом RELATED, благодаря чему соединение будет установлено.

Пассивный FTP действует противоположным образом. Клиент посылает запрос серверу на получение данных, а сервер возвращает клиенту IP адрес и номер порта для подключения. Клиент подключает свой 20-й порт (FTP-data) к указанному порту сервера и получает запрошенные данные. Если ваш FTP сервер находится за брандмауэром(iptables), то нам потребуется этот вспомогательный модуль для того, чтобы сервер смог обслуживать клиентов из Интернет. То же самое касается случая, когда мы хотим ограничить своих пользователей только возможностью подключения к HTTP и FTP серверам в Интернет и закрыть все остальные порты.

Поэтому необходимо подключить дополнительный вспомогательный модуль данном ip_nat_ftp.
Это осуществляется добавлением в файл /etc/sysconfig/iptables-config следующих строк:

# Additional iptables modules (nat helper)
# Default: -empty-
IPTABLES_MODULES="ip_nat_ftp"


Перед этим естественно нужно проверить есть ли такие модули в системе:

[root@srv sysconfig]# modprobe -l | grep nat
/lib/modules/2.6.9-42.ELsmp/kernel/net/bridge/netfilter/ebtable_nat.ko
/lib/modules/2.6.9-42.ELsmp/kernel/net/bridge/netfilter/ebt_dnat.ko
/lib/modules/2.6.9-42.ELsmp/kernel/net/bridge/netfilter/ebt_snat.ko
/lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/netfilter/iptable_nat.ko
/lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/netfilter/ip_nat_snmp_basic.ko
/lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/netfilter/ip_nat_ftp.ko
/lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/netfilter/ip_nat_tftp.ko
/lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/netfilter/ip_nat_amanda.ko
/lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/netfilter/ip_nat_irc.ko
/lib/modules/2.6.9-42.ELsmp/kernel/drivers/net/natsemi.ko

Вернуться назад