
Я создал iptables
правило:
iptables -I INPUT -p tcp --tcp-flags SYN,RST,ACK,FIN SYN --dport 10000 -j REJECT --reject-with tcp-reset
Но на самом деле это приводит к отклонению всех пакетов с флагами RST
и ACK
.
Можно ли отклонить только с RST
установленным флагом?
Я знаю, что в обычных условиях это не имеет никакого смысла, но у меня есть лаборатория, и мне нужно сделать именно так, как описано.
решение1
Я в Китае, поэтому прежде чем я это сделаю dig +tcp twiter.com @1.1.1.1
, мне нужно сделать эти 2 строчки:
sudo iptables -A INPUT -p tcp -s 1.1.1.1/32 --tcp-flags ALL RST,ACK -j DROP
sudo iptables -A INPUT -p tcp -s 1.1.1.1/32 --tcp-flags ALL RST -j DROP
Тогда я получу правильный ответ:
;; ANSWER SECTION:
twitter.com. 204 IN A 104.244.42.65
Если я выполню только первую iptables
команду, мой dig завершится неудачей:
";; communications error to 1.1.1.1#53: connection reset"
Великий китайский файрволстранно...
решение2
Чтобы отбросить входящие пакеты RST,
iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK --dport 10000 -j DROP
Чтобы отбросить исходящие пакеты RST,
iptables -I OUTPUT -p tcp --tcp-flags ALL RST,ACK --dport 10000 -j DROP
БЮР:
RST/ACK не является подтверждением RST, так же как SYN/ACK не является подтверждением SYN. Установление TCP на самом деле является четырехсторонним процессом: инициирующий хост отправляет SYN принимающему хосту, который отправляет ACK для этого SYN. Принимающий хост отправляет SYN инициирующему хосту, который отправляет ACK обратно. Это устанавливает связь с отслеживанием состояния.
SYN -->
<-- ACK
<-- SYN
ACK -->
Чтобы сделать этот процесс более эффективным, принимающий хост может подтвердить SYN и отправить свой собственный SYN в том же пакете, создавая трехсторонний процесс, который мы привыкли видеть.
SYN -->
<-- SYN/ACK
ACK -->
В случае RST/ACK устройство подтверждает все данные, отправленные в предыдущем пакете(ах) в последовательности, с помощью ACK, а затем уведомляет отправителя о том, что соединение закрыто с помощью RST. Устройство просто объединяет два пакета в один, как SYN/ACK. RST/ACK обычно не является нормальным ответом при закрытии сеанса TCP, но это также не обязательно указывает на проблему.