无需VPN即可通过TLS重定向所有网络流量


10

假设:

服务器:

  • 我有一个Debian Squeeze服务器,该服务器可在公共Internet上路由,具有静态IPv4地址。
  • 我无限制地访问服务器上的软件。
  • 服务器可以侦听任意端口,重新配置防火墙规则,基本上服务器不受限制。

客户:

  • 我可以运行Firefox,Java程序,.NET程序以及一些不需要在本地系统上具有管理员访问权限的本机可执行文件(没有管理员权限的锁定Windows桌面)。
  • 我可以将Addons安装到Firefox中。
  • 我可以在Loopback(localhost)接口上的任何端口上监听。因此,上述程序可以绑定到本地端口并执行任意网络I / O,而无需通过代理。
  • 所有公共Internet访问都通过限制性HTTP代理进行路由,该HTTP代理会阻止许多站点并进行仔细的状态检查。在端口80上,它仅允许使用HTTP(无TLS / SSL)。在端口443上,它允许CONNECT基于SSL / TLS的远程主机不受域名/ IP地址的阻止。
  • 限制性HTTP代理不会对通过代理允许的TLS连接执行深度数据包检查,并且不会对这些连接执行中间人攻击。
  • 我可以访问的上述服务器没有被代理阻止。

目标:

我想通过上述服务器,通过SSL / TLS 路由Firefox发出的所有 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不起作用,甚至无法监听443端口上的TLS上的基于TLS的OpenVPN,因为我没有本地计算机上的权限来安装tun可以执行第3层路由的网络适​​配器,也无法进行任何形式的第2层路由(例如tap)。简而言之:我需要管理员权限才能安装OpenVPN,即使我临时拥有这些管理员权限,如果他们发现已安装该公司,公司也不会太高兴。Java或.NET程序不那么引人注目,尤其是当它未安装在“添加/删除程序”中且没有像OpenVPN那样的内核驱动程序组件时。

你尝试袜子吗?您可以在服务器的端口443上定义它。
Ashian

您可以使用本文所述的解决方案:穷人的HTTP VPN吗?请注意,它到HTTPTunnel的链接不正确。
harrymc

1
proxy.org可能会有帮助。
Arjan

@Ashian不,SOCKS将无法工作,除非将其包装在TLS中。SOCKS不是基于HTTP的协议,因此当它到达内部代理时,它将被阻止。如果我能够运行它通过TLS,我可能会使用不同的协议。我的第一个问题是以Firefox可以使用的方式设置TLS隧道。我仍然没有看到如何做的解释。
allquixotic

@harrymc:问题标题通过TLS表示。HTTP隧道通过HTTP路由IP数据包,该数据包是未加密的,并且使用TLS。文章本身说该连接未加密。我的代理人绝对不可能让它通过。此外,我没有socatWindows客户端框的管理员权限。
allquixotic

Answers:


5

我想到了。:D此解决方案可以完全满足我的所有要求并满足我的所有目标。考虑到实现此目标所需的间接级别,性能也不算太差。

因此,一般的方法是:

  1. 设置本地证书颁发机构(CA),并生成RSA“服务器密钥”和“客户端密钥”(我使用256位加密)。为此,我使用了Easy-RSA版本3.0.0-rc2。

  2. 在“ Debian Box”(公共Internet上的服务器)上运行任何沼泽标准HTTP代理,确保仅在本地主机上侦听(不应将其暴露于公共Internet上)。就我的目的而言,我使用Privoxy,但Squid效果也一样。由于它仅在localhost上侦听,因此不需要身份验证(除非您不信任的框上正在运行进程;在这种情况下,是yikes ...)

  3. 下载stunnel并将其安装在客户端和服务器上。这样做的过程将取决于操作系统。就我而言,我选择从Windows编译源代码(偏执狂...),这是一个相当复杂的过程,在此不再赘述。在服务器端,它在包管理器中可用:)

  4. 首先,Stunnel的配置令人生畏,但它比看起来简单!基本上,在服务器上,您需要类似下面的“服务器的stunnel.conf”。在客户端上,您需要类似下面的“ client's stunnel.conf”。

  5. 启动Privoxy;在服务器上启动stunnel,将其指向配置文件;在客户端上启动stunnel,将其指向配置文件。实际上,Privoxy的配置没有什么特别的。默认对我来说很好。

  6. 在Firefox(客户端选择的浏览器)中,将HTTP和HTTPS代理设置为与客户端的通道正在侦听的端口相同-可能类似于localhost:8080。

我可能应该注意,如果您本地网络的代理需要某种身份验证,则您要么必须获得stunnel身份验证,要么使用另一个本地拦截代理并将它们链接在一起-类似于Firefox-> stunnel-> local身份验证代理-> LAN代理/网关->互联网->服务器的通道-> 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

