Назад | Перейти на главную страницу

Linux: недопустимые флаги TCP

В учебниках и книгах часто рекомендуется фильтровать недопустимые флаги TCP с помощью iptables. Интересно, не отфильтрованы ли они уже самим ядром или модулем состояния iptables. У кого-нибудь есть дополнительная информация по этому поводу?

Фильтрация странных TCP-флагов обычно является хорошей идеей по двум причинам:

  1. Предотвращает несколько типов сканирования сети.
  2. Некоторые (более старые) системы могут плохо себя вести при отправке странных TCP-флагов

В iptables вы должны выполнять фильтрацию таких пакетов вручную (насколько я знаю), другие межсетевые экраны, такие как PF, имеют модули «очистки». Очистка - это набор стандартных правил, который пытается удалить недопустимые пакеты из потока, гарантирует, что все пакеты имеют одинаковый TTL и т. Д.

Я предполагаю, что спецификации TCP не запрещают некоторые недопустимые конфигурации флагов. Некоторые системы может выберите отправку (или раньше отправляли) странные комбинации флагов, но в настоящее время их отправляют только «плохие парни» (для сканирования FIN и т.д.), поэтому рекомендуется их отфильтровать.

Кстати, вот правила iptables, которые я использую, чтобы отфильтровать их (вероятно, получил их из учебника по frozentux iptables)

#new not syn
-A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

-A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP
-A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP
-A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
-A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
-A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

Новые версии ядер не отвечают на сообщения с недопустимыми флагами TCP. Вы можете быть протестированы, отправив пакеты с недопустимыми флагами Hping3 с помощью этого инструмента. Если нужно использовать iptables, оставляю свой скрипт:

#!/bin/bash

# -- UTF 8 --

iptables="/sbin/iptables"

CADENA="put INPUT, FORWARD or OUTPUT"

IPWS="put destination IP"

IFACE_Nro1="put input interface (example: wlan0 or eth0)"

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags FIN,RST FIN,RST -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags SYN,FIN,PSH SYN,FIN,PSH -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags SYN,FIN,URG SYN,FIN,URG -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags SYN,FIN,RST SYN,FIN,RST -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL SYN,FIN,RST,PSH -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,PSH -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL ALL -j DROP

$iptables -A $CADENA -i $IFACE_Nro1 -d $IPWS -p tcp --tcp-flags ALL NONE -j DROP