iptables problema NAT com conexões envolvendo pacotes RST

1

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?

    
por James 11.03.2018 / 17:52

1 resposta

0

Deixa pra lá, acontece que o problema não estava relacionado ao NAT.

O servidor de licenças 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, portanto, os 10 segundos vêm de algum tempo limite no aplicativo. Meu palpite é que ele tenta o nome do host, depois de 10 segundos, tenta o primeiro endereço que tinha (é assim que funciona).

Depois de adicionar o nome do host do servidor de licenças ao arquivo hosts na máquina cliente, ele funciona.

Eu me sinto como um idiota real. Obrigado a todos que pareciam.

    
por 11.03.2018 / 22:01