连接到 OpenVPN 时的托管服务

连接到 OpenVPN 时的托管服务

有时我会托管不同的服务(Web 服务器、游戏服务器等),即使我已连接到 OpenVPN 服务器,我也希望通过我的真实 IP 地址访问这些服务。在 Windows 中,我无需更改任何内容,只需使用默认设置即可,如何在 Linux 中以相同的方式进行设置?

答案1

我花了一段时间才搞明白。虽然没有我想象的那么简单,但确实有效。感谢@dirkt 为我指明了正确的方向。

首先,在 /usr/local/bin 目录中创建以下脚本:

nsstart

#!/bin/sh

# Enable eno1 interface
# eno1 is the name of the interface I get my connection from, change it so it fits your system
ip link set eno1 up

# Add 'internet' namespace
ip netns add internet

# Create veth pair and add veth1 to 'internet' namespace
ip link add type veth
ip link set veth1 netns internet
ip link set veth0 up

# Create bridge interface and add eno1 and veth0 to it
ip link add type bridge
ip link set bridge0 up
ip link set eno1 master bridge0
ip link set veth0 master bridge0

# Enable namespace interfaces, add IP and route
ip netns exec internet ip link set lo up
ip netns exec internet ip link set veth1 up

# Set a free IP from your routers IP range here
# You can also use a DHCP client if you have one, mine didn't work with namespaces
ip netns exec internet ip addr add 192.168.1.99/24 dev veth1

# Set IP of the router here
ip netns exec internet ip route add default via 192.168.1.1 metric 10

nsinternet

#!/bin/sh

# Execute the command in internet namespace as user who called sudo
ip netns exec internet sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"

然后在文件中添加并启用 systemd 服务/etc/systemd/system/internet-namespace.service(我用systemd-networkd它来从路由器获取 IP,如果你使用其他 IP,请在下面进行更改,以便在 DHCP 客户端尝试获取其地址之前设置网桥):

[Unit]
Description=Sets up a namespace that uses real internet connection instead of OpenVPN
After=systemd-udevd.service
Before=systemd-networkd.service network.target
Wants=network.target

[Service]
Type=oneshot
RemainAfterExit=1
ExecStart=/usr/local/bin/nsstart

[Install]
WantedBy=multi-user.target

然后将这一行添加到sudoers文件中(这是可选的,当您尝试使用我们创建的命名空间时,它将使您不必输入密码):

%wheel ALL=NOPASSWD: /usr/local/bin/nsinternet

不要忘记添加bridge0到您的 DHCP 客户端。

就是这样。启用 openvpn-client 服务,一切就绪。现在默认命名空间是使用 VPN 连接的命名空间,如果您想使用真实的互联网连接,只需运行sudo nsinternet YOUR_COMMAND

相关内容