标题想了好久……请不要吐槽晦涩难懂
先说一下应用场景:
- 一台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