Может ли пакет TCP не достичь 7-го уровня OSI
Я сталкиваюсь с ситуацией, когда клиент устанавливает TCP-соединение через telnet
(или же netcat
) для подключения к серверу Linux. Затем сервер должен отправить обратно баннер, содержащий некоторую текстовую информацию...
На каждом хосте я запускал Tcpdump для захвата трафика.
Во-первых, две машины сделали традиционное TCP-рукопожатие. Затем сервер отправил пакет PUSH, содержащий баннер в направлении клиента, и получил ACK от клиента.
Странная часть в том, что клиент никогда не получал баннер (ничего не показывалось в telnet
/ nc
) и tcpdump, запущенный на стороне клиента, не перехватил ни PUSH-пакет с сервера, ни ACK в направлении сервера. В то время как tcpdump на стороне сервера захватил все пакеты.
Я делал это несколько раз, и каждый раз, когда ничего не менялось, похоже, не проблема tcpdump.
Интересно, это вызвано брандмауэром, поскольку между двумя компьютерами есть один (но почему сервер получает ACK!?)
Кроме того, возможно, что когда клиент получил пакет PUSH, вместо отправки его на 7-й уровень OSI ( telnet
) он почему-то остановил его в 4-м слое (TCP) и отправил обратно ACK? Связано ли это с фильтрацией приложений на стороне клиента?
Примечание: обе машины используют Linux From Scratch и не используют iptables. Я не знаю, какую реализацию TCP они используют.
РЕДАКТИРОВАТЬ:
Вот схема связи:
Вид сервера:
Server........................................................................client
<-----------------------------------SYN (Ip ID=3333)---------------------------
----------------------------------SYN-ACK (IP ID=4444)--------------------------->
<---------------------------------ACK (Ip ID=2222)-------------------------------
-----------------------------PUSH (data) (100 bytes, IP ID=4445)------------------->
<----------------------------ACK (Ip ID=2223, ack-num=101)------------------------
Вид клиента:
Server........................................................................client
<---------------------------------SYN (Ip ID=3333)-----------------------------
---------------------------------SYN-ACK (IP ID=4444)--------------------------->
<--------------------------------ACK (Ip ID=3334)-----------------------------
Внутри всех пакетов все совпадает, кроме идентификатора IP-пакета, номера подтверждения и порядкового номера.
1 ответ
Проблема не в 7-м уровне, а в сетевом уровне.
Предполагая ваш tcpdump
на клиенте работает правильно, клиент не получает данные с сервера, поэтому не возникает вопросов, может ли он передавать данные или нет.
Как вы уже знаете, между ними есть брандмауэр, попробуйте его без брандмауэра. С помощью брандмауэра можно многое сделать. Если клиент не получает пакет данных и, следовательно, не отправляет ACK, но сервер получает ACK, он должен исходить от брандмауэра.