我尝试使用以下方式将整个 IPv6 (/64) 块添加到接口
ip route add local 2001:41d0:2:ad64::/64 dev lo
就像描述的一样这里在我的 Debian 服务器上,但我似乎缺少了一些东西。
例如,如果我2001:41d0:2:ad64::fe
在本地 ping 一下,一切正常,但如果我从远程机器上尝试,则不起作用。然后我尝试在 eth0 上添加路由:
ip route add local 2001::41d0:2:ad64::/64 dev eth0
现在我甚至无法在本地 ping 任何示例地址!
我有点迷茫,因为我似乎错过了一些东西,但我在这里找不到答案。
简而言之:我想要2001:41d0:2:ad64::/64
绑定到 eth0,以便这个块包含的每个 IP 都可以通过我的机器从互联网访问。
我希望有人能给我指明正确的方向。提前致谢。
这指导ISP 提供的服务确实要求我明确地将每个 IPv6 添加到接口。我希望它是隐式的。
具有显式 IP 地址绑定的工作配置
在 /etc/网络/接口:
auto eth0
iface eth0 inet static
address my.ip.v4
netmask 255.255.255.0
network my.network.address.ip
broadcast my.broadcast.address.ip
gateway my.gateway.ip
iface eth0 inet6 static
address 2001:41d0:2:ad64::fe
netmask 64
gateway 2001:41d0:2:adff:ff:ff:ff:ff
up ip addr add 2001:41d0:2:ad64::1/64 dev eth0
down ip addr del 2001:41d0:2:ad64::1/64 dev eth0
up ip addr add 2001:41d0:2:ad64::2/64 dev eth0
down ip addr del 2001:41d0:2:ad64::2/64 dev eth0
up ip addr add 2001:41d0:2:ad64::3/64 dev eth0
down ip addr del 2001:41d0:2:ad64::3/64 dev eth0
up ip addr add 2001:41d0:2:ad64::4/64 dev eth0
down ip addr del 2001:41d0:2:ad64::4/64 dev eth0
up ip addr add 2001:41d0:2:ad64::5/64 dev eth0
down ip addr del 2001:41d0:2:ad64::5/64 dev eth0
up ip addr add 2001:41d0:2:ad64::6/64 dev eth0
down ip addr del 2001:41d0:2:ad64::6/64 dev eth0
up ip addr add 2001:41d0:2:ad64::7/64 dev eth0
down ip addr del 2001:41d0:2:ad64::7/64 dev eth0
up ip addr add 2001:41d0:2:ad64::8/64 dev eth0
down ip addr del 2001:41d0:2:ad64::8/64 dev eth0
up ip addr add 2001:41d0:2:ad64::9/64 dev eth0
down ip addr del 2001:41d0:2:ad64::9/64 dev eth0
up ip addr add 2001:41d0:2:ad64::a/64 dev eth0
down ip addr del 2001:41d0:2:ad64::a/64 dev eth0
解决方案尝试#1
我尝试按照@kasperd 的建议重新启用本地路线。
/etc/network/interfaces 的内容
auto lo
iface lo inet loopback
post-up ip route add local 2001:41d0:2:ad64::/64 dev lo
pre-down ip route del local 2001:41d0:2:ad64::/64 dev lo
auto eth0
iface eth0 inet static
# <snip of ipv4 config>
iface eth0 inet6 static
address 2001:41d0:2:ad64::fe
netmask 64
gateway 2001:41d0:2:adff:ff:ff:ff:ff
本地路由表:
# ip -6 route show table local
local ::1 dev lo proto none metric 0
local 2001:41d0:2:ad64::fe dev lo proto none metric 0
local 2001:41d0:2:ad64::/64 dev lo metric 1024
local fe80::225:90ff:fe06:6bbe dev lo proto none metric 0
ff00::/8 dev eth0 metric 256
traceroute
(我本地家用电脑)的输出:
1 <1 ms <1 ms <1 ms fritz.box [xxx]
2 20 ms 21 ms 24 ms 2002:c058:6301::1
3 21 ms 22 ms 24 ms 10gigabitethernet6.switch2.fra1.he.net [2001:470
:0:150::1]
4 44 ms 31 ms 40 ms 100ge3-1.core1.ams1.he.net [2001:470:0:2d4::1]
5 * * * Zeitüberschreitung der Anforderung.
6 * * 35 ms ams-5-6k.nl.eu [2001:41d0::8d1]
7 37 ms 39 ms 36 ms rbx-g2-a9.fr.eu [2001:41d0::ab1]
8 37 ms 70 ms 36 ms chi-3-4m.il.us [2001:41d0::176]
9 Zielhost nicht erreichbar.
Ablaufverfolgung beendet.
traceroute6
在服务器上:
traceroute to 2001:41d0:2:ad64::23 (2001:41d0:2:ad64::23), 30 hops max, 80 byte packets
1 2001:41d0:2:ad64::a (2001:41d0:2:ad64::a) 0.028 ms 0.009 ms 0.008 ms
ping6
在服务器上:
PING 2001:41d0:2:ad64::23(2001:41d0:2:ad64::23) 56 data bytes
64 bytes from 2001:41d0:2:ad64::23: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from 2001:41d0:2:ad64::23: icmp_seq=2 ttl=64 time=0.057 ms
^C
--- 2001:41d0:2:ad64:23 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.029/0.043/0.057/0.014 ms
tcpdump
输出(在远程服务器上 ping 和跟踪路由时):
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
tracert
到网关:
Routenverfolgung zu vss-3-6k.fr.eu [2001:41d0:2:adff:ff:ff:ff:ff] über maximal 3
0 Abschnitte:
1 <1 ms <1 ms <1 ms fritz.box [2002:5476:1b4c:0:c225:6ff:fe40:b2b0]
2 23 ms 22 ms 26 ms 2002:c058:6301::1
3 24 ms 40 ms 23 ms 10gigabitethernet6.switch2.fra1.he.net [2001:470
:0:150::1]
4 28 ms 37 ms 39 ms 100ge3-1.core1.ams1.he.net [2001:470:0:2d4::1]
5 * * * Zeitüberschreitung der Anforderung.
6 38 ms 33 ms * ams-5-6k.nl.eu [2001:41d0::8d1]
7 36 ms 39 ms 38 ms rbx-g2-a9.fr.eu [2001:41d0::ab1]
8 36 ms 35 ms 35 ms vss-3-6k.fr.eu [2001:41d0:2:adff:ff:ff:ff:ff]
Ablaufverfolgung beendet.
ping
到网关:
Ping wird ausgeführt für 2001:41d0:2:adff:ff:ff:ff:ff mit 32 Bytes Daten:
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=36ms
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=34ms
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=38ms
Antwort von 2001:41d0:2:adff:ff:ff:ff:ff: Zeit=57ms
Ping-Statistik für 2001:41d0:2:adff:ff:ff:ff:ff:
Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
(0% Verlust),
Ca. Zeitangaben in Millisek.:
Minimum = 34ms, Maximum = 57ms, Mittelwert = 41ms
因此它仍然只是在本地(服务器)工作,而不是在远程(我的电脑)工作。
答案1
我以前也需要类似的东西。我发现要实现这一点需要三个步骤:
- 您需要将前缀路由到主机
- 您需要主机上的本地路由
- 应用程序需要在套接字上设置
IP_FREEBIND
或选项IP_TRANSPARENT
要获得路由到主机的前缀,正确的方法是联系您的提供商(如果他们尚未提供)。他们可能有 DHCPv6 服务器,如果您向其发送正确的 DHCPv6 请求,该服务器可以为您委派前缀。
如果由于某种原因您无法获得真正的路由前缀,但您可以从某个网络接口上可用的链接前缀中使用任意数量的地址,则可以通过让守护进程响应该范围内每个 IPv6 地址的邻居发现请求,将其中一部分转换为路由前缀。
除非万不得已,否则不建议使用这样的守护进程,因为它会不必要地消耗所有邻居的内存。这种守护进程有几个实现,其中一个看起来很有希望的是ndppd。(我没有这方面的具体经验,因为我只是在用硬编码的链接前缀编写了自己的代码之后才知道这一点。)
看起来您已经让本地路由正常工作了。正如您所注意到的,它必须分配给接口lo
才能正常工作。
最后,使用此范围内的地址的应用程序需要一个 IP 选项,以便能够绑定到未明确分配给主机上特定网络接口的地址。以下是可以使用的代码片段:
const int one = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one));
答案2
现在是 2019 年了。一个词:ip_nonlocal_bind(据我所知,从 4.3 内核开始)。
使用 ndppd + sysctl net.ipv6.ip_nonlocal_bind = 1,最后一个允许您绑定到任何 IPv6 地址(在这种情况下不需要 IP_FREEBIND)。
我猜你这样做了:
ip add add local 2001::41d0:2:ad64::/64 dev lo
ip route add local 2001::41d0:2:ad64::/64 dev eth0
sysctl net.ipv6.ip_nonlocal_bind = 1
ndppd.conf 将如下所示:
route-ttl 30000
proxy eth0 {
router no
timeout 500
ttl 30000
rule 2001::41d0:2:ad64::/64{
static
}
}
运行 ndppd,现在您可以绑定到任何地址(添加的块)并使用它,就像它自己添加的一样。
答案3
lo
您需要将子网添加到环回接口,然后在和之间添加路由eth0
,并为 ipv6 启用非本地绑定。只需修改您的网络配置(/etc/networking/interfaces
如下所示)并重新启动网络守护程序:
auto eth0
iface eth0 inet static
address my.ip.v4
netmask 255.255.255.0
network my.network.address.ip
broadcast my.broadcast.address.ip
gateway my.gateway.ip
iface eth0 inet6 static
address 2001:41d0:2:ad64::fe
netmask 64
gateway 2001:41d0:2:adff:ff:ff:ff:ff
up ip addr add 2001:41d0:2:ad64::/64 dev lo
up ip route add local 2001:41d0:2:ad64::/64 dev eth0
up sysctl net.ipv6.ip_nonlocal_bind=1
down ip -6 addr del 2001:41d0:2:ad64::/64 dev lo
down ip route del local 2001:41d0:2:ad64::/64 dev eth0
down sysctl net.ipv6.ip_nonlocal_bind=0
我使用这种方法在我的 Ubuntu 机器上设置 ipv6 隧道,效果很好。整个 IP 范围都可以从远程机器 ping 通。