Конфигурация сервера и клиентов
Что хранится в server.conf, users.conf и client.conf, какие параметры приходят через push, а какие остаются локальными.
Три файла, одна flat-INI модель
/etc/qeli/server.conf хранит глобальные секции и профили транспорта. /etc/qeli/users.conf — пользователей и группы. client.conf на устройстве содержит подключение и локальное поведение клиента. Комментарий допустим только на отдельной строке.
$ sudo qeli check-config --config /etc/qeli/server.conf
$ sudo qeli check-config --client --config /etc/qeli/client.conf
Что несут ссылка, push и клиентский файл
Ссылка отвечает за подключение и рукопожатие. Серверный push меняет сетевые параметры без перевыпуска ссылки. Настройки поведения устройства остаются только на клиенте.
| Источник | Что несёт | Как обновляется |
|---|---|---|
qeli:// | Адрес, порт, учётка, режим, pinning/REALITY, параметры рукопожатия и опционально MTU/имя | Нужно заново выдать ссылку, если эти данные изменились |
| Server push | IP клиента и сервера, префикс пула, MTU, DNS, keepalive и маршруты | При следующем подключении; ссылка остаётся прежней |
client.conf | gateway, route_local, kill_switch, include/exclude, dns, persist_tun | Изменяется на устройстве или в Client manager |
users.conf | profiles, max_sessions, allowed_networks, route, client_subnet, quotas | Большинство полей применяется reload без разрыва сессий |
Ключи профиля сервера
Каждый [profile:имя] имеет собственные порт, транспорт, TUN и пул. Одна служба может поднять несколько профилей одновременно.
| Ключ | Дефолт | Назначение |
|---|---|---|
bind.address | 0.0.0.0 | Адрес слушателя профиля |
bind.port | 443 | TCP/UDP-порт; не должен конфликтовать с другим профилем |
bind.transport | tcp | Несущий транспорт: tcp или udp |
tun.address | 10.9.0.1 | IP сервера внутри туннеля и типовой next-hop |
tun.name | vpn0 | Имя TUN; должно быть уникальным между профилями |
tun.mtu | 1400 | MTU профиля, пушится клиентам |
tun.queues | 0 | 0 = число ядер, 1 = однопоточная помпа, N = заданное число очередей |
pool.cidr | 10.9.0.0/24 | Единый источник префикса TUN и пула адресов |
pool.reservation.<user> | — | Закрепляет IP пула за пользователем |
obf.mode | fake-tls | Режим провода: plain, fake-tls, obfs или reality-tls |
route | — | Повторяемый маршрут, который сервер пушит клиентам профиля |
routing.nat.enabled | false | NAT с подменой исходного адреса для выхода клиентов через сервер |
routing.nat.interface | eth0 | Egress-интерфейс NAT; при дефолте сервер пытается определить его автоматически |
routing.forward_private | true | Разрешает форвардинг к приватным сетям за сервером |
routing.client_to_client | false | Разрешает трафик между VPN-клиентами профиля |
dns.enabled | false | Запускает встроенный DNS-прокси |
dns.push_servers | — | Явно задаёт DNS, который получат клиенты |
perf.connection.max_clients | 128 | Общий предел активных сессий профиля |
Встроенный DHCP: когда он нужен и что гарантирует
DHCP включается отдельно на профиле только для TAP/L2-сценариев. В обычном L3 TUN адрес выдаётся внутри AUTH, поэтому dhcp.enabled=false остаётся правильным дефолтом.
| Ключ | Дефолт | Назначение |
|---|---|---|
dhcp.enabled | false | Запускает DHCPv4 на фактическом TUN/TAP-интерфейсе профиля |
dhcp.listen | пусто | Логический адрес и порт; пустое значение использует tun.address:67. Явный 0.0.0.0 отклоняется |
dhcp.pool_start / pool_end | — | Опциональный диапазон внутри пригодной части pool.cidr; иначе выбирается автоматически |
dhcp.lease_time_secs | 86400 | Срок аренды в секундах |
dhcp.domain_name | vpn | Домен, передаваемый клиентам |
В 0.8.1 уточнён lifecycle lease: сервер различает SELECTING/INIT-REBOOT/RENEWING/REBINDING REQUEST, отвечает NAK только когда это разрешено состоянием и authoritative server identity, освобождает адрес по RELEASE, временно исключает DECLINE и очищает истёкшие lease. Relay и broadcast обрабатываются по правилам DHCP.
dns.push_servers; пустой список означает отсутствие DNS-option, а не подстановку публичных резолверов.0.0.0.0:67, но Qeli привязывает его через SO_BINDTODEVICE только к фактическому интерфейсу профиля. Небезопасный или malformed listen отклоняется при запуске.Пользователи, группы и ограничения
Собственные значения пользователя имеют приоритет над группой. Персональные route заменяют профильные маршруты для этого пользователя.
| Ключ | Дефолт | Назначение |
|---|---|---|
password_hash | — | Argon2id-хеш для аутентификации |
password_enc | — | Зашифрованная копия для повторной выдачи ссылки; ключ хранится в /var/lib/qeli |
enabled | true | Разрешает или запрещает новые подключения |
profiles | все | Список доступных профилей |
group | — | Шаблон лимитов и ACL из [group:имя] |
max_sessions | 0 | Предел одновременных устройств; 0 = из группы или без лимита |
static_ip | — | Фиксированный адрес пользователя из pool.cidr |
allowed_networks | любые | Whitelist CIDR назначения; пусто = без ограничений |
route | — | Персональный push-маршрут клиенту |
client_subnet | — | Входящий маршрут к сети за этим клиентом, аналог iroute |
bandwidth.limit_mbps | 0 | Ограничение скорости; 0 = без лимита или значение группы |
data_limit_gb | 0 | Пожизненная download-квота; upload учитывается отдельно |
expire_at | — | Unix-время окончания действия учётной записи |
Ключи подключения и локального поведения
Поля подключения обычно приходят из импорта qeli://. Политики gateway, DNS, маршрутов и поведения устройства в ссылку не входят; явный MTU — документированное исключение.
| Ключ | Источник | Назначение |
|---|---|---|
server, user, pass | qeli:// | Адрес и учётные данные |
proto, mode | qeli:// | Транспорт и режим должны совпадать с профилем |
key, reality_sid, sni | qeli:// | Pinning и параметры REALITY/H-1 |
gateway | локально | true включает full-tunnel; false оставляет split-tunnel |
route_local | локально | Также направляет приватные сети через туннель |
include, exclude | локально | Дополнительные CIDR через туннель или в обход него |
route_file | Windows/macOS | Файл CIDR, который локально дополняет include в split-tunnel |
kill_switch | локально | Блокирует утечки full-tunnel, пока соединение не поднято |
allow_ipv6_leak | локально | Разрешает IPv6 идти физическим путём, только когда согласованный full-tunnel не содержит IPv6; явное принятие утечки |
apps, apps_mode | по платформе | Per-app маршрутизация Windows, macOS и Android |
allow_lan | Android | Оставляет домашнюю LAN и локальный multicast вне VPN |
dns | локально | Режим управления резолвером: tunnel, off или синоним system |
mtu | link/push/локально | 0 принимает push/автоподбор; значение больше 0 переопределяет его |
persist_tun | локально | Сохраняет адаптер и маршруты между реконнектами |
keepalive, tcp_nodelay | локально | Параметры TCP-сокета клиента |
recv_buffer_size | локально | Стартовый размер UDP receive buffer; авто-рост ограничен sysctl |
forward | локально | Site-to-site форвардинг без NAT; применяется на Linux, Windows и macOS |
gateway_nat, lan_subnet | локально | Режим клиентского шлюза для локальной сети |
exit_node | Linux | Выпускает трафик других клиентов через физический WAN этого узла |
dev_attach | Linux CLI | Подключает готовый TUN, которым адресно и маршрутно управляет внешний контроллер |
Когда достаточно reload
reload рассчитан на пользователей и часть runtime-настроек. Всё, что меняет слушатель, транспорт или устройство TUN, требует полного restart и краткого разрыва сессий.
| Изменение | Действие | Эффект |
|---|---|---|
| Пользователи, группы, ACL, лимиты | sudo systemctl reload qeli | Без разрыва активных сессий, если поле допускает runtime reload |
web.allowed_ips, allowed_origins, public_host | reload | Перечитываются на лету |
bind.*, web.bind/port/tls/base_path | sudo systemctl restart qeli | Меняется сокет, нужен полный restart |
tun.*, pool.cidr, obf.* | restart | Пересоздаётся профиль и TUN |
rotate-identity | restart | Клиентам нужно обновить закреплённый key |
Где проверить полный список
Эта страница покрывает операторские ключи, которые используются чаще всего. Редкие transport, shaping, multipath, logging, hooks и platform-specific параметры перечислены в полном справочнике.