正向代理

正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

  • http正向代理的两种方式:
  • 普通模式(RFC 7230 - HTTP/1.1:Message Syntax and Routing)
  • 隧道模式(Tunneling TCP basedprotocols through Web proxy servers)
  • 隧道代理:也就是透传代理。代理服务器只是在TCP协议上透传HTTPS流量,对于其代理的流量的具体内容不解密不感知。客户端和其访问的目的服务器做直接TLS/SSL交互。
  • 中间人(MITM, Man-in-the-Middle)代理:代理服务器解密HTTPS流量,对客户端利用自签名证书完成TLS/SSL握手,对目的服务器端完成正常TLS交互。在客户端-代理-服务器的链路中建立两段TLS/SSL会话。

为什么正向代理处理HTTPS流量需要特殊处理?

  • HTTPS流量的认证过程发生在客户端和反向代理服务器之间。
  • 而作为正向代理在处理客户端发过来的流量时,HTTP加密封装在了TLS/SSL中,代理服务器无法看到客户端请求URL中想要访问的域名。

反向代理

  • 反向代理面对服务端,用户端是无感知的,用户访问最外层的节点,然后转发到真实的服务器。

高度匿名代理

  • 服务器根本不知道你使用了代理。在使用高匿代理服务器时,高匿名代理不改变客户机请求,被访问的服务器再看受访者来就像是有个真正的客户浏览器在访问它,此时客户的真实代理IP是隐藏的,服务器端也不会认为我们使用了代理。
  • REMOTE_ADDR 是服务端根据请求TCP包的ip指定的。假设从client到server中间没有任何代理,那么web服务器就会把client的IP设为IP remote_addr;如果存在代理转发HTTP请求,web服务器会把最后一次代理服务器的IP设置为remote_addr。
  • HTTP_X_FORWARDED_FOR(XFF) 在客户端访问服务器的过程中如果需要经过HTTP代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端的IP地址,这个消息首部成为事实上的标准。在消息流从客户端流向服务器的过程中被拦截的情况下,服务器端的访问日志只能记录代理服务器或者负载均衡服务器的IP地址。如果想要获得最初发起请求的客户端的IP地址的话,那么 X-Forwarded-For 就派上了用场。
  • HTTP_VIA 是一个通用首部,是由代理服务器添加的,适用于正向和反向代理,在请求和响应首部中均可出现。告知目标服务器,请求中使用了代理。
  • REMOTE_ADDR不可以显式伪造(有兴趣的同学可以了解一下hping3),它是与服务器建立TCP连接的地址。
  • 如果HTTP请求没有使用七层代理,则直接读取REMOTE_ADDR作为客户端真实ip地址。
  • 如果HTTP请求使用了七层代理,比如nginx,就需要设置信任的负载均衡节点转发过来的ip地址。相当于把最外层的REMOTE_ADDR逐一传递过来。

TinyProxy

  • Tinyproxy是一个轻量级的开源 HTTP/HTTPS 代理守护进程,其设计目标是快而小。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
User
#在以root用户身份完成初始端口绑定之后,Tinyproxy进程会以该用户的身份来运行。可以填用户名或UID。

Group
#在以root用户身份完成初始端口绑定之后,Tinyproxy进程会以该用户组的身份来运行。可以填组名或GID。

Port
#Tinyproxy服务将侦听的端口。 如果端口小于 1024,则需要以 root 用户的身份启动 Tinyproxy 进程。

Listen
#在默认情况下,Tinyproxy 会侦听在所有可用接口上的连接(即,侦听地址 0.0.0.0)。
#通过配置此参数,Tinyproxy 可以被告知仅侦听一个特定地址。

Bind
#这允许您指定 Tinyproxy 将绑定到哪个目标地址,以将其连接到Web服务器或上游代理。

BindSame
#如果此布尔值选项被设置为 Yes,Tinyproxy 会将目标地址设定为触发了传出请求的传入连接的IP地址。

Timeout
#Tinyproxy关闭连接之前,允许该连接处于非活动状态的最大秒数。

ErrorFile
#该选项控制 Tinyproxy 如果遇到特定的HTTP错误时,会返回哪个HTML文件。它包含两个参数,错误号、HTML错误文件的路径。

DefaultErrorFile
#该选项控制如果发生未配置的错误时,返回的HTML模板文件。

