hAuthD — авторизационный сервер для Lineage II (en, ru)

hAuthD — альтернативный авторизационный сервер для Lineage II с расширенной функциональностью. Умеет одновременно работать с «PTS» и некоторыми L2J-серверами. Авторизационные данные хранятся в базе данных MSSQL.

Особенности:

Последняя версия (2.7.0.146): hauthd.org/hAuthD.zip
Исходный код: github.com/Hint-ru/hAuthD

Конфигурация (hAuthD.ini)

Сервер загружает настройки из файла hAuthD.ini только в момент запуска. После изменения параметров требуется перезапуск программы.

Секция L2J

IP — список адресов L2J-серверов.
Возможно использование масок, возможно перечисление нескольких адресов через запятую, возможно использование символа * (любой адрес).
Параметр позволяет определить программе тип подключаемого сервера и отправить правильный пакет "приветствия".

Protocol — версия внутреннего протокола (для взаимодействия авторизационного сервера с игровыми).

FixedPorts (0 или 1) — передавать клиентам порт, считанный из базы данных (lin2db.server), или порт, полученный от игрового сервера (0).

Секция Log

Отвечает за ведение логов.
Auth (0 или 1) — сохранять результаты авторизации в файлы.
Guard (0 или 1) — сохранять сообщения защиты в файлы.
All (0 или 1) — сохранять в файлы все сообщения из окна программы.
DB (0 или 1) — сохранять в БД информацию о входе в игру.

Если параметр DB имеет значение 1, то требуется наличие следующей таблицы:
USE [lin2db] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[hauthd_log]( [time] [datetime] NOT NULL, [account] [varchar](14) NOT NULL, [ip] [varchar](15) NOT NULL, [hkey] [varchar](16) ) ON [PRIMARY] GO SET ANSI_PADDING OFF

Секция Online

Multiplier — множитель онлайна (например, 1.5).
Онлайн указывается в списке серверов, который передается клиентам.

UserCount — заполнять или нет (0) таблицу user_count, как это делает стандартный авторизационный сервер.
Значение отличное от нуля обозначает интервал в минутах.

Interval — интервал в секундах между запросами онлайна у игровых серверов.

Секция Admin

Password — универсальный пароль, позволяющий войти в игру любой учетной записью с обходом всех ограничений (бан, привязка по IP, защита и т.д.).

IP — список IP-адресов (или масок) для которых разрешено использование универсального пароля (для разделения адресов используется запятая).

Секция Adv

EULA (0 или 1) — отображать (1) или нет (0) пользовательское соглашение (отключение может приводить к конфликтам на некоторых серверах).

Test (0 или 1) — вход в игру разрешен всем (0) или только избранным учетным записям (1) из списка Test_IDs.
Помимо списка Test_IDs учитывается значение поля login_flag из таблицы user_account (вход разрешен, если login_flag имеет значение 16).

TestServers — id тестовых серверов через запятую.
Позволяет скрыть некоторые сервера от обычных пользователей. Аналог — значение 16 в поле kind таблицы server. Работает независимо от глобального режима Test.

C4 (0 или 1) — режим совместимости с С4 клиентом.
Не забудьте изменить параметр BlowfishKey в секции Main.
Необходимо использовать клиент, который поддерживает чистый C4 протокол авторизации!

MaxConnectionsPerIP — ограничение на число одновременных соединений с одного IP к серверу авторизации.
Ограничение не на ИГРУ, а только на АВТОРИЗАЦИЮ. Соединение продолжается с момента нажатия кнопки login и до выбора сервера из списка включительно.

AntiDOS (0 или 1) — если параметр установлен в единицу, то при резком повышении нагрузки (когда сервер уже не успевает обрабатывать все запросы) включается режим AntiDOS. Режим работает 5 минут и отключается (если атака продолжается, то включается опять). В этом режиме таймауты сведены к минимуму, включаются жесткие ограничения как по времени обработки каждого запроса, так и по количеству одновременных запросов с IP-подсетей.

AntiBrute и AntiBruteIP (0 или 1) — включение секции AntiBrute и AntiBruteIP (защита от перебора паролей).

MD5Simple (0 или 1) — использовать md5 хеш вместо l2-хеша.
Никаких изменений в БД не требуется. Хеш пароля, как обычно, сравнивается с хешем из поля password, но вычисляется уже с использованием MD5. Для перехода на MD5 в данном случае пользователям необходимо вручную пересохранять пароли в MD5 формате через специальный скрипт на сайте. Предпочтительнее использовать функцию MD5Password из секции Ext (информация ниже). Опция MD5Simple скорее нужна для совместимости с другими авторизационными серверами.

SHA1 (0 или 1) — использовать SHA1 вместо l2-хеша.
Необходимо увеличить размер поля password до 20 байт.

