![只针对某些特殊软件设置VPN,不针对系统所有部分?](https://linux22.com/image/1080768/%E5%8F%AA%E9%92%88%E5%AF%B9%E6%9F%90%E4%BA%9B%E7%89%B9%E6%AE%8A%E8%BD%AF%E4%BB%B6%E8%AE%BE%E7%BD%AEVPN%EF%BC%8C%E4%B8%8D%E9%92%88%E5%AF%B9%E7%B3%BB%E7%BB%9F%E6%89%80%E6%9C%89%E9%83%A8%E5%88%86%EF%BC%9F.png)
如何仅在系统的某些部分使用 VPN?这意味着,例如,Firefox 和 aria2c 将使用 vpn,而 pidgin 则不会!这可能吗?
就我而言,我希望对整个系统使用 VPN,但 transmission、apt-get 和 pidgin 除外,反之亦然:仅对这些软件使用 vpn:firefox、aria2c、youtube-dl
答案1
这个答案需要一些编译(更多信息请参见上文)、root 访问权限和来自包的ip
命令
iproute
sudo apt-get install iproute
这将检索并编译bind.so
当前目录中的 PRELOAD 库。
wget http://www.ryde.net/code/bind.c.txt -O bind.c
gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE
现在,我们假设您的 VPN 处于在线状态,并且您知道隧道设备名称(如 tun0)。我们还假设您知道默认网关 ( route |awk '/default/ {print $2 }'
) 以及隧道/其他设备网关route |awk '/tun0/ {print $2 }'
## run as root:
## which device to route out with (tun0, eth0, wlan0)
export DEV=tun0
## default gw to use for that device (see above for advice)
export DEVGW=192.168.1.1
# which routing table to use
export TABLE=special_table1
# get ip for "$DEV"
export BINDIP=$(ifconfig $DEV | perl -ne 'if (/inet addr:([\d\.]+)/) {print $1}')
## create empty routing tables
# match name to TABLE variable above with unique number before it.
# like: (creates two tables)
echo 201 special_table1 >> /etc/iproute2/rt_tables
echo 202 special_table2 >> /etc/iproute2/rt_tables
## add default gw for special routing table
ip route add default via $DEVGW dev $DEV table $TABLE
## source route all traffice from you bound ip through that
ip rule add from $BINDIP table $TABLE
# flush routing cache
ip route flush cache
查看你的路由表:
# This is the main table (should basically have same info as `route -n`)
ip route show table main
# your special_table1
ip route show table special_table1
# this this you can see which source ips trigger which routing table
ip rule show
运行带有 bind.so PRELOADED 的 Firefox 之类的程序,并将其绑定到您想要用来路由流量的接口。
### run as user
## change DEV to with route/device you want your program to bind to
export DEV=tun0
export BINDIP=$(ifconfig $DEV | perl -ne 'if (/inet addr:([\d\.]+)/) {print $1}')
BIND_ADDR="$BINDIP" LD_PRELOAD=./bind.so "PROGRAM NAME"
#like:
BIND_ADDR="$BINDIP" LD_PRELOAD=./bind.so firefox
如果需要,您可以对任意数量的接口重复此操作,然后使用 bind.so 将特定应用程序绑定到特定接口。所有未使用 bind.so 启动的应用程序都将按照主路由表指定的方式路由出去。
答案2
如果您可以确定想要与 VPN 一起使用的特定 IP 地址和/或端口(反之亦然),那么 ip 命令将通过允许/禁止此类路由来帮助您做到这一点。
ip 命令位于 iproute 包中:
sudo apt-get install iproute
man ip
我一直以非常有限的方式使用它,所以我不想给你详细的信息,但我确信你可以通过文档弄清楚。你也可以在网上找到关于如何使用 ip 命令执行此类操作的很好示例。
答案3
可以配置监听套接字(即提供服务的程序)以使用特定适配器。但 Firefox 等客户端程序通常只会将 IP 数据包发送到操作系统(通过绑定到 0.0.0.0),而这些数据包如何到达互联网则由操作系统决定。
一些客户端程序确实允许您配置绑定到特定的适配器 IP 地址,但如何执行此操作取决于每个应用程序的配置。
可以配置 IPTABLES2 使用 PID(进程 ID)将 IP 路由到给定的适配器,但此 PID 将不断变化,因此需要不断更新防火墙规则。
更好的解决方案是安装一个简单的SOCKS代理,例如 Squid(相当复杂)、tinyproxy、Dante 或 SS5。
绑定代理服务器以在 lo 适配器上提供 SOCKS5,并将其配置为通过 VPN 适配器发送所有 IP。
如果将代理服务器绑定到以太网端口,则同一网络中的其他机器可以使用相同的 SOCKS 服务器。
配置每个需要使用VPN的应用程序以使用代理服务器。
答案4
如果您想使用 vpn 来路由您的流量,并且您想例如将它与 Firefox 一起使用,例如您可以这样做:进入 Firefox,转到选项菜单:
进入“高级”->“网络”选项卡
现在在“连接设置”对话框中:
选择手动配置
在 SOCKS 主机中,输入你的环回 IP 地址(始终为 127.0.0.1)
使用你上面选择的端口(80,或 8080,如果你不想使用 80,也可以使用其他端口)
确保选择了 SOCKS v5
如果你不想代理某些地址(可能是 localhost 或其他地址),请
在“无代理:”文本框中输入这些地址\域
单击确定。
一切就绪。您可以检查您的 IP 是否正常工作。
http://www.whatismyip.org
其余申请的流程应该相同。请注意,并非所有申请都有这些选项。