StatHost
#该选项配置被当作统计主机的主机名或者IP地址:每当收到对该主机的请求时,Tinyproxy 会返回内部统计信息页面,而不会将请求转发给该主机。
#此页面的模板可以使用 StatFile 配置项进行配置。StatHost 的默认值为 tinyproxy.stats。

StatFile
#该选项配置 Tinyproxy 在收到对统计主机的请求时发送的HTML文件。
#如果未设置此选项,Tinyproxy 将返回一个硬编码的基本统计信息页面。
#有关详细信息,请参见 tinyproxy(8) 手册页中的 STATHOST 部分。
#需要注意的是,使用StatFile 以及 ErrorFile 和 DefaultErrorFile 选项配置的错误文件都是模板文件,其中可以包含一些模板变量,并由 Tinyproxy 在发送时进行扩展。
#例如,"{cause}" 表示简短的错误描述,"{detail}"表示详细的错误消息。
#tinyproxy(8) 手册页包含所有模板变量的描述。

LogFile
#该选项控制 Tinyproxy 将调试输出写入文件的位置。 此外,Tinyproxy 可以将日志输出到syslog - 请参阅 Syslog 选项。

Syslog
#当设为 On 时,此选项告知 Tinyproxy 将其调试消息写入syslog,而不是写入由 LogFile 所配置的日志文件。这两个选项是互斥的。

LogLevel
#设置日志级别。高于或等于该设置项级别的日志消息会被记录。
#例如,如果LogLevel设为 Warning,则从Warning到Critical级别的所有日志消息会被输出,但Notice或更低等级的日志消息会被过滤掉。允许的取值如下:

* Critical(最简洁)
* Error
* Warning
* Notice
* Connect(不包含Info的连接日志)
* Info(最详细)

PidFile
#该选项控制 Tinyproxy 主进程将其进程 ID 号存入的文件路径,用于处理信号。

XTinyproxy
#将此选项设置为Yes将通知Tinyproxy将包含客户端IP地址的标头X-Tinyproxy添加到请求中。

Upstream,No Upstream
#该选项允许您设置一组基于所访问站点主机或域的规则,来选择是否使用某些上游代理服务器。
#这些规则按照在配置文件中录入的顺序存储,并且在使用时 最后一条 所匹配的规则会生效。
#有以下三种指定上游主机的方式:
# upstream host:port 开启一个常规形式的上游代理
# upstream host:port "site_spec" 为匹配 site_spec 的站点启用上游代理
# no upstream "site_spec" 为匹配 site_spec 的站点禁用上游代理站点可以用主机名、域名、IP范围等形式来指定:

# .name 匹配任何在域 name 中的主机
# . 匹配任何无域名的主机(在空域名中)
# IP/bits 匹配IP地址/掩码位数
# IP/mask 匹配IP地址/掩码

MaxClients
#Tinyproxy 为每一个连接的客户端创建一个子进程。
#此选项指定可创建的最大进程数量。 也就是说,至多只有 MaxClients这么多个客户端可以同时连接到 Tinyproxy。

MinSpareServers, MaxSpareServers
#Tinyproxy 始终保留一定数量的空闲子进程,以保证它可以快速处理新传入的客户端请求。
#MinSpareServer 和 MaxSpareServers 控制备用进程数的最大值和最小值。
#即,当备用服务器的数量降至 MinSpareServers以下时,Tinyproxy 将在后台开始创建新的备用进程,而当备用进程的数量超过 MaxSpareServers 时,Tinyproxy 将杀死多余的进程。

StartServers
#初始化启动的服务进程数。一般应将其设置为位于 MinSpareServers和 MaxSpareServers 之间的值。

MaxRequestsPerChild
#此选项限制一个子进程在终止之前将会处理的最大连接数。 默认值为0,即无限制。此选项是在出现内存泄漏问题时可采取的紧急措施。
# 在这种情况下,请将 MaxRequestsPerChild 设置为例如1000 或 10000,可能会有用。

Allow, Deny
#Allow和Deny选项用于自定义允许哪些客户端访问Tinyproxy。
#Allow和Deny行可以在配置文件里重复出现,以构建Tinyproxy的访问控制列表。
#在配置文件中的顺序很重要。 如果没有 Allow 或 Deny 行,则允许任意的客户端。
#反之,默认的操作是拒绝访问。
#允许或拒绝的参数可以配置为客户端主机的单个IP地址,
#例如 127.0.0.1,IP地址范围,例如 192.168.0.1/24,
#或将与客户端主机名尾端匹配的字符串,
#可以是完整的主机名,例如 host.example.com,或域名,
#例如.example.com,或者顶级域名,例如.com。

