我的想法是这样的:
我有要连接的外部 vpn 服务。但我是否可以设置使用该 vpn 连接的本地代理服务器,以便通过该代理连接的应用程序使用 vpn?这适用于 Linux 系统。
欢迎提供提示和链接!
编辑:用例:也许还有其他方法可以做到这一点。
Router #1 - Connects by the default net provided by ISP
Router #2 - Connects by PPTP VPN to another 'ISP'
网络中的客户端默认连接到普通路由器 #1,所有流量都由该路由器处理。客户端有一个不同的浏览器 (opera),该浏览器通过路由器 #2 上的代理进行连接,并最终到达 VPN 隧道的末端。
这清楚了吗?
答案1
虽然你所描述的情况不可能(正在运行的应用程序无法覆盖系统路由表)您可能有几个选择:
- 建立一个您正在访问的网络上有代理通过 VPN 并让您的应用程序默认使用该代理。您可以根据应用程序使用的协议选择多个代理
- ssh 到给定网络上的主机并利用 ssh-s 服务动态转发。这基本上是一个由您的 ssh 客户端组成的 SOCKS 代理。然后您可以使用此代理设置您的应用程序或使用 tsocks(透明 Socks)对其进行调整
ssh_config 手册
动态转发 指定本地计算机上的 TCP 端口通过 安全通道,然后使用应用程序协议来确定 从远程机器连接到哪里。 参数必须是 [bind_address:]port。可以指定 IPv6 地址 通过将地址括在方括号中或使用替代语法 tax: [bind_address/]port。默认情况下,本地端口根据以下条件绑定: 与 GatewayPorts 设置共舞。但是,显式 bind_address 可用于将连接绑定到特定地址。 bind_address 为“localhost”表示绑定到监听端口 仅本地使用,而空地址或“*”表示端口 应该可从所有接口获得。 目前支持 SOCKS4 和 SOCKS5 协议,ssh(1) 将 充当 SOCKS 服务器。可以指定多个转发,以及附加 命令行上可以指定转发。只有超级用户 可以转发特权端口。
答案2
六年后,我又遇到了这个问题,差点因为公认的答案而失望。到今天为止,使用策略路由并不复杂。所有详细信息都可以在同一个网站上找到,网址为https://serverfault.com/a/389004/70774。
就我而言,我首先必须确保 vpn 不是默认路由。如何实现这一点取决于您使用的连接管理器类型。
代理(tinyproxy)以其自己的用户运行,因此我使用命令标记来自该用户的所有包
iptables -t mangle -A OUTPUT -m owner --uid-owner 125 -j MARK --set-mark 2
其中,125
是 tinyproxy 用户的 uid,2
是一个任意数字,稍后进行匹配。
然后我指示路由系统使用特定的表来路由所有标有 的请求2
。
ip rule add fwmark 2 table 3
再次强调,3
只是一个任意数字。请注意选择一张未使用的桌子(看看您选择的桌子上是否有 的东西ip route list table 3
)。
3
然后我用我的默认路线填充表格:
ip route add default dev ppp0 via proto static scope link metric 1024
最后一步是制定一条伪装规则,我不完全理解其必要性:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
瞧!
答案3
这变得相当容易乌贼及其tcp_outgoing_address xxx
参数:
apt install squid
nano /etc/squid/conf.d/proxy2vpn
# put this in: tcp_outgoing_address YOUR_VPN_NIC_IP (check ifconfig)
systemctl restart squid.service
Squid 默认监听端口 3128。
使用示例:
curl --proxy 127.0.0.1:3128 https://ipinfo.io
请求将首先通过 Squid 代理,然后通过 VPN。
答案4
也许我不明白你的问题,但请尝试一下:
- 设置服务器,连接到您的 VPN 服务器(什么类型的 VPN?OpenVpn、PPTP?IPSec?)。
- 将默认网关设为 VPN 端点
- 启用 IP 转发,如下所示:“echo 1 > /proc/sys/net/ipv4/ip_forward”
- 在客户端上,使用您的服务器作为默认网关。