我与我的朋友沟通有困难虚拟分路设备通过ipv6。本质上ping6 -I eth0 <tap interface link-local ipv6 address>
不返回任何东西。我什至无法 ping 通水龙头的面向主机的端点:
[user ~]$ ping6 -I eth0 fe80::88a2:f6ff:fe6f:90cb
PING fe80::88a2:f6ff:fe6f:90cb(fe80::88a2:f6ff:fe6f:90cb) from fe80::4f3:9ff:fec9:2032%eth0 eth0: 56 data bytes
^C
--- fe80::88a2:f6ff:fe6f:90cb ping statistics ---
8 packets transmitted, 0 received, 100% packet loss, time 7162ms
以及 eth0 的 tcpdump 输出:
20:54:00.658849 IP6 (flowlabel 0x1efcb, hlim 64, next-header ICMPv6 (58) payload length: 64) fe80::4f3:9ff:fec9:2032 > fe80::88a2:f6ff:fe6f:90cb: [icmp6 sum ok] ICMP6, echo request, seq 1
20:54:01.673920 IP6 (flowlabel 0x1efcb, hlim 64, next-header ICMPv6 (58) payload length: 64) fe80::4f3:9ff:fec9:2032 > fe80::88a2:f6ff:fe6f:90cb: [icmp6 sum ok] ICMP6, echo request, seq 2
20:54:02.698029 IP6 (flowlabel 0x1efcb, hlim 64, next-header ICMPv6 (58) payload length: 64) fe80::4f3:9ff:fec9:2032 > fe80::88a2:f6ff:fe6f:90cb: [icmp6 sum ok] ICMP6, echo request, seq 3
20:54:03.722004 IP6 (flowlabel 0x1efcb, hlim 64, next-header ICMPv6 (58) payload length: 64) fe80::4f3:9ff:fec9:2032 > fe80::88a2:f6ff:fe6f:90cb: [icmp6 sum ok] ICMP6, echo request, seq 4
20:54:04.745974 IP6 (flowlabel 0x1efcb, hlim 64, next-header ICMPv6 (58) payload length: 64) fe80::4f3:9ff:fec9:2032 > fe80::88a2:f6ff:fe6f:90cb: [icmp6 sum ok] ICMP6, echo request, seq 5
正如预期的那样,来自 Tap 设备接口的 tcpdump 错误为空。我能够从 eth0 本身 ping 通。我无法eth0
从 Tap 接口执行 ping 操作,出现错误connect: Network is unreachable
。然而,我认为这是一个单独的问题,因为 tcpdump 表明 ping 甚至没有到达 Tap 设备。
这是我的网络设置
[user ~]$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
inet 172.30.255.7 netmask 255.255.255.240 broadcast 172.30.255.15
inet6 2600:1f14:XXXX:XXXX:e134:ff0c:cccd:b262 prefixlen 128 scopeid 0x0<global>
inet6 fe80::4f3:9ff:fec9:2032 prefixlen 64 scopeid 0x20<link>
ether 06:f3:09:c9:20:32 txqueuelen 1000 (Ethernet)
[user ~]$ ifconfig tp-0ge-0000gf-0
tp-0ge-0000gf-0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 169.254.18.114 netmask 255.255.255.252 broadcast 0.0.0.0
inet6 fe80::88a2:f6ff:fe6f:90cb prefixlen 64 scopeid 0x20<link>
ether 8a:a2:f6:6f:90:cb txqueuelen 1000 (Ethernet)
以及目前的路线:
[user ~]$ ip -6 r s
2600:1f14:XXXX:XXXX:XXXX:ff0c:cccd:b262 dev eth0 proto kernel metric 256 expires 439sec pref medium
fe80::4f3:9ff:fec9:2032 dev eth0 metric 1024 pref medium
fe80::88a2:f6ff:fe6f:90cb dev tp-0ge-0000gf-0 metric 1024 pref medium
default via fe80::460:a1ff:fec3:9cb6 dev eth0 metric 1024 pref medium
ip6tables 过滤表让一切都通过
[user ~]$ sudo ip6tables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我已经net.ipv6.conf.[inteface].forwarding
启用了 Tap 和 eth0,显然 ipv6 已启用。如果想到任何其他重要的内核参数,我将在此处添加它们。
这是在亚马逊 Linux 2 上cat /etc/os-release
:
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
如果我还需要包含任何其他信息,请告诉我。任何建议都非常感谢。
答案1
作为介绍,您应该习惯从不使用ifconfig
,即使它几乎无法处理 IPv6。与使用 的方式相同ip -6 route show
,只需始终使用ip address show
(和ip link show
)。您将避免由于ifconfig
命令的限制(在 Linux 上)而导致的问题,该命令现已过时(因为使用了已弃用的内核 API)。
我可以看到您可能需要信息的三点。
- IPv6 链路本地地址还要求接口是完整地址
由于在连接到 IPv6 接口的每个网络中允许存在相同的链路本地地址,因此必须指定该地址的接口具有完整的链路层地址。它被指定在RFC 4007:
这些字符串的一个可能的候选者是接口名称,因为接口唯一地消除了任何范围的歧义。
对于您的系统,这些是完全指定的链接本地地址:
fe80::4f3:9ff:fec9:2032%eth0
fe80::88a2:f6ff:fe6f:90cb%tp-0ge-0000gf-0
- 本地地址属于主机
lo
因此,如果允许这样的路由,则通过它们之间的(环回)接口进行路由。不要尝试,它会强制数据包通过没有任何东西可以接收的地方ping -I eth0
发送。eth0
所以ping
有效的是:
ping fe80::88a2:f6ff:fe6f:90cb%tp-0ge-0000gf-0
并且是本地的,默认情况下系统会选择相同的源。可能不允许从连接到一个接口的一个本地链路本地地址到连接到另一个接口的另一个本地链路本地地址(但是从任何接口上的一个全局地址到任何(甚至其他)接口上的链路本地地址,或者对于一个同一界面上的第二个本地也可以)。所以这会失败:
ping -I fe80::4f3:9ff:fec9:2032%eth0 fe80::88a2:f6ff:fe6f:90cb%tp-0ge-0000gf-0
但这会起作用:
ping -I 2600:1f14:XXXX:XXXX:e134:ff0c:cccd:b262 fe80::88a2:f6ff:fe6f:90cb%tp-0ge-0000gf-0
请注意,这并不能说明您的 TAP 接口正在工作:您正在从本地系统本身 ping 通本地系统,而根本不使用 TAP 接口。
- TUN/TAP 接口的重要部分不是其上可见的本地地址
对于 TUN/TAP 接口来说重要的是运行过程连接在该接口后面,该接口应该接收帧或数据包并处理(或隧道)它们。在您的教程中,这是第 6 步运行的流程:
STEP#6 KVM qemu command to startup Guest using tap0 device
它使用此选项:-net tap,script=no,ifname=tap0,vlan=0
附加到tap0
之前设置的接口。这就是 TUN/TAP 接口的全部意义:将系统的网络链接到进程。
由于接口tp-0ge-0000gf-0
自动分配了一个链接本地地址,这意味着存在或曾经有这样一个正在运行的进程附加到tp-0ge-0000gf-0
。如果您正在使用ip link show tp-0ge-0000gf-0
或者ip address show tp-0ge-0000gf-0
您可以通过存在来确认这一点LOWER_UP
(此处翻译为附流程) 代替NO-CARRIER
(未附流程)。ifconfig
不会显示此类信息。例如,此类进程可以是openvpn
QEMU 或 QEMU。中继/隧道应用程序ssh
(具有 tun 或 tap 隧道模式)甚至该socat
工具都具有附加选项(但例如socat
仅用于中继:它不包括内置网络堆栈)。
如果它被配置为处理(或隧道)IPv6,那么它会在其(不可见)端分配一个链路本地地址,也可能分配一个全局地址。
您应该能够通过 ping 来发现远程链路本地 IPv6 地址链路本地所有节点地址目的地,仍然指定接口:
ping ff02::1%tp-0ge-0000gf-0
要发现那里的路由器(如果有),可以 ping 链路本地所有路由器地址:
ping ff02::2%tp-0ge-0000gf-0
答案2
这是一个 IPv6 本地链接地址,它只“存在”于链接内部tp-0ge-0000gf-0
并且不可路由,您无法从eth0
.
要 ping 它,您必须在末尾指定设备,如下所示:
$ ping6 fe80::88a2:f6ff:fe6f:90cb%tp-0ge-0000gf-0