AddHeader
#配置一个或多个 HTTP 请求标头,用于添加到由 Tinyproxy 发出的 HTTP 请求中。
#需要注意的是,此选项不适用于 HTTPS 流量,因为 Tinyproxy 无法控制要交换的标头。

AddHeader "X-My-Header" "Powered by Tinyproxy"

ViaProxyName
#RFC 2616 要求代理将 Via 标头添加到 HTTP 请求中,但使用真实主机名可能会引起安全问题。
#如果设置了 ViaProxyName 选项,其字符串值将用作 Via 标头中的主机名。 否则,将使用服务器的主机名。

DisableViaHeader
#该选项设置为 yes 时,Tinyproxy 不会将 Via 标头添加到请求中。
#这实际上就使 Tinyproxy 进入了隐身模式。
#请注意,RFC 2616 要求代理设置 Via 头,因此启用此选项会破坏合规性。
#除非您知道自己在做什么,否则不要禁用 Via 标头...

Filter
#Tinyproxy 支持基于 URL 或域的网站过滤。 此选项指定包含过滤规则的文件的位置,每行一条规则。

FilterURLs
#如果此布尔选项设置为 Yes 或 On,则根据 URL 执行过滤,而不根据域执行过滤。默认设置为根据域进行过滤。

FilterExtended
#如果此布尔选项设置为 Yes,则扩展的 POSIX 正则表达式将用来匹配过滤器规则。默认使用基本 POSIX 正则表达式。

FilterCaseSensitive
#如果此布尔选项设置为 Yes,则过滤器规则匹配时会区分大小写。 默认匹配时不区分大小写。

FilterDefaultDeny
#默认的过滤策略会允许所有与过滤规则不匹配的内容。 将 FilterDefaultDeny 设置为 Yes 会更改该策略,从而拒绝在过滤规则所匹配的域或URL之外的任何内容。

Anonymous
#如果设置了 Anonymous 选项,则启用匿名代理。
#由 Anonymous 配置的标头被允许通过,其他标头会被拒绝。
#如果未配置 Anonymous 选项,则允许所有标头通过。您必须给标头内容加上引号。
#大多数站点都需要启用 cookie 才能正常工作,因此,如果您访问这种站点,需要允许 cookie 通过。
用法举例:

* Anonymous "Host"
* Anonymous "Authorization"
* Anonymous "Cookie"

ConnectPort
#此选项用于指定 CONNECT 方法所允许的端口。 如果找不到 ConnectPort 行,则允许所有端口。
#若要完全禁用 CONNECT,请仅设置一条值为 0 的 ConnectPort 选项行。

ReversePath
#配置一条或多条 ReversePath 选项,以启用反向代理支持。
#使用反向代理,可以使许多站点看起来像是单个站点的一部分。
#配置以下指令,并在自己的计算机上的端口 8888上运行 Tinyproxy,则可以通过 http://localhost:8888/example/来访问站点 example.com。

ReversePath "/example/" "http://www.example.com/"

ReverseOnly
#当把 Tinyproxy 用作反向代理时,强烈建议将此布尔选项设置为 Yes ,从而关闭普通代理功能。

ReverseMagic
#将此选项设置为Yes,可让 Tinyproxy 使用 cookie 来跟踪反向代理的映射。 如果您需要反向具有绝对链接的代理站点,必须启用此选项。

ReverseBaseURL
#用于访问此反向代理的URL地址。 该 URL 会被用于重写 HTTP 重定向地址,以使它们不会绕过代理。
#如果您有一连串的反向代理,则需要在此处放置最外层的 URL(也就是终端用户在其浏览器中键入的地址)。
#如果未设置此选项,则不会修改重定向。

总结

  • 什么时候用到 Tinyproxy
  • 它的优势安装简单,快速集成,高匿代理。当我们需要请求第三方API接口时,为了不暴露服务器的真实ip地址,就可以引入Tinyproxy
  • 或者你可以拿来做一个代理的ip池,用Python动态切换ip抓取一些东西,仅供参考,请谨慎使用。