跳到主要内容

代理相关

前置准备

阿里的弹性伸缩

TODO: ECS 实例:待更新...

代理的分类

参考资料:代理服务器介绍及种类划分 参考资料:代理服务器是如何工作的?

代理服务器按照协议分,可以分为以下几种:

  • HTTP 代理: 能够代理客户机的 HTTP 访问,主要是代理浏览器访问网页,它的端口一般为 80、8080、3128等;

  • FTP 代理: 能够代理客户机上的 FTP 软件访问 FTP 服务器,它的端口一般为 21、2121;

  • RTSP 代理: 代理客户机上的 Realplayer 访问 Real 流媒体服务器的代理,其端口一般为 554;
  • SOCKS 代理: SOCKS 代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心是何种应用协议,所以 SOCKS 代理服器比其他类型的代理服务器速度要快得多。SOCKS 代理又分为 SOCKS4 和 SOCKS5,二者不同的是 SOCKS4 代理只支持 TCP 协议(即传控制协议),而 SOCKS5 代理则既支持 TCP 协议又支持 UDP 协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解等。SOCK4 能做到的 SOCKS5 都可得到,但 SOCKS5 能够做到的 SOCKS 则不一定能做到,比如我们常用的聊天工具 QQ 在使用代理时就求用 SOCKS5 代理,因为它需要使用 UDP 协议来传输数据。

从另一个角度来说,代理又可以分为三种,即高度匿名代理、普通匿名代理和透明代理。

  1. 高度匿名代理:不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实 IP 是隐藏的服务器端不会认为我们使用了代理;
  2. 普通匿名代理:能隐藏客户机的真实 IP,但会改编我们的请求信息,服务器端有可能会认为我们使用了代理;
  3. 透明代理:它不但改变我们的请求信息,还会传送真实的 IP 地址。

代理服务器按照功能可分为三类

  • 转发代理服务器
  • 反向代理服务器
  • 开放式代理服务器

转发代理服务器(正向代理服务器)

用户发送了连接到特定网站的请求,它首先必须通过转发代理服务器,该服务器决定是否允许客户端访问该资源。如果是,则连接请求将转到外部服务器,该服务器看不到客户端的 IP 地址,而仅看到从正向代理服务器发送的连接请求。

转发代理服务器提供对本地网络连接的完全管理控制。它充当屏蔽或防火墙,使管理员可以限制内部网络客户端对不需要的 Web 资源的访问。校园网大多使用这种代理服务器。

反向代理服务器

与正向代理服务器不同,反向代理服务器在网站(或 Web 服务)的一侧工作,对外部用户隐藏内部网络中的 IP 地址。反向代理决定 Web 用户是否可以查看网站的内容或使用 Web 服务。

优点在于,反向代理服务器使黑客很难攻击内部服务器。此外,还有负载均衡的作用,在内部服务器之间分散数据,从而防止大量连接请求导致的服务器过载。Web 服务提供商大多使用这种代理服务器。

开放式代理服务器

开放式代理服务器既可以转发互联网用户的请求,也可以接收网站的响应。这种代理服务器的主要功能是从 Web 隐藏用户的原始 IP 地址。与专用代理不同,开放式代理服务器不需要用户方面的身份验证,并且容易受到攻击。

部署代理服务器

参考资料:服务端如何获取客户端请求IP地址

服务器是如何获取用户 IP 的?因为用户可能会使用代理,所以如何取得代理下面的真实 IP 地址就尤为重要了,服务端获取客户端请求 IP 地址,常见的包括:x-forwarded-for、client-ip 等请求头,以及 remote_addr 参数。

remote_addr:指的是当前直接请求的客户端IP地址,它存在于 TCP 请求体中,是 HTTP 协议传输的时候自动添加,不受请求头header 的控制。因此,当客户端与服务器之间不存在任何代理的时候,通过 remote_addr 获取客户端IP地址是最准确,也是最安全的。

x-forwarded-for:即 XFF,是很多代理服务器在请求转发时添加上去的。如果客户端和服务器之间存在代理服务器,那么通过 remote_addr 获取的 IP 就是代理服务器的地址,并不是客户端真实的 IP 地址。因此,需要代理服务器(通常是反向代理服务器)将真实客户端的 IP 地址转发给服务器,转发时客户端的真实IP地址通常就存在于 XFF 请求头中。

client-ip 同 XFF,也是代理服务器添加的用于转发客户端请求的真实IP地址,同样保存与请求头中。

重点: 1.remote_addr 无法伪造。

TODO: 待更新...

Ubuntu 设置代理

export http_proxy="http://proxy-XXXXX:port"
export https_proxy="https://proxy-XXXXX:port"
# or
export all_proxy="socks5://proxy-XXXXX:port"

# 如果代理服务器需要用户名和密码才能访问,需要填写上面的username和passwd部分,否则的话,省略这两部分。
export https_proxy="http://username:password@proxyServer:port/"

# 设置不需要代理的地址
export no_proxy="127.0.0.1,192.168.124.0/16,*.example.com"

取消代理

unset http_proxy
unset https_proxy

如果使用 Clash for Windows 则更方便

export hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*')
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"

测试:

sudo apt install w3m
w3m www.google.com