限于某些原因 F-Stack 项目之前是未对 IPv6 进行支持的,随着 IPv6 需求的增多,近期对 IPv6 进行了支持。本文将简单介绍 F-Stack 支持 IPv6 所做的修改,如何使用以及相关注意事项。
以下所列为 F-Stack 支持 IPv6 所进行的修改,具体改动细节可查看 github 相关 commits。
Makefile
中定义 IPv6 相关的宏INET6
及需要包含编译的文件NETINET6_SRCS
opt/opt_inet6.h
中定义#define INET6 1
ff_api.h
中将 AF_INET6
重新定义为 FreeBSD 中的值 28, 增加 AF_INET6_LINUX
宏定义供应用调用 Linux 系统函数时使用,如inet_pton
struct 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
包,可能影响对端进行性能测试