hAuthD — авторизационный сервер для Lineage II (en, ru)
hAuthD — альтернативный авторизационный сервер для Lineage II с расширенной функциональностью. Умеет одновременно работать с «PTS» и некоторыми L2J-серверами. Авторизационные данные хранятся в базе данных MSSQL.
Особенности:
- Динамические IP у игровых серверов (случайные адреса из списка, привязка к IP пользователя, автоматическая перезагрузка).
- Прокси-серверы в списке серверов со своими именами и статусами.
- Одновременное использование PTS и L2J серверов с одним авторизационным сервером и с единой базой учетных записей. Переход с PTS на L2J без необходимости конвертирования базы данных lin2db.
- Привязка учетных записей к IP.
- Полноценная защита от перебора паролей (AntiBrute).
- Надежное хранение паролей с использованием MD5 или SHA1.
- Пароль администратора с привязкой по IP (дает возможность зайти в игру любой учетной записью с обходом всех ограничений).
- Режим «тест» (ограниченный доступ к игровым серверам).
- Определение реальных IP при работе через специальные внешние шлюзы.
Последняя версия (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.