REJECT vs DROP при використанні iptables


Відповіді:


79

Як правило, використовуйте REJECT, коли ви хочете, щоб інший кінець знав, що порт недоступний ', використовуйте DROP для з'єднань з хостами, які ви не хочете, щоб люди бачили.

Зазвичай у всіх правилах з'єднань у вашій локальній мережі слід використовувати REJECT. Для Інтернету, За винятком ідентифікатора на певних серверах, з'єднання з Інтернету зазвичай перериваються.

Використання DROP робить з'єднання з незайнятою IP-адресою. Сканери можуть вирішити не продовжувати сканування адреси, які видаються незайнятими. Зважаючи на те, що NAT може використовуватися для переадресації з'єднання на брандмауері, наявність добре відомої служби не обов'язково вказує на наявність сервера на адресу.

Ідентифікатор повинен бути переданий або відхилений на будь-яку адресу, що надає послугу SMTP. Однак використання пошукових ідентифікаторів Ident за допомогою сервісів SMTP вийшло з ужитку. Існують протоколи чату, які також покладаються на робочу службу ідентифікації.

EDIT: При використанні правил DROP: - Пакети UDP будуть скинуті, а поведінка буде такою ж, як підключення до непроведеного порту без обслуговування. - TCP-пакети повернуть ACK / RST, що відповідає тій самій відповіді, на яку буде відповідати відкритий порт без жодної служби. Деякі маршрутизатори відповідатимуть і ACK / RST від імені серверів, які не працюють.

При використанні правил REJECT надсилається пакет ICMP, який вказує, що порт недоступний.


5
Це не правда. Навіть коли правило говорить "DROP", система все одно відповість на вхідний пакет TCP SYN / ACK так, як ніби він був відкритим. Щоб справді скинути пакет, системі потрібно відповісти TCP RST / ACK - для якого немає правила брандмауера. Таким чином, найкраща установка брандмауеру - це те, куди пересилаються лише вибрані порти. Ваше правило DROP рекламує ваш брандмауер, і сканери портів будуть знати, що ви щось брандмауер, і продовжуєте забивати вас, сподіваючись затримати ваш брандмауер.
Дагельф

2
Моя думка, це виявляється ззовні, чи є ти брандмауер чи щось через те, що твій стек TCP поводиться інакше, коли ти DROP, ніж тоді, коли в тебе не працює служба в першу чергу!
Дагельф

2
Це не змінює той факт, що існують ботнети, що використовують величину різниці та моніторинг ваших портів, як наслідок.
Дагельф

1
що б ви не робили, будьте послідовними. якщо зловмисник вибере невикористаний номер порту і намагається підключитися, він повинен отримати таку ж відповідь, як якщо б він вибрав той, який ви цілеспрямовано блокуєте. дати іншу відповідь говорить йому, що там щось є. наприклад, він може використати числовий номер, який дає іншу відповідь, щоб визначити, який сервер бази даних ви використовуєте, він може
налаштувати

5
@Dagelf, звідки ви отримуєте інформацію про те, що DROP надсилає відповідь? Це велика новина і суперечить усьому, що я спостерігав і сказав. Чи є у вас посилання на документацію, яка описує цю поведінку?
Score_Under

27

Різниця полягає в тому, що ціль REJECT надсилає відповідь відхилення до джерела, тоді як ціль DROP нічого не посилає.

Це може бути корисно, наприклад, для послуги ident. Якщо ви використовуєте REJECT, клієнтам не потрібно чекати очікування.

Більше про це: http://www.linuxtopia.org/Linux_Firewall_iptables/x4550.html


2
Ціль DROP нічого не надсилає. Перевірте мій коментар до прийнятої відповіді та самостійно вивчіть тему, якщо вас цікавлять деталі!
Дагельф

8

Зазвичай, ви хочете ігнорувати зонди від зловмисників до певних портів, під якими я маю на увазі, що ви не хочете надсилати назад "відмовлено в з’єднанні". "Відмовлено в з’єднанні" означає: "тут є сервер", і, можливо, надає більше інформації, тоді як випадання пакету не дає підказки про версії програмного забезпечення, можливі вразливості або навіть те, що сервер слухає вас IP.

Сказане є однією з головних причин використовувати DROP замість REJECT.


