[решено] iptables не понятки с ftp

#!/bin/bash

IPT="iptables"
POLICY="DROP"

LAN="192.168.1.0/24" # внутренняя сеть
LAN1_IF="eth0" # внутренний интерфейс
LAN1_IP="192.168.1.2" # адрес на внутреннем интерфейсе

LO_IF="lo" # loopback-интерфейс
LO_IP="127.0.0.1" # loopback-адрес
LOOPBACK="127.0.0.0/8" # loopback-петля

DNS1="80.82.32.9" # DNS-провайдера
DNS2="80.82.33.65"

modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe iptable_nat
modprobe ip_nat_ftp

echo 1 > /proc/sys/net/ipv4/ip_forward #ядро должно знать что оно может продвигать пакеты

depend() {
before net
use logger
}

# Установка политики по умолчанию (переменная $POLICY установлена в DROP, т.е. пакеты будут дропаться)
$IPT -P INPUT $POLICY
$IPT -P FORWARD $POLICY
$IPT -P OUTPUT $POLICY

$IPT -N allowed
$IPT -F allowed
# "allowed" это просто имя, можно использовать что нибудь и другое:)
# Разрешаем прохождение statefull трафика. Далее идет собственно сам список правил
$IPT -A allowed -m state --state ESTABLISHED,RELATED -j ACCEPT
# Журналируем все обращение к этому серверу от WAN-сетей :) Мы не ждем гостей !
$IPT -A allowed -i $LAN1_IF -m limit --limit 1/second -j ULOG --ulog-prefix "Bad packet from $LAN_IF"
$IPT -A allowed -j $POLICY

