确定 IP 地址

确定 IP 地址

我有两台设备,一台笔记本电脑和一台树莓派。我不想在树莓派上使用 wifi,我的路由器只提供 ipv6 地址。因此,我拥有的物理连接如下:

Router <---(wifi ipv6)---> Laptop <---(ethernet)---> Raspberry pi

通常对于 ipv4 我只需执行以下操作:

# First machine:
sudo ip addr add 192.168.12.01 dev eth0
sysctl -w net.ipv4.conf.all.forwarding=1

#Second machine:
sudo ip addr add 192.168.12.02 dev eth0
sudo ip route add default via 192.168.12.01 dev eth0

然后我可以 ping google 例如:

ping 8.8.8.8

然而,这在 IPv6 上不起作用。为什么?正确的解决方案是什么?

答案1

在这个答案中,我将第一个路由器称为“主路由器”,笔记本电脑将是“中间路由器”,而树莓派将是客户端。此外,我将使用以下名称来命名接口:

Main router <---(wifi)--->[interface wlo1] Middle router [interface eno2]<---(ethernet)--->[interface eth0] Client

因此,显然我上面尝试的方法不起作用,因为在 ipv6 中,具有子网内 IP 的机器需要与连接到主路由器的机器位于同一链路上。因此,如果我相信本网站(抱歉,这是法语),级联两个 IPv6 路由器只有 4 种方法:

  • 如果主路由器支持,我们就使用 DHCPv6-PD,但很少有路由器支持
  • 或者主路由器可以添加静态路由到第二个路由器。同样,很少有路由器支持它。
  • 我们在中间路由器上设置一个 NDP 代理(效果很好)
  • 我们在中间路由器上设置一个 NAT IPv6(真的不推荐)

因此,在这个答案中,我将使用基于 NDP 代理的第 3 个选项。所有功劳都归功于此(再次是法语)网站

确定 IP 地址

