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які є непривілейованими портами, тобто користувачі, які не мають привілейованого доступу, можуть використовувати ці порти для тестування своїх програм.
Валентин Байрамі

@Being Gokul, це правильно. Ми можемо контролювати наш сервер, на яких портах він повинен слухати клієнтські з'єднання. Однак у пасивному режимі ми маємо використовуватись --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

(детальніше див. тут )


1
Інформація про ядро ​​4.7 врятувала мені життя, годинами намагалася дозволити цьому працювати. Простий echo "1" > /proc/sys/net/netfilter/nf_conntrack_helperі все працює як очікувалося.
Хранитель

1
Чудово! 4.7 була проблема, яку я не міг вирішити на ядрі Джессі 4.9!
Арунас Бартізіус

@Jakob існує проблема з пов'язаними зв’язками, які можуть використовуватися для доступу до інших служб: home.regit.org/wp-content/uploads/2011/11/… та github.com/rtsisyk/linux-iptables-contrack-exploit
Yvan

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 SERVER:

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.

3
Ви, безумовно, заслуговуєте на це кілька грошей. Забувши завантажити модуль nf_conntrack_ftp - це джерело головних болів при усуненні неполадок пасивних FTP-з'єднань та відстеження з'єднання iptables. Використання цього модуля дозволяє видалити тип "НОВО", щоб ці порти були захищені від довільних з'єднань без встановлення попереднього сеансу FTP.
Райан Гріггс

5

Додавання НОВОГО виправлене, я вважаю.

Тепер мій файл 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.