Я пытаюсь настроить iptables, чтобы компьютер КЛИЕНТА мог использовать FTP / FTPS в пассивном режиме.
Я уже установил правила большинства по ufw - краткий отрывок (пропущен список IPv6 и других правил для ясности):
Status: active
Logging: on (low)
Default: deny (incoming), deny (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
20/tcp ALLOW OUT Anywhere # FTP Data
21/tcp ALLOW OUT Anywhere # FTP Command
22 ALLOW OUT Anywhere # FTPS
989 ALLOW OUT Anywhere # FTPS
21 ALLOW OUT Anywhere # FTP
когда я добавляю правило ufw:
sudo ufw allow out from any to any port 1025:65535 proto tcp comment "Ephemeral TCP"
Все работает хорошо - клиент может подключиться к FTPS и просмотреть дерево каталогов + скачать файлы.
Правила UFW:
Status: active
Logging: on (low)
Default: deny (incoming), deny (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
20/tcp ALLOW OUT Anywhere # FTP Data
21/tcp ALLOW OUT Anywhere # FTP Command
22 ALLOW OUT Anywhere # FTPS
989 ALLOW OUT Anywhere # FTPS
21 ALLOW OUT Anywhere # FTP
1025:65535/tcp ALLOW OUT Anywhere # Ephemeral TCP
но это правило:
1025:65535/tcp ALLOW OUT Anywhere # Ephemeral TCP
имеет нежелательный эффект, заключающийся в том, что с клиентского компьютера разрешена любая связь с любым IP-адресом.
Вот почему я хотел не использовать его как правило UFW, а вместо этого установить iptables с помощью этой команды:
sudo iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
поэтому разрешена только исходящая связь с ранее установленным IP.
так что у нас есть правила UFW, как в первом листинге - без
1025:65535/tcp ALLOW OUT Anywhere # Ephemeral TCP
и список iptables
sudo iptables -L -n --line-numbers
что дает этот результат:
Chain OUTPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
2 ufw-before-logging-output all -- 0.0.0.0/0 0.0.0.0/0
3 ufw-before-output all -- 0.0.0.0/0 0.0.0.0/0
4 ufw-after-output all -- 0.0.0.0/0 0.0.0.0/0
5 ufw-after-logging-output all -- 0.0.0.0/0 0.0.0.0/0
6 ufw-reject-output all -- 0.0.0.0/0 0.0.0.0/0
7 ufw-track-output all -- 0.0.0.0/0 0.0.0.0/0
но это не работает, и клиент FTPS может связаться с сервером, но не может перечислить дерево каталогов, загрузить любые файлы. Исходящая связь заблокирована UFW
cat /var/log/syslog
дает вывод:
[UFW BLOCK] IN= OUT=wl0 SRC=192.xxx.xxx.xxx DST=215.xxx.xxx.xx LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=8271 DF PROTO=TCP SPT=43379 DPT=27918 WINDOW=29200 RES=0x00 SYN URGP=0
Я пробовал выдавать команды после обновления правил цепочки OUTPUT в iptables:
sudo iptables-save #echoes all rules, seems not having a problem
sudo iptables-restore #hang ups, needs termination CTRL+C
но это не имело значения.
и:
sudo iptables-apply
дает эту ошибку:
Error: rulesfile not readable: /etc/network/iptables.up.rules
некоторые вопросы:
Почему добавление установленного правила в цепочку OUTPUT в iptables не имеет никакого значения, где добавление правила в UFW помогает?
Как добавить правило в iptables, чтобы можно было подключаться к серверу FTP / FTPS по эфемерному TCP, но только в том случае, если соединению предшествует другое соединение с тем же IP.
Как применить новый набор правил в iptables, чтобы он был постоянным и загружался при загрузке так же, как правила UFW?
В целом - это хорошая идея использовать UFW с iptables или мне просто удалить UFW и вместо этого использовать только iptables? Я бы предпочел переписать все правила UFW в iptables, если это упростит жизнь и упростит практику, чем пытаться объединить использование этих инструментов.
Пассивный режим FTP требует подключения к временным портам на FTP-сервере, поскольку фактическая передача данных осуществляется через разные TCP-подключения.
Вы можете попробовать с помощью какого-нибудь помощника FTP (ip_conntrack_ftp
), который проверяет канал управления FTP и извлекает порты, чтобы открывать только эти соединения. Но обычно это не работает с неявным FTPS (порт 990), поскольку канал управления зашифрован. И хотя явный протокол FTPS (порт 21) поддерживает шифрование канала управления только для аутентификации, не все FTP-клиенты поддерживают это поведение, что опять же делает невозможным использование помощника FTP.
Вкратце: не используйте FTP. Это ужасный протокол, если задействованы NAT или межсетевые экраны. Вместо этого используйте SFTP (то есть передачу файлов по SSH), который является совершенно другим протоколом и также требует только одного порта (22).