Перейти к содержанию

Как проверить, из какой страны реально выходит нода#

Нода заявлена как немецкая, но действительно ли трафик клиента выходит из Германии? Хостер мог переназначить IP в другой стране, каскад через mihomo мог отвалиться на резервный выход, geoip-база приложения могла устареть. Ниже - шесть независимых способов определить страну исходящего (egress) IP и сверить ее с ожидаемой. По-отдельности каждый ошибается, вместе дают надежную картину.

Если выход настроен через цепочку mihomo - сначала получите exit-IP цепочки по инструкции из Hiddify через mihomo, раздел "Проверка". Здесь дальше речь о том, как от IP перейти к стране.

Две группы методов#

Способы делятся на две группы, и это принципиально:

  • Запросы с самой ноды (Cloudflare trace, ipinfo.io, ip-api.com). Команда curl выполняется на сервере по SSH, поэтому сервис видит именно реальный egress-IP ноды. За один запрос возвращают и IP, и его страну. Это основной способ: он отражает то, что увидит внешний сайт, к которому подключится клиент. Сюда же примыкает запрос к YouTube (метод 4) - он показывает не геолокацию IP как такового, а регион, который Google по факту отдает на этом выходе.
  • Пробивка известного IP (локальная база DB-IP/MaxMind, RDAP). Сначала узнаете egress-IP (из ответов выше или через curl https://api.ipify.org), затем пробиваете его из любого места. Эти источники не зависят от того, что в данный момент с нодой, и хороши как офлайн-сверка.

Запросы с ноды#

Выполняются по SSH на самом сервере.

1. Cloudflare trace#

Самый быстрый и надежный. Cloudflare отдает страну вашего IP в поле loc:

curl -s --max-time 8 https://www.cloudflare.com/cdn-cgi/trace | grep -E '^(ip|loc)='

Вывод:

ip=203.0.113.7
loc=DE

loc - ISO-код страны (DE, NL, US), ip - тот самый egress-IP, который пригодится для методов 4 и 5.

2. ipinfo.io#

curl -s --max-time 8 https://ipinfo.io/json

В ответе - поле "country": "DE". Без токена сервис ограничивает число запросов в сутки, для разовой проверки этого хватает.

3. ip-api.com#

Дает не только страну, но и ASN с названием провайдера - это помогает понять, действительно ли IP принадлежит ожидаемому хостеру:

curl -s --max-time 8 'http://ip-api.com/json/?fields=status,message,query,countryCode,as,isp'

Вывод:

{"status":"success","query":"203.0.113.7","countryCode":"DE","as":"AS24940 Hetzner Online GmbH","isp":"Hetzner Online GmbH"}

Нюансы ip-api: бесплатный доступ только по HTTP (не HTTPS) и с лимитом около 45 запросов в минуту с одного IP - при превышении вернет HTTP 429 (status: fail). Для одной ноды это неважно, при массовой проверке парка делайте паузы.

4. YouTube - регион, который вам отдает Google#

Первые три источника отвечают на вопрос "в какой стране находится IP". YouTube отвечает на другой, для многих более важный: "контент какого региона Google по факту отдает на этом выходе". Главная youtube.com содержит в конфиге ytcfg поле GL (geo location) - двухбуквенный код страны, которую Google определил для вашего egress-IP:

curl -s --compressed --max-time 10 -A 'Mozilla/5.0' https://www.youtube.com/ \
  | grep -aoE '"GL":"[A-Z]{2}"' | head -n1

Вывод:

"GL":"DE"

Поле GL лежит глубоко внутри страницы (~80 КБ), поэтому в примере оно сразу вытаскивается через grep в пайпе, а не качается целиком. Рядом в той же странице есть дублирующее поле "contentRegion" с тем же кодом - можно свериться по нему.

Ценность метода в том, что вердикт Google нередко расходится с остальными базами, и это не ошибка проверки, а реальное поведение. Встречаются ноды, у которых Cloudflare, ipinfo и ip-api единогласно показывают, например, KZ или US, а YouTube отдает GL:RU: Google по своим данным считает этот IP российским и отдает на него российский YouTube - с российской выдачей, рекомендациями, рекламой и гео-ограничениями. Для VPN это часто важнее формальной страны IP: пользователь на таком выходе получит не тот YouTube, на который рассчитывал. Если выход берут именно ради ютуба - сверяться стоит в первую очередь по этому полю.

Пробивка IP откуда угодно#

Этим методам нужен egress-IP на вход (берется из шага 1 или из curl -s https://api.ipify.org). Запускать можно не на ноде - с любой машины.

5. Локальная база DB-IP / MaxMind#

Офлайн-сверка по локальной базе в формате MaxMind .mmdb. Бесплатная база DB-IP Country Lite обновляется раз в месяц, скачивается одним файлом. Запрос через mmdblookup (пакет libmaxminddb):

mmdblookup --file dbip-country-lite.mmdb --ip 203.0.113.7 country iso_code

Плюс - никаких лимитов и сети. Минус - база статична: результат настолько свежий, насколько свежий ваш скачанный файл, поэтому базу нужно периодически обновлять (раз в месяц достаточно).

6. RDAP - страна регистрации блока#

RDAP отдает регистрационные данные диапазона IP из реестра RIR (RIPE, ARIN и т.п.):

curl -s --max-time 8 https://rdap.org/ip/203.0.113.7

В ответе - поле country и название сети (netname). Важно: это страна регистрации блока в реестре, а не физическое местоположение сервера. Хостер из Германии может анонсировать IP, зарегистрированный на голландское юрлицо. Поэтому RDAP - справочный источник, а не критерий: расхождение RDAP с остальными само по себе не значит, что нода "не в той стране".

Как читать результат#

Берите несколько источников и сравнивайте:

  • Все источники сходятся на ожидаемой стране - нода в порядке.
  • GeoIP-базы "с ноды" (1-3) расходятся с ожидаемой страной - это реальный сигнал: либо хостер переназначил IP, либо отвалился каскад/выход. Разбираться.
  • YouTube (4) расходится, а GeoIP-базы (1-3) совпадают с ожидаемой - Google геолоцирует egress-IP иначе, чем остальные базы, и отдает на него контент своего региона. На сам факт работы VPN не влияет, но YouTube на этом выходе ведет себя как из страны GL - учитывайте, если ноду берут ради ютуба.
  • RDAP (6) расходится, а 1-3 совпадают - чаще всего норма: страна регистрации блока просто не совпадает с физическим размещением. Не алерт.
  • Базы расходятся между собой - типично для облачных и хостинговых ASN и для недавно переназначенных диапазонов. Доверяйте группе "с ноды" (1-3), они отражают живую картину; локальная база (5) могла устареть.

Смысл шести источников именно в том, что geoip-базы регулярно ошибаются поодиночке, особенно на hosting-провайдерах. Совпадение нескольких независимых методов снимает сомнения, единичное расхождение - повод перепроверить, а не паниковать.

Источники#

На основе опыта автора hiddify-faq и публичной документации сервисов Cloudflare trace, ipinfo.io, ip-api.com, DB-IP и протокола RDAP (RFC 9083). Поле GL YouTube - из конфига ytcfg главной страницы youtube.com.


Не помогло или есть уточняющий вопрос - заходите в русское сообщество @hiddify_rus.