OpenWrt中文网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 46581|回复: 42

[2013-09-15]openwrt下的ipv6单一地址做网关(附mentohust、njitclient)

[复制链接]
asxzy 发表于 2011-12-23 21:09:56 | 显示全部楼层 |阅读模式
本帖最后由 asxzy 于 2013-9-16 01:31 编辑

本文源自龍蝦的書房<asxzy.net>
IPv6中单一地址做网关的三种方案【续】 - openwrt下的配置       http://blog.asxzy.net/blog/2011/ ... v6-gateway-openwrt/
IPv6中单一地址做网关的三种方案              http://blog.asxzy.net/blog/2011/ ... -make-ipv6-gateway/
首发于Openwrt中文网 <openwrt.org.cn>

asxzy <asxzy@asxzy.net>


相信很多大学的路由都是通过自动配置给客户端分配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. config prefix
  8.         option interface        'lan'
  9.         # If not specified, a non-link-local prefix of the interface is used
  10.         list prefix             '2001:250:1006:3006::/64'
  11.         option AdvOnLink        1
  12.         option AdvAutonomous    1
  13.         option AdvRouterAddr    0
复制代码
启动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. proxy eth1{
  2.   router yes
  3.   timeout 500
  4.   ttl 30000

  5.   rule2001:250:1006:3006::/64 {
  6.   auto
  7.   }
  8. }
复制代码
开启ndppd
  1. /etc/init.d/ndppd start
复制代码
设置ndppd为开机自启动
  1. /etc/init.d/ndppd enable
复制代码
NOTE:在启用npd6之前,要给路由器设定固定的ipv6地址,否则路由器会向上端路由发送请求自动获取ip,br-lan和wan口均会获得prefix为/64的ipv6地址,导致路由表错乱。
编辑配置/etc/config/network
  1. vi /etc/config/network
复制代码
  1. config interface lan
  2.         option type     bridge
  3.         option ifname   eth1.0
  4.         option proto    static
  5.         option ipaddr   10.0.0.1
  6.         option netmask  255.255.255.0
  7.         option ip6addr  '2001:250:1006:3006::4/64'
  8.         option nat      1

  9. config interface wan
  10.         option ifname   eth1.1
  11.         option proto    static
  12.         option ipaddr   XXX.XXX.XXX.XXX #你的ipv4地址
  13.         option netmask  255.255.255.0
  14.         option gateway  XXX.XXX.XXX.XXX #你的网关地址
  15.         option dns      '2001:470:20::2 74.82.42.42' #dns服务器
  16.         option ip6addr  '2001:250:1006:3006::3/126' #ipv6地址,注意prefix,prefix相同会导致路由表错乱
  17.         option ip6gw    '2001:250:1006:3006::1 #你的ipv6网关地址
复制代码
重启network
  1. /etc/init.d/network restart
复制代码
之后启动npd6
  1. npd6
复制代码
子网客户端上用浏览器开ipv6.google.com,可以打开就说明ok了。

注意事项:
lan口wan口必须设定ipv6地址,且不能使用同一prefix,否则会导致路由表错乱。

下文中npd6包不再提供支持,仅供个人研究参考



npd6 <http://code.google.com/p/npd6/>
npd6是一款可以自动配置npd proxy的软件,短小精悍,配置简洁,老少皆宜。。



安装对应路由器的npd6,通过简单的配置即可。
软件包请自行在我的服务器上找
http://openwrt.asxzy.net
以brcm为例(有这个芯片的基友们太多了 -。-!)
  1. opkg install http://openwrt.asxzy.net/backfire/10.03.1/brcm63xx/packages/npd6_0.4.4-1_brcm63xx.ipk
复制代码
编辑配置文件/etc/npd6.conf
  1. vi /etc/npd6.conf
复制代码
  1. prefix = 2001:250:1006:3006:
  2. interface = eth1 #这里要写WAN网卡,我的是eth1,具体可以ifconfig或者cat /etc/config/network查看
复制代码






总结:以上三种方案,nat的适用性最强,可以适用于各种ipv6的环境之中;bridge最简单,可以适用于即插即用的ipv6环境;ndp最优雅,既是标准协议,也可以解决无法通过认证,无端口映射等问题,可以适用于各大高校的实验室及宿舍网络中。



PS:我的仓库里还有njit-client和mentohust,均可用。。


方案是确定可用的,等会上图。。
如果不可用,99%是配置问题。。

引导为主,说教为辅。
目的是给大家提供一个思路。
手写版,难免有误,欢迎指正。
个人减低,不喜误入,同时欢迎交流。
superbillgates 发表于 2011-12-23 22:10:54 | 显示全部楼层
这个要顶,慢慢看看,对校园网用户很有实用价值,好好研究一下~~~
weirdxl 发表于 2011-12-23 23:23:48 | 显示全部楼层
嗯,刚在你的BLOG上看到了。LZ辛苦了!
admin 发表于 2011-12-24 13:47:02 | 显示全部楼层
好贴, 加精, 已录入教程汇总索引
tthr 发表于 2012-5-4 09:42:08 | 显示全部楼层
好贴,找了好久了,楼主是自己研究得到的还是有很多参考 ,希望能给一些参考链接。
本人最近用我带wr841v7刷netgear的wnr2200官方固件里面有一项可以设置ipv6穿透方式解决楼主所提问题。但是不知道这个穿透是何意思。请指教
moderaterain 发表于 2012-6-6 11:24:25 | 显示全部楼层
请问楼主:

我用的是sit隧道来走v6的外网,wan卡的ipv6静态留空,sit1固定ip,lan卡ip用fec0::/64段,开radvd

现在问题是内网可以上v6网络,但是速度很慢,同ping ipv6.google.com,路由小于100ms,内网大于400ms

像我这种sit隧道该怎么配置才能把网速提上去?
cnfavor 发表于 2012-8-18 15:04:31 | 显示全部楼层
方法二好像有点问题,我在trunk上测试后发现客户端得不到v6地址,在路由器上能看到eth1和bripv6有相同的v6地址。
 楼主| asxzy 发表于 2012-8-24 18:36:37 | 显示全部楼层
cnfavor 发表于 2012-8-18 15:04
方法二好像有点问题,我在trunk上测试后发现客户端得不到v6地址,在路由器上能看到eth1和bripv6有相同的v6 ...

桥接要注意一下几点:
1.ipv6不和拨号账号绑定,否则只会分配一个ip
2.ebtables正确安装,否则无法建立ipv6网桥
 楼主| asxzy 发表于 2012-8-24 18:37:51 | 显示全部楼层
tthr 发表于 2012-5-4 09:42
好贴,找了好久了,楼主是自己研究得到的还是有很多参考 ,希望能给一些参考链接。
本人最近用我带wr841v7 ...

穿透我也没研究过,个人猜测很有可能是方案2,ipv6网桥
rocknjoekudo 发表于 2012-9-18 15:46:44 | 显示全部楼层
楼主,我使用的是方法二,结果不能使用。
使用的是6scripts的方法,trunk版本下。
当我准备使用/etc/init.d/6bridge start开启时,终端显示Too many levels of symbolic links,然后路由就ping不通了,偶尔能看到IPv6地址分配下来,但是不能连接上Internet了。
当我从luci的界面开启6scripts的时候,也是这个样子。求楼主大大指导!
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|OpenWrt中文门户. ( 湘ICP备10006320号

GMT+8, 2019-12-15 22:03 , Processed in 0.166824 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表