我已经为本地和 GCP 之间的 VPN 设置苦恼了一个多星期。我现在完全没有主意了,很想得到网络专家的帮助。
目标
最终目标很简单:让 GCP 上的 VM 实例无缝地与本地 VM 通信 - 但使用 2 个路由器。
设置如下:
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 ,并且我们的被放在同一个 LAN 上。我们在数据中心只有一个机架,需要到达由其他方托管的机架(在其他机架中)。我们的机架与相关联。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
,我可以成功 ping 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
,我可以确认我可以 ping 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
但是,从ping 到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
无法再 ping OP_VM
。这至少在我看来 VPN 已建立并且 IP 已正确公布。但从实际网络角度来看,这似乎不对。
问题
我认为在 GCP 方面没有什么可做的,问题似乎纯粹出在本地。
是否存在任何设置问题或可能导致 VPN、BGP、ARP 等行为不当的问题?什么原因导致路由似乎已共享但实际上无法访问它们的情况?
其他说明
- 我已经确认 ARP 表
Router
包括10.100.0.200
- 我可以看到在 GCP 中传播的路线
- 我已经测试了 GCP VPC 的防火墙设置,以允许
169.254.0.0/30
并10.100.0.0/24
- 我最终将需要从 GKE 进行访问,但我已经确认 GKE 的行为与
GCP_VM
Router
来自雅马哈- 尝试了 TCPdump(在 Yamaha 路由器中),但在日志中
packetdump
没有看到10.0.0.25
10.0.0.25
TCPdump 确实显示了我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
更新(12 月 24 日)
我已经在和tcpdump
之间完成了简单的 ping 操作。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
。
此外,ping 至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
...
更新(12 月 27 日)
Router
将源地址设置为 后,从 执行 Ping操作成功,因为它默认10.100.0.50
尝试使用。169.254.0.2
ping 仍然无法达到OP_VM
,并且我仍然面临 NAT 配置问题以确保转换正确进行。
更新(12 月 31 日)
连接终于建立好了。我将在单独的答案中总结所采取的步骤,以理清这个问题。
答案1
这看起来像是本地路由问题。我认为,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
via设置静态路由Router
并将其保留DC Router Gateway
为默认网关。
您必须ip route 10.100.0.0/24 gateway 10.100.0.50
从Router
网络中删除路由 -该路由10.100.0.0/24
直接与他相连。
编辑
从 GCP_VM,我可以成功 ping 10.100.0.50(路由器)。
目前看来您已经正确配置了Router
和之间的对等连接HA_VPN
。
您应该能够 pingGCP_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
并且具有 IP10.100.0.50
但是,从 GCP_VM 到 10.100.0.200 (OP_VM) 的 ping 通却失败。
这是预料之中的,因为没有到 的路由,正如我上面提到的,OP_VM
并且无法回复,您必须在 处设置静态路由到via并将其保留为默认网关。 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
来解决此问题。
答案2
经过大量测试和调试,我解决了 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
)
根据上述检查点,目前情况如下:
- 未对此进行测试,因为 Cloud VPN 端点(
169.254.0.1/30
)不是 VPC 中路由的一部分 - 我可以确认
ping
命中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也得到了确认) - 如上所述,#6 也证实了这一流量
- 没有符合此案例的流量
- 如上所述,#2 也确认了此流量
下面是描述情况的图表
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 个问题:
- 可能性 A. 数据包未到达
OP_VM
(10.100.0.200
) - 可能性 B. 数据包到达
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
可能性 A不太可能。路由本身运行正常。
这意味着很有可能会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
到,以便 可以正确地将流量路由回。收到响应后,NAT 再次生效,然后替换为,并将数据包发送回。10.100.0.50
Router (AS65002)
OP_VM
Router (AS65002)
Router (AS65002)
10.100.0.50
10.0.0.25
GCP_VM