在debian上的网络接口上添加整个IPv6 / 64块


15

我尝试使用以下命令将整个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,以便可以从我的机器上的Internet访问此块包含的每个IP。

我希望有人可以指出正确的方法。提前致谢。

ISP提供的指南确实要求我将每个IPv6明确添加到接口。我希望它是隐含的。

具有明确IP地址绑定的工作配置

/ etc / network / 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::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(我的本地家用PC)的输出:

  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和tracerouting时):

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

因此它仍然只在本地(服务器)工作,而不是从远程(我的电脑)工作。


那么,您是否尝试过从远程计算机执行traceroute?跟踪在哪里失败?
Zoredache 2014年

如果所有主机都在同一网络中,则您不应有任何路由。
Spack

您的第二个ip route命令在IPv6地址中有错字。
迈克尔·汉普顿

@Spack我希望eth0监听整个ipv6 / 64前缀(传入流量),@ michael-hampton已修复,仅在键入此问题时,@ Zoredache在ISP网关失败,2001:41d0:2:adff:ff:ff:ff:ff之后它将超时。
Hikaru-Shindo 2014年

根据我过去所做的研究,这是不可能的。它在本地工作的原因是因为您的路由表知道将数据包路由到何处。如果您将此前缀添加为边缘路由器中的静态路由,则将看到LAN客户端能够连接。
内森·C

Answers:


13

过去我需要类似的东西。我发现要完成此工作需要三个步骤:

  • 您需要将前缀路由到主机
  • 您需要主机上的本地路由
  • 应用程序需要在套接字上设置IP_FREEBINDor IP_TRANSPARENT选项

将前缀路由到主机的正确方法是联系您的提供商(如果他们尚未为您提供)。他们可能有一个DHCPv6服务器,如果您只是向其发送正确的DHCPv6请求,则该服务器可以将前缀委派给您。

如果出于某种原因使您无法获得真实的路由前缀,但是您可以从一个网络接口上可用的链接前缀访问所需数量的地址,则可以通过以下方式将部分地址转换为路由前缀:让守护程序响应该范围内每个IPv6地址的邻居发现请求。

建议不要使用这种守护程序,除非万不得已,因为它会不必要地消耗所有邻居的内存。有一种这样的守护程序实现,看起来令人讨厌的是ndppd。(我没有特定的经验,因为只有在我自己写的链接前缀经过硬编码后才了解它。)

看来您已经使本地路线生效。如您所见,必须将其分配给lo接口才能正常工作。

最后,使用此范围内地址的应用程序需要一个IP选项才能绑定到地址,这些地址未明确分配给主机上的特定网络接口。这是一个可以使用的代码片段:

const int one = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &one, sizeof(one));

我有一个由ISP路由到我的服务器的静态前缀(它们不提供DHCP。IPv4和IPv6都不提供)。我希望这个/ 64块中的所有IPv6都可以从外部访问(我的大多数应用程序都绑定到::,如果我没有记错的话,应该是所有可用的地址)。现在,我希望所有这些IP在eth0上都可用,因此,如果我尝试连接到该块中的任何IPv6,则侦听指定端口的任何应用程序都将能够应答(例如,每个IP应该正确响应ping)。
Hikaru-Shindo 2014年

如果绑定到::,则不需要IP_TRANSPARENT选项。有了路由到我的服务器的前缀和本地路由,我可以绑定到::并接收到该范围内任意IPv6地址的连接。ping6也可以。我正在Ubuntu 12.04上对此进行测试,但是我希望它也可以在其他发行版的任何最新内核上运行。如果它对您不起作用,建议您使用tcpdump -pni eth0 'host 2001:41d0:2:ad65::fe'
kasperd

它仍然无法正常工作。我在问题中提供了有关配置的更多信息,也许有帮助。
Hikaru-Shindo

您说您有一个/ 64路由到服务器。但是托管服务提供商指南中的示例仅具有链接前缀,而没有路由前缀。而且tcpdump和traceroute6输出看起来好像地址没有路由到服务器。您是否已使用提供商提供的文档设法使一个IPv6地址正常工作?
kasperd 2014年

1
@Arya当我需要这样的东西时,我将命令放入/etc/rc.local
kasperd

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,现在您可以绑定到(添加块的)任何地址,并在添加地址时使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.