Ced*_*tin 5 ssh http-proxy squid
我一直在我的一台服务器上使用 Squid 作为透明代理很长一段时间(几年)。
基本上从客户端,我在我的客户端和 ssh + Squid 服务器之间创建了一个 SSH 隧道,这样做:
ssh -T -N -x -C -L3128:127.0.0.1:3128 cedric@xxx
Run Code Online (Sandbox Code Playgroud)
然后我会启动我的网络浏览器(chromium),在端口 3128 上的 127.0.0.1 上为它提供一个代理服务器。
这在很长一段时间内都运行良好,但后来我开始在许多网站(论坛、使用 Google 作为登录权限的 stackexchange 等)上出现日志问题。有些一直工作正常(如 GMail 和所有 GMail 服务)。我不知道是什么导致了登录问题:我认为这是由于我升级服务器的操作系统和软件时的一些 Squid 配置问题。
所以我考虑建立一个 VPN,但后来通过阅读一篇名为“SSH 作为穷人的 VPN”的文章,我意识到我可以使用 SSH 并简单地从客户端执行此操作:
ssh -D 5222 cedric@xxx -N
Run Code Online (Sandbox Code Playgroud)
然后将我的浏览器配置为使用 127.0.0.1 作为端口 5222 上的 SOCKS 主机。
现在一切正常:所有登录问题似乎都解决了,我什至不再需要服务器上的 Squid。
但是我不明白它是如何工作的。从各种“我的 ip 是什么”网站,我看到了我的服务器地址(这是我想要的)。此外,这些站点似乎没有检测到正在运行的 SSH“隧道”。
基本上我的问题是:从技术上讲,使用 Squid 作为透明代理与使用“SSH -D ... -N”和使用 VPN 之间的区别是什么?
从我访问的网站的角度来看,有什么不同吗?
另外我想知道在使用“SSH -D ... -N”时,我正在访问的网站是否有任何方式能够检测到我的真实IP?这在技术上是否可行,还是浏览器根本无法获得该信息?
1)squid是http和https流量的特殊代理。因为它知道这个协议,它可以提供一些高级功能,如缓存、过滤、重写规则、DNS 解析。所有 Web 浏览器都知道如何处理 http 代理,因为它是该协议规范的一部分。
此外,Squid 可以充当透明代理,您无需将 Web 浏览器配置为使用它,但防火墙会将流量重定向到代理。浏览器不知道它正在使用代理,这在这种情况下是透明的含义。从这个意义上说,您的旧设置并不透明。
2) ssh -D 充当与协议无关的 SOCKS 代理。它只是接收进入隧道本地端的socks端口的所有流量,提取有效载荷并将其未经修改和未经检查地发送到远程端,然后将其发送到真正的目的地。为了使 SOCKS 代理工作,客户端程序必须特别支持它,因为必须更改(封装)从客户端发送到 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/administrator 权限,因此设置起来可能并不容易。
在所有四种情况下,数据首先发送到远程主机,然后创建到目标 Web 服务器的真实连接并发送您的请求。答案首先返回到远程主机,该主机在一些内部数据中查找真正的目的地,然后将其发送回原始客户端。显示您 IP 的网站只能看到远程主机,不知道您的隧道/代理。
编辑:
如果网站真的想知道您的 IP,则可能会通过网页中的 javascript 或插件,在您的浏览器中执行代码,可能会使用一些错误。如果您绝对需要隐藏您的真实 IP 地址,则必须禁用 javascript 和插件。
编辑2:
添加了 VPN