
限于某些原因 F-Stack 项目之前是未对 IPv6 进行支持的,随着 IPv6 需求的增多,近期对 IPv6 进行了支持。本文将简单介绍 F-Stack 支持 IPv6 所做的修改,如何使用以及相关注意事项。
以下所列为 F-Stack 支持 IPv6 所进行的修改,具体改动细节可查看 github 相关 commits。
Makefile 中定义 IPv6 相关的宏INET6及需要包含编译的文件NETINET6_SRCSopt/opt_inet6.h中定义#define INET6 1ff_api.h中将 AF_INET6重新定义为 FreeBSD 中的值 28, 增加 AF_INET6_LINUX宏定义供应用调用 Linux 系统函数时使用,如inet_ptonstruct sockaddr相关的所有结构体全部使用struct sockaddr_storage替换并对相关的参数和代码进行修改protocol_filter_ip函数进行修改,支持对 IPv6 包进行匹配,需跳过 IPv6 不同的扩展头,支持 IPv4 over IPv6、IPv6 over IPv4、ICMPv6 等包类型的匹配。config.ini中增加部分 IPv6 相关参数,如配置net.inet6.ip6.auto_linklocal, net.inet6.ip6.accept_rtadv等参数默认开启 IPv6,并接受 RA 组播等ifconfig,route ,netstat工具进行了修改,以支持 IPv6 相关操作tools/opts.mk中修改MK_INET6_SUPPORT="yes"开启 IPv6 编译选项tools/compat/include下相关目录 因为 Nginx 本身即支持 IPv6, 所以改动较少,仅改动 ff_module模块ngx_ff_module.c下的fstack_territory函数,增加对 AF_INET6的支持即可。
Nginx 并未对绑定到系统 Host 进行 IPv6 的支持,如有需要可自行修改,需在全部判断AF_INET6代码处增加AF_INET6_LINUX的支持,或其他更多修改。
对 example/main.c修改了增加了 IPv6 的服务端 DEMO,自行定义INET6即可开启
本节给出在 AWS EC2 运行 helloworld的简单演示,及部分相关配置命令
helloworld程序。需注意以下两点:ixgbevf或ena两种网卡,而 F-Stack 包含的 dpdk 18.11.2 LTS版本的此两种网卡驱动均不完善(如均不支持设置网卡混杂模式,无法收到 RA 组播;ena网卡驱动无法正常运行多进程模式等),需在 DPDK 官网下载 DPDK 19.05或以上版本替换 F-Stack目录下的 dpdk目录,再行编译。如 EC2 实例使用了ena网卡,且需使用 kni 功能,还需参照 issue #401 对相关代码进行修改。example/Makefile或相关文件中定义INET6开启helloworld的 IPv6 支持,编译支持 IPv6 的helloworld程序tools目录下执行make;make install命令编译并安装 F-Stack 相关系统工具# 为 f-stack-0 配置 IPv6 地址
ff_ifconfig f-stack-0 inet6 <记录的IPv6 地址>/<prifixlen> auto_linklocal accept_rtadv autoconf defaultif
# 查看 f-statck-0 网卡的相关信息
ff_ifconfig
# 查看 IPv6 路由信息
ff_route -6 show ::/0
# 查看本机端口监听和连接信息
ff_netstat -na在 F-Stack 配置了 IPv6 地址后,F-Stack 会发送 MLD 组播侦听报文加入广播组接收路由组播 RA 信息,并且会发送相关 NS 信息,接收路由的 NA 响应信息,所以如果本网络环境支持 MLD 组播(如AWS EC2),则可无需手工配置 IPv6 路由,如在其他环境使用可以使用如下命令配置 IPv6 路由信息
ff_route -6 add ::/0 <网关 IPv6 地址>需要注意的是,在 AWS EC2 环境中使用 F-Stack 的 IPv6 功能,运行一段时间后无法 F-Stack 会收不到网关应发送的 RA 组播信息,且向网关发送 NS 请求,网关也不再回应 NA 应答,IPv6 连接会因无有效的邻居和路由信息而中断,原因尚未明确,但在其他环境运行未发现此问题。
ff_sysctl工具配置net.inet.tcp.nolocaltimewait参数的值为0(当前版本已默认配置为0), 否则在 F-Stack 应用程序主动关闭连接时,在接收到对方应答的 fin+ack包后不会发送 last ack包,可能影响对端进行性能测试