1

У меня есть установка, которая напоминает что-то вроде следующего.

Приложение> Локальный сервер> 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?

1 ответ1

0

Неважно, оказывается, проблема была совершенно не связана с NAT.

Сервер лицензий отправлял свое собственное имя хоста как часть полезной нагрузки предыдущего пакета. Очевидно, что это имя хоста не было доступно приложению, поэтому 10 секунд приходят из-за некоторого времени ожидания в приложении. Я предполагаю, что он пробует имя хоста, затем через 10 секунд пробует первый адрес, который у него был (вот как это в конечном итоге работает).

Как только я добавил имя хоста сервера лицензий в файл hosts на клиентском компьютере, он работает.

Я чувствую себя как королевский идиот. Спасибо всем что посмотрел.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .