構建Squid代理服務器-傳統代理、透明代理、反向代理
正向代理:
根據實現的方式不同,代理服務可分為傳統代理和透明代理。
- 傳統代理:普通的代理服務,多見於Internet環境,必須在客戶機的瀏覽器、QQ聊天工具、下載軟件等程序中手動設置代理服務器對的地址和端口,才能使用代理服務器來訪問網絡。對於網頁瀏覽器,訪問網站時的域名解析請求會發送給指定的代理服務器。
- 透明代理:提供與傳統代理相同的功能和服務,多見於局域網環境,其區別在於客戶機不需要指定代理服務器的地址和端口,而是通過默認路由、防火墻策略將Web訪問重定向,實際上仍然交給代理服務器處理。網頁瀏覽器訪問網站時的域名解析請求會優先發給DNS服務器
。反向代理:將不同的URL請求分發到後臺不同的Web服務器上,通過squid反向代理,可以加速網站的訪問速度,同時互聯網用戶只能看到反向代理服務器的地址,加強網站的訪問安全。
官方地址:http://www.squid-cache.org/
參考文檔:http://www.squid-cache.org/Doc/config/
Squid安裝
1.編譯安裝Squid
將下載的Squid軟件包解壓至/opt目錄下。
[root@localhost abc]# tar zxvf squid-3.5.28.tar.gz -C /opt/
準備編譯環境,配置Squid的編譯選項並進行安裝。
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
2.安裝完成後,創建鏈接文件、創建用戶和組。
ln -s /usr/local/squid/sbin/* /usr/local/sbin/ //便於使用squid命令
useradd -M -s /sbin/nologin squid //創建用戶和組
chown -R squid.squid /usr/local/squid/var/ //創建文件的屬性
3.編輯配置文件/etc/squid.conf
vim /etc/squid.conf
cache_effective_user squid //添加 指定squid的程序用戶,用來設置初始化、運行時緩存的賬戶,否則啟動不成功
cache_effective_group squid //添加 指定賬號的基本組
coredump_dir /usr/local/squid/var/cache/squid
4.啟動squid服務,使用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
構建傳統代理服務器
案例需求描述:
- 基於Internet環境。
- 一臺Linux主機作為web服務器,啟用httpd服務。
- 一臺Linux主機構建Squid服務,允許客戶機使用代理。
- 一臺Windows7主機,指定所使用的代理服務器地址、端口號信息。
主機 | 系統 | IP |
---|---|---|
squid 主機 | CentOS7 | 172.16.100.110 |
web服務器 | CentOS7 | 172.16.100.100 |
客戶機 | windows 7 | 172.16.100.50 |
1.squid服務器的配置
(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 //生效修改後的配置文件
2.客戶機的代理設置
(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
3.網站服務器的設置
(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
4.代理服務的驗證
在客戶機中通過瀏覽器訪問目標網站http://172.16.100.100/
查看Squid訪問日誌的新增記錄
查看Web訪問日誌的新增記錄
當客戶機使用代理後,web服務器並不知道客戶機的真實ip,實際上是由代理服務器訪問。
構建透明代理服務器
案例需求描述:
- 基於局域網主機通過Linux網關訪問Internet的環境。
- 一臺Linux主機作為Internet上的web服務器,啟動httpd服務。
- 一臺Linux主機作為網關服務器,並構建Squid服務提供代理服務。
- 一臺windows7主機作為局域網的客戶機,只需正確設置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 |
1.配置Squid支持透明代理
vim /etc/squid.conf
http_port 192.168.100.1:3128 transparent //添加 提供透明服務
service squid reload //重新加載服務
配置文件其余地方的修改參考前面的傳統代理的配置處。
2.設置iptables的重定向策略
將局域網段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
3.開啟路由轉發功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
4.網站服務器配置如上述,操作步驟一樣
5.驗證透明代理的使用
如果客戶機上存在手動指定的代理服務器設置,應將其去除。在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 |
1.配置squid服務器
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
2.配置防火墻策略
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
3.配置兩個網站服務器,操作步驟如上述一樣,不同的是修改web主頁。
#web1
echo "<h1>Squid-Web1</h1>" > /var/www/html/index.html
#web2
echo "<h1>Squid-Web2</h1>" > /var/www/html/index.html
4.配置客戶端
這裏可以使用DNS服務來解析,這裏我們為了方便,就在hosts 文件裏直接指定。
修改C:\Windows\System32\drivers\etc\hosts 文件
5.測試反向代理
在客戶端訪問目標網站www.yun.com
關閉web1的httpd服務,在web1服務器清除緩存,訪問網站,如圖所示:
然後在客戶端清除緩存訪問www.yun.com ,如圖所示:
刷新一次:
可以看到反向代理緩存成功。
構建Squid代理服務器-傳統代理、透明代理、反向代理