Отловить фейковый слушатель порта
Есть у меня сеть, изображенная на рисунке
Я с клиента поднимаю 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 свой адрес и эффект восстановился.
