NAT traversal (постановка)
Материал из GedeminWiki
Версия от 16:20, 7 февраля 2016; SYSDBA (обсуждение | вклад)
Описанная ниже схема не отменяет действующего механизма, когда на мобильном устройстве прописан адрес с портом, а на файрволле предприятия настроен статический роут на внутренний компьютер.
Терминология:
- Сервер предприятия -- gedemin.exe в качестве веб-сервера, обслуживающий запросы мобильных приложений.
- Хаб -- gedemin.exe в качестве веб-сервера, где регистрируются серверы предприятий и куда мобильные приложения обращаются за адресами серверов предприятий.
- Мобильное приложение -- android приложение, которое обращается к серверу предприятия за данными. Адрес сервера предприятия мобильное приложение узнает, послав запрос на хаб.
Хаб
Один из серверов выступает в роли хаба, где регистрируются сервера предприятий и куда обращаются мобильные приложения за адресами.
Сервера предприятий мы прописываем в таблице GD_WEBHUB:
...
allowedip -- список допустимых адресов. Если пустой, то мы разрешаем
регистрацию сервера предприятия с любым внешним
адресом.
aliases -- список алиасов, обслуживаемых данным сервером предприятия.
если пустой, то мобильные приложения смогут подключиться
только по адресу.
companyruid -- РУИД организации.
computerid -- id компьютера сервера.
adminemail -- адреса электронной почты для уведомления о недоступности
сервера.
lastactive -- дата и время последней регистрации сервера на хабе.
accessdenied-- отказано в доступе. Адрес сервера предприятия не будет
передан в мобильное приложение. Вместо этого будет передан
код и текстовое сообщение.
usermessage -- сообщение которое будет передано пользователю.
мобильное приложение отображает это сообщение на экране.
используется в коомбинации с флагом accessdenied.
Например, "Сервер находится на плановом обслуживании.
С 14:00 до 16:00".
...
Сервер предприятия
Сервер предприятия активируется через файл gedemin.ini:
[WEB SERVER]
Active = 1
Bindings = можно не указывать, тогда сервер привяжется к
локальному адресу.
Register = 1 -- флаг указывает, что веб сервер должен
зарегистрироваться на хабе. По умолчанию равен 0.
RegisterPeriod = 580 -- период в секундах, через который сервер
обновляет информацию о себе на хабе. По умолчанию
580 сек, так как есть информация, что на некоторых
свитчах и файрволах используется 10-ти минутный
интервал времени, в течение которого сохраняется
информация о соответствии внутреннего адреса и
внешнего порта.
Допустимые значения для Bindings:
- адрес:порт
- адрес -- будет использован порт 80
- :порт будет использован локальный адрес и заданный номер порта
- пустое значение -- локальный адрес и порт 80
Сценарий регистрации
- запускается веб сервер предприятия
- если параметры из gedemin.ini указывают на необходимость регистрации на хабе, то шлется запрос на зашитый в экзешник адрес (например, gs.selfip.biz:47002/web_register)
- на хаб передается id компьютера и ruid организации.
- если хаб не доступен, то сервер переходит в неактивное состояние. на экран и в лог выдается сообщение о полученной ошибке.
- хаб сверяет переданный ид компьютера и руид организации с информацией в GD_WEBHUB. Если сервер не прописан то возвращается соответствующий код. Сервер предприятия выдает на экран и в лог сообщение.
- хаб регистрирует
Мобильное приложение
Если адрес прописан пользователем непосредственно или используется алиас, прошитый в коде, то все работает по-старому. Алгоритм, описанный ниже, относится только к связи с использованием хаба.
- Приложение помнит адрес, порт и время последнего сеанса связи с сервером предприятия.
- Если с момента последней связи прошло времени меньше, чем установлено константой, то пытаемся связаться по сохраненному адресу, не запрашивая хаб.
- Если мы не можем связаться с сервером предприятия по сохраненному адресу (тайм аут или иной код ошибки), то не выдаем никаких сообщений пользователю, а идем на хаб за новым адресом.
- Если хаб недоступен, выводим соответствующее сообщение об ошибке.
- Если хаб вернул код ошибки (алиас неизвестен или отказано в доступе), то выдаем пользователю соответствующее сообщение.
- Если мы не можем соединиться с сервером предприятия по полученному от хаба адресу (тайм аут или код ошибки), то выдаем пользователю сообщение.
- Важно, чтобы сообщения пользователю позволяли однозначно идентифицировать проблему. Т.е. при жалобе пользователя мы должны сразу идентифицировать что произошло: недоступен хаб, подключение запрещено, недоступен сервер предприятия и т.п.