将 OpenVPN 流量路由到 IP 隧道

将 OpenVPN 流量路由到 IP 隧道

我通过 OpenVPN 连接到我的服务器 1,但不想在浏览网页时显示其 IP,因此我打开了到另一台服务器(服务器 2)的 IP 隧道。我该如何设置路由和 IP 表,以便 OpenVPN 的流量通过此 IP 隧道,然后在浏览网站时显示服务器 2 的 IP?

Server1 和 Server2 可以通过 IPTunnel 访问。

  • Server1 公网 IP:198.51.100.1
  • 服务器1 OpenVPN IP:10.8.0.0
  • 服务器1 IP隧道IP:172.20.9.1
  • Server2 公网 IP:203.0.113.1
  • 服务器2 IP隧道IP:172.20.9.2

谢谢 :)

答案1

主要问题在于server1。它与互联网有直接连接,它会通过此连接将所有数据包发送到互联网。但是,您希望它通过隧道将来自其 VPN 客户端的所有数据包发送到互联网。这是不可能的使用简单的基本路由来执行。

要解决这个问题,你必须使用 Linux 的策略路由。我建议你阅读完整的 LARTC 章节(不仅仅是那个页面)然后再继续,因为了解正在发生的事情对您来说至关重要!

现在,当您读完该内容后,让我们将其用于我们的目的。

目前你的server1路由大概有以下几种(命令显示ip route):

198.51.100.0/24 dev eno1 src 198.51.100.1
default via 198.51.100.2 dev eno1
172.20.9.0/30 dev wg1 src 172.20.9.1
10.8.0.0/30 dev tun0 src 10.8.0.1
10.8.0.0/24 via 10.8.0.2 dev tun0

前两个路由是 server1 的 Internet 连接,第三个是隧道,最后两个与 OpenVPN 相关。(我假设物理接口称为eno1,隧道是称为 的 WireGuard 虚拟设备wg1,并且 OpenVPN 处于服务器 net30 模式并使用tun0。)

规则表如下所示(ip rule)—默认情况下:

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

您需要添加额外的路由表和规则:

ip route add default via 172.20.9.2 table 200
ip rule add from 10.8.0.0/24 lookup 200

如果您将表注册到文件中,则可以用表的符号名称代替数字,/etc/iproute2/rt_tables如 LARTC 中所述。

这对服务器本身没有任何影响。但是,地址为 的客户端10.8.0.6将根据策略使用该表进行路由200,因此它们到 Internet 的流量将通过wg1路由表中定义的隧道进行路由200

剩下的就简单了。在 server2 上,为它们设置一条通往 VPN 客户端和 NAT 的路由:

ip route add 10.8.0.0/24 via 172.20.9.1
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE

(再次,我假设服务器 2 上的物理接口eno1也被调用。)

如果您想使用现代 NFTables 而不是传统的 IPTables,请将 masquerade 命令更改为以下内容:

nft add rule ip nat POSTROUTING oifname "eno1" ip saddr 10.8.0.0/24 masquerade

在 OpenVPN 服务器配置中,您可以将其设置为通过 VPN 向客户端推送默认路由(与上面 @dominix 的评论相反,如果您希望客户端通过 VPN 浏览互联网,您实际上需要向所有客户端推送默认路由):

push "route 0.0.0.0 0.0.0.0"

不要忘记启用 IP 转发两个都服务器:

sysctl net.ipv4.ip_forward=1

就这样。您必须弄清楚如何使用发行版的网络配置功能使此操作永久生效。由于您没有指定在服务器上使用的发行版,因此我将把它留作家庭作业。

相关内容