本随笔记录了在Pandorabox固件下(OpenWRT也适用)IPV6中继失效问题的踩坑和解决过程。
路由器:Newifi 3
固件版本:PandoraBox 19.02
零、故障描述
参考配置了dhcp服务器,发现后台设备无法获取到IPV6地址,拓扑如下:
电信光猫——路由器——PC
路由器/etc/config/dhcp内容如下:
config dnsmasq option domainneeded '1' option boguspriv '1' option filterwin2k '0' option localise_queries '1' option rebind_protection '0' option rebind_localhost '1' option local '/lan/' option domain 'lan' option expandhosts '1' option nonegcache '0' option authoritative '1' option noping '0' option readethers '1' option leasefile '/tmp/dhcp.leases' option resolvfile '/tmp/resolv.conf.auto' option localservice '1' option allservers '1' option sequential_ip '1' option redirect_all '0' option noresolv '0' option ignore '1' list server '127.0.0.1#5333' config dhcp 'lan' option interface 'lan' option start '100' option limit '150' option leasetime '12h' option dhcpv6 'relay' option ndp 'relay' option ra 'relay' config dhcp 'wan6' option interface 'wan6' option master '1' option dhcpv6 'relay' option ndp 'relay' option ra 'relay' config odhcpd 'odhcpd' option maindhcp '0' option leasefile '/tmp/hosts/odhcpd' option leasetrigger '/usr/sbin/odhcpd-update' option loglevel '4'
一、初查,定位故障点
通过进入光猫后台,发现光猫支持两种方式分配IP地址,DHCPv6和SLACC两种方式,目前使用DHCPv6方式。
调整为SLACC发现可以实现IP地址的获取,遂定位问题点出在DHCPv6报文的中继转发上。
通过路由器安装tcpdump抓包,发现路由器在lan侧收到了报文,在wan侧存在中继请求和中继应答报文,但是lan侧没有转发应答报文,判断中继应答报文的转发出现异常
lan端捕获到了请求报文
wan端有捕获到中继应答报文
二、编译、调试odhcpd
因为使用的是Pandorabox的固件,需要到官网下载相关的SDK才可以进行编译,所幸下载地址http://downloads.pangubox.com:6380/尚可访问,成功下载到了SDK。
进入对应版本的SDK,替换对应的mirror为前面提到的地址,执行一次make,下载完所需的依赖后,完成了编译前的准备工作。
进入github,找了OpenWRT组织维护的odhcpd代码,下载了一份最新版本,同时从archive路径下扣了package.mk文件放置到SDK的package目录下,参考了一下archive里面UCI的MAKEFILE,结合自己的摸索,改了下MAKEFILE以支持odhcpd的代码编译。
1 # 2 # Copyright (C) 2008-2014 OpenWrt.org 3 # 4 # This is free software, licensed under the GNU General Public License v2. 5 # See /LICENSE for more information. 6 # 7 8 include $(TOPDIR)/rules.mk 9 10 PKG_NAME:=odhcpd 11 PKG_VERSION:=1.11-3 12 PKG_BUILD_PARALLEL:=0 13 14 include $(INCLUDE_DIR)/package.mk 15 include $(INCLUDE_DIR)/cmake.mk 16 17 18 CMAKE_OPTIONS = 19 -DUBUS=1 20 -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON 21 22 define Package/odhcpd 23 SECTION:=base 24 CATEGORY:=Base system 25 DEPENDS:=+libnl-tiny +libubox +libuci +libubus 26 TITLE:=Odhcpd for OpenWRT 27 endef 28 29 TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include 30 TARGET_LDFLAGS += -L$(STAGING_DIR)/usr/lib 31 32 define Package/odhcpd/install 33 $(INSTALL_DIR) $(1)/sbin 34 $(INSTALL_BIN) $(PKG_BUILD_DIR)/odhcpd $(1)/sbin/ 35 endef 36 37 $(eval $(call BuildPackage,odhcpd))
很明显的,编译不报错,是不可能的。编译报错发现缺少了mkdir_p的函数实现,参考了1.11版本的odhcpd代码,移植了相关实现,解决了此问题,移植代码如下:
1 static int mkdir_p(char *dir, mode_t mask) 2 { 3 char *l = strrchr(dir, '/'); 4 int ret; 5 6 if (!l) 7 return 0; 8 9 *l = '