Как проверить, из какой страны реально выходит нода#
Нода заявлена как немецкая, но действительно ли трафик клиента выходит из Германии? Хостер мог переназначить 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:
Вывод:
loc - ISO-код страны (DE, NL, US), ip - тот самый egress-IP, который пригодится для методов 4 и 5.
2. ipinfo.io#
В ответе - поле "country": "DE". Без токена сервис ограничивает число запросов в сутки, для разовой проверки этого хватает.
3. ip-api.com#
Дает не только страну, но и ASN с названием провайдера - это помогает понять, действительно ли IP принадлежит ожидаемому хостеру:
Вывод:
{"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 лежит глубоко внутри страницы (~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):
Плюс - никаких лимитов и сети. Минус - база статична: результат настолько свежий, насколько свежий ваш скачанный файл, поэтому базу нужно периодически обновлять (раз в месяц достаточно).
6. RDAP - страна регистрации блока#
RDAP отдает регистрационные данные диапазона IP из реестра RIR (RIPE, ARIN и т.п.):
В ответе - поле 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.