Назад | Перейти на главную страницу

Как получить регион по ip-адресу в GCP

Я создал и остановил пару экземпляров GCP для сбора статистики о задержках и пропускной способности сети. У меня есть публичные IP-адреса, но я потерял файл сопоставления из-за поломки ноутбука. Есть ли способ сопоставить IP-адрес с регионом в GCP?

Скажите 35.243.94.242 для региона Япония.

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

В Google доступно множество блоков диапазонов IP-адресов, но эти IP-адреса назначены многим регионам. Существует масса документации по GCP, но она просто дает вам некоторые подсказки. Подобный случай обсуждался и на StackOverflow..

Есть способ определить, что это за диапазоны IP точно, но они никак не «привязаны» к регионам.

Если вы попытаетесь определить местонахождение IP-адреса, вы (в большинстве случаев) в конечном итоге найдете «Маунтин-Вью, Калифорния» (потому что они принадлежат Google).

Ты тоже не можешь traceroute чтобы точно определить, где эти IP-адреса из-за Политика безопасности Google - они скрывают результаты, увеличивая время TTL пакета, когда они покидают виртуальную машину.

Использование traceroute даже не дает вам представления о том, на какой континент отправляются пакеты. Я попытался трассировать свою виртуальную машину (в 4 разных зонах), и результаты были очень странными, если не считать эту последнюю часть маршрута, скрытую Google.

Если вы не потратили целый день на изучение времени задержки, просто повторите эксперимент. Так вы убедитесь, что все поняли правильно.

Вы можете зарезервировать общедоступный IP-адрес в зависимости от региона. Зарезервировать статический адрес

для получения дополнительной информации - https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address

Приведенный ниже подход может работать, если к экземплярам виртуальных машин был доступ через HTTP.

Еще в 2014 году Гэри Линг, менеджер по продуктам GCP, объяснил на Группы Google как обрабатываются публичные адреса:

"Мы знаем об этой проблеме, что (почти) все IP-адреса Google по SWIP относятся к Маунтин-Вью, Калифорния. И в Google нередко переносят блок IP-адресов из одного места в другое, особенно с учетом эластичности IP-адреса для облака. Жаль, что многие внешние службы гео-IP зависят исключительно от базы данных SWIP. Пока мы оцениваем, что мы можем сделать, чтобы помочь нашим клиентам, лучше всего, на мой взгляд, связаться с вашим поставщиком API и изучить варианты, которые они могут предложить сейчас ".

Это означает, что до тех пор, пока внешний IP-адрес не будет настроен как стандартный (региональный) тип, невозможно получить местоположение экземпляра виртуальной машины на основе адреса.

В этой ситуации тот факт, что сам экземпляр виртуальной машины привязан к зоне, может помочь ретроспективно восстановить потерянные привязки.

К сожалению, GCP Logging не сохраняет информацию о привязке внешнего IP-адреса, в отличие от внутреннего IP. Кроме того, при остановке экземпляра виртуальной машины эта информация теряется в конфигурации Compute Engine.

К счастью, эту информацию можно получить из журнала доступа к веб-серверу. Если вы остановили, а затем запустили экземпляр виртуальной машины, он потеряет свой эфемерный внешний IP-адрес и получит новый. Следовательно, вам нужно будет запросить информацию об обоих адресах, которые имел экземпляр виртуальной машины.

Перейдите в средство просмотра журналов и переключите его в режим просмотра новой версии:

Меню навигации GCP => Stackdriver => Logging => Logs Viewer => Classic => Предварительный просмотр нового Logs Viewer

Введите и выполните такой запрос:

timestamp>="2019-12-18T16:55:55.671Z"
"GET"
"35.246.254.65" OR "35.198.96.135"

или используйте gcloud командная строка в CloudShell (для вашего удобства приведены подготовительные шаги):

$ gcloud config list 
$ gcloud config set account 'account'
$ gcloud config set core/project 'project_id'
$ gcloud logging read 'timestamp>="2019-12-19" AND "GET" AND "35.246.254.65" OR "35.198.96.135"'

Вы увидите записи журнала из журнала доступа к веб-серверу (в данном примере Apache), которые содержат внешний IP-адрес экземпляра виртуальной машины, его идентификатор, зону и имя в качестве значений. textPayload, instance_id, zone и compute.googleapis.com/resource_name соответственно. В приведенном ниже примере информация ретроспективно восстанавливается из журналов, в которых упоминается эфемерный внешний IP-адрес. 35.246.254.65 был привязан к экземпляру виртуальной машины ssh2 в регионе europe-west3:

{
  "textPayload": "104.132.189.65 - - [19/Dec/2019:12:36:34 +0100] "GET /icons/openlogo-75.png HTTP/1.1" 200 6040 "http://35.246.254.65/" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"",
  "insertId": "46bi50g2tl8r4c",
  "resource": {
    "type": "gce_instance",
    "labels": {
      "project_id": "myworks2",
      "instance_id": "8445465273187245258",
      "zone": "europe-west3-c"
    }
  },
  "timestamp": "2019-12-19T11:36:35.006315576Z",
  "labels": {
    "compute.googleapis.com/resource_name": "ssh2"
  },
  "logName": "projects/myworks2/logs/apache-access",
  "receiveTimestamp": "2019-12-19T11:36:36.253027441Z"
}

Это работает как для эфемерного, так и для статического внешнего IP-адреса, и, что важно, он остается в журналах Stackdriver даже после удаления виртуальной машины.

Результат запроса может быть огромным. Вы можете обработать вывод с помощью --format или --flatten параметры командной строки или любой сценарий синтаксического анализа по мере необходимости.

$ gcloud logging read 'timestamp>="2019-12-19" AND "GET" AND "35.246.254.65" OR "35.198.96.135"' --format="table(labels.'compute.googleapis.com/resource_name',resource.labels.instance_id,resource.labels.zone,textPayload)"
COMPUTE.GOOGLEAPIS.COM/RESOURCE_NAME  INSTANCE_ID          ZONE            TEXT_PAYLOAD
ssh2                                  8445465273187245258  europe-west3-c  104.132.189.65 - - [19/Dec/2019:12:56:56 +0100] "GET /icons/openlogo-75.png HTTP/1.1" 200 6040 "http://35.198.96.135/" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
ssh2                                  8445465273187245258  europe-west3-c  104.132.189.65 - - [19/Dec/2019:12:36:34 +0100] "GET /icons/openlogo-75.png HTTP/1.1" 200 6040 "http://35.246.254.65/" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"

Пожалуйста, просмотрите следующие ссылки для более сложных примеров запросов:

Расширенные запросы журналов

Фильтрация и форматирование с помощью gcloud, интерфейса командной строки GCP