我的想法是这样的:
我有要连接的外部 vpn 服务。但是我是否可以设置一个使用该 vpn 连接的本地代理服务器,以便通过该代理连接的应用程序使用 vpn?这适用于 Linux 系统。
欢迎提供提示和链接!
编辑:用例:也许还有另一种方法可以做到这一点。
Router #1 - Connects by the default net provided by ISP
Router #2 - Connects by PPTP VPN to another 'ISP'
Run Code Online (Sandbox Code Playgroud)
网络中的客户端默认连接到普通路由器 #1,所有流量都由它处理。客户端有一个不同的浏览器(opera),它通过路由器 #2 上的代理连接,并在 VPN 隧道的末端结束。
这清楚吗?
小智 8
六年后,我遇到了这个问题,根据接受的答案几乎让它失望了。截至今天,它并不复杂,使用策略路由。所有详细信息都可以在同一站点上获得,网址为https://serverfault.com/a/389004/70774。
就我而言,我必须首先确保 vpn 不是默认路由。您将如何实现这一点取决于您使用的连接管理器类型。
代理 (tinyproxy) 以其自己的用户运行,因此我使用以下命令标记来自该用户的所有包
iptables -t mangle -A OUTPUT -m owner --uid-owner 125 -j MARK --set-mark 2
Run Code Online (Sandbox Code Playgroud)
其中125是 tinyproxy 用户的 uid,2是一个任意数字,稍后匹配。
然后我指示路由系统使用一个特定的表来路由所有标有2.
ip rule add fwmark 2 table 3
Run Code Online (Sandbox Code Playgroud)
同样,这3只是一个任意数字。只是祈祷注意选择一个未使用的桌子(看看桌子上是否有你选择的东西ip route list table 3)。
然后我3用我的默认路由填充表:
ip route add default dev ppp0 via proto static scope link metric 1024
Run Code Online (Sandbox Code Playgroud)
最后一步是制定一个伪装规则,我不完全理解其必要性:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
等等!
尽管您描述的情况是不可能的(正在运行的应用程序无法覆盖系统路由表),但您可能有多种选择:
\n\n人 ssh_config
\n\n\n DynamicForward\n 指定通过安全通道转发本地计算机上的 TCP 端口,然后使用应用程序协议来确定从远程计算机连接到的位置。\n\n 该参数必须是[bind_address:]端口。可以通过将地址括在方括号中或使用替代的 syn\xe2\x80\x90\n 税收:[bind_address/]端口来指定 IPv6 地址。默认情况下,本地端口与 GatewayPorts 设置绑定在 accor\xe2\x80\x90\n dance 中。但是,可以使用显式的bind_address\n 将连接绑定到特定地址。\xe2\x80\x9clocalhost\xe2\x80\x9d 的bind_address 表示监听端口仅限本地使用,空地址或\xe2\x80\x98*\xe2\x80\x99 表示该端口\n 应可从所有接口使用。\n\n 当前支持 SOCKS4 和 SOCKS5 协议,并且 ssh(1)\n 将充当 SOCKS 服务器。可以指定多个转发,并且可以在命令行上给出附加转发。只有超级用户\n 可以转发特权端口。\n\n