Iptables, чтобы разрешить входящий FTP

32

Я хочу разрешить входящий трафик FTP.

CentOS 5.4:

Это мой /etc/sysconfig/iptablesфайл.

# Generated by iptables-save v1.3.5 on Thu Oct  3 21:23:07 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [133:14837]
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT
# Completed on Thu Oct  3 21:23:07 2013

Также по умолчанию загружается модуль ip_conntrack_netbios_n.

#service iptables restart

Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

Но проблема не в этом модуле, так как я пытался его разгрузить, но все равно не повезло.

Если я отключу iptables, я смогу перенести свою резервную копию с другого компьютера на FTP. Если iptables применяется, передача не удалась.

Быть Гокулом
источник

Ответы:

27

Вашему ftp-серверу нужен канал для передачи данных. Порт 21используется для установления соединения. Поэтому, чтобы сделать возможной передачу данных, вам также необходимо включить порт 20. Смотрите следующую конфигурацию

Сначала загрузите следующий модуль, чтобы убедиться, что пассивные соединения ftp не отклонены

modprobe ip_conntrack_ftp

Разрешить FTP-соединения для порта 21входящего и исходящего

iptables -A INPUT  -p tcp -m tcp --dport 21 -m conntrack --ctstate ESTABLISHED,NEW -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
iptables -A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"

Разрешить FTP-порт 20для активных подключений входящих и исходящих

iptables -A INPUT  -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
iptables -A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"

Наконец, разрешите пассивный входящий трафик FTP

iptables -A INPUT  -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow passive inbound connections"
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow passive inbound connections"

Для получения дополнительной информации о проблемах FTP и брандмауэра см .: http://slacksite.com/other/ftp.html#active

Изменить: Добавлено NEWв правило ввода порта 21.

Валентин Байрами
источник
2
Я забыл упомянуть, что это --sport 1024: and --dport 1024:означает, что мы включаем все порты в диапазон, 1024:32535которые являются непривилегированными портами, а это означает, что пользователи, не имеющие привилегированного доступа, могут использовать эти порты для тестирования своих приложений.
Валентин Байрами
@ Будучи Гокул, это правильно. Мы можем контролировать наш сервер, на каких портах он должен прослушивать клиентские соединения. Однако в пассивном режиме мы должны использовать --sportнепривилегированный режим, чтобы предотвратить проблемы с брандмауэром и позволить клиентам подключаться к серверу.
Валентин Байрами
2
Ну, вы можете добавить, NEW,ESTABLISHEDно это не должно иметь значения. Соединение сначала всегда находится в NEWсостоянии, затем оно переходит, RELATEDчто указывает на то, что это соединение связано с уже разрешенным соединением. Когда соединение переходит в ESTABLISHEDсостояние, оно сообщает нам, что соединение установлено с обеих сторон (сервер / клиент). Вы можете попробовать -m state --state ...вместо этого.
Валентин Байрами
1
Это NEWдействительно имеет значение. Кажется, это не работает без него.
Леандрос
1
@ val0x00ff Я не понимаю необходимости --sport 1024:. Почему порт клиента будет полезен для правила? Если он подключается от порта 80 к пассивным портам сервера, ему также необходимо разрешить подключение.
Иван
15

Я видел такие обширные правила уже в нескольких блогах и т. Д. И задавался вопросом, почему бы просто не использовать

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

вместе с nf_conntrack_ftpмодулем. Это более кратко и читабельно, что, как правило, хорошо, особенно с брандмауэрами ...

FWIW, похоже, что в ядре 4.7 произошли изменения, так что вам нужно либо установить net.netfilter.nf_conntrack_helper=1через sysctl(например, вставить его /etc/sysctl.d/conntrack.conf), либо использовать

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp

(см. здесь для более подробной информации)

Jakob
источник
1
Информация о ядре 4.7 спасла мне жизнь, несколько часов пытался заставить это работать. Все просто echo "1" > /proc/sys/net/netfilter/nf_conntrack_helperи все работает как положено.
Хранитель
1
Большой! 4.7 была проблема, которую я не мог решить на ядре Jessie 4.9!
Арунас Бартизиус
@Jakob есть проблема с СВЯЗАННЫМИ подключениями, которые могут использоваться для доступа к другим службам: home.regit.org/wp-content/uploads/2011/11/… и github.com/rtsisyk/linux-iptables-contrack-exploit
Иван
6

FTP-клиент:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

FTP-СЕРВЕР:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Для переключения между пассивным и активным режимом на стороне клиента

ftp> passive
Passive mode on.
ftp> passive
Passive mode off.
Sathish
источник
3
Вы определенно заслуживаете некоторых голосов за это. Забыв о загрузке модуля nf_conntrack_ftp является источником головной боли при устранении неполадок пассивных FTP-соединений и отслеживания соединений iptables. Использование этого модуля позволяет удалить тип «NEW», чтобы эти порты были защищены от произвольных подключений без установления предыдущего сеанса FTP.
Райан Григгс
5

Добавление NEW исправило это, я считаю.

Теперь мой файл iptables выглядит следующим образом ..

# Generated by iptables-save v1.3.5 on Thu Oct  3 22:25:54 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [824:72492]

-A INPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu Oct  3 22:25:54 2013

Введите его в качестве ответа, так как слишком много символов не допускаются в комментариях. Большое спасибо за вашу помощь.

Быть Гокулом
источник
2
Круто это сработало и рад, что я указал вам верное направление Пожалуйста, пометьте свой собственный ответ как решенный, чтобы помочь другим людям, которые ищут правильный ответ.
Валентин Байрами
Я считаю, что в принятом ответе есть опечатка. Я полагаю, что --dport 20:65535все порты с 20 - 65535 остаются открытыми с любого порта источника между 1024: 65535, что оставляет многие службы открытыми, чего, вероятно, не должно быть, если это явно не разрешено. Я верю, что было задумано--dport 1024:65535
itnAAnti
0

Если вам нужны как активные, так и пассивные соединения, и вы уже принимаете ESTABLISHEDсоединения, такие как:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Тогда вам нужно только открыть порт 21 и добавить специальное правило для пассивных портов. Для порта 20 не требуется никаких правил, так как оно уже принято ESTABLISHEDправилом выше.

Сначала примите новые подключения на port 21:

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

Затем добавьте помощник CT для пассивных портов 1024::

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp
iptables -A INPUT -p tcp -m conntrack --ctstate RELATED -m helper --helper ftp --dport 1024: -j ACCEPT

Смотрите также:

Примечание: вы должны установить 1024:как на вашем FTP-сервере: поиск пассивных портов по умолчанию в вашей конфигурации FTP. В противном случае вы открываете слишком много портов, которые могут не относиться к FTP.

Важное примечание: я не добавил OUTPUTправила, так как мои настройки по умолчанию соответствуют iptables -P OUTPUT ACCEPT. Это означает, что я доверяю тому, что происходит из моей коробки. Это не может быть хорошим вариантом, особенно в настройках NAT.

Очень важное примечание: FTPS не будет работать с такой настройкой, поскольку пассивный порт скрыт (зашифрован), поэтому нет никакого способа iptablesугадать хороший порт. См. Изменение IPTables для разрешения FTP через TLS с использованием пассивных портов и https://serverfault.com/questions/811431/are-my-iptables-for-ftps-with-tls-ok

Yvan
источник