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