IPv6中单一地址做网关的三种方案【续】 - openwrt下的配
置 http://blog.asxzy.net/blog/2011/ ... v6-gateway-openwrt/
IPv6中单一地址做网关的三种方案 http://blog.asxzy.net/blog/2011/ ... -make-ipv6-gateway/
首发于Openwrt中文网
asxzy
相信很多大学的路由都是通过自动配置给客户端分配ipv6地址的,所有用户获取到的ipv6地址的prefix都是/64,无法继续划分子网,为了使/64的用户也能做网关,大家玩命的想各种方法,NAT,网桥,NDP Proxy。
今天我给大家分享一下我是如何使用prefix为/64的ipv6地址做路由网关的,旨在抛砖引玉,欢迎各位探讨(倾向于邮件交流)
方案一:NAT
IPV6标准协议中无NAT,原因请谷歌。
本IPv6 的NAT方案和IPv4的NAT方案思路一致,在IPv6下划分一段“子网”的IPv6地址给客户端(其实是假IPV6地址),openwrt通过内核转发完成NAT功能。
由于本方案并非官方支持。故本文仅给出几个现成的解决方案 NAPT66:http://code.google.com/p/napt66/
北邮方案,小巧精悍,内核级别的,不易安装使用。
ipv6nat Qycaitian:http://sourceforge.net/projects/ipv6nat/ 西电研究生作品。支持局域网ipv6自动配置、局域网端口映射、多WAN口负载均衡。
方案二:IPv4 NAT + IPv6 bridge
本方案思路为,IPv4路由+IPv6交换机,将wan+lan口桥接并屏蔽掉网桥上的ipv4封包,实现ipv6链路。
严格意义上来说,本方案并不是将单一地址做网关,而是给IPv6搭了一座桥出来,让IPv6的封包从路由器直接穿过。
实现起来也非常简单。
1.桥接wan口lan口。
2.屏蔽掉所有非IPv6的包。
约定:
wan口eth1
lan口eth0、wlan0、wlan1 依赖:
ebtables、birdge-utils 命令样例
1. brctl addbr br-lan 2. ifconfig br-lan up 3. brctl addif br-lan eth0 4. brctl addif br-lan eth1 5. brctl addif br-lan wlan0 6. brctl addif br-lan wlan1
7. ebtables -t broute -A BROUTING -p ! ipv6 -j DROP
复制代码
openwrt的trunk版提供了6scripts包可以使用该方法实现ipv6。 操作
1. opkg update
2. opkg install ebtables 6scripts
复制代码
编辑配置文件/etc/config/6bridge
1. vi /etc/config/6bridge
复制代码
修改配置文件
1. config 6bridge
2. option bridge 'bripv6' # 将bripv6修改为你的bridge设备名,
通过brctl show查看
复制代码
启用脚本
1. /etc/init.d/6bridge start
复制代码
设置开机自启动
1. /etc/init.d/6bridge enable
复制代码
但实际上,在某些环境下,这种方法还是有缺陷的。比如需要IPv4通过交换机验证的环境中,由于客户端没有通过联网验证,上端路由器不会相应来自客户端的任何请求,故本方案只是用于IPv6无需认证的网络环境使用。
NOTE:6script依赖ebtables包,该软件包只有trunk版提供,backfire版无ebtables,自12.09之后,非trunk版也提供ebtalbes与6script
接下来请出我的杀手锏
方案三:proxy_ndp
众所周知,IPv4中有个arp协议,他在IPv4的网络中有着非常重要的作用。但IPv6取消了ARP协议,取而代之的是NDP(Neighbor Discovery Protocol),即邻居发现协议。而Linux在2.6.19版中加入了proxy_ndp这个特性,使得linux有了代理ipv6的能力。本方案就是基于这一特性实现的。
这一方案中,网关中单一的IPv6地址可以认定为是其子网的网关,通过任意方式给子网分配与网关相同前缀的IPv6之后,将子网的IPv6地址加入网关的ndp代理之中,从而实现子网的IPv6。
过程也是非常简单。
1.在网关上打开ipv6 forwarding和proxy_ndp。
2.用任意方式给网关wan口lan口设定合法IPv6地址,所谓合法,就是要能与外网相连。 3.用任意方式给子网划分与wan口相同前缀的合法IPv6地址。 4.在网关上将子网的IPv6地址加入proxy_ndp
需要注意的几点:
1.网关必须使用静态IPv6地址,否则IPv6 forwarding会出问题。
2.网关上的路由表一定要正确,最好添加静态路由,外网网关和内网子网都要注意,最好相互ping6检测一下是否路由正确。
3.网关添加neigh proxy,dev应为wan口。
约定:
wan口eth1 lan口br-lan
wan对外网关:2001:250:1006:3006::1
lan内客户端:2001:250:1006:3006:1112:2222:3333:4444 依赖:
linux >= 2.6.19、ip 命令样例
1. ip -6 route add default 2001:250:1006:3006::1 dev eth1
2. ip -6 route add 2001:250:1006:3006:1112:2222:3333:4444 dev br-lan 3. ip -6 neigh add proxy 2001:250:1006:3006:1112:2222:3333:4444 dev eth1
复制代码
如果客户端是固定的,可以将命令写成脚本,加入/etc/init.d/network或/etc/sysconfig/network-script/ifup-eth1中。
但这样做会很蛋疼,因为你要将客户端一个一个写入脚本。
于是乎,第三方软件出现了。
此处更新(2013/4/19) 本文之前所提供的npd6由于没有受到官方支持,且配置具有一定的不稳定性,故现使用Openwrt官方提供的ndppd包取代npd6。
声明:以下配置参考于http://rockuw.sinaapp.com/openwrt-buffalo-g300n-v2-router-hack/,并根据个人经验做以改动
开始openwrt下的配置吧
1.安装radvd,给客户端分配合法ip
1. opkg update 2. opkg install radvd
复制代码
编辑配置文件/etc/config/radvd
前两个配置项的ignore去掉,prefix项中的list prefix填写正确的prefix即可:
1. vi /etc/config/radvd
复制代码
1. config interface
2. option interface 'lan' 3. option AdvSendAdvert 1 4. option AdvManagedFlag 0 5. option AdvOtherConfigFlag 0 6. list client ''
7.
8. config prefix
9. option interface 'lan'
10. # If not specified, a non-link-local prefix of the interface is used 11. list prefix '2001:250:1006:3006::/64' 12. option AdvOnLink 1 13. option AdvAutonomous 1 14. option AdvRouterAddr 0 15.
复制代码
启动radvd
1. /etc/init.d/radvd start
复制代码
设置开机自启动
1. /etc/init.d/radvd enable
复制代码
此处更新(2013/4/19) 此文发布已久,现发现npd6可以使用openwrt官方trunk版的ndppd
包代替,安装及配置方法如下 安装ndppd包
1. opkg install ndppd
复制代码
配置ndppd
1. vim /etc/ndppd.conf
复制代码
找到配置文件中的proxy标签和rule标签,设置成你的内网网段:
1.
2. proxy eth1{ 3. router yes 4. timeout 500 5. ttl 30000 6.
7. rule2001:250:1006:3006::/64 { 8. auto 9. } 10. } 11.