$IPT -N com-allow
$IPT -F com-allow
$IPT -A com-allow -p tcp -j ACCEPT
$IPT -A com-allow -p udp -j ACCEPT
# 1. Разрешаем ICMP
$IPT -N icmp_in
$IPT -F icmp_in
# здесь можно увидеть применения модуля "state" т.е. состояние. пропускаются пакеты со статусом NEW,
# остальные нам не нужны
$IPT -A icmp_in -m state --state NEW -p icmp --icmp-type echo-request -j ACCEPT
$IPT -A icmp_in -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A icmp_in -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT
# Журналируем ICMP-пакеты, нам не нужны эти пакеты.
$IPT -A icmp_in -p icmp -j ULOG --ulog-prefix "Bad ICMP"
# 2. Входящий SSH трафик
$IPT -N ssh-in
$IPT -F ssh-in
$IPT -A ssh-in -p tcp --dport 22 -j ACCEPT
# Защита о флуда по SSH
$IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL RST --dport ssh -j ACCEPT
$IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL FIN --dport ssh -j ACCEPT
$IPT -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL SYN --dport ssh -j ACCEPT
$IPT -A ssh-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT
# Разрешаем исходящий ICMP трафик (функции диагностики)
# пингуем всех.
$IPT -N icmp_out
$IPT -F icmp_out
# Разрешаем icmp-reply во все сети в ответ на icmp-request'ы с сетей
$IPT -A icmp_out -p icmp --icmp-type 8 -j ACCEPT
$IPT -A icmp_out -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A icmp_out -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT
# Проверка флагов. Обнаружение сканеров потров.
$IPT -N check_tcp
$IPT -F check_tcp
# Отбрасываем невалидные пакты
$IPT -A allowed -m state --state INVALID -m limit --limit 3/minute -j ULOG --ulog-prefix "INVALID"
$IPT -A allowed -m state --state INVALID -j DROP
$IPT -A check_tcp -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPT -A check_tcp -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW not --syn"
$IPT -A check_tcp -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A check_tcp -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j ULOG --ulog-prefix "NMAP-XMAS"
$IPT -A check_tcp -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A check_tcp -p tcp --tcp-flags ALL ALL -m limit --limit 5/minute -j ULOG --ulog-prefix "XMAS"
$IPT -A check_tcp -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A check_tcp -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit 5/minute -j ULOG --ulog-prefix "XMAS-PSH"
$IPT -A check_tcp -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPT -A check_tcp -p tcp --tcp-flags ALL NONE -m limit --limit 5/minute -j ULOG --ulog-prefix "NULL_SCAN"
$IPT -A check_tcp -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A check_tcp -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j ULOG --ulog-prefix "SYN/RST"
$IPT -A check_tcp -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A check_tcp -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j ULOG --ulog-prefix "SYN/FIN"
$IPT -A check_tcp -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# Цепочка INPUT
# Проверяем пакеты.
$IPT -A INPUT -p tcp -j check_tcp
#FTP
$IPT -A INPUT -p tcp --dport 21 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
# Разрешаем входящие по SSH
$IPT -A INPUT -p tcp --dport 22 -j ssh-in
#torrents
$IPT -A INPUT -p tcp -m tcp --dport 59222 -j ACCEPT
# Разрешаем входящие по DNS
$IPT -A INPUT -s $LAN -p udp --dport domain -j com-allow
# Разрешаем входящие по icmp
$IPT -A INPUT -p icmp -j icmp_in
# Разрешаем входящие на петлю, при его включении заметно улучшение отклика при ssh-авторизации
$IPT -A INPUT -i $LO_IF -d $LOOPBACK -j ACCEPT
# Ну, и разрешаем statefull-пекеты.
$IPT -A INPUT -j allowed
#
#FORWARD
#
# Отбрасываем плохие пакеты
$IPT -A FORWARD -j check_tcp
# Разрешаем SSH
$IPT -A FORWARD -s $LAN -p tcp --dport 22 -j com-allow
# Разрешаем прохождение icmp-пакетов
$IPT -A FORWARD -p icmp -j icmp_in
# Разрешаем прохождение асечных пакетов
$IPT -A FORWARD -i $LAN1_IF -s $LAN -p tcp --dport 5190 -j com-allow
# Разрешаем веб-трафик, если у нас не стоит прокси сервер, можно раскоментить эту строку
# Здесь же показано применения модуля "multiport"
$IPT -A FORWARD -i $LAN1_IF -s $LAN -p tcp -m multiport --dport 80,443,1080,8080 -j com-allow
# Разрешаем прохождение почтовых пакетиков от POP и SMTP
$IPT -A FORWARD -i $LAN1_IF -s $LAN -p tcp -m multiport --dport 25,110 -j com-allow
# Разрешаем входящие пакеты, являющиеся частью установленного соединения
$IPT -A FORWARD -j allowed
#OUTPUT
$IPT -A OUTPUT -j check_tcp
$IPT -A OUTPUT -o $LAN1_IF -j ACCEPT
$IPT -A OUTPUT -p icmp -j icmp_out
$IPT -A OUTPUT -o $LO_IF -j ACCEPT
$IPT -A OUTPUT -p tcp --source-port 59222 -j ACCEPT
$IPT -A OUTPUT -p tcp --dport 22 -j com-allow
$IPT -A OUTPUT -p udp --dport domain -j com-allow
$IPT -A OUTPUT -p tcp -m multiport --dport http,https -j com-allow
$IPT -A OUTPUT -j allowed

непонятки с фтп..
через браузер не пускает если заходишь из внещки на фтп..
через mc или totalcomander все атличьно пускает.
Подскажите что не так...
мне нужно открытй порт 22 и 21.

При сканировании машины из вне...то видно что порт 21 открыт.

bagas написал(а): через mc

bagas написал(а):
через mc или totalcomander все атличьно пускает

Мобыть, просто ваши "mc или totalcomander" юзают пассивный режим FTP?

Мы тоже не всего читали Шнитке!.. © В. Вишневский

Добрый день. как я понял мне

Добрый день.
как я понял мне нужно перевести фтп свой в пасивный режим?

Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

вы в своём скрипте всё

вы в своём скрипте всё поняли, что написали?
и оно вам всё надо?

если мне не не изменяет память (за базар не отвечаю ;) ) , но 21-й ftp порт вроде тянет за собой и 20-й

