Squid是Linux系統中最經常使用的一款開源代理服務軟件,主要提供緩存加速和應用層過濾控制的功能,能夠很好的實現HTTP、FTP、DNS查詢以及SSL等應用的緩存代理。html
正向代理:
根據實現的方式不一樣,代理服務可分爲傳統代理和透明代理。linux
- 傳統代理:普通的代理服務,多見於Internet環境,必須在客戶機的瀏覽器、QQ聊天工具、下載軟件等程序中手動設置代理服務器對的地址和端口,才能使用代理服務器來訪問網絡。對於網頁瀏覽器,訪問網站時的域名解析請求會發送給指定的代理服務器。
- 透明代理:提供與傳統代理相同的功能和服務,多見於局域網環境,其區別在於客戶機不須要指定代理服務器的地址和端口,而是經過默認路由、防火牆策略將Web訪問重定向,實際上仍然交給代理服務器處理。網頁瀏覽器訪問網站時的域名解析請求會優先發給DNS服務器。
反向代理:將不一樣的URL請求分發到後臺不一樣的Web服務器上,經過squid反向代理,能夠加速網站的訪問速度,同時互聯網用戶只能看到反向代理服務器的地址,增強網站的訪問安全。c++
官方地址:http://www.squid-cache.org/web
參考文檔:http://www.squid-cache.org/Doc/config/正則表達式
將下載的Squid軟件包解壓至/opt目錄下。vim
[root@localhost abc]# tar zxvf squid-3.5.28.tar.gz -C /opt/
準備編譯環境,配置Squid的編譯選項並進行安裝。windows
yum install -y gcc gcc-c++ make
cd /opt/squid-3.5.28 ./configure --prefix=/usr/local/squid \ //安裝目錄 --sysconfdir=/etc \ //單獨將配置文件修改到其餘目錄 --enable-arp-acl \ //能夠在規則中設置爲直接經過客戶端MAC進行管理,防止客戶端使用IP欺騙 --enable-linux-netfilter \ //使用內核過濾 --enable-linux-tproxy \ //支持透明模式 --enable-async-io=100 \ //異步I/O,提高存儲性能 --enable-err-language="Simplify_Chinese" \ //錯誤信息的顯示語言 --enable-underscore \ //容許URL中有下劃線 --enable-poll \ //使用Poll()模式,提高性能 --enable-gnuregex //提高GNU正則表達式
make && make install
ln -s /usr/local/squid/sbin/* /usr/local/sbin/ //便於使用squid命令 useradd -M -s /sbin/nologin squid //建立用戶和組 chown -R squid.squid /usr/local/squid/var/ //建立文件的屬性
vim /etc/squid.conf cache_effective_user squid //添加 指定squid的程序用戶,用來設置初始化、運行時緩存的帳戶,不然啓動不成功 cache_effective_group squid //添加 指定帳號的基本組 coredump_dir /usr/local/squid/var/cache/squid
(1)檢查配置文件的語法是否正確。瀏覽器
squid -k parse
(2)先初始化緩存目錄,調用squid程序來啓動服務。緩存
squid -z //初始化緩存目錄 squid //啓動服務
確認服務處於監聽狀態。安全
[root@localhost squid-4.1]# netstat -ntap | grep squid tcp6 0 0 :::3128 :::* LISTEN 86805/(squid-1)
(3)編寫squid啓動腳本,並使用chkconfig和service工具進行管理。
vim /etc/init.d/squid #!/bin/bash #chkconfig: 2345 90 25 PID="/usr/local/squid/var/run/squid.pid" CONF="/etc/squid.conf" CMD="/usr/local/squid/sbin/squid" case "$1" in start) netstat -natp | grep squid &> /dev/null if [ $? -eq 0 ] then echo "squid is running" else echo "正在啓動 squid..." $CMD fi ;; stop) $CMD -k kill &> /dev/null rm -rf $PID &> /dev/null ;; status) [ -f $PID ] &> /dev/null if [ $? -eq 0 ] then netstat -natp | grep squid else echo "squid is not running" fi ;; restart) $0 stop &> /dev/null echo "正在關閉 squid..." $0 start &> /dev/null echo "正在啓動 squid..." ;; reload) $CMD -k reconfigure ;; check) $CMD -k parse ;; *) echo "用法:$0{start|stop|status|reload|check|restart}" ;; esac
chmod +x /etc/init.d/squid //執行權限 chkconfig --add squid //添加爲系統服務 chkconfig --level 35 squid on
主機 | 系統 | IP |
---|---|---|
squid 主機 | CentOS7 | 172.16.100.110 |
web服務器 | CentOS7 | 172.16.100.100 |
客戶機 | windows 7 | 172.16.100.50 |
(1)修改squid.conf配置文件
vim /etc/squid.conf http_access allow all //容許任意客戶機使用代理服務 http_access deny all http_port 3128 cache_mem 64 MB //指定緩存功能所使用的內存空間大小,便於保持訪問較頻繁的WEB對象,容量最好爲4的倍數,單位爲MB,建議設爲物理內存的1/4 reply_body_max_size 10 MB //容許用戶下載的最大文件大小,以字節爲單位。默認設置0表示不進行限制 maximum_object_size 4096 KB
(2)在防火牆上添加容許策略
iptables -F setenforce 0 iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
(3)重載squid服務
service squid reload //生效修改後的配置文件
(1)Windows客戶機的代理配置
打開瀏覽器(以IE爲例,其餘相似),菜單欄 -> 工具 -> Internet 選項 -> 鏈接 -> 局域網設置 -> 代理服務器,按照如下格式設置。
(2)Linux客戶機的代理配置
在命令行界面中使用代理服務器如elinks網頁瀏覽器、wget下載工具,必須經過環境變量來指定代理服務器的地址、端口等信息。
vim /etc/profile HTTP_PROXY=http://192.168.235.206:3128 //使用HTTP協議指定代理 HTTPS_PROXY=http://192.168.235.206:3128 //使用HTTPS協議指定代理 FTP_PROXY=http://192.168.235.206:3128 //使用FTP協議指定代理 NO_PROXY=192.168.10.,192.168.20. //對兩個局域網段指定代理 export HTTP_PROXY HTTPS_PROXY FTP_PROXY NO_PROXY source /etc/profile
(1)安裝httpd,關閉防火牆
yum install httpd -y systemctl stop firewalld.servie setenforce 0
(2)啓動httpd服務並加入開機自啓動
systemctl start httpd.service chkconfig httpd on
(3)建立index.html
echo "<h1>Squid-Web1</h1>" > /var/www/html/index.html
在客戶機中經過瀏覽器訪問目標網站http://172.16.100.100/
查看Squid訪問日誌的新增記錄
查看Web訪問日誌的新增記錄
當客戶機使用代理後,web服務器並不知道客戶機的真實ip,其實是由代理服務器訪問。
主機 | 系統 | IP |
---|---|---|
squid 網關 | CentOS7 | ens33:192.168.100.1 ens37:12.0.0.1 |
web服務器 | CentOS7 | 12.0.0.12 |
客戶機 | windows 7 | 192.168.100.20 |
vim /etc/squid.conf http_port 192.168.100.1:3128 transparent //添加 提供透明服務 service squid reload //從新加載服務
配置文件其他地方的修改參考前面的傳統代理的配置處。
將局域網段192.168.100.0/24且訪問HTTP、HTTPS等協議的數據包轉交給運行在本機3128端口上的Squid服務進行處理。
iptables -F iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128 iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128 iptables -I INPUT -p tcp --dport 3218 -j ACCEPT
vim /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p
若是客戶機上存在手動指定的代理服務器設置,應將其去除。在Linux客戶機,能夠經過unset命令清除。
unset HTTP_PROXY HTTPS_PROXY
在客戶機中經過瀏覽器訪問目標網站http://12.0.0.12/
驗證結果:
在Squid代理服務器中,發現客戶機訪問網站服務器的記錄;
在被訪問的web服務器中,發現來自代理服務器的訪問記錄。
客戶端請求訪問 WEB 服務時,DNS 將訪問的域名解析爲 Squid 反向代理服務器的 IP 地址,這樣客戶端的 URL 請求將被髮送到反向代理服務器。若是 Squid 反向代理服務器中緩存了該請求的資源,則將該請求的資源直接返回給客戶端,不然反向代理服務器將向後臺的 WEB 服務器請求資源,而後將請求的應答返回給客戶端,同時也將該應答緩存在本地,供下一個請求者使用。
案例環境: 主機 |
系統 | IP |
---|---|---|
squid 網關 | CentOS7 | ens33:192.168.100.1 ens37:12.0.0.1 |
web1服務器 | CentOS7 | 192.168.100.100 |
web2服務器 | CentOS7 | 192.168.100.120 |
客戶機 | windows 7 | 12.0.0.50 |
vim /etc/squid.conf http_port 192.168.100.1:3128 transparent //啓動透明代理 http_port 12.0.0.1.1:80 accel vhost vport cache_peer 192.168.100.100 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1 cache_peer 192.168.100.120 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2 cache_peer_domain web1 web2 www.yun.com service squid restart
iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128 iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128 iptables -I INPUT -p tcp --dport 3218 -j ACCEPT
#web1 echo "<h1>Squid-Web1</h1>" > /var/www/html/index.html #web2 echo "<h1>Squid-Web2</h1>" > /var/www/html/index.html
這裏可使用DNS服務來解析,這裏咱們爲了方便,就在hosts 文件裏直接指定。
修改C:\Windows\System32\drivers\etc\hosts 文件
在客戶端訪問目標網站www.yun.com
關閉web1的httpd服務,在web1服務器清除緩存,訪問網站,如圖所示:
而後在客戶端清除緩存訪問www.yun.com ,如圖所示:
刷新一次:能夠看到反向代理緩存成功。