Отловить фейковый слушатель порта

Есть у меня сеть, изображенная на рисунке

введите сюда описание изображения

Я с клиента поднимаю VPN туннель, получаю адрес 10.8.0.x и работаю с рабочими станциями в подсети 191.168.1.xxx. Все отлично работает. На клиенте прописывается правильный шлюз и маршрутизация.

Теперь я пытаюсь с клиента подключится на 21 порт любого несуществующего хоста 191.168.1.xxx сети

function SockCheck(ARes: Integer): Integer;
begin
  if ARes = SOCKET_ERROR then begin
    RaiseSocketError(WSAGetLastError());
  Result := ARes;
end;

function TryConnect: TSocket;
var
  LAddr: TSockAddrIn;
begin
  FillChar(LAddr, SizeOf(LAddr), 0);
  LAddr.sin_family := AF_INET;
  LAddr.sin_addr.S_addr := inet_addr('192.168.1.100');
  LAddr.sin_port := htons(21);

  Result := SockCheck(socket(AF_INET, SOCK_STREAM, IPPROTO_TCP));
  SockCheck(connect(Result, TSockAddr(LAddr), SizeOf(LAddr)));
end;

И отлично подключаюсь!!! А при попытке дальнейшего вызова

SockCheck(recv(Result, LBuf[0], Length(LBuf), 0));

после таймаута получаю ошибку WSAECONNRESET (10054)

При этом если я подключусь на любой другой порт, то connect честно вернет WSAETIMEDOUT (10060).

VPN туннель обеспечивается при помощи OpenVPN. VPN сервер развернут на Windows 2003 с двумя сетевыми картами (внешней и внутренней)

Если на VPN сервере запустить WireShark, то при попытке подключиться на порт, отличный от 21 (в примере подключаюсь на 80), то получается такая картина

1   0.000000000 10.8.0.8    192.168.1.100   TCP 66  60546→80 [SYN] Seq=0 Win=64240 Len=0 MSS=1353 WS=256 SACK_PERM=1
2   1.000936000 10.8.0.8    192.168.1.100   TCP 66  [TCP Retransmission] 60546→80 [SYN] Seq=0 Win=64240 Len=0 MSS=1353 WS=256 SACK_PERM=1
3   3.001113000 10.8.0.8    192.168.1.100   TCP 66  [TCP Retransmission] 60546→80 [SYN] Seq=0 Win=64240 Len=0 MSS=1353 WS=256 SACK_PERM=1
4   7.000823000 10.8.0.8    192.168.1.100   TCP 66  [TCP Retransmission] 60546→80 [SYN] Seq=0 Win=64240 Len=0 MSS=1353 WS=256 SACK_PERM=1
9   15.00096000 10.8.0.8    192.168.1.100   TCP 66  [TCP Retransmission] 60546→80 [SYN] Seq=0 Win=64240 Len=0 MSS=1353 WS=256 SACK_PERM=1

при попытке же подключиться на 21 порт, получается вот так

1   0.000000000 10.8.0.8    192.168.1.100   TCP 66  60578→21 [SYN] Seq=0 Win=64240 Len=0 MSS=1353 WS=256 SACK_PERM=1
2   0.000064000 192.168.1.100   10.8.0.8    TCP 66  21→60578 [SYN, ACK] Seq=0 Ack=1 Win=16384 Len=0 MSS=1460 WS=1 SACK_PERM=1
3   0.017893000 10.8.0.8    192.168.1.100   TCP 54  60578→21 [ACK] Seq=1 Ack=1 Win=262400 Len=0

Подключение также устанавливается, если подключаться непосредственно с VPN сервера. А с любой другой машины 192.168.1.ххх сети я получаю честный WSAETIMEDOUT.

Что это такое и как его искать?

Update Похоже, что OpenVPN ни при чем. Остановил OpenVPN сервер, выдернул оба сетевых кабеля. Эффект остался. Причем вообще для произвольного адреса. Перезапустил весь сервер, получил ошибку "Требуемый адрес для своего контекста неверен". Воткнул кабель с первой сетью, сервер получил по DHCP свой адрес и эффект восстановился.


Ответы (0 шт):