我有一个使用 IPv4 的 OpenVPN 设置。为了准备 IPv6 支持,我做了以下工作:
- ens3 接口(可以访问互联网)从 ISP 获得了一个 /64 地址
- 我将 /64 拆分成两个 /65
- ens3 现在有 ....::/65
- OpenVPN 服务器配置为使用 ....:8000::/65
- 因此 tun0(OpenVPN 设备)有 ....:8000::1/65
- 当客户端连接时,他们会从分配的适当范围内获取地址,例如....:8000::1000/65
问题:IPv6 通信仅在传出方向有效。入站流量不起作用,因为 ISP 网关询问例如ICMP6, neighbor solicitation, who has ....:8000::1000
哪些数据包到达 ens3,但我的服务器对此没有响应。我想我必须告诉我的服务器和 ens3 接受 ....:8000::/65 范围的数据包并将其转发到 tun0?!但我不确定如何做到这一点。
如果这相关,我在 Fedora 机器上使用firewalld。
编辑
在@kasperd 向我指出了有关路由前缀的良好解释后,我继续阅读相关内容。
我还没有找到关于如何从托管服务提供商处请求路由前缀的文档。所以我想我必须继续使用我的自分割 /65 前缀。如果这不是一个干净的解决方案,请告诉我如何改进!
为了响应提到的邻居请求,需要启用 NDP 代理。sysctl -w net.ipv6.conf.all.proxy_ndp=1
对于固定数量的客户端,现在可以执行ip neigh add proxy ....:8000::1000 dev ens3
。要使用 OpenVPN 自动执行此过程,可以将以下两行添加到 OpenVPN 服务器配置中:
script-security 2
learn-address ./proxy-ndp
proxy-ndp
脚本正在
#!/bin/bash
extif=ens3
op="$1"
addr="$2"
if [[ "$addr" != *":"* ]]; then
# no IPv6
exit 0
fi
case "$op" in
add|update)
/usr/sbin/ip neigh replace proxy "$addr" dev "$extif"
;;
delete)
/usr/sbin/ip neigh del proxy "$addr" dev "$extif"
;;
esac
此外,如果 IPv6 转发尚未存在,则应使用 启用此功能sysctl -w net.ipv6.conf.all.forwarding=1
。最后一步是允许网络接口之间的转发。由于我使用防火墙,因此命令是firewall-cmd --direct --add-rule ipv6 filter FORWARD 0 -i tun0 -o ens3 -j ACCEPT
。