Eu tenho uma configuração parecida com a seguinte.
Aplicação > Servidor local > VPN > Servidor VPN Remoto > Servidor de licenças
O aplicativo e o servidor local estão na minha LAN. O servidor local se conecta via VPN ao servidor VPN corporativo, que é como o servidor local pode ver o servidor de licenças corporativo.
Eu digo ao meu aplicativo para encontrar uma licença no meu servidor local e adicionar as seguintes regras do 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 obterá uma licença com sucesso. No entanto, a negociação é muito lenta em comparação com 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. Eu observo 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 isso seja uma coincidência, já 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 espera outros 10 segundos.
Quando o aplicativo é local para o servidor de licenças, as mesmas mensagens são enviadas, mas não há espera de 10 segundos após o envio do pacote [RST, ACK].
A minha pergunta é, portanto, o que o NAT está fazendo no meu servidor que poderia fazer com que meu aplicativo fosse interrompido por 10 segundos após o envio de um pacote RST?