Squid及正向代理簡介
Squid cache(簡稱為Squid)是一個流行的自由軟件,它符合GNU通用公共許可證。Squid作為網頁服務器的前置cache服務器,可以代理用戶向web服務器請求數據並進行緩存,也可以用在局域網中,使局域網用戶通過代理上網。Squid主要設計用於在Linux一類系統運行。--摘自360百科
本篇博客將詳細演示如何使用squid實現正向代理以及瀏覽內容過濾。
所謂正向代理模式,是指讓用戶通過Squid服務程序獲取網站頁面等資源,以及基於訪問控制列表(ACL)功能對用戶訪問網站行為進行限制,在具體的服務方式上又分為標准代理模式與透明代理模式。標准正向代理模式是把網站數據緩存到服務器本地,提高數據資源被再次訪問時的效率,但是用戶在上網時必須在瀏覽器等軟件中填寫代理服務器的IP地址與端口號信息,否則默認不使用代理服務。
Squid正向代理訪問流程
使用Squid服務程序提供正向代理服務的拓撲如下圖所示。局域網內的主機如果想要訪問外網,則必須要通過Squid服務器提供的代理才行,這樣當Squid服務器接收到用戶的指令后會向外部發出請求,然后將接收到的數據交還給發出指令的那個用戶,從而實現了用戶的代理上網需求。另外,從拓撲圖中也不難看出,企業中的主機要想上網,就必須要經過公司的網關服務器,既然這是一條流量的必經之路,因此企業一般還會把Squid服務程序部署到公司服務器位置,並通過CL(訪問控制列表)功能對企業內員工進行上網審計及限制。
Squid安裝環境准備
這里我准備了兩台虛擬機,鑒於工作中大部分都是Windows使用代理,所以我就使用windows來演示了。一台安裝linux,另外一台安裝windows,無論是windows還是linux都是一樣的!
服務器端需要准備兩塊網卡,一塊網卡負責對內通信,另外一張網卡負責對外通信。
服務器端linux: 外網IP: 172.20.10.2
內網IP: 192.168.11.2
客戶端windows:內網IP: 192.168.11.137
linux服務器
第一步:代理服務器添加網卡
一個連接外網,一個連接內網
第二步:生成網卡配置文件
[root@ken network-scripts]# cp ifcfg-eth0 ifcfg-eth1 [root@ken network-scripts]# vim ifcfg-eth1 NAME="eth1" DEVICE="eth1" ONBOOT=yes NETBOOT=yes BOOTPROTO=static TYPE=Ethernet IPADDR=192.168.11.2 NETMASK=255.255.255.0
第三步:重啟網絡
至此linux網卡配置完成
[root@ken network-scripts]# ip a | grep eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 inet 192.168.11.2/24 brd 192.168.108.255 scope global noprefixroute eth1
windows客戶端
只需要給客戶端添加一個內網IP即可
現在可以使用僅主機模式下的windows訪問外網,發現是訪問不通的
Squid安裝
第一步:關閉防火牆
[root@ken ~]# systemctl stop firewalld [root@ken ~]# setenforce 0
第二步:下載squid服務程序
[root@ken ~]# yum install squid -y
第三步:啟動squid
squid默認監聽的是3128端口,安全起見,在公司內部布置的正向代理服務器建議修改監聽的端口號。
[root@ken ~]# systemctl restart squid [root@ken ~]# ss -tnl | grep 3128 LISTEN 0 1024 :::3128 :::*
Squid實現正向代理
其實下載並啟動完成之后,我們就可以使用squid代理服務了。
第一步:打開你的瀏覽器工具>Internet選項,看到如下界面
第二步:點擊連接>局域網設置
可以看到如下的界面
第三步:填寫服務器端內網IP及squid的端口號,點擊確定即可。
填寫的是內網代理端的內網IP,可以和客戶端通信的IP網段
第四步:瀏覽器測試
刷新瀏覽器即可發現僅主機模式下的windows也可以上網了
Squid常用的訪問控制列表
url_regex與urlpath_regex的區別
1. url_regex
url_regex ACL用於匹配請求URL的任何部分,包括傳輸協議和原始服務器主機名。例如,如下ACL匹配從FTP服務器的MP3文件請求:
acl FTPMP3 url_regex -i ^ftp://.*\.mp3$
2. urlpath_regex
urlpath_regex與url_regex非常相似,不過傳輸協議和主機名不包含在匹配條件里。這讓某些類型的檢測非常容易。例如,假設你必須拒絕URL里的"sex",但仍允許在主機名里含有"sex"的請求,那么這樣做:
acl Sex urlpath_regex sex
另一個例子,假如你想特殊處理cgi-bin請求,你能這樣捕獲它們:
acl CGI1 urlpath_regex ^/cgi-bin
當然,CGI程序並非總在/cgi-bin/目錄下,這樣你應該編寫其他的ACL來捕獲它們。
總結
1. url_regex匹配整個URL部分,包含傳輸協議和主機名
2. urlpath_regex不包含傳輸協議和主機名
3. 可以單獨使用url_regex完成百分之90以上的工作
4. url_regex和urlpath_regex都支持正則
5. URL中的.需要使用\進行轉義
Squid正向代理之ACL訪問控制
演示一:只允許192.168.43.1主機使用代理服務
第一步:修改配置文件
acl ken src 192.168.43.1/24 :定義了一個別名ken
http_access all ken :定義了允許來自ken的訪問
http_access deny all :拒絕其他任何主機的訪問
[root@ken ~]# vim /etc/squid/squid.conf
...
27 acl ken src 192.168.43.1/24 28 29 # 30 # Recommended minimum Access Permission configuration: 31 # 32 # Deny requests to certain unsafe ports 33 http_access all ken 34 http_access deny all
...
第二步:重啟squid服務
[root@ken ~]# systemctl restart squid
第三步:window端刷新界面
發現已經上不去網了
演示二:禁止訪問www.baidu.com網站
在做一個演示的時候把之前定義的規則都刪掉
第一步:修改配置文件
acl ken url_regex www.baidu.com #定義url_regex規則 acl kenken src 192.168.11.137 #定義客戶端地址 # # Recommended minimum Access Permission configuration: # # Deny requests to certain unsafe ports http_access deny ken #拒接url http_access allow kenken #接受客戶端地址的訪問
第二步:重啟服務
[root@ken ~]# systemctl restart squid
第三步:window端查看
現在我的博客又能訪問了
現在訪問下百度網站試試
現在訪問被拒絕了,說明我們配置是生效的
演示三:禁止網址中包含redis的網站
第一步:修改配置文件
添加如下內容
.*表示任意長度的任意內容
acl ken url_regex .*redis.* acl kenken src 192.168.11.137 # # Recommended minimum Access Permission configuration: # # Deny requests to certain unsafe ports http_access deny ken http_access allow kenken
第二步:重啟服務
[root@ken ~]# systemctl restart squid
第三步:windows端查看
現在我的博客還是能訪問的
瀏覽一下redisdoc網站
可以發現只要帶有redis的網站都會被拒絕訪問
演示四:禁止訪問網址中以mp3為結尾的網站
這個我就不演示了無非就是添加一條 acl ken url_regex .*mp3$
acl寫來寫去還是考驗大家的正則表達式
大家有興趣的可以找一個這樣的網站來測試一下
演示五:基於時間段20:00-8:00
第一步:修改配置文件
定義一個時間段
拒絕該時間段的訪問
acl ken time 20:00-23:50 acl kenken src 192.168.11.137 # # Recommended minimum Access Permission configuration: # # Deny requests to certain unsafe ports http_access deny ken http_access allow kenken
第二步:重啟服務
[root@ken ~]# systemctl restart squid
第三步:windows端查看
該時段下的上網服務會被拒絕