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.