6
Без правил iptables, закритий порт за замовчуванням REJECT. Якщо ви скидаєте кожен порт, це чудова альтернатива (ваш хост з'являється вниз), але якщо ви DROP тільки конкретні порти, ви насправді надаєте їм більше інформації, ніж ОТКАЗ. Якщо хтось використовує датчик з ковдрою на зразок nmap, конкретні порти, які скидають пакети, виглядатимуть як «відфільтровані», а це означає, що вони знають, що у вас є служба, яку ви ховаєте.
Raptor007

7

Я бачу тут багато суперечливих відповідей, і з огляду на це перша стаття в Google з правильними ключовими словами; ось правильне пояснення.
Це просто:

DROP взагалі нічого не робить з пакетом. Він не передається хосту, він не отримує відповіді. Сторінка IPtables каже, що вона скидає пакет на підлогу, тобто нічого не робить з пакетом.

REJECT відрізняється від DROP тим, що він надсилає пакет назад, але відповідь полягає в тому, ніби сервер знаходиться в IP-адресі, але не має порту в стані прослуховування. IPtables надішле RST / ACK у випадку TCP або з UDP, через порт ICMP недоступний.


2
+1 від мене, але відповіді насправді не згодні. Вони всі згодні, наскільки я бачу, за винятком Дагельфа - хто помиляється.
MadHatter

Гаразд, ось вам для цього невеликий трюк: зробіть "nmap localhost". Тепер виберіть будь-який порт, який не є "відкритим" ... і додайте правило, яке "нічого не робить", наприклад: "iptables -I INPUT -p tcp --dport 888 -j DROP". Тепер знову "nmap localhost". Що ти бачиш? ...
Дагельф

4

Якщо ви намагаєтесь повністю приховати існування машини, -j DROPце доречно. Наприклад, ви можете використовувати це для реалізації чорного списку.

Якщо ви намагаєтесь приховати той факт, що порт відкритий, вам слід імітувати поведінку, яка б мала місце, якщо порт не був відкритий:

  • TCP: -p tcp -j REJECT --reject-with tcp-reset
  • UDP: -p udp -j REJECT --reject-with icmp-port-unreachable

Якщо сканер портів бачить, що кілька портів скидають пакети, а більшість їх відкидає, він може припустити, що скинуті пакети знаходяться на відкритих, але прихованих портах.


Що робити, якщо ви відкриєте кілька портів (тобто 22, 25, 53, 80, 443), а потім знеструмите все інше? Тепер у мене запущені MySQL, PostgreSQL, SQLite або Cassandra ... сканер не може сказати, правда?
Alexis Wilke

@AlexisWilke У цьому випадку єдиною додатковою інформацією, яку ви надаєте сканеру порту, є те, що у вас є якийсь брандмауер із політикою DROP за замовчуванням.
Raptor007

0

Незважаючи на безліч правильних відповідей, лише два мої центи:

Ось короткий PoC FW.IDS-DROP-vs-REJECT мене на цю тему щодо правил щодо забороненої системи (брандмауер, IDS тощо).

Незабаром:

  • DROP може використовуватися для зворотних зловмисників, якщо заборонити всі порти (так виглядає, що сервер знаходиться на стороні зловмисника)
  • REJECT --reject-with tcp-reset є найкращим вибором для багатопортових заборон, оскільки він, здається, веде себе як справжній закритий порт
  • якщо деякі порти відповідають (зловмисник знає, що хост живий), DROPі REJECT(без tcp-reset) подасть зловмиснику "сигнал", що там щось блокує (щоб це могло стимулювати його продовжувати "атаку", сподіваючись надати потрібні дані в деякій точці)

-5

Так, використовувати DROP безглуздо. Використовуйте REJECT.

Навіть коли правило каже "DROP", система все одно відповідає на вхідний SYN з TCP RST / ACK - що є поведінкою за замовчуванням для портів, де не працює служба. (tcpdump та ін. не записують це.)

Якщо служба працює, SYN відповідає TCP SYN / ACK.

Оскільки DROP не відповідає нормально за допомогою TCP SYN / ACK, а замість цього RST / ACK, ваше правило DROP рекламує ваш брандмауер, і сканери портів будуть знати, що ви щось брандмауер, і може продовжувати забивати вас у надіях відключення вашого брандмауера.

Це тепер nmap може повідомити про "відфільтрований" замість "закритого", наприклад:

$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
80/tcp   open  http

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds

$ iptables -I INPUT -p tcp --dport 1111 -j DROP
$ nmap localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-14 00:21 SAST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s latency).
Not shown: 986 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
53/tcp   open  domain
80/tcp   open  http
1111/tcp filtered lmsocialserver

Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds

$ iptables -D INPUT 1

Таким чином, єдине "невидиме" налаштування брандмауера - це те, де виділений пристрій сидить між вашими пристроями і лише вибірково пересилає порти.

Якщо ви дійсно хочете повозитися з основними сканерами, ви можете TARPIT tcp-з'єднання, яке встановлює вікно TCP 0, так що жодні дані не можуть бути передані після відкриття з'єднання, ігноруючи запити на закриття з'єднання, тобто сканер повинен чекати щоб відбувся час очікування з'єднання, якщо він хоче бути впевненим. Але для нападника банально виявити це і зробити його тайм-аут дуже коротким.

Зважаючи на все, вам, мабуть, найкраще просто використовувати REJECT - або встановити спеціальний пристрій для переадресації портів між вашим сервером та Інтернетом.

Або просто запустити сервіси на своїх Інтернет-машинах, які не потребують брандмауера.

Як правило, REJECT найкраще підходить для веб-серверів, оскільки будь-яка служба намагається отримати доступ до неї (можливо, частіше за все, ви) швидко отримає відповідь, і користувачі чи інші сервіси не будуть чекати, цікавлячись, чи є відключення мережі.


5
Ця відповідь невірна. За допомогою tcpdump можна легко показати, що правило DROP призведе до того, що система не надсилає жодної відповіді - як можна було очікувати. І ваше твердження «Щоб справді скинути пакет, системі потрібно відповісти TCP RST / ACK» не має сенсу, оскільки відповідати на що-небудь явно не є «справді скидання пакету». Якщо ви "справді скидаєте" пакет, ви просто не відповідаєте, і це, очевидно, ефект правила DROP.
Джуліана Хольц

3
Чи можете ви надати джерело твердження про те, що DROPвидасть SYN/ACK? Я ніколи цього не бачив на своїх машинах.
motobói

2
@Dagelf У вашій статті написано "DROP (він же DENY, BLACKHOLE) Заборонити передачу пакету. Надіслати відповідь не буде".
JeanT

Він не надсилає нормальну відповідь, але посилає один, як було пояснено, незалежно.
Дагельф

3
У документі, на який ви посилаєтесь, йдеться про " СПРАВКА ... Надіслати відповідь ", і, наскільки я бачу, не підтримується ваша претензія, яка DROPповертає а SYN/ACK. Я теж ніколи не бачив такої поведінки ні в одній версії iptables. Якщо у вас є джерело, яке підтримує вашу претензію, було б найкорисніше розглянути її; Звичайно, щойно зроблені вами пакети пакетів не підтримують вашу заяву.
MadHatter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.