Перейти к содержимому

DNS-балансировка

DNS-балансировка позволяет распределять входящие подключения между несколькими серверами без полноценного балансировщика трафика.

DNS-балансировка строится на том, что для одного домена создаётся несколько A-записей с разными IP-адресами:

Окно терминала
vpn.example.com. 300 IN A 1.1.1.1
vpn.example.com. 300 IN A 2.2.2.2
vpn.example.com. 300 IN A 3.3.3.3

Когда приложение пользователя обращается к доменному имени, оно запрашивает у DNS-резолвера список IP-адресов. DNS возвращает все доступные IP, обычно в случайном порядке или по принципу round-robin(). Чаще всего клиент использует первый адрес из полученного списка для установления соединения.

Значение 300 см. выше — это TTL (time to live, время жизни записи в секундах)

Пока TTL не истёк, клиент продолжает использовать тот IP, который он получил ранее. После истечения TTL клиент отправит новый DNS запрос и может получить другой порядок адресов или новые IP (если вы их добавили или удалили). Все уже установленные TCP соединения продолжают работать через тот IP, который был выбран при подключении; новые подключения будут использовать новые IP из свежего DNS-ответа.

  • Не требует установки отдельного балансировщика.
  • Работает на уровне DNS — поддерживается практически везде.
  • IP-адрес может меняться у пользователя с течением времени, если клиент корректно обрабатывает TTL.
  • DNS-серверы часто перемешивают список IP-адресов перед выдачей.
  • Клиенты могут выбирать IP случайным образом или использовать только первый в списке — поведение зависит от реализации.
  • Некоторые клиенты могут “залипать” на одном IP до перезапуска, даже если TTL уже истёк.
  • Это единственный способ балансировки, не требующий backend-приложения — нет узкого места в виде одного прокси.
  • Не учитывает состояние серверов — если один из IP упал, клиенты всё равно могут к нему обращаться. Это можно решить обвязкой: health-check скрипт (например, xray-checker) + автоматического обновление DNS через API.

Вместо указания конкретного IP, пользователь подключается по доменному имени (например, vpn.example.com). Это позволяет:

  • скрывать за одной «локацией» (например, 🇩🇪 Германия) сразу несколько серверов;
  • распределять нагрузку между ними без изменений на стороне клиента;
  • централизованно управлять доступностью нод через DNS;
  • повышать устойчивость системы без сложных прокси и балансировщиков.