远程请求Squid

不久前在办公室抓取某网站S被对方发现,导致对方自动屏蔽了来自办公室网络的所有HTTP请求,连正儿八经地用浏览器打开也不行。为了可以摸索出“改头换面”(改HTTP头部)访问的方法,必须先成功访问至少一次,看看发出的HTTP头部是怎样的才行。恰好想起自己有一台腾讯云服务器,登上去用curl访问网站S,发现是成功的(也就是尚未被屏蔽)。既然如此,干脆在服务器上部署一套Squid作为正向代理,帮助办公网络的请求成功抵达网站S并拿到响应页面。

apt-get安装了squid软件包后启动并监听端口8321,在办公网络下将公网地址和8321端口作为代理配置传递给curl-x选项,访问网站S。不料Squid拒绝了我的请求,返回了如下内容(节选自curl -v命令的输出)

1
2
3
4
5
6
7
8
9
10
11
12
13
< HTTP/1.1 403 Forbidden
< Server: squid/3.5.12
< Mime-Version: 1.0
< Date: Wed, 17 May 2017 15:18:08 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 3531
< X-Squid-Error: ERR_ACCESS_DENIED 0
< Vary: Accept-Language
< Content-Language: en
< X-Cache: MISS from VM-44-136-ubuntu
< X-Cache-Lookup: NONE from VM-44-136-ubuntu:8321
< Via: 1.1 VM-44-136-ubuntu (squid/3.5.12)
< Connection: keep-alive

经过一番Google,才知道原来是Squid的配置导致的。在Squid配置文件(/etc/squid/squid.conf)中,默认的acl和http_access指令的设置如下

1
2
3
4
5
6
7
8
9
10
11
12
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
1
2
3
4
5
6
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny all

由于Squid是按照第一条匹配的http_access指令来决定允许还是拒绝的,因为来自我办公网络的请求实际上命中的是

1
http_access deny all

因此被拒绝是必然的。为了可以接受来自办公网络发起的请求,首先需要新增一行acl指令。通过Squid的日志(/var/log/squid/access.log)可以查看到被拒绝的请求的IP地址是多少,此处假设IP地址为8.7.198.45,那么相应的acl指令如下

1
acl myclients src 8.7.198.45

此处的myclients为自定义的名称,顾名思义,它表示“我的客户端”;src是一种acl类型,表示客户端的IP地址;8.7.198.45是src类型下的参数,也就是我所使用的客户端发出的请求的来源IP地址。配置了acl后,还需要配置http_access指令。这个就简单多了,只要允许上面创建的这个acl的访问即可,内容如下

1
http_access allow myclients

之后再重启Squid服务即可

1
sudo service squid restart

这时候再从办公网络中以腾讯云服务器上的Squid为正向代理发出请求,就不会再被Squid拒绝了。

全文完