IPv6开启转发并保持自动获取PPP提供的IPv6地址

标题想了好久……请不要吐槽晦涩难懂

先说一下应用场景:

  • 一台Linux-based box(ARM开发板如ODROID U3、Raspberry Pi,或者OpenWRT神马的)当作Host + Router,通过有线网卡连接交换机Hub作为局域网网关和服务器,再通过PPPoE拨号连接外网(PPPoE能自动配置并获取IPv6地址)。
  • 局域网PC配置好本地的IPv6地址透过局域网网关(上面那台Linux Box)连接外网,要求能以IPv4和IPv6协议访问Internet,但是获得的IPv4和IPv6地址都是内网地址


注意:作为局域网网关和服务器的Linux Box内核必须要3.7以上,因为旧版的内核不支持ip6tables的NAT。下面以Debian Jessie为例,讲述一下在局域网网关即Linux Box(我用的ODROID U3)上的配置。

首先,编辑/etc/sysctl.conf文件,将下面两个值设为2:

net.ipv6.conf.all.forwarding=2
net.ipv6.conf.default.forwarding=2

为什么是2呢?应该可以看到默认取消注释的话也是1,确实感觉一般非0即1,但是注意到上面注释的内容:

#  Enabling this option disables Stateless Address Autoconfiguration
#  based on Router Advertisements for this host

这里设为2意思是强制开启转发同时不要自动禁用基于Router Advertisements的Stateless Address Autoconfiguration(如果禁用了的话,远程机器就会把这台设备当作路由器而不是主机,而地址自动配置只会给主机配置,不会给路由器配置)。

继续,/etc/sysctl.conf文件加上下面这两行:

net.ipv6.conf.all.accept_ra=2
net.ipv6.conf.default.accept_ra=2

这两行的意思是强制接受Router Advertisements而不管是否开启转发(forwarding)。保存关闭,然后运行:

sudo systcl -p

更新设置的值。如果已经连接了PPP的,需要先断开再重连。然后配置一下ip6tables,开启NAT:

sudo ip6tables -t -A POSTROUTING -s fc00::/7 -o ppp0 -j MASQUERADE

这条指令把属于fc00::/7网段的IPv6设备的包进行伪装(masquerade)再发送给外网,以此实现IPv6的内网和外网分离。如果需要局域网网关向局域网机器广告IPv6地址的话,可以安装radvd服务,这里就不作介绍了。我这里则是通过配置静态的IPv6地址实现的,局域网设备和网关的IPv6均为fc00::/7网段(fc00::/7属于Unique Local Address,详见维基)。

最后记得在box和局域网PC上分别ping6(Windows的命令是ping -6)一下www.google.com看看是否能ping通。

参考文章: IPv6 at home, under the hood with Debian Wheezy and Internode by @vk5tu