openwrt+ndp+ndppd+radvd+dhcpv6,ipv6穿透配置指南
要用ipv6首先你的openwrt路由内核必须已经支持ipv6,且能安装相关软件!
首先说说最简单的ndp手工ipv6穿透,很简单,看代码详解:
环境: wan口 eth1 lan口 br-lan wan对外网关:2001:250:1006:3006::1/64 lan内客户端1:2001:250:1006:3006:2::20/80 lan内客户端2:2001:250:1006:3006::2::21/80 客户端网关:路由器lan口v6地址(没有手动设置一个)。 设置系统支持: sysctl -w net.ipv6.conf.all.forwarding=1 #其他发行版需要开启ipv6包转发;openwrt默认就是会转发的,这句可忽略。 sysctl -w net.ipv6.conf.all.proxy_ndp=1 #开启邻居代理功能,如果使用npd6的话,这句可忽略。 设置路由支持: ip -6 route add default via 2001:250:1006:3006::1 dev eth1 #wan口默认路由 ip -6 route add 2001:250:1006:3006:2::/80 dev br-lan #将发往lan内客户端的数据交给lan口 ndp设置: ip -6 neigh add proxy 2001:250:1006:3006:2::20 dev eth1 #在wan口开启对PC1的邻居代理 ip -6 neigh add proxy 2001:250:1006:3006:2::21 dev eth1 #在wan口开启对PC2的邻居代理 。。。。。。有多少设备上ipv6就需要设置几条ndp规则 然后,你要上网的电脑,配置ipv6的ip、网关:填写路由lan口ipv6地址、dns (如he的dns:2001:470:20::2)
IPv6 NDP(自动获取ip地址)
IPv4由于NAT的存在共享上网是想当的简单(随便一个不懂电脑的萌妹子给家里搞一台TP-Link,就知道设置PPPoE认证然后就NAT组建家庭局
域网共享上网了……让我等苦逼技术死宅没有了上门帮忙的机会
QAQ),IPv6标准协议里面木有NAT,让我顿时费解了一把,后来谷歌了一下发现北邮有一群学生做了一个创新项目实现了IPv6的NAT,当时感觉是
各种膜拜啊……还是内核级的项目啊卧槽……难道我又要改内核代码然后重新编译OpenWRT了啊……
后来仔细研究了一下,果然北邮那个项目还是没啥意思的,有点坑经费的感觉,因为IPv6有一种更好的解决方案:Proxy Neighbour
Discovery
Protocol(邻居发现协议),具体可以看:http://en.wikipedia.org/wiki
/Neighbor_Discovery_Protocol。
简单来说,NAT就是把内网终端伪装起来请求出去,同时数据会到有外网地址的Router,再让此Router把数据包转发给客户端机器。由于IPv6的地址空间是相当相当的大,没有必要再公用一个外网地址,可以让每个内网的终端都具有一个外网地址
这个地址依然是不可再路由,这时就需要让具有外网地址的Router帮忙告诉它的上层Router,这些外网地址在这个Router的内网中。
这种方式牛逼之处在于……什么UPnP,什么NAT穿透,全部都不需要了……P2P什么的嘛……完全无压力……
继续配置,我这里外网网卡是eth0,内网是br-lan
先安装ndppd
opkg update && opkg install ndppd
看一下我的Global IPv6地址:
root@OpenWrt:/etc# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 8C:21:0A:A6:94:B3
inet addr:121.48.171.138 Bcast:121.48.171.255 Mask:255.255.255.128
inet6 addr: 2001:250:2000:7520:8e21:aff:fea6:94b3/64 Scope:Global
inet6 addr: fe80::8e21:aff:fea6:94b3/64 Scope:Link
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1
RX packets:517397 errors:0 dropped:450 overruns:0 frame:0
TX packets:777032 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:177017984 (168.8 MiB) TX bytes:688621714 (656.7 MiB)
Interrupt:4
是2001:250:2000:7520:8e21:aff:fea6:94b3/64,因为是/64,所以无法继续划分子网,就要使用刚才说的邻居发现协议。
然后给内网网卡br-lan设置与eth0的地址前64位相同,后64位不同的IPv6地址(不要直接抄袭我的,如果你也在电子科大清水河……这样咱们会冲突的),设置时前缀长度要大于64:
ip -6 addr add 2001:250:2000:7520:1::1/80 dev br-lan
修改/etc/ndppd.conf
proxy eth0{
router yes
timeout 500
ttl 30000
rule 2001:250:2000:7520:1::/80 {
auto
}
}
然后运行ndppd:/etc/init.d/ndppd start,这样就配置好了。比内核级的NAT实现要轻松许多。
但是这个时候还不能客户端自动获得IP,radvd配置只能前缀为64,所以还需要dhcpv6 server:
opkg install radvd
opkg install wide-dhcpv6-server
配置/etc/config/radvd:
config interface
option interface 'lan'
option AdvSendAdvert 1
option AdvManagedFlag 1
option AdvOtherConfigFlag 1
list client ''
config prefix
option interface 'lan'
# If not specified, a non-link-local prefix of the interface is used
list prefix ''
option AdvOnLink 1
option AdvAutonomous 1
option AdvRouterAddr 0
配置/etc/config/dhcp6s,enabled设置为1
配置/etc/dhcp6s.conf
interface br-lan {
address-pool pool1 86400;
};
pool pool1 {
range 2001:250:2000:7520:1::200 to 2001:250:2000:7520:1::300 ;
};
启动radvd和dhcpv6 server:
/etc/init.d/radvd start
/etc/init.d/dhcp6s start
注意顺序,如果遇到错误,可以:
/etc/init.d/radvd restart
/etc/init.d/ndppd restart
这样我们就配置好了IPv6的邻居发现协议和IP地址的分配,这个时候连上路由器的客户端已经可以自动获得IPv4和IPv6的地址并无障碍访问IPv4和IPv6的网络了