树莓派可以通过create_ap最为无线路由器使用。
通常情况下仅有ipv4功能,没有ipv6功能。

要使子网具有完整的ipv6功能一般有两种方案一种是ndp(邻居发现协议)另一种是nat66(网络地址转换),两种方式各有优缺点。

ndp方式

ndp方式利用ipv6标准的邻居发现协议使所有接入子网的设备获得ipv6地址,子网设备与网关设备在同一个ipv6地址段。这要求网关的上级设备对ipv6地址的要求比较宽松,最好是无状态分配地址,这可以允许用户自行编造符合网段前缀要求的全球单播地址。在ipv6部署早期,绝大多数ISP采用这种无状态分配IP地址,但该方式对ipv6地址浪费严重,由于网络实名原则相抵触,最近随着ipv6新一轮的建设,改分配方式逐步被dhcpv6等传统基于网卡mac地址更加严格的方式取代。垃圾google Android到现在还不支持dhcpv6方式获取ip地址

我之前采用的就是ndp方式,但随着网络架构的变化ndp方式变得不可用,上级网关不再接受自造的ipv6全球单播地址。所以不得不改用nat66方式。

nat66

ipv6在设计之初是强烈反对nat的,ipv6就是为了应对IP地址枯竭,然而经过多年的网络实践。nat不受web服务提供者的欢迎,失去一个公网IP地址就等于失去了一切,但对于普通的互联网使用者而言,nat未必不是一件好事情。相互独立的子网与关闭的常用端口往往可以有效的阻止计算机病毒的传播与破坏。普遍来说,ISP对一个互联网账号仅仅会分配一个ipv6地址,子网用户取得全球单播ipv6任然比较困难

ipv6发展的今天是必须且必要需要nat的。

树莓派在成功部署create_ap之后(或许也适用于其他debian系操作系统),需要安装radvdip6tables(可能会自带)。

在最新版debian时使用iptables 与ip6tables可能会遇到软件降级问题update-alternatives可以使软件顺利降级。

设置nat

首先设置ipv6 nat 方法与ipv4差不多

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

ip6tables -A FORWARD -i wlan0 -j ACCEPT
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


ip -6 addr add 6666:1:1:1::1/64 dev wlan0
service radvd restart


其中 wlan0 eth0 分别是两个网卡的名称

为子网分配64前缀的IP地址是为了Android等设备无状态获取ipv6地址
6666:1:1:1::1可以改成其他前缀,最好不要与现有公网ipv6地址冲突

设置radvd

radvd配置文件通常在/etc/radvd.conf

1
2
3
4
5
6
7
8
9
10
11
12
interface wlan0
{
AdvSendAdvert on;
AdvManagedFlag on;
AdvOtherConfigFlag on;
prefix 6666:1:1:1::/64 {
AdvRouterAddr off;
AdvOnLink on;
AdvAutonomous on;
};
};

注意 前缀与上一步应保持一致

树莓派ipv6地址消失的问题

通常经过以上两步处理之后,子网设备可以顺利获取ipv6地址并通过ipv6测试,然而我在搭建完成之后经过一个小时之后eth0网口的ipv6地址会丢失。有人说是ip6tables的问题,经多方查找没有解决方案,于是写一个脚本,半小时运行一次,手动添加ipv6地址。

1
2
3
4
5

sudo ip -6 addr add 2001:da8:7007:1898::43/128 dev eth0
sudo ip -6 route add default via fe80::22ff:9ff:f11:3a8 dev eth0 metric 256


这两个分别是本机ipv6地址和网关地址,具体可以通过命令ip -6 route show dev eth0来查看。

效果展示

Android端效果