类库大魔王
类库大魔王 多年C++、Go项目经验,长期从事跨平台(Windows/macOS/iOS/Android)应用架构设计与开发。

在家部署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看,便多出了sit0sit1两个接口,这时如果IPv4本身没问题的话,路由器应该可以连接IPv6网络了,可以用命令ping6 ipv6.google.comcurl -vv -6 https://ipv6.google.com测试。

在网页的Advance页,还有一个Example Update URL,可以在电信分配的IPv4地址发生变化后,更新新的IPv4地址用:

1
curl -vv -4 "https://username:[email protected]/nic/update?hostname=tunnel-id"

除了更新IPv4地址到Hurricane Electric,还得更新sit0sit1两个接口,就是先ifconfig sit0 downifconfig 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 radvdradvd运行起来,如果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.comcurl -vv -6 https://ipv6.google.com测试,应该就已经能正常工作了。

至此,IPv6环境就全部配置好了。


比较郁闷的是我的二级路由器R6300v2刷了梅林固件后好像不能分配内网IPv6地址,网上看也有人提出了相同的问题,但并没有答案。

感觉本文不错,不妨小额鼓励我一下!
如果你有Visa、MasterCard之类的国际银行卡,也可以考虑以下选项:
如果你看不到评论框,说明Disqus被墙了。