北邮 国内高校的通用方案之一介绍
给每栋楼一个/64
,然后SLAAC
拨出去,用户自行通过NDP
获取和发现ipv6`。
针对该方案有桥接和NDP Relay两种方案。都有自己的优势和缺点,自行抉择,两种方法在BUPT和UCAS都已经过验证。
环境介绍
设备:
- NeWIFI 3 Openwrt
- N5015 X86 openwrt
网络环境:
- ipv6 无认证,ipv4 有认证
- 学校网关代拨,不需要自行pppoe
方案介绍
NDP Relay
推荐方案!
原理
- 针对
IPV4
进行NAT
- 针对
IPV6 SLAAC
进行NDP Relay
Tradeoff
不稳定,usually has bug2021年开始已经稳定修复- 路由器有v6,可以挂PT
实现
准备工作:
- 删除
wan6
创建wwan6
(wifi接入用户),或者使用默认的wan6
(有线接入用户) - 为方便描述,将wwan6或wan6统一定义为INET6,在后续的配置文件中请自行替换
- 熟练使用ssh
配置文件:
如果你是最新版的Openwrt
,对/etc/config/dhcp
的修改可以在LUCI界面完成:
LAN
接口:设置IPV6
的DHCPv6
为禁用,其他为中继INET6
接口: 设置为IPV6
主接口
否则修改配置文件 /etc/config/dhcp
的部分内容如下:
config dhcp 'lan'
option interface 'lan'
……(省略)
option ndp 'relay'
option ra 'relay'
config dhcp 'INET6'
option interface 'INET6'
#option ignore '1' (注释掉这行)
option ndp 'relay'
option ra 'relay'
option master '1'
同时再配置路由:
route -A inet6 add 2001:da8:201:xxxx::/64 dev br-lan
或者用:
iproute2:ip -6 r a 2001:da8:201:xxxx::/64 dev br-lan
最后重启生效:
如果有service/systemctl
service network restart
service odhcpd restart
没有则
/etc/init.d/network restart
/etc/init.d/odhcpd restart
备注:
- 配置路由是因为目前NDP转发存在一些问题,需要这么操作来保持客户端持续被发现。
- 务必不要打开
IGMP组播嗅探
,会拦截NDP pack
Ebtables Bridge
原理
- 针对
IPV4
进行NAT
- 针对所有
IPV6
数据包进行 转发
Tradeoff
- 非常稳定,不会出bug
- 路由器没有v6,无法挂PT
实现
检查环境:
由于沙邮为全WiFi,所以我使用WIFI的5Ghz作为一个Client连接到学校的AP上,同时也作为AP发射信号。如果你的驱动不支持,会无法同时作为 AP & Client。
- WIFI接入用户
apclii0
是无线网卡在wan上的接口,因固件而异。可以ssh到路由器上ifconfig
看,一般有类似数据的就是你的无线网卡。而br-lan就是你的LAN域(WIFI AP + LAN)。root@Openwrt:~ $ ifconfig apclii0 Link encap:Ethernet HWaddr 22:76:XX:43:XX:AC inet addr:10.122.232.XX Bcast:10.122.255.255 Mask:255.255.192.0 inet6 addr: 2001:da8:215:8f01:XXXX:XXff:fXX3:6XXc/64 Scope:Global inet6 addr: fe80::2076:XXff:fXX3:6XXc/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:319321 errors:0 dropped:0 overruns:0 frame:0 TX packets:237847 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
- 有线接入用户
如果物理接口选对,wan6应该直接是好的。不需要任何操作。否则你就无法获取ipv6。
配置网桥:
请跟据自己的接口配置寻找WAN接口(apclii0或是eth0.2或是eth1之类的)
- WIFI接入用户
ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i apclii0
brctl addif br-lan apclii0
- 有线接入用户
ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i eth0.2 brctl addif br-lan eth0.2
持久化:
每次重启后操作会消失,因此需要将其置于/etc/rc.local中持久化(rc.local自己补知识)。但由于系统刚启动时WiFi初始化没完成,直接运行会产生未预期行为,因此要等启动完了再操作。
又由于rc.local是阻塞的,所以将这段代码放到脚本里后台执行,同时如果启动时如果rc.local产生了输出也会导致Bug,因此如下操作:
-
在/etc/config目录(关机不清空)下新建
boot.sh
-
内容如下,sleep 20(睡眠20秒)用来保证作为Client的WiFi已经上
#!/bin/sh sleep 20 # 如果你是有线网可以不需要这一条 ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i apclii0 brctl addif br-lan apclii0
-
chmod +x boot.sh
(执行权限) -
编辑
/etc/rc.local
, 在exit 0
前加入/etc/config/boot.sh > /dev/null 2>&1 &
-
避免odhcpd 分配ipv6与桥接冲突(不要把自己的v6暴露到外网)
/etc/init.d/odhcpd stop /etc/init.d/odhcpd disable
重启并检测
参考文章
1.OpenWRT IPv6 三种配置方式(NEED OVER WALL)
2.OpenWRT 设置 IPv6 的问题
沙发,Maki太强了
tql
byr支持一下
强无敌,感谢!