что-то добрый я сегодня ....

/

leryc написал(а):
если мне не не изменяет память (за базар не отвечаю ;) ) , но 21-й ftp порт вроде тянет за собой и 20-й

Это плохо :) За базар надо отвечать всегда.
В данном конькретном случае подсказка живёт по адресу /etc/services

ЗЫ: Явно открывать 20-й порт не обязательно.

:wq
--
Live free or die

как сказать... Anarchist

как сказать...

Anarchist написал(а):
ЗЫ: Явно открывать 20-й порт не обязательно.

где-то типа тут

IPT -A check_tcp -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

и DROP'нуться может

что-то добрый я сегодня ....

leryc, ты местным джаббером

leryc, ты местным джаббером пользуешься?

:wq
--
Live free or die

а надо? ;) я веду не

а надо? ;)

я веду не регулярный образ жизни и пока все айсикю и скайпы отрубил
джабер где-то валялся, но я уже и пароля\аккаунта не вспомню

что-то добрый я сегодня ....

leryc написал: 21-й ftp

leryc написал(а):
21-й ftp порт вроде тянет за собой и 20-й

Млин, какая каша в топике... Нет бы маны покурить - всяк по своему трактует... А ведь всё не особо сложно (не так страшен чёрт, как его малютка...) Короче, Склифосовский!.. ©
Клиент инициирует соединение с FTP-сервером, обращаясь по TCP на его порт 21. Это начало обмена, общее для обоих режимов. Для стороны сервера это соединение является входящим, следовательно требуется открытый порт 21. Это управляющее соединение, в рамках него затем начинается процесс согласования между клиентом и сервером, в результате которого выбирается дальнейшее поведение (типо хачу/нихачу - могу/нимагу).
Если это пассив, сервер сообщает клиенту номер (динамический!) порта, к которому клиент должен сделать запрос для установки другого соединения - передачи данных. Для сервера это входящее, соотв., требуется открытые порты TCP из диапазона, выделенного для динамических (устанавливается через sysctl). Да, вот такая куча открытых!
В активном же режиме клиент сообщает серверу номер порта (снова из динамического диапазона) для того, чтобы уже сервер мог инициировать соединение к клиенту для передачи данных. FTP-сервер делает запрос к сообщённому ему номеру порта клиента используя со своей стороны порт 20. На стороне клиента это соединение будет входящим, а соотв., в этом случае именно на его стороне требуется диапазон открытых портов (при этом сторона сервера отдыхает со своим единственным открытым 21-ым).
Казалось бы, вопрос открытых портов можно было бы легко решить посредством банального для iptables правила с ESTABLISHED,RELATED, но FTP протокол композитный (использует не единственный уровень OSI), в нём файрволлу не так-то просто определить логически связанные соединения (а след., и порты), и решается это посредством отдельных самостоятельных модулей, в частности - conntrack_ftp

Мы тоже не всего читали Шнитке!.. © В. Вишневский

Ну все правильно кроме одного

Ну все правильно кроме одного места - 20 порт. При активном соединении он вообще не причем. Общение идет на активной управляющей сессии (21 порт). А ларчик действительно просто открывается, если под рукой tcpdump и элементарные знания iptables statefull machine.

.

taho написал(а):
Ну все правильно кроме одного места - 20 порт. При активном соединении он вообще не причем. Общение идет на активной управляющей сессии (21 порт)

В активном? Общение да, по входящему соединению на 21 порт, а вот данные - по исходящему с 20 порта. В RFC-959 порты вообще не оговариваются, но судя по всему девы серверов ориентируются на стандарт де-факто

Мы тоже не всего читали Шнитке!.. © В. Вишневский

Не спорь, а просто проверь

Не спорь, а просто проверь tcpdump. Активный режим сам выбирает с какого динамичекого порта ему устанавливать данные на какой динамический порт клиента. Поэтому это вид соединения труднее файерволится, немного труднее чем пассив ;)

спасибо,

