代码之家  ›  专栏  ›  技术社区  ›  carasha

GCP问题,两个虚拟机不能通过使用外部ipv6相互ping

  •  0
  • carasha  · 技术社区  · 2 年前

    VM1

    IPv4:10.100.100.101(内部)

    IPv6:2001:b00:4030:67d0:0:0:0:0(外部)

    VM2

    IPv4:10.100.100.102(内部)

    IPv6:2001:b00:4030:67d0:0:1:0:0(外部)

    对于IPv4:

    • 10.100.100.101和10.100.100.102可以相互ping,工作正常。

    对于IPv6:

    • 从互联网上,可以ping 2001:b00:4030:67d0:0:0:0和2001:b00:403:67d0:0:1:0:0,效果很好。
    • 但是,2001:b00:4030:67d0:0:0:0和2001:b00:403:67d0:0:1:0:0不能相互ping。

    根据GCP文件:
    外部IPv6地址可以用于VPC网络中的VM到VM通信,也可以在互联网上路由。 要控制互联网的出口和入口,请配置防火墙规则或分级防火墙策略。要完全禁用IPv6到互联网的路由,请删除VPC网络中的IPv6默认路由。

    我的问题集中在 IPv6 :

    互联网主机可以ping到VM1和VM2,但为什么VM1和VM 2不能互相ping?这很奇怪。

    有人能帮忙吗?

    以下是我的设置和测试:

    VM1(tjtw8)

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc fq state UP group default qlen 1000
    link/ether 42:01:0a:64:64:65 brd ff:ff:ff:ff:ff:ff
    inet 10.100.100.101/32 brd 10.100.100.101 scope global noprefixroute dynamic eth0
       valid_lft 3450sec preferred_lft 3450sec
    inet6 2001:b000:4030:67d0::/128 scope global dynamic
       valid_lft 3431sec preferred_lft 3431sec
    inet6 fe80::11e6:ba8f:81a2:8165/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
    

    VM2(tjtw9)

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 42:01:0a:64:64:66 brd ff:ff:ff:ff:ff:ff
    inet 10.100.100.102/32 brd 10.100.100.102 scope global noprefixroute dynamic eth0
       valid_lft 2549sec preferred_lft 2549sec
    inet6 2001:b000:4030:67d0:0:1::/128 scope global noprefixroute dynamic
       valid_lft 3599sec preferred_lft 3599sec
    inet6 fe80::9fe5:71b4:5ee7:6283/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
    

    VM1 ping VM2

     [root@tjtw8 ~]# ping -6 2001:b000:4030:67d0:0:1:0:0
     PING 2001:b000:4030:67d0:0:1:0:0(2001:b000:4030:67d0:0:1::) 56 data bytes
     From 2001:b000:4030:67d0::: icmp_seq=1 Destination unreachable: Address unreachable
     From 2001:b000:4030:67d0::: icmp_seq=2 Destination unreachable: Address unreachable
     From 2001:b000:4030:67d0::: icmp_seq=3 Destination unreachable: Address unreachable
    

    VM2 ping VM1

     [root@tjtw9 ~]# ping -6 2001:b000:4030:67d0:0:0:0:0
     PING 2001:b000:4030:67d0:0:0:0:0(2001:b000:4030:67d0::) 56 data bytes
    

    很奇怪,它没有显示出来 信宿不可达 .

    Internet主机ping VM1

     [root@nat ~]# ping -6 2001:b000:4030:67d0:0:0:0:0
     PING 2001:b000:4030:67d0:0:0:0:0(2001:b000:4030:67d0::) 56 data bytes
     64 bytes from 2001:b000:4030:67d0::: icmp_seq=1 ttl=58 time=13.5 ms
     64 bytes from 2001:b000:4030:67d0::: icmp_seq=2 ttl=58 time=10.8 ms
     64 bytes from 2001:b000:4030:67d0::: icmp_seq=3 ttl=58 time=13.3 ms
    

    Internet主机ping VM2

     [root@nat ~]# ping -6 2001:b000:4030:67d0:0:1:0:0
     PING 2001:b000:4030:67d0:0:1:0:0(2001:b000:4030:67d0:0:1::) 56 data bytes
     64 bytes from 2001:b000:4030:67d0:0:1::: icmp_seq=1 ttl=57 time=11.6 ms
     64 bytes from 2001:b000:4030:67d0:0:1::: icmp_seq=2 ttl=57 time=13.6 ms
     64 bytes from 2001:b000:4030:67d0:0:1::: icmp_seq=3 ttl=57 time=11.5 ms
    

    我试过我能做的任何事情,但还是想不通。 有人能帮忙吗?

    0 回复  |  直到 2 年前
        1
  •  0
  •   carasha    2 年前

    测试后,我查看了路由表,发现:

    VM1(tjtw8)

     2001:b000:4030:67d0:: dev eth0 proto kernel metric 256 expires 3524sec pref medium
     2001:b000:4030:67d0::/64 dev eth0 proto kernel metric 100 pref medium
     unreachable 3ffe:ffff::/32 dev lo metric 1024 pref medium
     fe80::4001:aff:fe64:6401 dev eth0 proto static metric 100 pref medium
     fe80::/64 dev eth0 proto kernel metric 100 pref medium
     default via fe80::4001:aff:fe64:6401 dev eth0 proto static metric 100 pref medium
    

    VM2(tjtw9)

     2001:b000:4030:67d0:0:1:: dev eth0 proto kernel metric 100 pref medium
     2001:b000:4030:67d0::/65 via fe80::4001:aff:fe64:6401 dev eth0 proto ra metric 100 pref medium
     unreachable 3ffe:ffff::/32 dev lo metric 1024 pref medium
     fe80::/64 dev eth0 proto kernel metric 100 pref medium
     default via fe80::4001:aff:fe64:6401 dev eth0 proto ra metric 100 pref medium
    

    这两个虚拟机的路由表有点不同(我并没有修改路由表)。

    GCP给我的ipv6地址范围是: /64 .

    但是为什么路由表在 VM1是/64 和在 VM2是/65 ??

    我认为所有VM的路由表都应该是 /64 (不是/65)。

    好的,让我试试这个:

    我创建了第三个虚拟机(名为:tjtw10)。

    VM3(tjtw10)

     2001:b000:4030:67d0:0:2:: dev eth0 proto kernel metric 100 pref medium
     2001:b000:4030:67d0::/65 via fe80::4001:aff:fe64:6401 dev eth0 proto ra metric 100 pref medium
     unreachable 3ffe:ffff::/32 dev lo metric 1024 error -113 pref medium
     fe80::/64 dev eth0 proto kernel metric 100 pref medium
     default via fe80::4001:aff:fe64:6401 dev eth0 proto ra metric 100 pref medium
    

    看见

    VM2和VM3,它们的路由表是相同的,VM3也是 /65 .

    但第一个创建的VM1,它的路由表与VM2和VM3不同,有点奇怪。

    因此,最终结果是:

    • VM1和VM2不能相互ping。
    • VM1和VM3不能相互ping。
    • VM2和VM3可以相互ping。

    回到我的问题(IPv6问题):

    这是路由表的问题,尽管我不知道为什么GCP在我第一次创建的VM1(tjtw8)中制作了不同的路由表。

    解决方案

    当你重新启动虚拟机时,GCP会自动在你的虚拟机中生成它们的路由表。

    为了避免这种情况,可以通过添加路由命令来修改路由表( ip-6路由添加 ip-6路由del 进入 /etc/rc.local (rc.local必须是可执行的),因此它将使路由永久正确。

    因此,我需要更改VM1的路由以匹配VM2和VM3,因此我在VM1的/etc/rc.local中添加3 route命令:

     ip -6 route add 2001:b000:4030:67d0::/65 via fe80::4001:aff:fe64:6401 dev eth0
     ip -6 route del 2001:b000:4030:67d0::/64 dev eth0
     ip -6 route del fe80::4001:aff:fe64:6401 dev eth0
    

    所以当VM1重新启动时,VM1的路由将是正确的,这解决了我的问题。

    终止