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

пакет drop fin с правилом iptables

Os - это linux mint 19, я хочу настроить правило в iptables для отбрасывания входящего пакета FIN в качестве ответа состояния FIN_WAIT_2. Это для данного порта. Я хочу протестировать приложение и мне нужно, чтобы некоторые соединения оставались в состоянии TCP FIN_WAIT_2. Брандмауэр - это ufw

К сожалению, я не нашел никаких заметок о проверке флагов tcp в руководстве ufw.

В iptables ваш сценарий может быть реализован сложным образом с использованием ipset, но есть некоторые ограничения. Я предполагаю, что ваш хост - это tcp-клиент, а номер порта сервера - 1234 (его можно изменить).

# create the ipset list for fin_wait sockets.
# every entry is tuple (local-ip,local-port,remote-ip)
ipset create fin_wait hash:ip,port,ip timeout 3000

# if local host sends the fin packet inside established connection
#   add entry into fin_wait list
iptables -A OUTPUT \
         -p tcp --tcp-flags FIN FIN \
         --dport 1234 \
         -m conntrack --ctstate ESTABLISHED \
    -j SET --add-set fin_wait src,src,dst --exist

# if local host receives the fin packet for fin wait socket
#   drop it before tcp stack processing
iptables -A INPUT \
         -p tcp --tcp-flags FIN FIN \
         --sport 1234 \
         -m set --match-set fin_wait dst,dst,src \
    -j DROP

Для сервера есть разница.

# create list for test clients
ipset create test_clients hash:ip

# add addresses of test clients
ipset add test_clients 192.168.100.10

# create list for clients in fin wait state
# server ip,port is known, so ip,port type is enough
ipset create fin_wait_clients hash:ip,port timeout 3000

# if server receives fin from test client
#     add client's ip,port into set
iptables -A INPUT -p tcp \
         --dport 1234 \
         --tcp-flags FIN FIN \
         -m set --match-set test_clients src \
    -j SET --add-set fin_wait_clients src,src --exist

# if server sends fin to test client as reply
#     block this fin
iptables -A OUTPUT -p tcp \
         --sport 1234 \
         --tcp-flags FIN FIN \
         -m set --match-set fin_wait_clients dst,dst \
    -j DROP

Некоторые примечания:

  • Использовать ipset list fin_wait команда для вывода списка текущих заблокированных записей с точки зрения iptables

  • Использовать ss -t4 state fin-wait-2 команда для вывода списка сокетов в состоянии ожидания fin 2

  • Порядок правил очень важен.

  • Лучше использовать инструменты iptables-save / iptables-restore / iptables-apply для изменения набора правил безопасности.

Если вы просто хотите отбросить входящий пакет FIN, когда вы всегда инициируете отключение соединения, тогда должно быть достаточно правила, такого как следующее:

iptables -I INPUT --protocol tcp --destination-port 1337 --tcp-flags FIN FIN -j DROP

Однако это испортит закрытие соединений другим концом соединения. Я не думаю, что можно отбросить FIN, только если ему предшествует ACK.