我正在使用 CentOS 8 直播。我的 IP 是 2001:570:1:b86::12,我运行了这个:-
ip -6 route add local 2001:570:1:b86::/64 dev lo
并构建并运行其中之一这些,我现在可以(本地)连接到我的服务器上的任何 18,446,744,073,709,551,615 IP 地址,并且一切正常。我还可以从远程计算机连接到现有的 2001:570:1:b86::12,并且它在互联网上也可以正常工作。
但是,我无法从远程连接到我的任何其他 IP...
$ ping6 -c 1 2001:570:1:b86:1234:2345:3456:6789
PING6(56=40+8+8 bytes) 2001:8000:1ced:6d00:f507:cb71:703f:afe1 --> 2001:570:1:b86:1234:2345:3456:6789
--- 2001:570:1:b86:1234:2345:3456:6789 ping6 statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
看看这个,我的盒子似乎没有回复 ARP ?
# tcpdump -i eno1 -n -nn -vvv -XX proto 58
dropped privs to tcpdump
tcpdump: listening on eno1, link-type EN10MB (Ethernet), capture size 262144 bytes
00:11:47.354817 IP6 (class 0xc0, hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::629c:9fff:fe86:c00 > ff02::1:ff56:6789: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2001:570:1:b86:1234:2345:3456:6789
source link-address option (1), length 8 (1): 60:9c:9f:86:0c:00
0x0000: 609c 9f86 0c00
0x0000: 3333 ff56 6789 609c 9f86 0c00 86dd 6c00 33.Vg.`.......l.
0x0010: 0000 0020 3aff fe80 0000 0000 0000 629c ....:.........b.
0x0020: 9fff fe86 0c00 ff02 0000 0000 0000 0000 ................
0x0030: 0001 ff56 6789 8700 f8a7 0000 0000 2001 ...Vg...........
0x0040: 0570 0001 0b86 1234 2345 3456 6789 0101 .p.....4#E4Vg...
0x0050: 609c 9f86 0c00 `.....
00:11:48.389831 IP6 (class 0xc0, hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::629c:9fff:fe86:c00 > ff02::1:ff56:6789: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2001:570:1:b86:1234:2345:3456:6789
source link-address option (1), length 8 (1): 60:9c:9f:86:0c:00
0x0000: 609c 9f86 0c00
0x0000: 3333 ff56 6789 609c 9f86 0c00 86dd 6c00 33.Vg.`.......l.
0x0010: 0000 0020 3aff fe80 0000 0000 0000 629c ....:.........b.
0x0020: 9fff fe86 0c00 ff02 0000 0000 0000 0000 ................
0x0030: 0001 ff56 6789 8700 f8a7 0000 0000 2001 ...Vg...........
0x0040: 0570 0001 0b86 1234 2345 3456 6789 0101 .p.....4#E4Vg...
0x0050: 609c 9f86 0c00 `.....
00:11:49.386308 IP6 (class 0xc0, hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::629c:9fff:fe86:c00 > ff02::1:ff56:6789: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2001:570:1:b86:1234:2345:3456:6789
source link-address option (1), length 8 (1): 60:9c:9f:86:0c:00
0x0000: 609c 9f86 0c00
0x0000: 3333 ff56 6789 609c 9f86 0c00 86dd 6c00 33.Vg.`.......l.
0x0010: 0000 0020 3aff fe80 0000 0000 0000 629c ....:.........b.
0x0020: 9fff fe86 0c00 ff02 0000 0000 0000 0000 ................
0x0030: 0001 ff56 6789 8700 f8a7 0000 0000 2001 ...Vg...........
0x0040: 0570 0001 0b86 1234 2345 3456 6789 0101 .p.....4#E4Vg...
0x0050: 609c 9f86 0c00 `.....
我如何告诉内核指示路由器我的盒子是接受这些数据包的盒子?
如果这与 tproxy 有关,我确实有这个(但不知道如何在我的防火墙中使这些 ARP 正常工作)
# lsmod | grep tproxy
nf_tproxy_ipv6 16384 0
建议?
答案1
OP的方法是自 Linux 2.6.37 起可能,但需要额外的设置。
ARP 的 IPv6 等效项是新民主党(它使用 ICMPv6 多播/单播,而不是 ARP 的广播/单播专用 L2 协议)。
proxy_ndp
这里的行为与代理 ARP 不完全一样(它仍然需要每个 IP 设置,我们在这里不需要)并且没有帮助。相反,一个名为的专用守护进程ndppd
监听 NDP 请求(通常)代表其他系统回答可以管理这种情况。必须将其设置为在应答之前不尝试查询后端系统,因为没有这样的其他系统。
这里假设:
- 主界面被调用
eth0
- 系统在这个 /64 中是单独的(除了可能其路由器的可选全局地址)。
- 系统不应设置为路由器。请参阅小警告。
启用 EPEL(程序包epel-release
)、安装ndppd
并使用与以下内容类似的配置/etc/ndppd.conf
:
proxy eth0 {
router no
rule 2001:570:1:b86::/64 {
static
}
}
static
使守护进程立即回答,而不查询任何后端系统,这是在这种情况下必须做的,因为所有地址都属于(或者更准确地说,所有查询都应该到达)主机。
注意事项:
ndppd
由于网络掩码太大,启动时会生成警告。当系统的路由器未明确设置为通过 2001:570:1:b86::12 或(更好)通过系统
eth0
接口上的链路本地地址路由此 /64 块时,这一点很重要。如果在没有正确设置路由器的情况下对块进行远程网络扫描,则该路由器将为该 /64 扫描中看到的每个新地址分配一个 NDP 条目。小型(家用)路由器的设计不够稳健,不能足够快地清除旧条目,可能无法很好地应对这种情况,并会出现内存不足/CPU 使用率过高的情况(即:拒绝服务)。
由于实际主机的 IPv6 地址位于 /64 之中,因此查询该地址将引出两个 NDP 答案:一个由内核回答,另一个由
ndppd
.如果系统实际上是路由器,这可能会导致间歇性路由问题。在这种情况下,router yes
可以考虑一下。ndppd
的配置似乎没有子网覆盖包括该子网的更大网络,就像路由表中那样。