接受传入的 IPv6 范围并将其转发到另一个接口

接受传入的 IPv6 范围并将其转发到另一个接口

我有一个使用 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

相关内容