1 分类

使用代理不能避免通信延时, 尽可能使用同网络(运营商), 近距离的代理服务器

1.1 代理自动配置

PAC–Proxy auto-config, 网页浏览器技术,定义http该如何自动选择适当的代理服务器来访问一个网址.

整个PAC的工作流程如下:
pac

使用PAC的优势:

  • 自定义配置, 使用javascript语法, Adblock语法进行配置
  • 防止无意义的绕路, 加快域内网络访问速度
  • 节省代理流量

注意, 这是一种自动代理配置.

1.2 代理自动发现协议

参考: WAPD原理和实现

WAPD–Web Proxy Auto-discovery Protocol, 浏览器自动发现代理服务器, 使代理服务器对用户透明, 借助DHCP,
DNS来查询PAC的位置并使用.

DHCP发现PAC流程:

利用252项, C端需要自动配置时, 即可下载对应PAC自动配置

wpad-dhcp

DNS发现PAC流程:

Client向DNS发起WAPD+X查询, DNS返回WAPD主机的IP, 之后C端下载相应IP的配置, 实现自动配置.
wpad-dns

注意, 这是一种基于PAC的自动代理发现协议.

1.3 网页代理服务器

Web Proxy Server, 在线代理, 线上代理, 服务于HTTP/HTTPS, 一种在网页上运行的代理服务器程序.
对于网页代理而言, 不需要本地PAC进行流量分发或者引导, 所有的流量都首先经过代理服务器, 再回转
到目标网站.

爬虫项目中所谓的IP代理池一般都是网页而代理服务器 + socks5代理, 以代理服务器
为跳板, 以高可匿方式进行数据的抓取工作.

1.4 Socks代理

参考: socket5-protocol

SOCKS–SOCKetS, 用于C端和外部S端通信时的网络传输协议,
OSI模型中居于会话层.

最初目的: 让高权限用户穿过防火墙的限制, 拥有更高权限访问外部网络资源, 通过SOCKS来控制C端访问外部
网络.

最新目的: 一开始, 仅仅是在网络隔离的前提下, 提高部分人员的网络访问权限. 但是, 随着代理软件的发展,
人们找到了SOCKS协议的新用途: 突破网络通信限制, 刚好与最初的目的相反.

现在使用: 经过很多年的发展, SOCKS扩展到SOCKS4, 再升级到SOCKS5, 大部分的应用都已经支持SOCKS5.

认证流程:

socks5-process

应用场景–正向代理(科学上网)

socks5-forward

应用场景–内网穿透, 例如花生壳NAT穿透, 学校内网穿透

socks5-内网渗透

2 网页代理

默认情况下, 所有浏览器的代理都是基于系统的代理配置, postman需要进行配置为走系统代理.
关于网页代理, 这里有几点注意事项:

  • 网页代理的最终生效都在系统代理中的网页代理中呈现
  • 网页代理的使用者, 可以是浏览器, 也可以是其他所有的http/https流量
  • 网页代理的配置者, 可以是代理服务器, 也可以是抓包应用, 例如charles, Fiddler等都是通过更改该设置来截取流量

即一旦配置了网页代理, 实际上当前系统所有的http/https流量都会经过该配置所涉及的代理, 除非在进行此类判断
之前, 流量就已经被截胡, 由其他出口偷税漏税了, 例如终端上配置http_proxy/https_proxy, 此时流量就
不会经过系统代理-->网页代理所涉及的代理服务器.

网页代理流程:
http-process

关于网页代理配置, 如何使用浏览器实现科学上网, 请见

2.2 firefox

foxyproxy配置, 首先安装浏览器的扩展应用, 这里指foxyproxy

方式1: 设置代理服务器(全局)

  • 新建代理服务器(127.0.0.1, 1080, socks5)
  • 工作模式: 为全部URLS使用代理

此时就可以进行全局的翻墙浏览

方式2: 设置代理服务器(科学上网-订阅模式)

2.3 chrome

方式1: 浏览器全局代理配置: 设置->高级->代理服务器配置

方式2: 使用SwitchyOmega进行自动代理配置工作

  • 安装SwitchyOmega
  • 下载gfwlist.bak文件
  • 在SwitchyOmega中导入gfwlist.bak文件,自动的设置各种情景模式
  • 开启shadowsocks代理服务器
  • 启动自动转换(需要相应的规则处理)

3 Socks代理

重点在于穿透

3.1 shadowsocks

关于SOCKS的原理, 在前面章节已经阐述, 目前大部分科学上网都是通过shadowsocks, 结合PAC与SOCKS5来进行流量分流操作.
关于shadowsocks的工作原理见下图:

shadowsocks-theory

关于VPS的配置见vps配置说明

  • iphone: 下载Wingy等代理终端, 配置VPN线路, 可购买或者自行配置
  • mac: 下载Shadowsocks-NG, 配置线路, 更新PAC即可实现全局代理/自动代理上网
  • ubuntu: 安装shadowsocks并启动客户端服务即可, 实际上这个也适用于mac

