iptables: разница между NEW, ESTABLISHED и RELATED пакетами

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

Когда я ищу в Интернете, я всегда вижу, что NEW используется в этом правиле, но мне трудно понять, почему ESTABLISHED и RELATED не используются.

Нравится :

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

Может кто-нибудь объяснить мне, когда именно НОВЫЙ пакет превращается в УСТАНОВЛЕННЫЙ и СВЯЗАННЫЙ?

Kris
источник

Ответы:

46

Рассмотрим НОВЫЙ пакет телефонного звонка до того, как получатель получит трубку. УСТАНОВЛЕННЫЙ пакет - это «Привет». И РОДСТВЕННЫЙ пакет был бы, если бы вы звонили, чтобы сообщить им об электронном письме, которое вы собирались отправить им. (Электронная почта связана.)

В случае, если моя аналогия не так велика, я лично думаю, что справочные страницы справляются с этим хорошо:

NEW - означает, что пакет установил новое соединение или иным образом связан с соединением, которое не видело пакеты в обоих направлениях, и

ESTABLISHED - означает, что пакет связан с соединением, которое рассматривало пакеты в обоих направлениях,

RELATED - означает, что пакет запускает новое соединение, но связан с существующим соединением, таким как передача данных по FTP, или ошибка ICMP.

iptables (8) - справочная страница по Linux

Аарон Копли
источник
9
Из любопытства, вы знаете, как он определяет СВЯЗАННЫЕ пакеты? Существует ли какой-то механизм, который приложения могут использовать, чтобы сигнализировать iptables, что соединение будет связанным соединением, или это просто часть состояния iptables с состоянием?
Мэтью Шарли
9
Он обрабатывается серией модулей ядра под названием ip_conntrack_ *, каждый из которых написан для определенного протокола, использующего несвязанные соединения (например, FTP). Чтобы ответить на ваш вопрос, я думаю, вам нужно загрузить аналогичный модуль для вашего приложения.
Кайл Смит
4
Хорошо спасибо. Но, возвращаясь к правилу с NEW в нем, возможно ли, что пакет можно будет сделать так, чтобы он выглядел так, как будто он уже УСТАНОВЛЕН и поэтому не заблокирован правилом?
Крис
2
@Kris: довольно сложно подделать исходящие пакеты, поэтому по формулировке справочной страницы в ответе я не вижу как. Вы правы в том, что возможно подделать пакет, который выглядит так, как будто он предназначен для открытого соединения, но даже без брандмауэра стек TCP просто отбросит пакет на полу, если он еще не знал об открытом соединении от отправитель. Если это на брандмауэре на маршрутизаторе, все еще возможно поддерживать это состояние путем проверки пакетов SYN/ ACK/ RST/ etc, когда они проходят через маршрутизатор, и я ожидаю, что iptables сделает это.
Мэтью Шарли
2
@ Kris: Нечто подобное (хотя и не идентичное технически) используется программным обеспечением VNC, таким как TeamViewer, для туннелирования через брандмауэры / маршрутизаторы. Процесс называется перфорацией . Короче говоря, у вас есть хост-компьютер (который может находиться за ограничительным межсетевым экраном), к которому вы хотите подключиться с другого устройства (через Интернет). Оба компьютера открывают отдельное соединение с отдельным сервером (например, сервером TeamViewer), который «посредничает» между ними, поэтому он смотрит на свои брандмауэры, как если бы пакеты были связаны, и, таким образом, эти ПК могут устанавливать отдельное соединение с каждым Другие.
Левит
14

Начисление как для сервера, так и для клиента ограничительное INPUTи открытое OUTPUT, то есть:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

И из iptables-extensions (8) на примере FTP в активном режиме:

1. НОВЫЙ

NEW Пакет установил новое соединение или иным образом связан с соединением, которое не видело пакеты в обоих направлениях.

Клиент на порту 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
@Medya, потому что с точки зрения клиента пакеты, отправленные с сервера (21) на клиент (50000), являются входящими пакетами, поэтому для клиента это - INPUT.
Хайме Хаблутцель