本地和 GCP 之间的 VPN:共享路由,但 ping 不通

本地和 GCP 之间的 VPN:共享路由,但 ping 不通

我已经为本地和 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.200RouterOP_VM10.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/3010.100.0.0/24
  • 我最终将需要从 GKE 进行访问,但我已经确认 GKE 的行为与GCP_VM
  • Router来自雅马哈
  • 尝试了 TCPdump(在 Yamaha 路由器中),但在日志中packetdump没有看到10.0.0.25
  • 10.0.0.25TCPdump 确实显示了我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_VMRouter

GCP_VMRouter(日志来自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

RouterGCP_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/24via设置静态路由Router并将其保留DC Router Gateway为默认网关。

您必须ip route 10.100.0.0/24 gateway 10.100.0.50Router网络中删除路由 -该路由10.100.0.0/24直接与他相连。

编辑

从 GCP_VM,我可以成功 ping 10.100.0.50(路由器)。

目前看来您已经正确配置了Router和之间的对等连接HA_VPN

您应该能够 pingGCP_VMOP_VMRouter,并且也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 Gateway10.0.0.0/24OP_VM10.0.0.0/24RouterDC 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 到本地的数据包

  1. 数据包从GCP_VM( 10.0.0.25) 发送至HA_VPN( 169.254.0.1/30)
  2. 数据包从GCP_VM( 10.0.0.25) 发送至Router (AS65002)( 10.100.0.50)
  3. 数据包从GCP_VM( 10.0.0.25) 发送至DC Router Gateway( 10.100.0.80)
  4. 数据包从GCP_VM( 10.0.0.25) 发送至OP_VM( 10.100.0.200)
  5. 数据包从Router (AS65002)( 10.100.0.50) 发送至OP_VM( 10.100.0.200)

从本地到 GCP 的数据包(返回路由)

  1. 数据包从OP_VM( 10.100.0.200) 发送至Router (AS65002)( 10.100.0.50)
  2. 数据包从OP_VM( 10.100.0.200) 发送至GCP_VM( 10.0.0.25)
  3. 数据包从Router (AS65002)( 10.100.0.50) 发送至GCP_VM( 10.0.0.25)

根据上述检查点,目前情况如下:

  1. 未对此进行测试,因为 Cloud VPN 端点(169.254.0.1/30)不是 VPC 中路由的一部分
  2. 我可以确认ping命中Router (AS65002)10.100.0.50),并且返回响应(这意味着相应的#9也得到了确认)
  3. 我可以不是确认ping命中DC Router Gateway10.100.0.80),因为 ping 没有收到响应
  4. 我可以不是确认ping命中OP_VM10.100.0.200),因为 ping 没有收到响应
  5. 我可以确认ping命中OP_VM10.100.0.200),并且返回响应(这意味着相应的#7也得到了确认)
  6. 如上所述,#6 也证实了这一流量
  7. 没有符合此案例的流量
  8. 如上所述,#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_VM10.100.0.200
  • 可能性 B. 数据包到达OP_VM( 10.100.0.200),但响应未返回Router (AS65002)( 10.100.0.50)

我可以通过上面的 #5 和 #6 确认,数据包在( )处启动时确实到达了OP_VM( )。这意味着,10.100.0.200Router (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.50Router (AS65002)OP_VMRouter (AS65002)Router (AS65002)10.100.0.5010.0.0.25GCP_VM

相关内容