Правила iptables для блокировки определенных пакетов

Я использую следующее правило iptables:

iptables -A INPUT -p tcp -m tcp --tcp-flags PSH,ACK PSH,ACK -m length --length 52 -m state --state ESTABLISHED -j DROP

Он выполняет свою работу по блокировке нежелательного пакета с моего сервера, но он также блокирует вещи, которые не должны.

Вот пакеты, полученные с помощью wireshark:

unwanted packet:source=192.168.0.100    destination=192.168.0.111   TCP lenght=66   [TCP Retransmission] 62401→38111 [PSH, ACK] Seq=15 Ack=19 Win=65536 Len=12

needed packet:source=192.168.0.100  destination=192.168.0.111   TCP lenght=66   [TCP Retransmission] 62433→38111 [PSH, ACK] Seq=344 Ack=37855 Win=62825 Len=12

Мой вопрос, как изменить правило, чтобы разрешить необходимый пакет и заблокировать нежелательный.

1 ответ

Решение

Вы не можете сделать это на уровне брандмауэра (ну, вы можете - но он не будет выполнять то, что вы думаете, ни то, что вы хотите). Второй пакет (который вы хотите) является частью того же потока TCP, что и первый пакет (который вам не нужен), и TCP является надежным механизмом доставки. Это означает, что ОС знает, пропал ли пакет в середине потока (по порядковому номеру в заголовке каждого пакета, см., Например, http://en.wikipedia.org/wiki/Transmission_Control_Protocol для Дополнительная информация).

Если вы отфильтруете пакет в середине потока, ядро ​​будет просто продолжать сообщать другому концу, что пакет отсутствует, а другой конец будет продолжать ретранслировать его (какое поведение вы уже видите, обратите внимание на [TCP Retransmission] маркеры выше). Если вы продолжите блокировать эти повторные передачи, поток станет десинхронизированным, соединение будет разорвано, и ничего в потоке не будет обработано.

Вы должны будете сделать это на прикладном уровне.

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

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

Другие вопросы по тегам