聊一聊代理
什么是代理
代理(Proxy)是一个中间服务,它在客户端和目标服务器之间转发请求和响应。
代理的用途
- 用于 CDN 缓存技术, 静态内容或动态内容的加速服务(
反向代理
) - 服务端负载均衡, 包括 web 服务或其他 TCP 或 UDP 服务(
反向代理
) - 隐藏真实服务端地址, 保障服务端安全(
反向代理
) - 公司网关旁路控制, 比如防火墙用途、客户端访问授权、客户端上网行为控制(
透明代理
) - 缓存服务, 比如部分运营商部署缓存服务, 为本网用户提供加速服务并节省网间结算费用(
透明代理
) - 隐藏客户端 IP(
正向代理
) - 访问受限网站(
正向代理
) - 通过缩短路径加速访问目标服务(
正向代理
) - 用户主动配置, 需要使电脑所有应用全部使用代理方式访问外网(
VPN 代理
)
代理的种类
反向代理
客户端把反向代理服务器当作是真正的目标服务器去请求数据, 客户端并不知道目标服务器是否是代理. 反向代理服务器收到请求后, 再作为客户端去真正的服务端请求数据, 然后把响应的内容在本地缓存或不缓存, 同时响应给客户端.
实现反向代理的软件有很多, 常用的比如 Nginx 的ngx_http_proxy_module
模块和ngx_stream_proxy_module
模块等.
正向代理
一般所说的代理就是指的正向代理, 正向代理包括HTTP
代理、HTTPS
代理、socket5
代理.
HTTP 代理
客户端若通过 HTTP 代理访问网站, 如果访问的是 HTTP 网站, 客户端和 HTTP 代理服务器之间、HTTP 代理服务器和目标服务器之间的通讯都是 HTTP 协议;如果访问的是 HTTPS 网站, 客户端和 HTTP 代理服务器之间的通讯也是 HTTP 协议, 而 HTTP 代理服务器和目标服务器之间则是 HTTPS 协议.由于现在的 HTTP 代理都支持CONNECT
请求, 所以通过 HTTP 代理也可以访问 HTTPS 网站.只有访问 HTTPS 网站才会使用CONNECT
方法.
一般我们常用的代理工具基本都是 HTTP 代理, 比如fiddler
、goagent
、squid
等.
HTTP 代理是应用层的代理, 只支持HTTP/HTTPS
协议代理.
HTTPS 代理
HTTPS 代理和 HTTP 代理的唯一区别就是客户端和 HTTPS 代理服务器之间的通讯也是 HTTPS 协议.
需要在 HTTPS 代理服务器上配置证书.
本地浏览器设置, 添加证书到客户端的受信任的根证书:
以 Windows 下 Chrome 浏览器为例, 将服务器上的公钥publickey.pem
下载至本地, 重命名至publickey.crt
, 在 Chrome 中依次点击"设置" - “显示高级设置” - “HTTP/SSL” - “管理证书”, 在"受信任的根证书颁发机构"选项卡中"导入"这个crt
证书就完成了.
代理客户端配置, 比如 chrome 的扩展插件SwitchyOmega
:
将本地的代理客户端指向 HTTPS://你的服务器IP或主机名>:4128
, 这里的 IP 或主机名和生成公钥时的 Common Name
一致, 端口为 stunnel 的端口.如果有配置 HTTP 认证的话, 需要在客户端中配置对应的用户名和密码.
HTTPS
代理是应用层的代理, 只支持HTTP/HTTPS
协议代理
Socks 代理
Socks
代理在TCP/IP
协议栈的传输层上运行, 对应OSI
模型的话就是会话层.与应用层代理不同, Socks
代理只是简单的传递数据包, 并不关心是何种应用协议, 所以比应用层代理要快不少, 并且更加通用.
常用的Socks
代理有Socks4
和Socks5
两种.Socks4
代理只支持TCP
协议, 而Socks5
代理不但TCP
和UDP
协议都支持, 并且还支持各种身份验证的安全机制, 同时还它还采用地址解析方案(addressing scheme
)来支持服务端域名解析(比如说浏览器配置了使用Socks5
代理, 那么访问的网站的域名解析工作也是在Socks5
代理服务器上解析的)和IPV6
.
可以说 Socks5 的出现缓解了各种具体应用协议需要专门设计代理协议的困难局面, 不过并不是凡是基于 TCP/IP 协议的应用软件, 都可以无条件通过 Socks5 服务器进行通讯, 前提提交是应用软件本身具有 Socks5 的接口, 才能利用 Socks5 代理服务器.
一个支持 Socks5 协议的应用软件, 通常具有 2 种运行状态:
- 直接通讯状态.
- Socks5 通讯状态.
Socks5 代理通常使用1080
端口.
sock5 协议本身没有加入加密策略, 所以是明文传输, 不过可以使用Socks5+Stunnel5
来实现客户端到代理之间的加密传输.
Shadowsocks 代理
Shadowsocks
是一种安全的Socks5
代理, 也就是加密的 Socks5 代理, 基于多种加密方式, 所以客户端到代理服务器之间的数据传输是加密的.
Shadowsocks
安装和使用需要服务端和客户端.使用方式是客户端安装完成后启动在本地监听, 其他要使用代理的应用通过各自的Socks5
接口来配置监听在本地的 ip 和端口, 一般是127.0.0.1:1080
.
服务端有很多实现版本, 最早是 python, 目前已停止维护, 还有libev(c)
、go
、node.js
(已停止维护)等.
客户端也比较全, 包括Windows
、MacOS
、IOS
、Android
、路由器(基于OpenWRT
).
SSH 代理
SSH(Secure Shell
, 安全外壳协议)是一种加密通道, 这里说的 SSH 代理, 是指使用 SSH 加上Socks
代理的方式组合成为一种加密代理.
使用方式是在本地安装 ssh 客户端工具, ssh 连接远程服务器, 并在用户本地监听端口, 然后在需要使用代理的应用, 比如浏览器将代理配置为socks:127.0.0.1:1080
即可.
VPN 代理
VPN(Virtual Private Network)
, 虚拟专用网. VPN 的主要功能是在公网上建立私有网络, 进行加密通讯. 一般用于企业数据中心之间的内网安全互通, 或者员工在公共网络上安全访问公司数据中心资源使用.
VPN 的实现方式主要有:
PPTP/L2TP
, 工作在 2 层IPSec
, 工作在 3 层MPLS
, 结合 2 层和 3 层SSL VPN
, 工作在 7 层
在这里主要说的是作为全局代理来使用.拨通 VPN 后, 相当于接入了另外一个网络, 整个电脑对外传输的数据都要通过这个网络进行, 自然上网使用的公网 IP 也是另外网络的, 实现了代理功能.
另外客户端到 VPN 代理之间是加密传输的, 可以防止访问行为被截获.
NAT 代理
NAT 代理其实不算是严格意义上的代理了, 纯网络方式实现更换用户上网 IP.之前做过的一个 NAT 代理方案:
拨 VPN(用户端)+(VPN 设备+iptables TEE 模块)+ssh 隧道+分散在各地的数台 NAT 服务器(iptables 实现 nat)
透明代理
透明代理本质上就是正向代理, 上述所说的正向代理都需要客户端主动配置代理 IP 和端口或认证信息才能使用, 而透明代理对用户是透明的, 也就是说用户本地不需要做任何配置, 用户可能就不知道有代理的存在.比如一些公司的上网行为管理软件、个别小运营商部署的缓存系统等都属于透明代理.
透明代理的实现一般是由网关防火墙的重定向(或流量镜像的方式)策略将用户的请求交给正向代理服务器处理来实现.
如何防止上网行为被监控
只访问 HTTPS 网站
访问 HTTPS 网站, 由于 HTTP 应用层内容全部被加密, 所以可以避免被监控到访问的具体内容, 但是访问了哪些网站还是可以被监控到的, 因为域名解析是在用户本地进行的, 且不是加密的, 所以通过公司的本地递归 DNS 还是可以收集和分析你访问的域名信息
使用 HTTPS 代理
通过 HTTPS 代理就可以解决我们访问 HTTP 网站也不被监控到了, 因为客户端和 HTTPS 代理之间也是走的 HTTPS 协议.但是还是没有解决 DNS 解析被监控的问题, 因为会先进行 DNS 解析拿到目标网站 IP 地址, 再走 HTTPS 代理.
Shadowsocks、Socks5+Stunnel5 的代理方案、SSH 代理
使用这 3 种方案既能解决访问网站内容不被监控到, 又能解决访问的域名不被监控到, 因为域名解析也交给代理去做了.
除了访问网址之外, 支持 Socks5 的应用都可以使用.
VPN 代理
终极方案, 使用 VPN 代理的方式, 你的电脑上的所有应用的所有数据传输都不会被监控到.能被监控到的只是你和这个 VPN 地址之间有传输数据的行为和传输数据量而已.
注意: 如果使用 HTTP 代理或者不加密的 Socks5 代理, 那么访问 HTTPS 网站也不再安全了. 当然如果你的电脑上存在公司的监控插件(比如自动截屏), 通过什么代理都是徒劳的.