Можно ли подделать успешное TCP-соединение с iptables?

Обычно с IP-таблицами вы либо отбрасываете, либо отклоняете трафик. Для TCP есть ли способ, чтобы iptables вместо этого отправлял обратно, но забыли соединение?

xtables-addons есть цель TARPIT ( man-страница ):

БИТУМНАЯ ЯМА
Захватывает и удерживает входящие TCP-соединения, не используя локальные ресурсы для каждого соединения.

TARPIT работает только на уровне TCP и полностью независим от приложений. Этот модуль ответит на запрос TCP и будет играть как прослушивающий сервер, но кроме отправки ACK или RST данные не отправляются. Входящие пакеты игнорируются и отбрасываются.

В Debian / Ubuntu пакет является xtables-addons-common .

Есть несколько не очень приятных вещей, которые можно сделать; может быть вставлен пакет RST, который, если участвующие узлы не имеют необычных и настроенных конфигураций брандмауэра, приведет к закрытию соединения. Другим способом было бы принять соединение, но затем каким-то образом удалить запись состояния; это может выглядеть примерно так

 ... -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp --syn -m tcp --dport 22 -j ACCEPT ... 

возможно также с журналированием (чтобы действовать через сканер журналов, такой как sec.pl ) или каким-либо другим модулем, который с установленными conntrack-tools запускает команду, аналогичную

 conntrack -D -s 192.0.2.42 

после 192.0.2.42 подключился через ssh, чтобы удалить запись таблицы состояний для этого IP.

отправить обратно, но забыли соединение?

Это означает, что нужно сгенерировать SYN / ACK, но не отслеживать соединение.

Не совсем, вроде.


Первым делом первым: почему?

Если SYN для закрытого порта, то либо:

  • отбросить пакет и избежать дальнейшей обработки.

  • если вы собираетесь ответить чем-нибудь, и злоумышленник получит ответ, показывающий, что вы там, то просто ответьте с помощью RST. Полностью возможный и распространенный ответ iptables:

    Вы можете отправить обратно RST с помощью iptables -p tcp […] -j REJECT –reject-with tcp-reset.

Если SYN для открытого порта, то либо:

  • разрешить серверу (службе) обрабатывать запрос так, как считает нужным.

  • помогите серверу с СИНПРОКСОМ.

    Смягчение наводнений SYN с помощью SYNPROXY

    Который на самом деле пытается защитить сервер от DDoS-атаки SYN-ACK Flood. Это не то же самое, что вы просите, и это не может быть. Не может быть двух объектов (сервер и iptables), которые одновременно отвечают SYN / ACK на один и тот же пакет. Это либо один, либо другой.

Но СИНПРОКСИЯ умна. Как это работает (и немного больше) :

Когда используется SYNPROXY, клиенты прозрачно подключаются к SYNPROXY. Итак, сначала происходит трехстороннее TCP-рукопожатие между клиентом и SYNPROXY:

  • Клиенты отправляют TCP SYN на сервер A

  • На брандмауэре, когда этот пакет прибывает, он помечен как неотслеживаемый

  • UNTRACKED TCP SYN пакет затем передается SYNPROXY

  • SYNPROXY получает это и отвечает (как сервер A) с помощью TCP SYN + ACK (UNTRACKED)

  • Клиент отвечает с помощью TCP ACK (помечен как НЕДЕЙСТВИТЕЛЬНЫЙ или НЕ СЛЕДОВАННЫЙ в iptables), который также передается SYNPROXY

  • Когда клиент подключен к SYNPROXY, SYNPROXY автоматически инициирует трехстороннее TCP-квитирование с реальным сервером, подделывая пакет SYN, чтобы реальный сервер увидел, что исходный клиент пытается подключиться:

  • SYNPROXY отправляет TCP SYN на реальный сервер A. Это новое соединение в iptables, которое происходит в цепочке OUTPUT. Исходный IP-адрес пакета – это IP-адрес клиента.

  • Реальный сервер A отвечает SYN + ACK клиенту

  • SYNPROXY получает это и отвечает на сервер ACK. Соединение теперь помечено как УСТАНОВЛЕНО

  • Как только соединение установлено, SYNPROXY оставляет stream трафика между клиентом и сервером

Таким образом, SYNPROXY может использоваться для любого вида трафика TCP. Его можно использовать как для незашифрованного, так и для зашифрованного трафика, поскольку он не мешает самому контенту.

Сказав все это …

Вы не можете установить SYNPROXY в порту, который не имеет сервера (он не будет работать).

Таким образом, для закрытых портов вам нужен сервер, возможно, фальшивый сервер, но сервер в любом случае.

Python – Scapy – Показать все ваши порты как открытые

Связанные с:

Syn куки вроде не работают