我只是在尝试使用 ipv6,并尝试通过 ipv6 使用 netcat。我尝试了以下方法,成功了。
$ # terminal one
$ nc -6 -l 7171
$ # terminal two
$ nc -vvv -6 ::1 7171
Connection to ::1 7171 port [tcp/*] succeeded!
我尝试运行 ifconfig 并得到以下输出:-
eth0 Link encap:Ethernet HWaddr 08:00:27:0c:5c:90
inet addr:192.168.5.177 Bcast:192.168.5.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe0c:5c90/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:363545 errors:0 dropped:0 overruns:0 frame:0
TX packets:389270 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:75700504 (75.7 MB) TX bytes:471219676 (471.2 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:15246 errors:0 dropped:0 overruns:0 frame:0
TX packets:15246 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1010273 (1.0 MB) TX bytes:1010273 (1.0 MB)
接下来我尝试通过 eth0 接口连接 nc 客户端。
$ # terminal one
$ nc -6 -l 7171
$ # terminal two
$ nc -vvv -6 fe80::a00:27ff:fe0c:5c90 7171
nc: connect to fe80::a00:27ff:fe0c:5c90 port 7171 (tcp) failed: Invalid argument
为什么会发生这种情况?我是不是做了一些明显错误的事情?
答案1
您尝试连接的地址是链路本地地址。使用此类地址时,您必须始终指定网络接口。常用符号是后缀%
和接口 ID。在您的示例中,它将变成:fe80::a00:27ff:fe0c:5c90%eth0
。
而且由于链路本地地址是链路本地的,因此无法路由。因此,通常更容易为您的接口提供“普通”IPv6 地址。如果您的 ISP 没有为您提供 IPv6 连接,那么您可以设置到 SixXS 或 Hurricane Electric 等的隧道,或者您可以使用私有地址。这些被称为ULA(唯一本地地址)在 IPv6 中,您可以在块中随机生成自己的 /48 前缀fd00::/8
。这可以防止在互连网络(VPN 隧道、公司合并等)时与其他 ULA 地址发生冲突
答案2
您必须附加区域索引链接本地地址(如果您要使用它们)。在 Linux 系统下,这是设备名称。这是因为链接本地地址fe80::/10
在每个设备上都有前缀。
假设您有两个接口(例如以太网和 wifi),那么类似的事情ping6 fe80::1
就会变得模棱两可 - 是fe80::1
在以太网上还是在 wifi 设备上?两者都完全有可能,但系统无法知道哪一个(而且它肯定不会尝试)。所以你必须说出来,比如ping6 fe80::1%enp2s0
或诸如此类。这就是为什么链接本地地址使用起来有些麻烦的原因。(它的 URL 编码特别尴尬。)除了它们对于邻居发现的重要性之外,如果 IP 地址配置出现问题,它们是最后的手段,但它们不适合常规使用 - 为此使用全局地址或唯一本地地址。
离题:如果您想使用 IPv6,最好先熟悉ip
iproute2 包中的实用程序,它取代并优于ifconfig
和route
。