在家部署IPv6
自从苹果要求iOS app能支持IPv6以来,我就一直想在自己屋里搞一个IPv4/IPv6双栈的环境,不为实用,只是为了满足那点强迫症,直到现在才有点进展。
屋里拉了电信的宽带,是只能pppoe得到一个公网IPv4地址,换了用BananaPi做的路由后,有些事情也变得清晰了,可以从Hurricane Electric申请一个IPv6 tunnel,这个过程很简单,而且电信给的IPv4地址是会定期变更的,这家tunnel服务可提供了API可以随时更新绑定的IPv4地址,后面再具体说说。
在Create Regular Tunnel之后,便可以得到一些有用的信息,比如Server IPv4 Address,Client IPv6 Address,Routed /64等等,同时网页上也有自动生成配置命令的功能,我的路由器装了Raspbian,就选择Linux-net-tools,得到以下命令:
1
2
3
4
5
ifconfig sit0 up
ifconfig sit0 inet6 tunnel ::222.111.222.111
ifconfig sit1 up
ifconfig sit1 inet6 add 2001:1111:2222:3333::2/64
route -A inet6 add ::/0 dev sit1
其中第2行的IPv4地址便是前面提到的Server IPv4 Address,第4行的IPv6地址便是Client IPv6 Address。执行以上命令,再用ifconfig
看,便多出了sit0
和sit1
两个接口,这时如果IPv4本身没问题的话,路由器应该可以连接IPv6网络了,可以用命令ping6 ipv6.google.com
或curl -vv -6 https://ipv6.google.com
测试。
在网页的Advance页,还有一个Example Update URL
,可以在电信分配的IPv4地址发生变化后,更新新的IPv4地址用:
1
curl -vv -4 "https://username:update-key@ipv4.tunnelbroker.net/nic/update?hostname=tunnel-id"
除了更新IPv4地址到Hurricane Electric,还得更新sit0
和sit1
两个接口,就是先ifconfig sit0 down
和ifconfig sit1 down
,再执行最开始那几条命令。
路由器能工作后,要让局域网中其他机器也能通过IPv6上网,就得给其他机器分配IPv6地址,并通过路由器转发路由。在路由器上安装radvd
,这个软件可以用来分配IPv6地址给局域网中其他机器,修改配置文件/etc/radvd.conf
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface eth0
{
AdvSendAdvert on;
AdvLinkMTU 1480;
MaxRtrAdvInterval 300;
MinRtrAdvInterval 60;
prefix 2001:1111:1111:1111::/64
{
AdvRouterAddr on;
AdvOnLink on;
AdvAutonomous on;
AdvPreferredLifetime 600;
AdvValidLifetime 3600;
};
route ::/0 {
};
};
第1行的eth0
根据自己系统中的网络接口而设定,下面的prefix
后面的地址段是网页中给出的Routed 64,执行命令sudo systemctl start radvd
让radvd
运行起来,如果radvd
运行不起来,可以重启系统再试。
再给eth0
绑定一个静态IPv6地址,修改配置文件/etc/network/interfaces
,加入几行:
1
2
3
iface eth0 inet6 static
address 2001:1111:1111:1111::1
netmask 64
地址前缀跟Routed /64的相同,最后::1
则随意,只不过我们比较习惯用1
来作为网关的地址。然后重启网络服务即可sudo systemctl restart networking
。估计电信接入的pppoe得到的IPv4地址在重启网络服务后又变了,需要再向Hurricane Electric更新一下。
最后,打开IPv6转发:sudo sysctl -w net.ipv6.conf.all.forwarding = 1
。
到此为止,路由器上的设置就完成了,其他机器还有最后一步要做。在其他机器运行ifconfig
,应该可以看到已经分配到2001:1111:1111:1111:wwww:xxxx:yyyy:zzzz
这样的IPv6地址,可以ping一下路由器:
1
ping6 2001:1111:1111:1111::1
正常情况下,应该已经能ping通。然后设置IPv6网关为路由器的地址(这一步并不是必需的,好像IPv6具有自动配置的能力,有的机器上没有这一步也能正常工作了,如果不能工作,便执行这一步):
1
sudo route -A inet6 add default gw 2001:1111:1111:1111::1
这时用命令ping6 ipv6.google.com
或curl -vv -6 https://ipv6.google.com
测试,应该就已经能正常工作了。
至此,IPv6环境就全部配置好了。
比较郁闷的是我的二级路由器R6300v2刷了梅林固件后好像不能分配内网IPv6地址,网上看也有人提出了相同的问题,但并没有答案。