我已经在我的一台服务器上使用 Squid 作为透明代理很长一段时间(几年)了。
基本上,我在客户端和 ssh + Squid 服务器之间创建了一个 SSH 隧道,执行以下操作:
ssh -T -N -x -C -L3128:127.0.0.1:3128 cedric@xxx
然后我启动我的网络浏览器(chromium),在端口 3128 上为它提供一个位于 127.0.0.1 的代理服务器。
这在很长一段时间内工作得很好,但后来我开始在许多网站上出现日志记录问题(论坛、使用 Google 作为登录权限的 stackexchange 等)。有些一直工作正常(例如 GMail 和所有 GMail 服务)。我不知道是什么导致了登录问题:我认为这是由于我升级服务器操作系统和软件时的一些 Squid 配置问题造成的。
因此,我考虑设置一个 VPN,但后来通过阅读一篇名为“SSH 作为穷人的 VPN”的文章,我意识到我可以使用 SSH,并从客户端简单地执行此操作:
ssh -D 5222 cedric@xxx -N
然后将我的浏览器配置为使用 127.0.0.1 作为端口 5222 上的 SOCKS 主机。
现在一切正常:所有登录问题似乎都已解决,我什至不再需要服务器上的 Squid。
但是我不明白它是如何工作的。从各种“我的IP是什么”网站中,我看到了我的服务器的地址(这就是我想要的)。此外,这些站点似乎没有检测到 SSH“隧道”正在运行。
基本上我的问题是:从技术上讲,使用 Squid 作为透明代理与使用“SSH -D ... -N”和使用 VPN 之间有什么区别?
从我访问的网站的角度来看,有什么不同吗?
另外我想知道是否有任何方法可以让我访问的网站在使用“SSH -D ... -N”时能够检测到我的真实IP?这在技术上是否可行,或者浏览器根本无法获得该信息?
答案1
1)Squid是http和https流量的特殊代理。正如它所知,该协议可以提供一些高级功能,例如缓存、过滤、重写规则、DNS 解析。所有网络浏览器都知道如何处理 http 代理,因为它是该协议规范的一部分。
此外,Squid 还可以充当透明的您无需配置 Web 浏览器来使用它,但防火墙会将流量重定向到代理。浏览器不知道它正在使用代理,这就是这种情况下透明的含义。从这个意义上说,您的旧设置并不透明。
2) ssh -D 充当与协议无关的 SOCKS 代理。它只是获取隧道本地端袜子端口上的所有流量,提取有效负载并将其未经修改和检查地发送到远程端,然后将其发送到真正的目的地。为了让 SOCKS 代理工作,客户端程序必须专门支持它,因为从客户端发送到袜子代理的每个数据包都必须进行更改(封装),以便袜子代理知道将其发送到哪里。我不知道是否所有网络浏览器都支持它,但原则上它适用于许多协议,而不仅仅是 http。
3) 您的旧命令行ssh -T -N -x -C -L3128:127.0.0.1:3128 ...
仅打开一个简单的隧道,其中来自本地端口 3128 的所有流量均未经修改地发送到预定义的目的地 127.0.0.1:3128。您可以将其用于任何客户端,因为不需要修改发送的包,但您只有固定的目的地。
除了代理之外,ssh 始终使用加密隧道,以便您的数据在通过隧道时不会被窥探。
您的旧设置结合了方法 1 和 3,但原则上它们可以单独工作,具体取决于具体情况。
4) 通过 VPN,您还可以创建从本地主机到“代理”服务器的加密隧道。在这种情况下,它不限于一个客户端程序,但您的操作系统会将所有非本地网络流量发送到您的代理,然后代理将其转发到目的地。要管理它,您需要 root/管理员权限,因此设置可能不那么容易。
在所有四种情况下,数据首先发送到远程主机,然后远程主机创建到目标 Web 服务器的真实连接并发送您的请求。答案首先返回到远程主机,远程主机在一些内部数据中查找真正的目的地,然后将其发送回原始客户端。显示您 IP 的网站只能看到远程主机,不知道您的隧道/代理。
编辑:
如果网站确实想知道您的 IP,可能会通过网页中的 JavaScript 或插件来执行某些代码,这些代码可能会使用一些错误,从而在您的浏览器中执行代码。如果您绝对需要隐藏您的真实 IP 地址,您必须禁用 javascript 和插件。
编辑2:
添加VPN