仅将OpenVPN用于一个应用程序/服务

仅将OpenVPN用于一个应用程序/服务

我正在使用托管在其他地方的 ubuntu 服务器。在该服务器上,运行的一项功能是传输。我想知道我是否可以只为该应用程序使用 VPN,因为一旦启用 VPN,由于 IP 发生变化,我将无法访问服务器。

我见过 namespaced-openvpn 但不确定它是否适用于此应用程序

(我正在使用无头式 Ubuntu)

谢谢

答案1

您所要求的是使用 OpenVPN 为 Torrent 客户端 Transmission 进行拆分隧道,其复杂性取决于您喜欢的防火墙规则。我本来想写一些基础知识,但由于已经有关于如何设置分割隧道凭证具有后备功能只进行传输以遵循该凭证,我只是假设你已经有一个有效的 OpenVPN 配置和适当的 DNS 限制(没有泄漏)给出一些指示。

1.在您已经拥有某些程序时进行安装sudo apt install iptables resolvconf apt-utils。现在向您的系统添加一个没有任何超级用户权限的新用户sudo adduser --disabled-login zzz是这个新用户的名字。为了避免服务权限问题,请将 zzz 添加到您的组,并将您的组添加到 zzz。

sudo usermod -aG zzz <username>
sudo usermod -aG <group_username> zzz 

2.检查ip route list并找到看起来像这样的行192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.101eth01是活动网络接口,192.168.1.101是 inet。您的可能有所不同。在遵循接下来的脚本时请注意这些。

3.刷新iptables规则sudo iptables --flush。附加一条规则,限制 zzz 用户使用常规网络接口,仅通过 OpenVPN 隧道有效。

sudo iptables -A OUTPUT ! -o lo -m owner --uid-owner zzz -j DROP

安装sudo apt install iptables-persistent并按下是的对于它所请求的任何许可。

4.在 openvpn 配置目录上创建一个新的脚本文件sudo nano /etc/openvpn/iptables.sh并添加该脚本。

#! /bin/bash

export INTERFACE="tun0"
export VPNUSER="zzz" # watch out.
export LOCALIP="192.168.1.101"
export NETIF="eth0"

# Look up the first article on "iptables Script for vpn User" section for the script, I don't know if I'm allowed to paste that. 
# The script simply  uses iptables built-in chains to redirect network traffic to VPN.

使此脚本可执行sudo chmod 755 /etc/openvpn/iptables.sh
创建 IP 路由脚本sudo nano /etc/openvpn/routing.sh并输入

#! /bin/bash

VPNIF="tun0"
VPNUSER="zzz"

# Look up the first article on "Routing Rules Script for the Marked Packets" section for the script, I don't know if I'm allowed to paste that.
# The script simply puts some routing commands to block the traffic when VPN goes down.

使此脚本可执行sudo chmod 755 /etc/openvpn/routing.sh

5.将新的 zzz 用户值添加到IP 路由表 sudo nano /etc/iproute2/rt_tables。只需200 zzz在最后一行添加。
此外,您还可以添加新的核参数配置为sudo nano /etc/sysctl.d/zzz.conf并放入

net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.eth0.rp_filter = 2

这可能没有必要,因为它只是将安全性强化到内核级别。
重新加载 sysctl 和 systemd sudo sysctl --systemsudo systemctl daemon-reload现在检查 openvpn 是否运行正常,以及你的 openvpn 终端 IP 是否为用户 zzz,systemctl status [email protected]sudo -u vpn -i -- curl ifconfig.co

如果curl显示正确的 VPN IP,您就可以继续执行后续步骤。您不应与服务器断开连接。

6.停止 transmission-daemon 服务sudo systemctl stop transmission-daemon。在 处创建一个新目录和一个systemd配置sudo mkdir -p /etc/systemd/system/transmission-daemon.service.d && sudo nano /etc/systemd/system/transmission-daemon.service.d/local.conf。粘贴配置

[Unit]
After=sys-devices-virtual-net-tun0.device
Wants=sys-devices-virtual-net-tun0.device

[Service]
User=
User=zzz
Group=
Group=zzz

Type=simple

ExecStart=
ExecStart=/usr/bin/transmission-daemon -f --log-error -g /etc/transmission-daemon

Restart=on-failure
RestartSec=5

这将允许transmission服务仅在 openvpn 服务运行后运行。重新加载 systemd sudo systemctl daemon-reload

7.为传输添加适当的用户、组和权限

sudo chown -R zzz:zzz /etc/transmission-daemon/ && sudo chmod -R 775 /etc/transmission-daemon/
sudo chown -R zzz:zzz /var/lib/transmission-daemon/ && sudo chmod -R 775 /var/lib/transmission-daemon/

对 transmission 的所有下载文件夹执行相同操作,如sudo chown -R zzz:zzz ~/Downloads && sudo chmod -R 775 ~/Download
将更改的目录添加到 transmission 设置sudo nano /etc/transmission-daemon/settings.json

"download-dir": "/home/Downloads",
"umask": 002,

8.最后打开sudo systemctl start transmission-daemon.service。如果您使用的是 Transmission Web GUI,请按照 nginx 方法操作。您可以尝试检查 torrent 是否与 openvpn IP 配合使用这里

答案2

上述答案很难/需要很长时间才能实现。看来更简单的方法是:https://github.com/slingamn/namespaced-openvpn

测试了一下,效果符合预期!

为了简化.bashrc我创建了 1 个函数和 2 个别名:

vpn_run() { nohup $1 &>/dev/null & }

alias vpn-prepare='sudo /path-to/namespaced-openvpn --config /path-to/openvpn.ovpn'
alias vpn-run='vpn_run'

因此你应该使用以下命令运行两个终端:

  1. vpn-prepare
  2. vpn-run <COMMAND><COMMAND>-例如where ='firefox'。它将在后台运行应用程序

相关内容