drop молчит, и клиент ждёт. Посмотри, что меняет reject. «Начать» вернёт правило drop на место.
Отказ вместо тишины
Замени в /opt/packets-lab/rules.nft действие drop на reject и загрузи файл на lab-node2. Посмотри шесть пакетов обмена с 192.0.2.11, потом запроси сайт с lab-node1.
Сначала предположи
Что lab-node2 отправит в ответ на SYN к порту 8080 после замены на reject?
Теперь начни упражнение, выполни команду и сверь прогноз с выводом.
Отказ приходит сразу, но бывает двух видов.
Правило reject по умолчанию отвечает сообщением ICMP «порт недоступен»: ICMP 192.0.2.12 tcp port 8080 unreachable. Порт 8081 закрывает ядро: там никто не слушает, и ядро отвечает пакетом RST — Flags [R.]. Правило reject with tcp reset шлёт такой же RST, и по пакетам его не отличить от пустого порта: на сервере это покажут ss -ltn и nft list ruleset.
Клиенту разница не видна: curl в обоих случаях печатает Couldn't connect to server, nc — Connection refused.
| На сервере | В tcpdump | У клиента |
|---|---|---|
drop |
[S] и его повторы, ответа нет |
тайм-аут |
reject |
[S], затем ICMP … unreachable |
отказ сразу |
пустой порт, reject with tcp reset |
[S], затем [R.] |
отказ сразу |
| порт открыт | [S], [S.], [.] |
подключение |
Фильтр tcp port 8080 прячет ответ ICMP: это не TCP-пакет. С таким фильтром отказ reject выглядит как SYN без ответа, только без повторов. Отказы смотри фильтром по адресу — host 192.0.2.11.
Клиент сразу получает Couldn't connect to server, а tcpdump на сервере показывает за SYN строку ICMP … tcp port 8080 unreachable. Кто отказал?
-
SYN клиента дошёл до сервера — он есть в выводе, и ответ пришёл от
192.0.2.12. -
dropне отвечает ничем: клиент повторяет SYN и ждёт до тайм-аута. -
Пустой порт ядро закрывает пакетом
[R.]от192.0.2.12.8080. Сообщение ICMP отправило правилоreject.
Сообщение ICMP «порт недоступен» в ответ на SYN отправляет правило reject. Пустой порт и reject with tcp reset отвечают [R.], а drop — тишиной.