iptables: різниця між новими, встановленими та пов'язаними пакетами


46

Частина брандмауера на сервері:

iptables -A INPUT -p tcp --dport 22 -m state NEW --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 100 --hitcount 10 -j DROP

Під час пошуку в Інтернеті я завжди бачу, що в цьому правилі використовується НОВЕ, але мені важко зрозуміти, чому НЕ ВИКОРИСТАНО і ПОВ'ЯЗАНО не використовуються.

Подобається це :

iptables -A INPUT -p tcp --dport 22 -m state NEW,ESTABLISHED,RELATED --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -m recent --update --seconds 100 --hitcount 10 -j DROP

Чи може хтось пояснити мені, коли саме НОВИЙ пакет змінюється на СТВОРЕНИЙ І ЗВ'ЯЗАНИЙ?

Відповіді:


46

Розгляньте НОВИЙ пакет телефонного дзвінка, перш ніж одержувач прийме. Встановлений пакет - це "Привіт". І ПОВ'ЯЗАНИЙ пакет був би, якби ви телефонували, щоб розповісти їм про електронний лист, який ви збираєтесь надіслати їм. (Електронна пошта пов'язана з цим.)

У випадку, якщо моя аналогія не така велика, я цілком думаю, що сторінки чоловіків обробляють це добре:

НОВО - означає, що пакет розпочав нове з'єднання або іншим чином пов'язаний із з'єднанням, яке не бачило пакетів в обох напрямках, і

Встановлено - означає, що пакет пов'язаний із з'єднанням, яке бачило пакети в обох напрямках,

ЗВ'ЯЗАНО - означає, що пакет починає нове з'єднання, але асоціюється з існуючим з'єднанням, таким як передача даних FTP або помилка ICMP.

iptables (8) - Людина сторінки Linux


9
З цікавості ви знаєте, як він визначає ПОВ'ЯЗАНІ пакети? Чи існує якийсь механізм, який програми можуть використовувати для передачі iptables, що з'єднання буде пов'язаним з'єднанням, або це суто частина стану, що належить до iptables?
Меттью Шарлі

9
Він обробляється серією модулів ядра під назвою ip_conntrack_ *, кожен записаний для певного протоколу, який використовує неспоріднені з'єднання (наприклад, FTP). Щоб відповісти на ваше запитання, я думаю, вам потрібно буде завантажити аналогічний модуль для вашої програми.
Кайл Сміт

4
Добре, дякую. Але повернувшись до правила з НОВОМ у ньому, чи не можливо пакет може бути зроблений так, щоб він був ВИСТАВЛЕНО, і це правило не заблоковано правилом?
Кріс

2
@Kris: Підробляти вихідні пакети досить важко, тому, формулюючи сторінку man у відповіді, я не розумію, як. Ви впевнені, що можна підробити пакет, схожий на те, що він призначений для відкритого з'єднання, але навіть без брандмауера стік TCP просто скине пакет на підлогу, якщо він ще не знав про відкрите з'єднання з відправник. Якщо це на брандмауері на маршрутизаторі, все одно можливо підтримувати цей стан, перевіряючи пакети SYN/ ACK/ RST/ тощо тощо, коли вони проходять через маршрутизатор, і я б очікував, що це зробить iptables.
Меттью Шарлі

2
@Kris: Щось подібне до цього (хоча і технічно не однакове) використовується програмним забезпеченням VNC, як TeamViewer, для тунелю через брандмауери / маршрутизатори. Процес називається пробиванням дірок . Коротше кажучи, у вас є хост-ПК (який може бути за обмеженим брандмауером), до якого ви хочете підключитися з іншого пристрою (через Інтернет). Обидва ПК відкривають індивідуальне підключення до окремого сервера (наприклад, сервера TeamViewer), який "опосередковується" між ними, тому їх брандмауэры виглядають так, ніби пакети пов'язані, і тим самим ці ПК можуть встановити окремий зв'язок з кожним інший.
Левіт

14

Асумінг для сервера та клієнта обмежувальний INPUTі відкритий OUTPUT, тобто:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

І з iptables-extensions (8) на прикладі FTP в активному режимі:

1. НОВИЙ

НОВО Пакет розпочав нове з'єднання або іншим чином пов’язаний із з'єднанням, яке не бачило пакетів в обох напрямках.

Клієнт на порту 50000(будь-який випадковий непривілейований порт) підключається до FTP-сервера на порту 21, серверу знадобиться принаймні це, щоб прийняти це вхідне з'єднання:

iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT

2. ВСТАНОВЛЕНО

Встановлено Пакет асоціюється із з'єднанням, яке бачило пакети в обох напрямках.

Тепер на стороні клієнта він відкрив вихідне з'єднання з сервером на порту 21за допомогою локального порту, 50000і йому потрібні такі iptables, щоб відповідь могла надходити з server (21)до client (50000):

sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

3. ПОВ'ЯЗАНІ

ЗВ'ЯЗАНО Пакет починає нове з'єднання, але асоціюється з існуючим з'єднанням, таким як передача даних FTP або помилка ICMP.

Тепер після встановлення з'єднання FTP і збирання даних буде вже встановлено, клієнт відкриє серверний сокет (так, з активним клієнтом FTP стає сервером для з'єднання даних) на порту 60000(наскільки я розумію, клієнт позначить цей порт 60000а RELATEDв іншу сполуку з 50000->21) і відправити цей номер порту на сервер з допомогою FTP - PORTкоманди. Тоді FTP-сервер відкриє нове з'єднання від свого порту 20до порту 60000на клієнті, і, клієнт тепер вимагає наступного, щоб дозволити цьому новому з'єднанню досягти успіху:

sudo iptables -A INPUT -m state --state RELATED -j ACCEPT

Нарешті, для цього потрібно увімкнути ip_conntrack_ftpмодуль ядра, щоб система давала змогу позначати з'єднання / пакети як RELATED(це я розумію, я надто не копався):

modprobe ip_conntrack_ftp

встановлений лише вимагає раніше місцевого однонаправленого потоку, а не tcp тристоронній рукостискання, чи моє розуміння правильне?
sdaffa23fdsf

Дякуємо за відповідь, за встановлені ви сказали "iptables, щоб дозволити прихід відповіді з сервера (21) до клієнта (50000)", якщо це від сервера до клієнта, чому це "ВХІД", а не "вихід"?
Медя

@ Medya, оскільки з точки зору клієнта пакети, що надсилаються з сервера (21) до клієнта (50000), є вхідними пакетами, тому для клієнта це є INPUT.
Хайме Хаблуцель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.