Как устранить тайм-аут подключения telnet в настройке IPSec VPN в GCP

Вопрос или проблема

Мы пытаемся подключиться к внешнему сервису, используя IPSec, и VPN хорошо установлен. Однако, когда мы пытаемся запустить telnet, мы всегда получаем следующую ошибку:

telnet: Невозможно подключиться к удаленному хосту: время подключения истекло

Мы используем команды gcloud от GCP для настройки сети, VPN и межсетевого экрана. Соответствующие команды, использованные для настройки VPN и межсетевого экрана, следующие:

Команды Gcloud

gcloud compute networks create sandbox-network \
  --subnet-mode custom

gcloud compute networks subnets create sandbox-network-subnet \
  --network sandbox-network \
  --region us-central1 \
  --range 10.0.0.0/24 \
  --enable-flow-logs

gcloud compute addresses create sandbox-ip \
  --region us-central1

gcloud compute addresses create sandbox-nat-ip \
  --region us-central1

gcloud compute target-vpn-gateways create sandbox-vpn-gateway \
  --network sandbox-network \
  --region us-central1

gcloud compute firewall-rules create sandbox-allow-vpn-traffic \
  --network sandbox-network \
  --allow tcp,udp,icmp,esp \
  --direction INGRESS \
  --enable-logging

gcloud compute forwarding-rules create sandbox-rule-esp \
  --region us-central1 \
  --ip-protocol ESP \
  --target-vpn-gateway sandbox-vpn-gateway \
  --address $(gcloud compute addresses describe sandbox-ip --region us-central1 --format "get(address)")

gcloud compute forwarding-rules create sandbox-rule-udp500 \
  --region us-central1 \
  --ip-protocol UDP \
  --ports 500 \
  --target-vpn-gateway sandbox-vpn-gateway \
  --address $(gcloud compute addresses describe sandbox-ip --region us-central1 --format "get(address)")

gcloud compute forwarding-rules create sandbox-rule-udp4500 \
  --region us-central1 \
  --ip-protocol UDP \
  --ports 4500 \
  --target-vpn-gateway sandbox-vpn-gateway \
  --address $(gcloud compute addresses describe sandbox-ip --region us-central1 --format "get(address)")

gcloud compute firewall-rules create sandbox-allow-ingress \
  --network sandbox-network \
  --allow all \
  --direction INGRESS \
  --priority 1000 \
  --enable-logging

gcloud compute firewall-rules create sandbox-allow-egress \
  --network sandbox-network \
  --allow all \
  --direction EGRESS \
  --priority 1000 \
  --enable-logging

gcloud compute vpn-tunnels create sandbox-vpn-tunnel \
  --region us-central1 \
  --peer-address SERVICE_PEER_IP \
  --ike-version 2 \
  --shared-secret YOUR_SHARED_SECRET \
  --target-vpn-gateway sandbox-vpn-gateway \
  --local-traffic-selector 0.0.0.0/0 \
  --remote-traffic-selector SERVICE_SNAT_IP

gcloud compute routes create sandbox-vpn-route \
  --network sandbox-network \
  --next-hop-vpn-tunnel sandbox-vpn-tunnel \
  --next-hop-vpn-tunnel-region us-central1 \
  --destination-range SERVICE_SNAT_IP

gcloud compute routers create sandbox-router \
  --region us-central1 \
  --network sandbox-network

gcloud compute routers nats create sandbox-router-nat-config \
  --router sandbox-router \
  --region us-central1 \
  --nat-all-subnet-ip-ranges \
  --enable-endpoint-independent-mapping \
  --nat-external-ip-pool sandbox-nat-ip \
  --log-filter ALL \
  --enable-logging

Наблюдения:

  • Мы можем видеть, что правила межсетевого экрана позволяют трафик, но telnet все равно истекает по времени.
  • Исходящий межсетевой экран, похоже, позволяет трафик согласно логам:
{
  "insertId": "INSERT_ID",
  "jsonPayload": {
    "instance": {
      "zone": "us-central1-a",
      "project_id": "OUR_PROJECT",
      "vm_name": "sandbox-test-vm",
      "region": "us-central1"
    },
    "vpc": {
      "project_id": "OUR_PROJECT",
      "vpc_name": "sandbox-network",
      "subnetwork_name": "sandbox-network-subnet"
    },
    "remote_instance": {
      "project_id": "OUR_PROJECT"
    },
    "connection": {
      "src_ip": "10.0.0.7",
      "protocol": 17,
      "dest_ip": "SERVICE_SNAT_IP",
      "src_port": 60248,
      "dest_port": 33523
    },
    "remote_vpc": {
      "vpc_name": "sandbox-network",
      "project_id": "OUR_PROJECT"
    },
    "rule_details": {
      "action": "ALLOW",
      "direction": "EGRESS",
      "priority": 1000,
      "ip_port_info": [
        {
          "ip_protocol": "ALL"
        }
      ],
      "destination_range": [
        "SERVICE_SNAT_IP/32"
      ],
      "reference": "network:sandbox-network/firewall:sandbox-allow-egress"
    },
    "disposition": "ALLOWED"
  },
  "resource": {
    "type": "gce_subnetwork",
    "labels": {
      "subnetwork_name": "sandbox-network-subnet",
      "project_id": "OUR_PROJECT",
      "subnetwork_id": "4135552741745782047",
      "location": "us-central1"
    }
  },
  "timestamp": "2024-10-20T16:16:20.745323759Z",
  "logName": "projects/OUR_PROJECT/logs/compute.googleapis.com%2Ffirewall",
  "receiveTimestamp": "2024-10-20T16:16:29.827308188Z"
}

