
Eu tenho uma configuração semelhante à seguinte.
Aplicativo > Servidor Local > VPN > Servidor VPN Remoto > Servidor de Licença
O aplicativo e o servidor local estão na minha LAN. O servidor local se conecta por meio de uma VPN ao servidor VPN corporativo, que é como o servidor local pode ver o servidor de licença corporativo.
Eu digo ao meu aplicativo para encontrar uma licença no meu servidor local e adicionar as seguintes regras de iptables ao meu servidor local.
iptables -F
iptables -t nat -F
iptables -X
licServer=$(host licserver | awk '/has address/ { print $4 ; exit }')
iptables -t nat -A PREROUTING -p tcp --dport 1642 -j DNAT --to-destination $licServer:1642
iptables -t nat -A PREROUTING -p tcp --dport 57109 -j DNAT --to-destination $licServer:57109
iptables -t nat -A POSTROUTING -j MASQUERADE
Isso parece funcionar e o aplicativo adquirirá uma licença com êxito. Porém, a negociação é muito lenta se comparada a uma sessão local (que não usa minhas regras).
Se eu olhar para o wireshark, vejo que o aplicativo está enviando algumas mensagens incomuns. Nenhum pacote FIN é enviado; em vez disso, o aplicativo envia pacotes RST. Percebo que toda vez que ele envia um desses pacotes RST, há uma espera quase exata de 10 segundos antes de enviar a próxima mensagem. Não acho que seja coincidência, visto que o tempo limite de CLOSE_WAIT é de 10 segundos.
Uma negociação típica começaria algo como o seguinte
t=0 Application:A > Local Server:1642 [SYN]
t+0.1 Local Server:1642 > Application:A [SYN, ACK]
t+0.1 Application:A > Local Server:1642 [ACK]
t+0.1 Application:A > Local Server:1642 [PSH, ACK]
t+0.2 Local Server:1642 > Application:A [PSH, ACK]
t+0.2 Application:A > Local Server:1642 [RST, ACK] (10 second wait here)
t+10.2 Application:B > Local Server:57109 [SYN]
... e assim por diante. Sempre que houver um RST, ele aguardará mais 10 segundos.
Quando a aplicação é local no servidor de licença, as mesmas mensagens são enviadas, mas não há espera de 10 segundos após o envio do pacote [RST, ACK].
Minha pergunta é, portanto, o que o NAT está fazendo no meu servidor que poderia fazer com que meu aplicativo travasse por 10 segundos após enviar um pacote RST?
Responder1
Deixa pra lá, acontece que o problema não tinha nenhuma relação com o NAT.
O servidor de licença estava enviando seu próprio nome de host como parte da carga útil de um pacote anterior. Obviamente esse nome de host não pode ser contatado pelo aplicativo, então os 10 segundos vêm de algum tempo limite no aplicativo. Meu palpite é que ele tenta o nome do host e, após 10 segundos, tenta o primeiro endereço que possui (é assim que funciona).
Depois de adicionar o nome do host do servidor de licença ao arquivo hosts na máquina cliente, ele funciona.
Eu me sinto como um idiota real. Obrigado a todos que olharam.