![无需 VPN 即可通过 TLS 重定向所有网络流量](https://linux22.com/image/1418763/%E6%97%A0%E9%9C%80%20VPN%20%E5%8D%B3%E5%8F%AF%E9%80%9A%E8%BF%87%20TLS%20%E9%87%8D%E5%AE%9A%E5%90%91%E6%89%80%E6%9C%89%E7%BD%91%E7%BB%9C%E6%B5%81%E9%87%8F.png)
假设:
服务器:
- 我有一个 Debian Squeeze 服务器,可在公共互联网上路由,具有静态 IPv4 地址。
- 我可以不受限制地修改服务器上的软件。
- 服务器可以监听任意端口,重新配置防火墙规则,基本上对服务器的功能没有任何限制。
客户:
- 我可以在我的计算机上运行 Firefox、Java 程序、.NET 程序和一些不需要管理员权限的本机可执行文件当地的系统(没有管理员权限的锁定的 Windows 桌面)。
- 我可以在 Firefox 中安装附加组件。
- 我可以监听 loopback (
localhost
) 接口上的任何端口。因此,上述程序能绑定到本地端口并执行任意网络 I/O,无需通过代理。 - 全部公共互联网访问通过限制性 HTTP 代理进行路由,该代理会阻止许多站点,并进行仔细的状态检查。在端口 80 上,它仅允许 HTTP(无 TLS/SSL)。在端口 443 上,它允许
CONNECT
基于 SSL/TLS 的远程主机访问未被域名/IP 地址阻止的远程主机。 - 限制性 HTTP 代理才不是对通过代理允许的 TLS 连接进行深度数据包检查,并且才不是对这些连接执行中间人攻击。
- 我可以访问的上述服务器是不是被代理阻止。
目标:
我想路由全部Firefox 通过上述服务器通过 SSL/TLS 发出的 HTTP 和 HTTPS 请求。
关于“目标”的其他说明:
- 即使终端站点(例如
http://superuser.com
)没有对我的服务器使用 SSL/TLS,我仍然希望使用 SSL/TLS从我的客户端到我的服务器,并让我的服务器执行 HTTP 请求——无论是否加密——到我想要的目的地。 - 我不管如果我的服务器正在“明文”查看 SSL 流量。换句话说,如果远程服务器正在被访问,我不需要从本地客户端到远程服务器进行完整的端到端 SSL 加密。换句话说,
https://google.com
我相信服务器对我的数据保密。 - 我愿意安装任何不需要管理员权限并且可以在 32 位 Windows 7 上运行的软件或 Firefox 插件。
- 开源软件优于专有软件,免费软件优于需要许可费的软件。
- 与编写新软件相比,我更倾向于使用现有软件,但如果这是唯一的方法,我愿意编写代码。
我正在寻找一个松散描述的“解决方案”,它描述:
- 客户端需要什么软件?如果您知道某个特定的软件包,请说出它的名字;否则,请描述客户端软件需要什么做。
- 服务器上需要什么软件?如果您知道某个特定的软件包,请说出它的名字;否则,请描述服务器软件需要什么做。
- 如果您上面提到了特定的软件包,请描述需要设置哪些配置参数才能达到我的目标。
- 如果出于某种原因你认为这是不可能, 描述为什么。
我试过但不起作用的方法
- 在服务器上安装后
squid
,我尝试在服务器上设置自己的标准 HTTP 代理。这没有奏效,因为当我通过常规 HTTP 在 Firefox 中请求网站时,Firefox 也尝试通过常规 HTTP 访问我的服务器!这是不可接受的,因为我的本地网络上的代理当然可以观察和/或阻止我的客户端和服务器之间的常规 HTTP 流量。 - VPN 不起作用,甚至无法通过 TLS 监听端口 443 的 OpenVPN,因为我没有权限在本地计算机上安装
tun
可以执行第 3 层路由的网络适配器,也无法执行任何类型的第 2 层路由(例如tap
)。简而言之:我需要管理员权限才能安装 OpenVPN,即使我暂时拥有这些管理员权限,如果公司发现它已安装,他们也不会高兴。Java 或 .NET 程序不太引人注意,尤其是当它未安装在“添加/删除程序”中并且没有像 OpenVPN 那样的内核驱动程序组件时。
答案1
我想到了。:D该解决方案满足全部并满足我的要求全部完美地实现了我的目标。考虑到实现此目标所需的间接级别,性能也不算太差。
一般做法是:
设置本地证书颁发机构 (CA),并生成 RSA“服务器密钥”和“客户端密钥”(我使用了 256 位加密)。为此,我使用了简易RSA版本 3.0.0-rc2。
在“Debian Box”(公共互联网上的服务器)上运行任何标准 HTTP 代理,确保它监听本地主机仅(不应暴露在公共互联网上)。出于我的目的,我使用了
Privoxy
,但Squid
效果一样好。由于它只监听本地主机,因此无需身份验证(除非您的机器上运行着您不信任的进程;在这种情况下,哎呀...)下载隧道并将其安装在客户端和服务器上。执行此操作的过程将特定于操作系统;就我而言,我选择从源代码编译 stunnel(偏执狂......)用于 Windows,这是一个相当复杂的过程,我不会在这里详细介绍。在服务器端,它可以在包管理器中使用 :)
Stunnel 的配置一开始看起来相当复杂,但其实比想象的要简单!基本上,在服务器上,您需要类似下面的“服务器的 stunnel.conf”。在客户端上,您需要类似下面的“客户端的 stunnel.conf”。
启动 Privoxy;在服务器上启动 stunnel,将其指向配置文件;在客户端上启动 stunnel,将其指向配置文件。Privoxy 的配置其实没什么特别的;默认配置对我来说就够了。
在 Firefox(客户端选择的浏览器)中,将 HTTP 和 HTTPS 代理设置为与客户端的 stunnel 正在监听的端口相同 - 可能类似于 localhost:8080。
我可能应该注意,如果你的本地网络的代理需要某种身份验证,你要么必须让 stunnel 为你进行身份验证,要么使用其他本地拦截代理并将它们链接在一起 - 类似于 Firefox -> stunnel -> 本地身份验证代理 -> LAN 代理/网关 -> internet -> 您服务器的 stunnel -> privoxy。
虽然需要大量复制,但确实有效!
;This is the *client's* stunnel.conf.
[https]
accept = localhost:9020
connect = your.lan.proxy:80
client = yes
protocol = connect
;protocolHost should be the same as the "accept" for the server
protocolHost = 1.2.3.4:443
;Same CAfile, different cert and key pair
CAfile = ca.crt
cert = client.crt
key = client.key
;VERY IMPORTANT!!! Make sure it's really your server and not a MITM attempt by your local network by making sure that the certificate authority "ca.crt" really signed the server's cert
verify = 2
;More performance tweaks...
sessionCachetimeout = 600
sessionCacheSize = 200
TIMEOUTidle = 600
。
;This is the *server's* stunnel.conf.
[https]
;1.2.3.4 is a publicly-routable, static IP address that can be connected to by your box that's under the firewall
accept = 1.2.3.4:443
;localhost:8118 is an example of where your local forwarding HTTP(S) proxy might reside.
connect = localhost:8118
CAfile = ca.crt
cert = server.crt
key = server.key
;VERY IMPORTANT!!! Without this, anyone in the world can use your public stunnel port as an open proxy!
verify = 2
;Set some timeouts higher for performance reasons
sessionCacheTimeout = 600
sessionCacheSize = 200
TIMEOUTidle = 600
一切配置完成后,最终结果将如下所示:
- 您的网络浏览器连接到
localhost:9020
(stunnel)并将其视为可以接受 HTTP 和/或 HTTPS 连接的代理。 - 一旦 stunnel 从您的浏览器获得连接,它就会通过防火墙的代理/网关与您的远程服务器建立 TLS 会话。此时,您的客户端会验证您的服务器的 PKI 证书,反之亦然。
- 一旦与远程服务器建立 TLS 会话,stunnel 就会将来自浏览器的数据(例如 HTTP 请求或 SSL 隧道请求)通过本地代理直接传递到您的服务器。此通道已加密,因此您的本地网络无法判断数据包含什么,只能通过流量分析进行猜测。
- 一旦
stunnel
实例运行在您的服务器上开始接收数据时,它会打开一个连接localhost:8118
,例如,您的 HTTP(S) 代理服务器(在我的情况下是 Privoxy)正在监听该连接。 - 然后,Privoxy 就像一个普通的转发 HTTP 代理服务器一样,并通过服务器的 ISP 将您的请求转发到公共互联网上。
所涉及的套接字和缓冲区的数量使得此方法的开销非常高,特别是如果您通过代理嵌套 SSL 连接,但它的优点是你的本地网络无法知道哪些网站您通过 SSL 进行访问。我的意思是,它知道您正在访问您的服务器,但除此之外,它不知道您正在访问 Gmail 还是 SuperUser 或任何其他服务。而且您的本地网关无法过滤或阻止您。
答案2
我已经在本地机器上尝试过这种设置,我可以保证“限制代理”会得到一个CONNECT DEBIAN_IP:443 HTTP/1.1
,但它看不到任何证书,所以我不确定这是否可行。
假设你的 Debian 有Apache
或Squid
要进行代理和SSH 服务器。在您的客户端电脑上,您需要putty
,这是一个不需要管理员权限即可运行、不需要安装并且可以从 pendrive 运行的程序。
首先是你的 Debian:
让您的 SSH 监听端口,只需添加443
(或替换当前端口)并允许 TCP 转发(在该文件中添加)Port 443
/etc/ssh/sshd_config
AllowTcpForwarding yes
配置 Squid 或 Apache 进行代理。由于这将通过 SSH 隧道使用,因此它只需要监听环回接口。如果您使用 Apache:
Listen 127.0.0.1:8080
ProxyRequests On
<Proxy *>
Order deny,allow
</Proxy>
服务器完成之后,让我们配置您的客户端电脑:
在 putty 上,将 Debian 的公共 IP 配置为Host
和443
端口。确保SSH
仍处于选中状态。更改设置Connection -> Proxy
,选择HTTP
并填写“限制代理”设置。更改设置并建立-Connection
的 keepalive 。更改为。建立后,在 上,。保持选中状态并按。您应该会在上方的空白处看到类似 的内容。更改回设置,在第一行写下名称并30
60
Connection -> SSH -> Tunnels
source port
8080
Destination
localhost:8080
Local
Add
L8080 locahost:8080
Session
Saved sessions
保存所有这些繁琐的设置以帮助在接下来的几天重新建立连接。
现在您可以尝试Open
连接到您的 Debian。如果您看到用户提示,我们距离完成此操作仅一步之遥。如果没有...我们将不得不寻找其他方法。
现在,在 Firefox 上,将localhost
端口设置8080
为您的代理。
答案3
您已在服务器上设置了一半代理。另一半是服务器上的 SSL,以及客户端上的本地代理,使用 putty 连接到启用 SSL 的 HTTP 代理,并将 Firefox 设置为将所有内容代理为 127.0.0.1。
我刚刚快速地在谷歌上搜索了腻子设置,发现了这个:https://mariobrandt.de/archives/technik/ssh-tunnel-bypassing-transparent-proxy-using-apache-170/