Виртуальная машина

gcloud compute instances create sandbox-test-vm \
  --zone=us-central1-a \
  --machine-type=e2-medium \
  --network=sandbox-network \
  --subnet=sandbox-network-subnet \
  --image-family=debian-12 \
  --image-project=debian-cloud \
  --can-ip-forward \
  --no-restart-on-failure \
  --no-address \
  --maintenance-policy=MIGRATE \
  --tags=sandbox-test-vm \
  --boot-disk-size=10GB

gcloud compute firewall-rules create sandbox-allow-icmp-ssh \
  --network=sandbox-network \
  --allow=tcp:22,icmp \
  --source-ranges=0.0.0.0/0 \
  --target-tags=sandbox-test-vm

Шаги отладки:

  • Мы попытались отладить соединение, используя telnet:
sudo telnet SERVICE_SNAT_IP 443 --debug
Попытка SERVICE_SNAT_IP...
telnet: Невозможно подключиться к удаленному хосту: время подключения истекло
  • traceroute также не показывает ответа:
traceroute SERVICE_SNAT_IP
traceroute to SERVICE_SNAT_IP (SERVICE_SNAT_IP), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *

Что может быть причиной истечения времени соединения telnet, несмотря на то, что межсетевой экран позволяет трафик? Необходимы ли дополнительные правила межсетевого экрана или настройки сети при настройке IPSec VPN с GCP, чтобы разрешить трафик?

Будем признательны за любые рекомендации по изменению правил межсетевого экрана или настройки сети для разрешения этой проблемы!

Ответ или решение

Как разрешить тайм-аут соединения Telnet в настройке IPSec VPN на GCP

Ваша проблема с тайм-аутом соединения Telnet, несмотря на успешную установку IPSec VPN, может быть связана с несколькими аспектами настройки, включая правила брандмауэра, конфигурацию маршрутизации и настройки самого VPN. Давайте детально рассмотрим возможные причины и способы их устранения.

1. Проверка конфигурации брандмауэра

Первым шагом в устранении проблемы является проверка правил брандмауэра, поскольку именно они контролируют доступ к вашим ресурсам и могут блокировать исходящие или входящие соединения.

Проверка правил брандмауэра:

  • Убедитесь, что у вас есть правильные входящие и исходящие правила брандмауэра. Ваши команды создания правил показывают, что вы разрешили трафик TCP и UDP:
gcloud compute firewall-rules create sandbox-allow-vpn-traffic \
  --network sandbox-network \
  --allow tcp,udp,icmp,esp \
  --direction INGRESS \
  --enable-logging
  • Кроме того, правила sandbox-allow-ingress и sandbox-allow-egress, которые разрешают все протоколы и порты, могут быть настроены правильно, но также необходимо добавить явные разрешения для целевого порта (например, 443) и треф юнитов, если они используются.

2. Проверьте настройки VPN и маршрутизации

Следующим шагом проверьте конфигурацию VPN и маршрутизации:

  • Убедитесь, что маршруты корректно настроены для направления трафика к SNAT IP-адресу вашего внешнего сервиса. Попробуйте выполнить команду для отображения маршрутов в вашей сети и убедитесь, что трафик направляется правильно:
gcloud compute routes list --filter="network:sandbox-network"
  • Ваша команда для создания маршрута выглядит правильно, однако проверьте, действительно ли SERVICE_SNAT_IP совпадает с IP-адресом, к которому вы пытаетесь подключиться.

3. Тестирование доступа

Для тестирования подключения вы правильно использовали команды telnet и traceroute. Если никаких ответов не поступает, это указывает на проблемы либо с маршрутизацией, либо на стороне сервиса:

  • Убедитесь, что внешний сервис действительно доступен и принимает соединения на порту 443. Это можно проверить, попытавшись установить соединение из другого окружения.

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

4. Общие рекомендации по настройке IPSec VPN

  • Проверьте наличие необходимых протоколов и настройте соответствующие правила для ESP и IKE (UDP 500 и 4500). Подобная настройка уже присутствует в ваших командах для создания правила пересылки, но убедитесь, что они активно обрабатываются на стороне внешнего сервиса.

5. Логи и отладка

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

  • Включите дополнительные логи для брандмауэра и VPN, чтобы выяснить, блокируются ли пакеты при маршрутизации через IPSec.

  • Используйте такие инструменты, как tcpdump на вашей виртуальной машине, чтобы просмотреть, проходят ли пакеты должным образом:

sudo tcpdump -i INTERFACE -n host SERVICE_SNAT_IP

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...