
다음과 유사한 설정이 있습니다.
애플리케이션 > 로컬 서버 > VPN > 원격 VPN 서버 > 라이센스 서버
응용 프로그램과 로컬 서버가 내 LAN에 있습니다. 로컬 서버는 VPN을 통해 기업 VPN 서버에 연결되며, 이를 통해 로컬 서버가 기업 라이센스 서버를 볼 수 있습니다.
내 로컬 서버에서 라이센스를 찾고 내 로컬 서버에 다음 iptables 규칙을 추가하도록 애플리케이션에 지시합니다.
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
이는 작동하는 것으로 보이며 응용 프로그램이 라이센스를 성공적으로 획득합니다. 그러나 협상은 내 규칙을 사용하지 않는 로컬 세션에 비해 매우 느립니다.
Wireshark를 보면 애플리케이션이 특이한 메시지를 보내는 것을 볼 수 있습니다. FIN 패킷은 전송되지 않으며 대신 애플리케이션은 RST 패킷을 보냅니다. 나는 RST 패킷 중 하나를 보낼 때마다 다음 메시지를 보내기 전에 거의 정확히 10초 동안 대기한다는 것을 알았습니다. CLOSE_WAIT 시간 초과가 10초인 것을 보면 이것이 우연이 아니라고 생각합니다.
일반적인 협상은 다음과 같이 시작됩니다.
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]
... 등등. RST가 있을 때마다 10초를 더 기다립니다.
애플리케이션이 라이센스 서버에 로컬인 경우 동일한 메시지가 전송되지만 [RST, ACK] 패킷을 전송한 후 10초 동안 기다리지 않습니다.
따라서 제 질문은 내 서버에서 NAT가 무엇을 하고 있어서 RST 패킷을 보낸 후 내 애플리케이션이 10초 동안 중단될 수 있느냐는 것입니다.
답변1
신경쓰지 마세요. 문제는 NAT와 전혀 관련이 없는 것으로 나타났습니다.
라이센스 서버는 이전 패킷 페이로드의 일부로 자체 호스트 이름을 보내고 있었습니다. 분명히 이 호스트 이름은 애플리케이션에서 연결할 수 없으므로 애플리케이션의 일부 시간 초과로 인해 10초가 발생합니다. 내 생각엔 호스트 이름을 시도한 다음 10초 후에 첫 번째 주소를 시도하는 것 같습니다(궁극적으로 작동하는 방식입니다).
라이센스 서버의 호스트 이름을 클라이언트 컴퓨터의 호스트 파일에 추가하면 작동합니다.
나는 왕실 바보 같은 느낌이 듭니다. 모두 감사드립니다.