Squid代理服務器
squid代理的工作機制:
- 代替客戶機向網站請求數據,從而可以隱藏用戶的真實IP地址
- 將獲得的網頁數據(靜態 web元素)保存到緩存中並發給客戶機,以便下次請求相同的數據時快速響應
代理服務器的概念及其作用:
代理服務器是一個位於客戶端和原始(資源)服務器之間的服務器,為了從原始服務器取得內容,客戶端向代理服務器發送一個請求並指定目標原始服務器,然后代理服務器向原始服務器轉交請求並將獲得的內容返回給客戶端。
其主要作用有:
資源獲取:代替客戶端實現從原始服務器的資源獲取:
加速訪問:代理服務器可能離原始服務器更近,從而起到一-定的加速作用:
緩存作用:代理服務器保存從原始服務器所獲取的資源,從而實現客戶端快速的獲取:,
隱藏真實地址:代理服務器代替客戶端去獲取原始服務器資源,從而隱藏客戶端真實信息。
squid代理的基本類型
- 傳統代理:適用於internet,需在客戶機指定代理服務器的地址和端口
- 透明代理:客戶機不需指定代理服務器的地址和端口,而是通過默認路由、防火牆策略將web訪問重定向給代理服務器處理
- 反向代理:如果Squid反向代理服務器中緩存了該請求的資源,則將該請求的資源直接返回給客戶端;否則反向代理服務器將向后台的web服務器請求資源,然后將請求的應答返回給客戶端,同時也將該應答緩存(靜態)在本地,供下一個請求者使用
傳統模式和透明模式的區別
安裝Squid服務
首先關閉防火牆和SElinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.編譯安裝 Squid
yum -y install gcc gcc-c++ make
tar zxvf squid-3.5.28.tar.gz -C /opt/ #解壓軟件包
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 \ #異步IO,提升存儲性能
--enable-err-language="Simplify_ Chinese" \ #錯誤信息的顯示語言
--enable-underscore \ #允許URL中有下划線
--disable-poll \ #關閉默認使用poll模式
--enable-epoll \ #開啟epoll模式提升性能
--enable-gnuregex #使用GNU正則表達式
make -j2 && make install
ln -s /usr/local/squid/sbin/* /usr/local/sbin
##創建鏈接文件,優化路徑
useradd -M -s /sbin/nologin squid
###創建程序用戶、組
chown -R squid:squid /usr/local/squid/var/
##改變目錄屬主,此目錄用來存放緩存文件
2.修改Squid的配置文件
vim /etc/squid.conf
......
-----56行--插入------
http_access allow all #放在http_access deny all 之前,允許任意客戶機使用代理服務,控制規則自上而下匹配
http_access deny all
http_port 3128 #用來指定代理服務監聽的地址和端口(默認的端口號為3128)
-----61行--插入------
cache_effective_user squid #添加,指定程序用戶,用來設置初始化、運行時緩存的賬號,否則啟動不成功
cache_effective_group squid #添加,指定賬號基本組
coredump_dir /usr/local/squid/var/cache/squid #指定緩存文件目錄
3.Squid 的運行控制
檢查配置文件語法是否正確
squid -k parse
啟動Squid, 第一次啟動Squid服務時,會自動初始化緩存目錄
squid -z #-z選項用來初始化緩存目錄
squid #啟動squid 服務
netstat -anpt | grep "squid"
4.創建 Squid 服務腳本
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
搭建傳統代理
環境准備工作:
服務器類型 系統和IP地址 需要安裝的組件 網絡模式
squid服務器 CentOS7.4(64 位) 192.168.247.10 squid-3.5.28.tar.gz ——nat模式
web服務器 CentOS7.4(64 位) 192.168.247.20 httpd ——nat模式
client客戶端 Win10客戶端 192.168.247.129 ——nat模式
1 . 修改squid.conf配置文件
vim /etc/squid.conf
cache_mem 64 MB
#指定緩存功能所使用的內存空間大小,便於保持訪問較頻繁的WEB對象,容量最好為4的倍數,單位為MB,建議設為物理內存的1/4
reply_body_max_size 10 MB
#允許用戶下載的最大文件大小,以字節為單位,當下載超過指定大小的Web對象時,瀏覽器的報錯頁面中會出現“請求或訪問太大”的提示默認設置0表示不進行限制
maximum_object_size 4096 KB
#允許保存到緩存空間的最大對象大小,以KB為單位,超過大小限制的文件將不被緩存,而是直接轉發給用戶
2 . 重啟服務
service squid restart
3 . 添加設置防火牆規則
#生產環境中還需要修改防火牆規則
iptables -F
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
4 . 修改客戶機代理
看一下客戶機的IP地址
搜索查看web服務器
此時可以查看web端的 網頁日志 (是可以直接看到是客戶機請求的IP)
tail -f /var/log/httpd/access_log
---客戶機的代理配置
打開瀏覽器,工具-->Internet選項-->連接 -->局域網設置-->開啟代理服務器 (地址: Squid服務器IP地址,端口: 3128)
清除緩存后,使用瀏覽器訪問http://192.168.247.20 (web服務器地址)
此時查看web端的 網頁日志 (這時候就只能看到是Squid服務器的ip請求的)
再查看一下Squid服務器的日志(可以看到是129向20的請求)
tail -f /usr/local/squid/var/logs/access.log
構建透明代理服務器
客戶端並不知道代理服務器的存在,但是數據需要經過代理服務器,再由代理服務器的路由及防火前規則進行轉發
1 . Squid服務器:雙網卡
內網ens33: 192.168.247.10 外網ens36: 12.0.0.1
2 . quid服務器配置
① 修改新網卡配置
cd /etc/sysconfig/network-scripts/
cp -p ifcfg-ens33 ifcfg-ens36
vim ifcfg-ens36
.......
NAME=ens36
DEVICE=ens36
IPADDR=12.0.0.1
NETMASK=255.255.255.0
systemctl restart network
②修改squid配置文件
vim /etc/squid.conf
http_port 192.168.247.10:3128 transparent
systemctl restart squid
③路由和防火牆配置
開啟路由轉發,實現本機中不同網段的地址轉發
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
iptables -F
iptables -t nat -F
iptables -t nat -I PREROUTING -i ens33 -s 192.168.247.0/24 -p tcp --dport 80 -j REDIRECT --to 3128 #用於轉發http協議
iptables -t nat -I PREROUTING -i ens33 -s 192.168.247.0/24 -p tcp --dport 443 -j REDIRECT --to 3128 #用於轉發https協議
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT #放3128端口的數據進來
3.訪問檢測
客戶機訪問web網站(12.0.0.12) 追蹤 web的日志 和Squid的日志
追蹤 web的日志 發現請求端是12.0.0.1 也就是squid的外網卡
追蹤 squid的日志
ACL訪問控制
ACL訪問控制概述
ACL訪問控制列表的概念
ACL(Access Control List)訪問控制列表,主要用於過濾網絡中的流量,是控制訪問的一種技術手段。網絡設備為了過濾報文,需要配置一系列的匹配條件對報文進行分類,應用在端口上,根據預先設定的策略,對特定端口的流量起到控制作用。
訪問控制列表(ACL)由一組規則組成,在規則中定義允許或拒絕通過路由器的條件
利用ACL可以對經過路由器的數據包按照設定的規則進行過濾,使數據包有選擇的通過路由器,起到防火牆的作用。
ACL一般只在以下路由器上配置:
內部網和外部網的邊界路由器。
兩個功能網絡交界的路由器。
在配置文件squid.conf中,ACL訪問控制的步驟
通過以下兩個步驟來實現:
- 使用acl配置項定義需要控制的條件
- 通過http_access配 置項對已定義的列表做“允許"或“拒絕”訪問的控制
定義訪問控制列表
格式: acl 列表名稱 列表類型 列表內容
• 列表名稱: 名稱自定義,相當於給acl起個名字
• 列表類型: 必須使用squid預定義的值,對應不同類別的控制條件
• 列表內容: 是要控制的具體對象,不同類型的列表所對應的內容也不一樣,可以有多個值(以空格為分
隔,為“或"的關系)
ACL訪問控制方式
根據源地址、目標URL、文件類型等定義列表
acl 列表名稱 列表類型 列表內容…
針對已定義的acl列表進行限制
http_access allow或deny列表名稱…
ACL規則優先級
一個用戶訪問代理服務器時,Squid會順序匹配Squid中定義的所有規則列表,一旦匹配成功,立即停止匹配
所有規則都不匹配時,Squid會使用與最后一條相反的規則
常用的ACL列表類型
src →>源地址
dst >自標地址
port→>端口
dstdomain>目標域
time →>訪問時間
maxconn →最大並發連接
ourl_regex→目標URL地址
Urlpath_regex→整個目標URL路徑
設置ACL訪問控制的步驟
環境准備工作: