У меня есть установка, которая напоминает что-то вроде следующего.
Приложение> Локальный сервер> VPN> Удаленный VPN-сервер> Сервер лицензий
Приложение и локальный сервер находятся в моей локальной сети. Локальный сервер подключается через 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 на моем сервере, что может привести к зависанию приложения на 10 секунд после отправки пакета RST?