Как отключить все исходящие RST

Я пытаюсь сбросить все исходящие RST и входящие RST на всех портах. Я использую дебиан линукс. Я пробовал все возможные комбинации команд, перечисленных в Интернете, но ничего не работает.

Например, я пробовал:

iptables -A OUTPUT -o eth0 -p tcp --tcp-flags RST RST -j DROP  
iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
iptables -A INPUT -p tcp --tcp-flags RST RST -m state --state RELATED,ESTABLISHED -j DROP  
iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP  

Тем не менее я вижу пакеты RST, отправляемые ядром, а также получающие пакеты RST. Пожалуйста, попробуйте решить эту проблему


person Justin Carrey    schedule 04.11.2012    source источник
comment
Отслеживание состояния -m state --state RELATED,ESTABLISHED кажется не связанным (без каламбура), но остальное выглядит хорошо. Возможно, есть другие правила в цепочках INPUT/OUTPUT, которые предшествуют добавленным вами и разрешают пакеты? Большой вопрос, однако, заключается в том, почему вы когда-либо хотели сделать что-то подобное.   -  person Celada    schedule 04.11.2012
comment
Я работаю над классным проектом и не могу двигаться дальше, пока эта проблема не будет решена.   -  person Justin Carrey    schedule 04.11.2012
comment
В любом случае линукс установлен в виртуалбоксе. Я не делаю этого на своей хост-ОС   -  person Justin Carrey    schedule 04.11.2012
comment
Как вы проверяете, что правила не работают? Если вы используете wireshark на том же компьютере, что и правила iptables, и видите RST, это ожидаемо. Wireshark увидит ВСЕ пакеты, даже отброшенные iptables.   -  person Neal    schedule 04.11.2012
comment
Я запускаю wireshark как на своей машине, так и на удаленной машине. Есть свидетельства того, что RST был отправлен моей машиной и достиг удаленной машины.   -  person Justin Carrey    schedule 04.11.2012
comment
Пожалуйста, уточните... Эти правила выполняются на виртуальной машине или на хост-ОС? Видите ли вы пакеты RST на виртуальной машине или хост-ОС? Фильтрация внутри виртуальной машины не предотвратит отправку RST-пакетов хост-компьютером.   -  person Brian White    schedule 05.11.2012
comment
Эти правила выполняются на виртуальной машине. Я вижу пакеты RST на виртуальной машине. На самом деле такая команда работала 2 месяца назад... но я забыл записать команду. теперь страдания...   -  person Justin Carrey    schedule 05.11.2012
comment
Я не понимаю, как можно рационально подавлять исходящие RST без полного нарушения TCP/IP.   -  person user207421    schedule 05.11.2012
comment
@EJP Я пытаюсь атаковать человека посередине для классного проекта. Я действую как поддельный маршрутизатор, и когда клиент отправляет мне какое-либо сообщение, я манипулирую его параметрами, такими как IP, MAC и т. д., и перенаправляю его на маршрутизатор и наоборот. Мне не нужно разрывать текущую связь. Единственная проблема, с которой я столкнулся, заключается в том, что моя машина является злоумышленником, и я подделал пакет, изменив IP/MAC-адрес пакета, ядро ​​​​не принимает поддельную комбинацию IP-MAC и отправляет RST в сторону маршрутизатора. Итак, если я не отключу этот RST, я не смогу пересылать сообщения как клиенту, так и маршрутизатору.   -  person Justin Carrey    schedule 05.11.2012
comment
Проблема решена... если я укажу исходный и конечный адреса, правило будет применено. Если я делаю это для всех пакетов, iptables не принимает это правило.   -  person Justin Carrey    schedule 05.11.2012


Ответы (4)


Хм, вполне возможно, что это происходит через прямую цепочку, а не через цепочку ввода или вывода, поскольку вы запускаете это на хост-компьютере.

Уловка для отладки заключается в использовании iptables -L -v, это отображает количество пакетов, отправленных на каждое правило, если вы настроили команду, которая отправляет много пакетов, подобных этой

watch --interval 0.1 "nc remote.machine CLOSED_PORT"

вы можете определить, какое правило срабатывает. Вы также должны знать, что существуют ортогональные таблицы — наборы цепочек правил, используемые в разных ситуациях (например, для nat). Возможно, стоит посмотреть в таблицу NAT, поскольку ваш виртуальный хост может использовать NAT через ваш хост, а не иметь собственный IP-адрес.

iptables -L -v -t nat

Было бы полезно знать, какой IP-адрес имеет виртуальный хост, поскольку, если он не пересекается с подсетью вашей сети, он, вероятно, будет подвергаться NAT.

person Att Righ    schedule 10.12.2012

Если вы хотите отбросить входящие пакеты RST, вам нужно сделать это:

iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK -j DROP
iptables -I INPUT -p tcp --tcp-flags ALL RST -j DROP

Если вы хотите отбрасывать исходящие RST-пакеты, вам нужно сделать следующее:

iptables -I OUTPUT -p tcp --tcp-flags ALL RST,ACK -j DROP

Почему RST ACK? Согласно RFC, любой ответ на TCP-пакет, включая SYN, должен подтверждать этот порядковый номер. Поэтому, даже если вы указываете, что ваш порт закрыт, вы отвечаете RST ACK.

Зачем беспокоиться об исходящем RST? Если вы пытаетесь использовать такой инструмент, как Scapy, для экспериментов с поведением IP, вам часто нужно запретить стеку IP хоста отправлять обратно RST ACK. В качестве альтернативы вы можете реализовать псевдостек в Scapy, запрашивая MAC-адрес, отвечая на ARP или ICMP ND для IPv6 и привязывая свой собственный IP-адрес, что также предотвратит ответ стека хоста. Очевидно, что это больше работы, чем просто блокировка исходящих RST-пакетов.

person David Hoelzer    schedule 15.07.2016
comment
Большое спасибо, но я должен использовать немного другую командную строку для удаления исходящих пакетов RST (т. е. без флага ACK): iptables -I OUTPUT -p tcp --tcp-flags ALL RST -j DROP - person Yingpei Zeng; 24.06.2017
comment
Что ж, это кажется уместным, поскольку в этом ответе я четко указал, что он отбрасывает только пакеты RST-ACK. - person David Hoelzer; 24.06.2017

В пакетах сброса активированы флаги RST и ACK. Итак, правильное правило:

iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK -j DROP

person adrianlzt    schedule 04.12.2013
comment
Действительно ли они? акк чего? Сегмент, предназначенный для несуществующего соединения? Зачем вам это подтверждать? - person user207421; 29.03.2014
comment
Хорошо, извини. Я работал над конкретной проблемой, когда пакеты ack + rst, но не все rst пакеты имеют флаг ack. Но, возможно, проблема Джастина в том, что пакеты с rst+ack не фильтруются фильтром rst only. - person adrianlzt; 01.04.2014
comment
Ты был совершенно прав, @adrianlzt. Если кто-то отправляет вам SYN, правильный ответ должен включать ACK с порядковым номером + 1. Поэтому даже закрытый порт ответит на SYN RST/ACK. Это в RFC. - person David Hoelzer; 15.07.2016

Надеюсь, поможет:

echo 0 > /proc/sys/net/ipv4/tcp_rst_retries
echo 0 > /proc/sys/net/ipv4/tcp_rst_timeout
person user3452496    schedule 29.03.2014