通过 OpenVPN 进行 IPv6 路由

通过 OpenVPN 进行 IPv6 路由

尝试了解 IPv6 如何与 OpenVPN 配合使用,因此我想设置以下方案。

我有一台 VPS 服务器(Ubuntu),已分配一个 /48 子网。

ISP ipv6 gateway is XXXX:XXXX:XXXX::1
Server ipv6 address is XXXX:XXXX:XXXX:39::1

这个想法是,任何连接到服务器的客户端都会在 XXXX:XXXX:XXXX:39:2::/64 子网上获得一个 IP 地址。

服务器配置文件基于 OpenVPN 的示例配置,并添加以下内容:

dev tun
tun-ipv6
server-ipv6 XXXX:XXXX:XXXX:39:2::/64
push "route-ipv6 XXXX:XXXX:XXXX:39::/48"

重新启动 OpenVPN 服务器没有出现任何问题。

服务器分配了以下 IP 地址:

eth0: XXXX:XXXX:XXXX:39::1/48
tun0: XXXX:XXXX:XXXX:39::2/64

客户被指定:

OpenVPN tap:XXXX:XXXX:XXXX:39:2:0:1:0,我可以 ping XXXX:XXXX:XXXX:39::1。但是从客户端 ping ISP 网关会导致连接超时。

我可以从服务器 ping ISP ipv6 网关。

我已在 Ubuntu 防火墙中允许来自 XXXX:XXXX:XXXX:39:2::/64 的流量。

我错过了什么?

我应该提到服务器正在运行 OpenVPN 版本 2.2.1 - 这是抱怨的原因吗?

答案1

事实证明,将我的托管服务器用作 IPv6 网关并不那么容易。虽然这是一个多步骤的过程,但还是可行的。

我最终在这里问了一些问题,所以下面是我在此过程中学到的内容的总结。

为了获得可路由的子网,我去了 Hurricane Electric,并从 Hurricane Electric 那里获得了一个路由的 /48 子网。请访问https://tunnelbroker.net有关如何获取您自己的子网的更多信息。

他们将提供通过 IPv4 隧道路由的 IPv6,还会告诉您应该添加什么/etc/interfaces

我的隧道链路上的 IPv6 地址形式为:2001:470:xxxx:xxx::/64。因此,应将以下几行添加到/etc/interfaces

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
    address 2001:470:xxxx:xxx::2
    netmask 64
    endpoint <ipv4 address Tunnelbroker side> 
    local <public ipv4 address your side>
    ttl 255
    gateway 2001:470:xxxx:xxx::1

但是由于我的服务器已经有公共 IPv6 地址,这会导致一些问题,我们必须先缓解这些问题,然后才能从 Tunnelbroker 子网 ping 任何内容。

#输入基于策略的路由。

其理念是,服务器根据源 IPv6 地址来决定应该为 IPv6 流量使用哪个出站链接。

规则非常简单。

  • 如果流量来自服务器本身,则使用默认网关。
  • 如果流量来自我的 /48 子网,则使用 IPv6 over IPv4 链接。

这意味着你需要两个路由表。默认路由表(称为:)main和你自己的路由表(我称之为mynet6)。

首先添加自定义路由表的条目:

echo 100     mynet6 > /etc/iproute2/rt_tables

为了论证的目的,假设我被分配了子网2001:db8:cafe::/48

我编写了一个脚本,当 VPN 链接启动时,OpenVPN 会调用该脚本,因为我的 /48 子网仅驻留在我的 VPN 链接上。该脚本有点像这样:

# Reset IPv6 routing table.
ip -6 rule flush

# Add default IPv6 rules again - since they gets deleted by the initial rule 
# flush command.
ip -6 rule add priority 32766 from all table main

# Reset Tunnelbroker routing table (table name: "mynet6").
ip -6 route flush table mynet6

# All traffic from my /48 subnet should be added to Tunnelbroker routing table
ip -6 rule add priority 32000 from 2001:DB8:CAFE::/48 table mynet6

# Add routeable VPN subnets to Tunnelbroker routing table
ip -6 rule add from 2001:DB8:CAFE::/48 table he-ipv6

# Remember to add a rule that if no machine does not respond to a 
# packet address in my /48, then we should return unreachable. 
# Else the package will be forwarded by default out through the 
# Hurricane Electric connection.

#(From the Internet)
ip -6 route add unreachable 2001:DB8:CAFE::/48

#(From my /48 subnet)
ip -6 route add unreachable 2001:DB8:CAFE::/48 table mynet6

# Any traffic that originates from VPN has to be forwarded via Tunnelbroker 
# routing table using the tunnelbroker link (link name: he-ipv6).
ip -6 route add default via 2001:470:xxxx:xxx::1 dev he-ipv6 table mynet6

#验证配置

您可以使用以下命令验证您的路由设置:

ip -6 rule show

它应该包含类似这样的内容:

0:      from all lookup local
32000:  from 2001:db8:cafe::/48 lookup mynet6
32766:  from all lookup main

可以通过以下方式找到 Tunnelbroker 链路的路由表:

ip -6 route show table mynet6

它应该输出类似这样的内容:

unreachable 2001:db8:cafe::/48 dev lo  metric 1024  error -113 pref medium
default via 2001:470:xxxx:xxx::1 dev he-ipv6  metric 1024  pref medium

您的默认路由表位于此处:

ip -6 route show table main

其中还应包含以下内容:

unreachable 2001:db8:cafe::/48 dev lo  metric 1024  error -113 pref medium
default via XXXX:XXXX:XXXX::1 dev eth0  metric 1024  pref medium

这应该说明了服务器在从 /48 子网接收流量时必须执行的操作。如何将 /48 子网分配给您自己的网络是另一个章节,我不会在这里介绍。:-)

相关内容