I'm 赵一开, a developer.
在一般IPv6网络环境下,一个局域网的子网大小为/64
,接口通过NDP协议获得自己的唯一IPv6地址(前64位为子网前缀,后64位一般由接口本身的MAC地址产生)。这种环境下若想使家用路由器后的所有设备能够得到IPv6地址,一般有两种方法:
但是众所周知清华大学紫荆宿舍的Native IPv6就是一坨x,只能通过ISATAP隧道访问。然而由于ISATAP本身的特性,一个公共的IPv4地址只能对应一个IPv6地址(因为其不是使用邻居发现协议来路由,而是直接根据IPv4地址路由),因此只能使路由器获得IPv6地址或者使NAT后的某一台设备获得IPv6地址。
因此要使(只拥有一个外网IPv4地址的)多个设备通过ISATAP均能访问IPv6,只能使用IPv6 NAT。
Google一下,大多数文章告诉我们:IPv6地址很多,不需要、不应该有NAT。再Google一下,@dangfan的这篇文章给出的解决方案是使用北邮同学的NAT66。
然而似乎所有人都没发现,Netfilter支持“all kinds of network address and port translation, e.g. NAT/NAPT (IPv4 and IPv6)” 所以说,ip6tables
是像iptables
一样有nat表的,只不过相应的内核模块一般没有被默认安装。
make menuconfig
时选中kmod-ip6tables
,kmod-ipt-nat6
两个包(其余的自己看着办咯),需要较新版本的内核。ip6tables -t nat -L
能输出结果就说明其nat表可用啦/etc/config/network
中给路由器的lan口指定Private IPv6地址:在option ipaddr 192.168.1.1
后加入option ip6addr fc00:0101:0101::1/64
fc00:0101:0101::/64
前缀的Private IPv6地址/etc/firewall.user
中加入ip6tables -t nat -I POSTROUTING -s fc00:101:101::/64 -j MASQUERADE
路由器上ISATAP自动配置脚本/etc/init.d/isatap
(修改YOUR_IP
):
#!/bin/sh /etc/rc.common
# By blahgeek
# before led, after everything else
START=95
start() {
ip tunnel add sit1 mode sit remote 166.111.21.1 local YOUR_IP
ifconfig sit1 up
ifconfig sit1 add fe80::200:5efe:YOUR_IP/64
ifconfig sit1 add 2402:f000:1:1501:200:5efe:YOUR_IP/64
ip route add ::/0 via 2402:f000:1:1501:200:5efe:166.111.21.1 metric 1
}
stop() {
ip tunnel del sit1
}
radvd配置文件/etc/radvd.conf
:
interface br-lan {
AdvSendAdvert on;
MinRtrAdvInterval 5;
MaxRtrAdvInterval 10;
AdvManagedFlag off;
AdvOtherConfigFlag off;
AdvDefaultPreference high;
prefix fc00:0101:0101::/64 {
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
};
Unable to load comments, check your (GFW Free) Internet connectivity.