спасибо, понял-разобрался.
$IPT -A INPUT -p tcp --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
и в конфиге vsftpd добавил поддержку пасивного режима
pasv_min_port=60000
pasv_max_port=60500
все браузеры могут заходить и файловые менеджеры тоже.
при заходе огнелиса ругань вылетела
огнели - да, но сообщение: 550 Failed to change directory.
что то с проверкой диреткории.

Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

/

bagas написал(а):
непонятки с фтп..
через браузер не пускает если заходишь из внещки на фтп..
через mc или totalcomander все атличьно пускает.
Подскажите что не так...
мне нужно открытй порт 22 и 21.

mc пускает извне?

Я бы рекомендовал настроить логирование reject'ов на заслуживающие особого внимания порты.
Может я где-то что-то недочитал, но по идее 20-й порт на вход (для related/established) должен быть открыт...

:wq
--
Live free or die

много буковок

для доступа с браузера нужно в ФТП включить пассивный режим, выставить порты для пассивного режима и разрешить в iptables эти порты на вход

добавил к конфигу iptablesa

добавил к конфигу iptablesa такое
$IPT -A INPUT -p tcp --dport 21 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
$IPT -A INPUT -p tcp --dport 1500:1505 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

vsftpd.conf
dirmessage_enable=YES
#banner_file=/etc/vsftpd/vsftpd.banner # edit banner first
chown_uploads=NO
idle_session_timeout=600
virtual_use_local_privs=NO
data_connection_timeout=300
ascii_upload_enable=NO
ascii_download_enable=NO
chroot_list_enable=YES
ls_recurse_enable=NO
#use_microsoft_no_smpke_driver=NO
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=NO
local_enable=NO
write_enable=YES
local_umask=022
pasv_min_port=1500
pasv_max_port=1505
dirmessage_enable=YES
xferlog_enable=YES
listen_port=21
#connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
nopriv_user=ftp
listen=YES
# chown_upload_mode=0777
file_open_mode=0777
anon_umask=0000

неполучаеться. конект не проходит.
как только стоит отрубить iptables, можно законктиться ко мне на фтп.

Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

.

bagas написал(а):
-A INPUT -p tcp --dport 1500:1505 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

Мдя, это, вообще, о чём? Если вам настолько лениво нагуглить описание протокола (сеть этим буквально набита), дык хотя бы прочитайте внимательно мой пост выше...

Мы тоже не всего читали Шнитке!.. © В. Вишневский

вообщем ситация

вообщем ситация такая..
протестил на разных браузерах.
ie , opera - прошло все атличьно.
firefox. chrom - не может соедениться...
Сей час внимательнее прочитаю.

Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

bagas написал(а):Сей час

bagas написал(а):
Сей час внимательнее прочитаю

Конкретно - обратите внимание на conntrack_ftp, и что на стороне клиента тоже файрволл надо пробивать для использования в активном режиме, и пока не понятно (а вы не сообщили, хоть посмотрели бы сниффером, что-ли) как оно предпочитается в разных браузерах

Мы тоже не всего читали Шнитке!.. © В. Вишневский

22:18:28.841412 IP

22:18:28.841412 IP 42.67.32.95.dsl-dynamic.vsi.ru.4020 > 192.168.1.2.ftp: S 1372229970:1372229970(0) win 65535
22:18:34.776088 IP 42.67.32.95.dsl-dynamic.vsi.ru.4020 > 192.168.1.2.ftp: S 1372229970:1372229970(0) win 65535

Firefox ломиться на ктивный порты 20/21
хоть в данный момент включен пасивный режим...
pasv_min_port=50200
pasv_max_port=50250
listen_port=21
#connect_from_port_20=NO

я уже запустался...
модули
modprobe ip_conntrack
modprobe ip_conntrack_ftp
Подругружаються автоматически...уже голова кругом иедт.

Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

A INPUT -i eth0 -m state

A INPUT -i eth0 -m state --state NEW -m tcp -p tcp --dport от:до -j ACCEPT

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".