在中间路由器和主路由器上使用ip -6 a,你可以看到你拥有哪个 ipv6(取全局的,不是以 开头的链接fe80。下面我们假设:

  • 2a04:1234:5678:abcd::ae是主路由器的ip
  • 2a04:1234:5678:abcd:24ff:7532:8b2c:aeba/64是主路由器的ip

因为您有一个/64,这意味着如果您想要一个子网,您不能更改前 64 位(即任何子网都需要以 开头2a04:1234:5678:abcd)。因此,让我们为客户端选择一个子网,例如:

  • 2a04:1234:5678:abcd:0001::/80将是客户端的地址/网络,并且可以是任意子网。

无用的部分

所以首先,我认为没有必要,但我决定禁用中间路由器以太网接口上的网络管理器,这需要一些命令。也许先尝试不使用该部分,如果失败,再返回这里。

[me@middleRouter:~]$ nmcli dev set eno2 managed no
## Check
[me@middleRouter:~]$ nmcli dev status

然后,检查你的 IP 是什么:

[me@middleRouter:~]$ ip -6 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
3: wlo1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 2a04:1234:5678:abcd:e0a1:98fd:80d1:4b1f/64 scope global temporary dynamic 
       valid_lft 3053sec preferred_lft 3053sec
    inet6 2a04:1234:5678:abcd:24ff:7532:8b2c:aeba/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 3053sec preferred_lft 3053sec
    inet6 fe80::5555:6666:7777:b9e6/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

[me@middleRouter:~]$ ip -6 route
::1 dev lo proto kernel metric 256 pref medium
2a04:1234:5678:abcd::/64 dev wlo1 proto ra metric 600 pref medium
2a04:1234:5678:abcd::/64 dev wlo1 metric 1024 pref medium
fe80::/64 dev wlo1 proto kernel metric 600 pref medium
default via fe80::1111:2222:3333:5add dev wlo1 proto ra metric 600 pref high

如您所见,我的接口eno2没有本地链接 ipv6,因此我将手动添加一个,但如果您有链接 ipv6,则可以跳过该部分(显然,只要以 开头,您就可以为本地链接输入任何值fe80,但让我们使用从 MAC 地址派生的值):

[me@middleRouter:~]$ ipv6calc --in prefix+mac fe80:: c0:3e:ba:68:01:09
No action type specified, try autodetection...found type: prefixmac2ipv6
fe80::c23e:baff:fe68:0109
[me@middleRouter:~]$ sudo ip addr add fe80::c23e:baff:fe68:0109 dev eno2

现在,你可以看到我们在两个接口上都有一个链接 IP:

[me@middleRouter:~]$ ip -6 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno2: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 fe80::c23e:baff:fe68:0109/128 scope link 
       valid_lft forever preferred_lft forever
3: wlo1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 2a04:1234:5678:abcd:e0a1:98fd:80d1:4b1f/64 scope global temporary dynamic 
       valid_lft 3581sec preferred_lft 3581sec
    inet6 2a04:1234:5678:abcd:24ff:7532:8b2c:aeba/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 3581sec preferred_lft 3581sec
    inet6 fe80::5555:6666:7777:b9e6/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

启用转发和代理 NDP

在中间路由器上,运行:

[me@middleRouter:~]$ sudo sysctl -w net.ipv6.conf.eno2.forwarding=1
net.ipv6.conf.eno2.forwarding = 1

[me@middleRouter:~]$ sudo sysctl -w net.ipv6.conf.wlo1.forwarding=1
net.ipv6.conf.wlo1.forwarding = 1

[me@middleRouter:~]$ sudo sysctl -w net.ipv6.conf.eno2.proxy_ndp=1
net.ipv6.conf.eno2.proxy_ndp = 1

[me@middleRouter:~]$ sudo sysctl -w net.ipv6.conf.wlo1.proxy_ndp=1
net.ipv6.conf.wlo1.proxy_ndp = 1

配置客户端的路由/ip

我们可以添加ip地址,并添加路由:

[rasp@client:~]$ sudo ip route add 2a04:1234:5678:abcd::ae/64 dev eth0


[rasp@client:~]$ sudo ip route add default via 2a04:1234:5678:abcd::ae

[rasp@client:~]$ sudo ip address add 2a04:1234:5678:abcd:1::/80 dev eth0

[rasp@client:~]$ ip -6 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 2a04:1234:5678:abcd:1::/80 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:ebff:feea:f6ce/64 scope link 
       valid_lft forever preferred_lft forever

[rasp@client:~]$ ip -6 route
::1 dev lo proto kernel metric 256 pref medium
2a04:1234:5678:abcd:1::/80 dev eth0 proto kernel metric 256 pref medium
2a04:1234:5678:abcd::/64 dev eth0 metric 1024 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via 2a04:1234:5678:abcd::ae dev eth0 metric 1024 pref medium

添加中间路由器和代理的路由

现在在中间路由器上:

[me@middleRouter:~]$ sudo ip route add 2a04:1234:5678:abcd:0001::/80 dev eno2

## Configure the ndp proxy: /!\ the interface is the one that needs to
## have access to the ip, not the one that contains the ip!
[me@middleRouter:~]$ sudo ip neigh add proxy 2a04:1234:5678:abcd::ae dev eno2

[me@middleRouter:~]$ sudo ip neigh add proxy 2a04:1234:5678:abcd:1:: dev wlo1

### You may need to enable the promiscuous mode to make sure the router does not miss the packages that are not made for him direclty:
[me@middleRouter:~]$ sudo ifconfig eno2 promisc

[me@middleRouter:~]$ sudo ifconfig wlo1 promisc

享受或调试

现在,你可以通过 ping google ip 来检查它是否正常工作:

[rasp@client:~]$ ping 2a00:1450:4007:812::2003
PING 2a00:1450:4007:812::2003(2a00:1450:4007:812::2003) 56 data bytes
64 bytes from 2a00:1450:4007:812::2003: icmp_seq=1 ttl=113 time=43.8 ms
64 bytes from 2a00:1450:4007:812::2003: icmp_seq=2 ttl=113 time=34.8 ms
64 bytes from 2a00:1450:4007:812::2003: icmp_seq=3 ttl=113 time=65.7 ms
^C
--- 2a00:1450:4007:812::2003 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 34.808/48.098/65.684/12.965 ms

如果它不起作用,wireshark或者tcpdump -ni <interface> ip6调试可能会有用。

最后,如果您希望能够使用域名,您可以通过在以下位置添加名称服务器行来添加 DNS /etc/resolv.conf

$ cat /etc/resolv.conf 
# Generated by resolvconf
options edns0
nameserver 2001:4860:4860::8888

相关内容