完成所有配置后,最终结果看起来像这样:

  1. 您的Web浏览器连接到localhost:9020(隧道),并将其视为可以接受HTTP和/或HTTPS连接的代理。
  2. 一旦通道从浏览器获得连接,它就会通过防火墙的代理/网关与您的远程服务器建立TLS会话。此时,客户端将验证服务器的PKI证书,反之亦然。
  3. 与远程服务器建立TLS会话后,隧道将通过本地代理直接将来自浏览器的数据(例如HTTP请求或SSL隧道请求)传递到本地代理。此通道是加密的,因此您的本地网络无法知道数据包含什么,只能通过进行流量分析来猜测。
  4. 在服务器上stunnel运行的实例开始接收数据后,它将打开与的连接,例如,这将是您的HTTP(S)代理服务器(在我的情况下为Privoxy)正在监听的位置。localhost:8118
  5. 然后,Privoxy就像普通的转发HTTP代理服务器一样,通过服务器的ISP将您的请求转发到公共Internet。

涉及的套接字和缓冲区的数量使此方法的开销非常高,尤其是在通过代理嵌套SSL连接的情况下,但是其优点是您的本地网络无法知道您正在通过SSL访问哪些站点。我的意思是,它知道您正在访问服务器,但除此之外,它不知道您是否正在访问Gmail或SuperUser或其他。而且您的本地网关无法过滤或阻止您。


2

我已经在本地计算机上尝试了此设置,并且可以确保“限制性代理”将获得CONNECT DEBIAN_IP:443 HTTP/1.1,但是它将看不到任何证书,因此我不确定是否可以使用。

假设:您的Debian拥有ApacheSquid做代理 SSH服务器。在客户端PC上,您需要putty,它是一个无需管理员特权即可运行,无需安装且可以从Pendrive运行的程序。

首先,您的Debian:

让您的SSH在端口上侦听443,只需添加(或替换您当前的端口)Port 443/etc/ssh/sshd_config并允许TCP转发(AllowTcpForwarding yes在该文件上添加)

配置您的Squid或Apache进行代理。由于这将通过SSH隧道使用,因此只需要在回送接口上侦听即可。如果您使用Apache:

Listen 127.0.0.1:8080
ProxyRequests On
<Proxy *>
  Order deny,allow
</Proxy>

服务器完成后,让我们配置客户端PC:

在腻子上,将Debian的公共IP配置为Host443作为端口。确保SSH仍处于选中状态。更改为Connection -> Proxy设置,选择HTTP并填写您的“限制性代理”设置。更改Connection设置,并保持30-的活动状态60。更改为Connection -> SSH -> Tunnels。在source portstablish 8080,和Destinationlocalhost:8080。保持Local选中状态,然后按Add。您应该在上方的空间中看到类似的东西L8080 locahost:8080。改回Session设置,在的第一行上写下一个名称,Saved sessions然后保存所有这些繁琐的设置,以帮助在接下来的几天重新建立连接。

现在,您可以尝试Open连接到您的Debian。如果您看到用户提示,则仅完成此步骤而已。如果没有,我们将不得不寻找另一种方式。

现在,在Firefox上,将localhostport 设置8080为您的代理。


不幸的是,这不起作用,因为SSH的协议不是基于SSL / TLS的。当我客户端上的限制性代理对通过端口443进行的连接进行嗅探时,它立即知道它不是 TLS套接字,并将其丢弃。当然,我可以包装在TLS中,但这不是您的答案所描述的。
allquixotic

我使用HTTP代理(BURP)进行了测试,并且可以正常工作,因此值得尝试。通过TLS包装SSH并使其保持工作状态可能会
有些

TLS上的SSH是不必要的间接。如果已经有了TLS套接字,那么您实际上就不需要SSH。请参阅下面的答案。(注意:直到最近我才知道这个答案,所以这不像我诱骗了您的答案然后发布了解决方案。我从字面上看是在25分钟前发现的。)
allquixotic 2014年

很高兴您解决了问题
NuTTyX 2014年

1

您已经在服务器上设置代理了一半。另一半是服务器上的SSL,客户机上的本地代理使用腻子连接到启用SSL的HTTP代理,并将Firefox设置为将所有代理都代理为127.0.0.1。

我只是通过一个快速的Google进行了腻子设置,发现了这一点:https : //mariobrandt.de/archives/technik/ssh-tunnel-bypassing-transparent-proxy-using-apache-170/


公平地说,他在自己的帖子中介绍了更多细节。不过,谢谢您的投票。
2014年

@krowe在我的答案中没有任何地方显示“ Apache”或“ PuTTY”。
allquixotic 2014年

不,您是否赞成这个答案,这不打扰我!我只是将您的评论解释为说,我在某种程度上昵称他的答案或扯掉了这个答案,而实际上,当我在寻找解决方案时,我并没有从这个答案中获得多少收益。回想起来,链接到的博客似乎可以替代我发布的答案,尽管我不确定它在性能,功能等方面有何不同(可能会更好,也可能会更糟)。
allquixotic 2014年

+1我喜欢这个,因为无论如何我都在运行一个网络服务器。
krowe 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.