尝试了解 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 子网分配给您自己的网络是另一个章节,我不会在这里介绍。:-)