Proxy — список адресов доверенных прокси-серверов (шлюзов).
Программа позволяет пропускать запросы через внешний сервер (например, через шлюз, защищающий от DDOS). Внешний сервер должен при этом передавать реальный IP пользователя в специальном пакете. Этот пакет должен быть отправлен первым и содержать 6 байт: 2 байта размера (всегда 0x06, 0x00) и 4 байта реального IP-адреса. На шлюзы не распространяется ограничение на число одновременных соединений.

AutoReloadFiles (0 или 1) — автоматическая перезагрузка файлов (Black_hKeys, Black_IPs, White_IDs, Test_IDs, ...) каждые 90 секунд.

AutoReloadServers (0 или 1) — автоматическая перезагрузка списка серверов (lin2db.dbo.server) каждые 90 секунд.

Секция Ext

Mask — включают привязку аккаунтов к IP (поле mask в таблице user_account).
Если поле пустое или содержит *, то вход разрешен с любого IP, иначе вход разрешен только с адресов, подходящих по маске. Возможен ввод нескольких масок через запятую.
Пример: 192.168.1.*,192.168.2.*,10.24.*

MD5Password — использовать хеш на основе MD5 для хранения паролей пользователей.
Необходимо наличие текстового поля md5password в таблице user_auth (размер поля может быть любым). Если поле пустое, то выполняется обычная проверка пароля. Если пароль верный, то вычисляется хеш с использованием MD5 и заносится в поле md5Password (в поле password заносится 0). Если поле md5Password уже заполнено, то выполняется проверка только с использованием MD5.
Значение параметра — ключ для получения хеша (задается раз и навсегда). Опция отключена, если параметр не задан или равен нулю.
Функция на PHP для получения хеша (замените 'key' на значение параметра MD5Password):
<?php function hCrypt($password) { $md5password = 'key'; $s = md5($password) . md5($md5password); $j = 0; for ($i = 0; $i < strlen($s); $i++) { if ($j >= strlen($md5password)) $j = 0; $s[$i] = $s[$i] ^ $md5password[$j]; $j++; } return md5($s); } ?>
Внимание! Используйте эту опцию только в том случае, если до конца понимаете на что идете!

ExecLogin (0 или 1) — позволяет при каждой успешной авторизации вызывать процедуру MSSQL.
Если значение 1, то hAuthD после всех проверок вызывает hauthd_login (Stored Procedure). Процедуре передается id учетной записи (параметр @uid), IP клиента (@ip) и hKey (@hkey). Вход в игру блокируется, если процедура возвращает ok со значением 0.
Пример процедуры hauthd_login:
USE [lin2db] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[hauthd_login] @uid int, @ip varchar(15), @hkey varchar(16) AS SELECT pay_stat AS ok FROM user_account WITH (nolock) WHERE uid = @uid

Guard — активирует модуль защиты (требуется специальная DLL для клиента).

Секции AntiBrute и AntiBruteIP

Защита от перебора работает с идентификатором, состоящим из IP и имени учетной записи.
Аналогичная секция AntiBruteIP управляет защитой, привязанной только к IP.

MaxAttempts — максимальное число попыток входа за интервал времени (interval).

Interval — интервал в секундах для расчета количества попыток входа.

Penalty — интервал в секундах в течение которого вход в игру запрещен (независимо от того, введен правильный пароль или нет) после того, как пользователь сделал MaxAttempts попыток за Interval секунд.

Прочее

Различная дополнительная функциональность.

Поле master_id в lin2db.dbo.server

Для одного сервера можно добавить несколько строк в таблицу с разными IP и названиями. Можно использовать для добавления в список проксирующих серверов. В master_id указывается id главного сервера. Дополнительные сервера будут иметь статус offline, если главный сервер имеет статус offline.

Расширенный формат поля IP в lin2db.dbo.server

Пример:
192.168.1.*:192.168.1.10; 10.*:10.1.1.1,10.1.1.2; 87.213.67.1,87.213.67.2,87.213.67.3

Игрокам с IP 192.168.1.* будет выдан IP 192.168.1.10. Для игроков с IP 10.* будут выдаваться 10.1.1.1 и 10.1.1.2 (случайным образом). Всем остальным: 87.213.67.1, 87.213.67.2 или 87.213.67.3.

Пользовательские аккаунты могут иметь разные уровни доступа (от 0 до 9). Уровень доступа указывается у аккаунта в колонке special_gates (int). У каждой группы IP может быть указан минимальный требуемый уровень доступа (префиксы от s до s9). Если уровень доступа группы IP выше уровня доступа пользователя, то эти IP ему выдаваться не будут.

Пример:
1.1.1.1; s:2.2.2.2; s2:3.3.3.3,3.3.3.4

Игрокам с уровнем доступа 2 и выше будет выдан 3.3.3.3 или 3.3.3.4. Игрокам с уровнем доступа 1 - 2.2.2.2. Всем остальным - 1.1.1.1.