Я боролся с настройкой VPN между локальной сетью и GCP более недели. На данный момент у меня совершенно нет идей, и я хотел бы получить помощь сетевых специалистов.
Конечная цель проста: заставить экземпляр виртуальной машины на GCP беспрепятственно взаимодействовать с виртуальной машиной на месте - но с двумя активными маршрутизаторами.
Настройка выглядит примерно так:
GCP_VM OP_VM
10.0.0.25 10.100.0.200
| |
| (DC Router Gateway)
| 10.100.0.80
| |
└-- HA_VPN (AS65001) <==========> Router (AS65002) --┘
Public IP: xx.xx.xx.xx yy.yy.yy.yy
Advertise: 10.0.0.0/24 BGP 10.100.0.0/24 BGP
VPN IP Range: 169.254.0.1/30 169.254.0.2 (as Peer)
Private IP: NA 10.100.0.50
Сложность здесь в том, что Router
здесь напрямую не связан с OP_VM
. Это локальная настройка, которую мы не контролируем. OP_VM
получает свой IP 10.100.0.200
с какого-то другого роутера, а наш Router
подключен к той же локальной сети. У нас есть только одна стойка в центре обработки данных, и нам нужно достичь OP_VM
который размещен другой стороной (в другой стойке). Наша стойка ассоциируется с 10.100.0.50
.
И с этим я хочу получить следующую работу:
me@GCP_VM:10.0.0.25:~$ ping 10.100.0.200
При описанной выше настройке VPN и BGP кажутся работоспособными из журналов с обеих сторон.
Из GCP_VM
, Я могу пинговать 10.100.0.50
(Router
) успешно.
me@GCP_VM:10.0.0.25:~$ ping 10.100.0.50
PING 10.100.0.50 (10.100.0.50) 56(84) bytes of data.
64 bytes from 10.100.0.50: icmp_seq=1 ttl=254 time=24.9 ms
...
Также из Router
, Я могу подтвердить, что могу пинговать 10.100.0.200
(OP_VM
).
# With the Router setup of something like
#
# ip route 10.100.0.0/24 gateway 10.100.0.80
root@Router:10.100.0.50:~$ ping 10.100.0.200
ping 10.100.0.200
received from 10.100.0.200: icmp_seq=0 ttl=63 time=0.583ms
received from 10.100.0.200: icmp_seq=1 ttl=63 time=0.571ms
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max = 0.571/0.577/0.583 ms
Из GCP_VM
однако пинговать 10.100.0.200
(OP_VM
) идет отсутствует.
# With the Router setup of something like
#
# ip route 10.100.0.0/24 gateway 10.100.0.80
me@GCP_VM:10.0.0.25:~$ ping 10.100.0.200
PING 10.100.0.200 (10.100.0.200) 56(84) bytes of data.
^C
--- 10.100.0.200 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3051ms
Я, вероятно, неправильно понимаю настройку шлюза, но изменение маршрута, как показано ниже, дает мне другой результат:
# With the Router setup of something like
#
# ip route 10.100.0.0/24 gateway 10.100.0.50
# ~~ <- Router itself
me@GCP_VM:10.0.0.25:~$ ping 10.100.0.200
PING 10.100.0.200 (10.100.0.200) 56(84) bytes of data.
From 169.254.0.2 icmp_seq=7 Destination Host Unreachable
From 169.254.0.2 icmp_seq=6 Destination Host Unreachable
From 169.254.0.2 icmp_seq=5 Destination Host Unreachable
From 169.254.0.2 icmp_seq=4 Destination Host Unreachable
From 169.254.0.2 icmp_seq=3 Destination Host Unreachable
From 169.254.0.2 icmp_seq=2 Destination Host Unreachable
From 169.254.0.2 icmp_seq=1 Destination Host Unreachable
^C
--- 10.100.0.200 ping statistics ---
9 packets transmitted, 0 received, +7 errors, 100% packet loss, time 8141ms
pipe 7
При такой настройке шлюза Router
больше не могу пинговать OP_VM
. По крайней мере, мне кажется, что VPN установлен и IP анонсируется правильно. Но это не совсем правильно с точки зрения сети.
Я не думаю, что со стороны GCP еще много чего предстоит сделать, и, похоже, проблема заключается исключительно в локальной системе.
Есть ли какие-либо проблемы с настройкой или опасения, которые могут вызвать неправильное поведение VPN, BGP, ARP и т. Д.? Что может вызвать такой случай, когда кажется, что маршруты используются совместно, но на самом деле нет к ним доступа?
Router
включает 10.100.0.200
169.254.0.0/30
и 10.100.0.0/24
GCP_VM
Router
от Yamahapacketdump
в роутерах Yamaha), но не видел 10.0.0.25
в журнале10.0.0.25
когда я бежал nmap -Pn 10.100.0.200
из GCP_VM
, но с одной строкой вроде этого:2019/12/21 16:35:40: LAN1 OUT:IP TCP 10.100.0.227:50516 > 10.103.24.1:80
я сделал tcpdump
для простого пинга между GCP_VM
и Router
.
Из GCP_VM
к Router
(журналы из GCP_VM
)
$ ping 10.100.0.50 > /dev/null &
$ sudo tcpdump -i eth0 | grep 10.100
...
18:49:18.696178 IP GCP_VM.(snip) > 10.100.0.50: ICMP echo request
, id 32396, seq 0, length 64
18:49:18.700395 IP 10.100.0.50 > GCP_VM.(snip): ICMP echo reply,
id 32396, seq 0, length 64
Из Router
к GCP_VM
(журналы из GCP_VM
)
# ping from Router, with `ping 10.0.0.25`
$ sudo tcpdump -i eth0 | grep 169.254
...
18:40:18.554555 IP 169.254.0.2 > GCP_VM.(snip): ICMP echo request,
id 3369, seq 0, length 72
18:40:18.554586 IP GCP_VM.(snip) > 169.254.0.2: ICMP echo reply, i
d 3369, seq 0, length 72
Хотя tcpdump
показывает, что ответ отправляется сюда, он никогда не получен Router
.
Кроме того, пинг 169.254.0.2
из GCP_VM
не получает ответа.
$ ping 169.254.0.2 > /dev/null &
$ sudo tcpdump -i eth0 | grep 169.254
...
18:59:07.113101 IP GCP_VM.(snip) > 169.254.0.2: ICMP echo request, i
d 32531, seq 0, length 64
18:59:08.137103 IP GCP_VM.(snip) > 169.254.0.2: ICMP echo request, i
d 32531, seq 1, length 64
...
Пинг от Router
был успешным после установки его исходного адреса на 10.100.0.50
, поскольку он пытался использовать 169.254.0.2
по умолчанию.
Пинг все еще не доходит OP_VM
, и я все еще сталкиваюсь с проблемой конфигурации NAT, чтобы гарантировать правильность перевода.
Наконец-то соединение установлено. Я подведу итоги предпринятых шагов в отдельном ответе, чтобы избавиться от лишнего шума.
После долгого тестирования и отладки я решил проблему соединения между GCP и локальной системой. Ниже приведены предпринятые шаги, а также соображения, сделанные при выявлении проблемы.
Мне не хватало внимания, чтобы отделить трафик от оба направления. Это означает разбиение того, как каждый пакет будет перемещаться из / в источник / пункт назначения, и это даст четкое представление о том, где может лежать основная причина.
Пакет от GCP до локальной сети
GCP_VM
(10.0.0.25
) к HA_VPN
(169.254.0.1/30
)GCP_VM
(10.0.0.25
) к Router (AS65002)
(10.100.0.50
)GCP_VM
(10.0.0.25
) к DC Router Gateway
(10.100.0.80
)GCP_VM
(10.0.0.25
) к OP_VM
(10.100.0.200
)Router (AS65002)
(10.100.0.50
) к OP_VM
(10.100.0.200
)Пакеты от локальной сети до GCP (обратный маршрут)
OP_VM
(10.100.0.200
) к Router (AS65002)
(10.100.0.50
)OP_VM
(10.100.0.200
) к GCP_VM
(10.0.0.25
)Router (AS65002)
(10.100.0.50
) к GCP_VM
(10.0.0.25
)Учитывая указанные выше контрольные точки, статус был следующим:
169.254.0.1/30
) не входил в маршруты в VPCping
удары Router (AS65002)
(10.100.0.50
), а также возвращается ответ (это означает, что соответствующий № 9 также подтвержден)ping
удары DC Router Gateway
(10.100.0.80
), так как ping не получил ответаping
удары OP_VM
(10.100.0.200
), так как ping не получил ответаping
удары OP_VM
(10.100.0.200
), а также возвращается ответ (это означает, что соответствующий № 7 также подтвержден)Ниже приведена диаграмма для описания ситуации.
GCP_VM HA_VPN (AS65001) Router (AS65002) (DC Router Gateway) OP_VM
10.0.0.25 10.100.0.50 10.100.0.80 10.100.0.200
1. NA
2. +--------------------------------> OK (response returned)
3. +----------------------------------------------------x NG?
4. +---------------------------------------------------------------------------x NG?
5. +-----------------------------------------> OK (response returned)
6. OK <-----------------------------------------+
7. No matching traffic
8. OK <--------------------------------+
Это поясняет, что любой трафик, исходящий из GCP_VM
оставляет 2 возможных вопроса:
OP_VM
(10.100.0.200
) OP_VM
(10.100.0.200
), но ответ не возвращается Router (AS65002)
(10.100.0.50
)Я мог подтвердить с помощью пунктов 5 и 6 выше, что пакет действительно достигает OP_VM
(10.100.0.200
) при запуске в Router (AS65002)
(10.100.0.50
). Это значит, Возможность А маловероятно. Сама роутинг работает как надо.
Это означало, что высока вероятность того, что ping
ответ теряется, и никогда не попадает Router (AS65002)
(10.100.0.50
) назад. И для моего конкретного случая здесь это Возможность B была первопричиной проблемы.
Я мог подтвердить, что это так, создав имитацию сети, имитирующую ту же настройку, что и выше, и используя Wireshark для прослушивания в каждой точке. Это означает, что приведенная ниже диаграмма является реальным случаем.
GCP_VM HA_VPN (AS65001) Router (AS65002) (DC Router Gateway) OP_VM
10.0.0.25 10.100.0.50 10.100.0.80 10.100.0.200
1. NA
2. +--------------------------------> OK (response returned)
3. +----------------------------------------------------> OK
4. +---------------------------------------------------------------------------> OK
5. +-----------------------------------------> OK (response returned)
6. OK <-----------------------------------------+
7. Where should I sent packet to?? LOST ---------------------------+
8. OK <--------------------------------+
В моем случае, когда трафик инициируется в GCP_VM
, исходный IP-адрес был установлен на 10.0.0.25
. Это означало, когда OP_VM
пытается отправить трафик обратно, не может найти где 10.0.0.25
, и пакет был потерян.
Мне пришлось добавить статическую запись NAT в Router (AS65002)
сопоставить исходный IP-адрес 10.0.0.25
к 10.100.0.50
когда пакет уходит Router (AS65002)
, таким образом OP_VM
может правильно направить трафик обратно в Router (AS65002)
. После получения ответа NAT снова вступает в силу и Router (AS65002)
затем заменяет 10.100.0.50
с участием 10.0.0.25
, и отправляет пакеты обратно в GCP_VM
.
Это похоже на проблему с маршрутизацией на месте. Думаю, OP_VM
нет пути к 10.0.0.0/24
и как результат отправить его на шлюз по умолчанию DC Router Gateway
и там он упал, потому что DC Router Gateway (10.100.0.80)
также нет маршрута к 10.0.0.0/24
(потому что вы смотрите на Router
).
Чтобы решить эту проблему, вы должны установить статический маршрут в OP_VM
к 10.0.0.0/24
через Router
и хранить DC Router Gateway
как шлюз по умолчанию.
Вы должны удалить маршрут ip route 10.100.0.0/24 gateway 10.100.0.50
из Router
- сеть 10.100.0.0/24
напрямую связана с ним.
РЕДАКТИРОВАТЬ
С GCP_VM я могу успешно пропинговать 10.100.0.50 (маршрутизатор).
На данный момент похоже, что вы правильно настроили пиринг между Router
и HA_VPN
.
Вы должны иметь возможность пинговать GCP_VM
и OP_VM
из Router
а также Router
из OP_VM
быть на правильном пути.
При настройке маршрутизатора что-то вроде
ip route 10.100.0.0/24 gateway 10.100.0.80
При настройке маршрутизатора что-то вроде
ip route 10.100.0.0/24 gateway 10.100.0.80
Эти маршруты не нужны, потому что Router
напрямую подключен к подсети 10.100.0.0/24
и имеет IP 10.100.0.50
Однако из GCP_VM пинг до 10.100.0.200 (OP_VM) пропадает.
Это ожидается, потому что OP_VM
и DC Router Gateway
нет пути к 10.0.0.0/24
как я уже упоминал выше и не могу ответить, и вам нужно установить статический маршрут на OP_VM
к 10.0.0.0/24
через Router
и хранить DC Router Gateway
как шлюз по умолчанию.
РЕДАКТИРОВАТЬ 2 OP_VM
отправил ответы на DC Router Gateway
потому что у него нет маршрута к 10.100.0.0/24, и он пытается достичь его через шлюз по умолчанию, а DC Router Gateway
они упали, потому что также нет маршрута.
Вы должны добавить статический маршрут в OP_VM
или в DC Router Gateway
к 10.100.0.0/24
решить это.