功能用途
我們在生活中見過各種代理,比如我們距離火車站較遠,我們可以選擇通過距離最近的火車票代售點來購買火車票。又比如商品代理商,我們拿不到廠家的直接或者,可以通過廠家授權的代理經銷商來獲得產品。代理服務器負責轉發你的請求到目標服務器,然后將目標服務器的響應反饋給你。你可以理解為它就是個聯姻的媒婆。代理服務器可以有很多用途,比如:
- 作為一個網絡防火牆,將內網與外網隔開。是的外網只能訪問代理服務器允許的邊界,這是我們常見的正向代理,比如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 8828
用戶名密碼認證
網絡上有很多專門爬免認證的代理的爬蟲,如果我們自己搭建的代理服務器不加認證的話,會被這些爬蟲探測到然后淪為了免費代理。
使用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 20 118.31.0.74 TCP_DENIED/407 444 HEAD http://www.baidu.com/ squid HIER_NONE/- text/html 1543199365.390 17 118.31.0.74 TCP_DENIED/407 444 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"