功能用途
我们在生活中见过各种代理,比如我们距离火车站较远,我们可以选择通过距离最近的火车票代售点来购买火车票。又比如商品代理商,我们拿不到厂家的直接或者,可以通过厂家授权的代理经销商来获得产品。代理服务器负责转发你的请求到目标服务器,然后将目标服务器的响应反馈给你。你可以理解为它就是个联姻的媒婆。代理服务器可以有很多用途,比如:
- 作为一个网络防火墙,将内网与外网隔开。是的外网只能访问代理服务器允许的边界,这是我们常见的正向代理,比如ningx的转发。另外,在一个局域网中如果有一台主机可以上外网,那么我们就可以把这台机器作为代理服务器,为其他机器提供外网的访问功能。
- 作为反爬利器,如果爬虫爬取的目标网站具有较强的反爬机制,最常见的通过IP来限制抓取频率,如果你的爬虫抓取太快,你的IP就会被封禁一段时间甚至永久封禁。此时我们就可以通过高匿代理让抓取的网站识别不出我们的真实IP。
本文提供两种代理情形:
1、两台都有外网IP,一台服务器请求资源通过另外一个服务器,本文重点讲第一种。
2、两台服务器,其中一台服务器只有内网IP,另外一台服务器有公网和内网IP。
两种配置情形大同小异,与第一种情形不同的是只需确认下面配置即可
{
# 确认服务器端ip_forward转发开启
echo 1 > /proc/sys/net/ipv4/ip_forward
ip_forward需要设定为1
sysctl -a |grep -w ip_forward
net.ipv4.ip_forward = 1
#客户端配置
export https_proxy=http://服务端内网ip:3128
}
代理安装
服务器端安装squid3
我是在Ubuntu14.04 64位环境下使用squid3搭建的代理服务器。squid3是一个主流的可配置的、健壮、低消耗的代理服务器。
sudo apt-get install squid3
配置
squid3的配置文件在/etc/squid3/squid.conf,我们使用vim编辑器来配置。
sudo vim /etc/squid3/squid.conf
我们在配置文件的末尾加入以下几行:
#允许的客户端ip
acl allcomputers src 0.0.0.0/0.0.0.0
#配置用户名密码,后面会生成passwords文件
auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid3/passwords
auth_param basic realm proxy
acl authenticated proxy_auth REQUIRED
http_access allow authenticated allcomputers
找到http_access deny all并注释掉
#http_access deny all
最好修改一下默认的3128端口,因为这个端口是默认的,很容易被网络上的代理爬虫探测到。
http_port
用户名密码认证
网络上有很多专门爬免认证的代理的爬虫,如果我们自己搭建的代理服务器不加认证的话,会被这些爬虫探测到然后沦为了免费代理。
使用htpasswd来创建passwords文件,htpasswd命令在软件包apache2-utils中。
sudo apt-get install apache2-utils
生成password文件
sudo htpasswd -c -d /etc/squid3/passwords 自定义用户名
然后输入两次至少8位的密码,会在/etc/squid3/目录下生成passwords文件,要保证该文件是可读的。
sudo chmod o+r /etc/squid3/passwords
启动服务,也可以使用restart,stop进行重启和关闭。
sudo service squid3 start
或者
etc/init.d/squid start
验证代理是否起作用
squid3的访问日志文件在/var/log/squid3/access.log
tail -f /var/log/squid3/access.log
1543199344.191 118.31.0.74 TCP_DENIED/ HEAD http://www.baidu.com/ squid HIER_NONE/- text/html
1543199365.390 118.31.0.74 TCP_DENIED/ HEAD http://www.baidu.com/ squid HIER_NONE/- text/html
客户端配置
另找一台linux机器打开shell,将我们的代理配置上:
export http_proxy="http://用户名:密码@代理IP:代理端口"
curl -l "http://www.baidu.com"
如果代理配置正确,回输出html,同时代理服务器上的access.log会记录这次请求。
上面的配置只会在命令行界面临时生效,如果退出命令行界面,配置会失效,接下来,我们将上面配置加入到环境变量中去
加入全局环境变量
#备份文件(很重要)
cp /etc/profile /etc/profile.bak
vim /etc/profile
#http 代理
export http_proxy="http://用户名:密码@代理服务器IP:代理端口"
配置高匿
代理分为透明代理、匿名代理、混淆代理、高匿代理,这4种代理,主要是在代理服务器端的配置不同,导致其向目标地址发送请求时,REMOTE_ADDR, HTTP_VIA,HTTP_X_FORWARDED_FOR三个变量不同。
1.透明代理(Transparent Proxy)
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP
透明代理虽然可以直接“隐藏”你的IP地址,但是还是可以从HTTP_X_FORWARDED_FOR来查到你是谁。
2.匿名代理(Anonymous Proxy)
REMOTE_ADDR = proxy IP
HTTP_VIA = proxy IP
HTTP_X_FORWARDED_FOR = proxy IP
匿名代理比透明代理进步了一点:别人只能知道你用了代理,无法知道你是谁。
3.混淆代理(Distorting Proxies)
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Random IP address
如上,与匿名代理相同,如果使用了混淆代理,别人还是能知道你在用代理,但是会得到一个假的IP地址,伪装的更逼真
4.高匿代理(Elite proxy或High Anonymity Proxy)
REMOTE_ADDR = Proxy IP
HTTP_VIA = not determined
HTTP_X_FORWARDED_FOR = not determined
可以看出来,高匿代理让别人根本无法发现你是在用代理,所以是最好的选择。
下面是squid3高匿的设置,我们修改配置文件squid.conf,在最后加上
request_header_access X-Forwarded-For deny all
request_header_access From deny all
request_header_access Via deny all
测试高匿是否生效,我们用上面同样的方法访问,会显示出你使用的IP的地址,我们就可以判断显示的IP和我们使用的代理IP是否相同,如果相同,则匿名生效。
curl -l "http://www.abc.com"