关于ubuntu配置:

1
2
3
4
# 安装
sudo pip install shadowsocks
# 启动sslocal, 连接远程代理服务器
sslocal -s server-name -p server-port -b 127.0.0.1 -l 1080 -k server-passwd -m aes-256-cfb

配置完上述的相关信息之后就可以使用浏览器, 基于socks5进行科学上网了.

关于shadowsocks, 参考: shadowsocks-ng

3.2 socks to http

让我们

4 自动代理配置

4.1 priority

对于各个代理的优先级, 目前试验过的仅仅是pac网页代理, 由此可以推到出(猜的), 整个代理的优先级根据系统代理
中从上至下的顺序(~_~), 分别是(MAC): WAPD->PAC->HTTP/HTTPS->SOCKS5->RTSP->Goher. 所以一旦配置了PAC, 则即使配置HTTP/HTTPS,
则流量一般都是经过PAC来进行分发的.

这也就是为何在MAC上同时配置Shadowsocks的PAC和charles的系统代理之后, 包流量没有经过charles.
在设置Shadowsocks的全局代理-socks5之后, 再配置External Proxy就能让流量经过
charles(实际上Socks5和http代理不能同时存在).

4.2 socks5

PAC会根据配置文件(一个javascript脚本)来进行分流操作, 对于内部流量, 直接使用正常的访问, 对于外网请求, 则最终还是
根据SOCKS5来进行代理访问.

整个Shadowsocks都是基于SOCKS5为基础, 以便进行穿透访问, 关于SOCKS5的功能见上面章节介绍.

5 正向和反向代理

何为正向? 何为反向? 两者的功能? 两者的使用场景?

5.1 正向代理

Forward Proxy是一个客户端和服务端之间的中间代理服务器, 此时客户端实际上知晓整个网络拓扑:

  • 我知道中间代理服务器IP/PORT
  • 我知道我要访问的资源所在的目标服务器
  • 我知道我的流量会通过中间正向代理服务器和目标服务器进行交互

在正向代理过程中, Client被代理角色, 和代理一起配合, 以达到消费目标服务器资源的目的. 一般而言, 正向代理和Client都是同属于一个内部网络, 注意, 这里仅仅是逻辑上的内部网络. 比如, 有可能某一个笨蛋配置了一个正向代理离自己非常远, 比如你配置一个欧洲的HTTP代理, 然后目标服务器是美国.

正向代理网络拓扑图如下:

反向代理

正向代理的使用场景:

  • 用于为防火墙内部的使用者提供访问外部网络的途径
  • 对于公司而言, 使用代理的缓存特性, 减少网络的使用率, 这个一般很少有
  • 匿名代理功能, 让Client以匿名方式访问目标服务器, 但是你得确保有足够多的正向代理服务器

正向代理在nginx服务器上的配置如下, 一般很少使用到:

1
2
3
4
5
6
7
server {  
resolver 192.168.1.1; #指定DNS服务器IP地址
listen 8080;
location / {
proxy_pass http://$http_host$request_uri; #设定代理服务器的协议和地址
}
}

5.2 反向代理

reverse proxy也是一种中间代理服务器, 不过对client而言是透明的, 即客户端不知道这是一个代理, 而将其当成目标服务器.

  • 我被告知网址A/B/C在IP1上面
  • 我访问IP1获取内容

整个过程对普通用户而言就是这么简单透明, 此时reverse proxy作为一个web服务角色, 对外提供服务. 相比正向代理, 客户端:

  • 无需指定代理服务器
  • 无需配置代理服务器IP地址

一般而言, 反向代理和webserver同处于一个局域网里, 以便实现负载均衡等功能, 方向代理的网络拓扑如下:

正向代理

另外, 注意一点, 反向代理服务器并非一定和目标服务器靠的很近, 考虑如下场景: 我提供一个反向代理服务器, 然后告知我的客户端目标网站都在代理服务器所在的IP上, 此时所有的流量仍旧走代理, 但是实际上反向代理到目标网站有很长的距离, 当然, 这种使用场景实际上很少会发生.

反向代理的使用场景:

  • 对访问者透明, 以保护和隐藏原始的资源服务器
  • 负载均衡, 确保服务的稳定
  • 缓存静态内容, 在这里做缓存的意义就非常大, 大规模的访问会因为缓存的原因带来性能非常大的提升
  • 处于安全保护等原因

反向代理的nginx配置如下:

1
2
3
4
5
6
7
8
9
server {
listen 80;
location /demo {
proxy_pass http://127.0.0.1:8081;
}
location /demo1 {
proxy_pass http://127.0.0.1:8082;
}
}

其中对外统一使用 80端口, 但是对于不同的服务, 会进行引流, 访问真正的资源服务器.

5.3 透明代理

基于正向代理的网络拓扑结构, 但是实际上代理仅仅网络管理员知晓, 从而实现包的改动, 包的过滤, 比如charles的抓包功能.