Linux就該這么學》最新正式版已出版上市,同學們可在線上京東網當當網淘寶網亞馬遜等電商平臺購買。

*亦可就近在新華書店購買*

章節概述:

本章首先介紹代理服務的原理以及作用,然后介紹Squid服務程序正向解析和反向解析的理論以及配置方法。其中,正向代理模式不僅可以讓用戶使用Squid代理服務器上網,還可以基于指定的IP地址、域名關鍵詞、網站地址或下載文件后綴等信息,實現類似于訪問控制列表的功能。反向代理模式可以大幅提升網站的訪問速度,還可以幫助網站服務器減輕負載壓力。

在掌握了Squid服務程序的標準正向代理模式、透明正向代理模式、訪問控制列表功能以及反向代理等實用功能之后,讀者不但可以進一步理解代理服務,提升服務控制能力,而且在步入運維崗位后能夠游刃有余地處理相關問題。

16.1 代理緩存服務

Squid是Linux系統中最為流行的一款高性能代理服務軟件,通常用作Web網站的前置緩存服務,能夠代替用戶向網站服務器請求頁面數據并進行緩存。簡單來說,Squid服務程序會按照收到的用戶請求向網站源服務器請求頁面、圖片等所需的數據,并將服務器返回的數據存儲在運行Squid服務程序的服務器上。當有用戶再請求相同的數據時,則可以直接將存儲服務器本地的數據交付給用戶,這樣不僅減少了用戶的等待時間,還緩解了網站服務器的負載壓力。

Squid服務程序具有配置簡單、效率高、功能豐富等特點,它能支持HTTP、FTP、SSL等多種協議的數據緩存,可以基于訪問控制列表(ACL)和訪問權限列表(ARL)執行內容過濾與權限管理功能,還可以基于多種條件禁止用戶訪問存在威脅或不適宜的網站資源,因此可以保護企業內網的安全,提升用戶的網絡體驗,幫助節省網絡帶寬。

由于緩存代理服務不但會消耗服務器較多的CPU計算性能、內存以及硬盤等硬件資源,同時還需要較大的網絡帶寬來保障數據的傳輸效率,由此會造成較大的網絡帶寬開銷。因此國內很多IDC或CDN服務提供商會將緩存代理節點服務器放置在二三線城市以降低運營成本。

在使用Squid服務程序為用戶提供緩存代理服務時,具有正向代理模式和反向代理模式之分。

所謂正向代理模式,是指讓用戶通過Squid服務程序獲取網站頁面等資源,以及基于訪問控制列表(ACL)功能對用戶訪問網站行為進行限制,在具體的服務方式上又分為標準代理模式與透明代理模式。標準正向代理模式是把網站數據緩存到服務器本地,提高數據資源被再次訪問時的效率,但是用戶在上網時必須在瀏覽器等軟件中填寫代理服務器的IP地址與端口號信息,否則默認不使用代理服務。而透明正向代理模式的作用與標準正向代理模式基本相同,區別是用戶不需要手動指定代理服務器的IP地址與端口號,所以這種代理服務對于用戶來講是相對透明的。

使用Squid服務程序提供正向代理服務的拓撲如圖16-1所示。局域網內的主機如果想要訪問外網,則必須要通過Squid服務器提供的代理才行,這樣當Squid服務器接收到用戶的指令后會向外部發出請求,然后將接收到的數據交還給發出指令的那個用戶,從而實現了用戶的代理上網需求。另外,從拓撲圖中也不難看出,企業中的主機要想上網,就必須要經過公司的網關服務器,既然這是一條流量的必經之路,因此企業一般還會把Squid服務程序部署到公司服務器位置,并通過稍后講到的ACL(訪問控制列表)功能對企業內員工進行上網審計及限制。

squid拓撲

圖16-1? Squid服務程序提供正向代理服務

反向代理模式是指讓多臺節點主機反向緩存網站數據,從而加快用戶訪問速度。因為一般來講,網站中會普遍加載大量的文字、圖片等靜態資源,而且它們相對來說都是比較穩定的數據信息,當用戶發起網站頁面中這些靜態資源的訪問請求時,我們可以使用Squid服務程序提供的反向代理模式來進行響應。而且,如果反向代理服務器中恰巧已經有了用戶要訪問的靜態資源,則直接將緩存的這些靜態資源發送給用戶,這不僅可以加快用戶的網站訪問速度,還在一定程度上降低了網站服務器的負載壓力。

使用Squid服務程序提供反向代理服務的拓撲如圖16-2所示。當外網用戶嘗試訪問某個網站時,實際請求是被Squid服務器所處理的。反向代理服務器會將緩存好的靜態資源更快地交付給外網用戶,從而加快了網站頁面被用戶訪問的速度。并且由于網站頁面數據中的靜態資源請求已被Squid服務器處理,因此網站服務器負責動態數據查詢就可以了,也進而降低了服務器機房中網站服務器的負載壓力。

squid反向代理

圖16-2? Squid服務程序提供的反向代理模式

總結來說,正向代理模式一般用于企業局域網之中,讓企業用戶統一地通過Squid服務訪問互聯網資源,這樣不僅可以在一定程度上減少公網帶寬的開銷,而且還能對用戶訪問的網站內容進行監管限制,一旦內網用戶訪問的網站內容與禁止規則相匹配,就會自動屏蔽網站。反向代理模式一般是為大中型網站提供緩存服務的,它把網站中的靜態資源保存在國內多個節點機房中,當有用戶發起靜態資源的訪問請求時,可以就近為用戶分配節點并傳輸資源,因此在大中型網站中得到了普遍應用。

16.2 配置Squid服務程序

Squid服務程序的配置步驟雖然十分簡單,但依然需要為大家交代一下實驗所需的設備以及相應的設置。首先需要準備兩臺虛擬機,一臺用作Squid服務器,另外一臺用作Squid客戶端,后者無論是Windows系統還是Linux系統皆可(本實驗中使用的是Windows 7操作系統)。為了能夠相互通信,需要將這兩臺虛擬機都設置為僅主機模式(Hostonly),然后關閉其中一臺虛擬機的電源,在添加一塊新的網卡后開啟電源,如圖16-3所示。
添加一塊網卡設備

圖16-3? 在其中一臺虛擬機中添加一塊新網卡

需要注意的是,這塊新添加的網卡設備必須選擇為橋接模式,否則這兩臺虛擬機都無法訪問外網。按照表16-1配置這兩臺虛擬機的IP地址。

表16-1?????????????????????????? Squid服務器和客戶端的操作系統和IP地址信息

主機名稱 操作系統 IP地址
Squid服務器 RHEL 7 外網卡:橋接DHCP模式
內網卡:192.168.10.10
Squid客戶端 Windows 7 192.168.10.20

這樣一來,我們就有了一臺既能訪問內網,又能訪問外網的虛擬機了。一會兒需要把Squid服務程序部署在這臺虛擬機上,然后讓另外一臺原本只能訪問內網的虛擬機(即Squid客戶端)通過Squid服務器進行代理上網,從而使得Squid客戶端也能訪問外部?? 網站。

另外,我們還需要檢查Squid服務器是否已經可以成功訪問外部網絡。可以ping一個外網域名進行測試(手動按下Ctrl+c鍵停止)。

[[email protected] ~]# ping www.52437949.com
PING www.52437949.com (162.159.211.33) 56(84) bytes of data.
64 bytes from 162.159.211.33: icmp_seq=1 ttl=45 time=166 ms
64 bytes from 162.159.211.33: icmp_seq=2 ttl=45 time=168 ms
64 bytes from 162.159.211.33: icmp_seq=3 ttl=45 time=167 ms
64 bytes from 162.159.211.33: icmp_seq=4 ttl=45 time=166 ms
^C
--- www.52437949.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 166.361/167.039/168.109/0.836 ms

當配置好Yum軟件倉庫并掛載好設備鏡像后,就可以安裝Squid服務程序了。考慮到本書中大部分服務程序都是通過Yum軟件倉庫安裝的,讀者應該對此十分熟悉,因此這里不再贅述。當然,大家也不必擔心自己過于依賴Yum軟件倉庫來管理軟件程序包,第20章會講解如何通過源碼包的方式來安裝服務程序。

[[email protected] ~]# yum install squid
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
rhel | 4.1 kB 00:00 
Resolving Dependencies
--> Running transaction check
---> Package squid.x86_64 7:3.3.8-11.el7 will be installed
--> Processing Dependency: perl(DBI) for package: 7:squid-3.3.8-11.el7.x86_64
--> Processing Dependency: perl(Data::Dumper) for package: 7:squid-3.3.8-11.el7.x86_64
--> Processing Dependency: perl(Digest::MD5) for package: 7:squid-3.3.8-11.el7.x86_64
--> Processing Dependency: libecap.so.2()(64bit) for package: 7:squid-3.3.8-11.el7.x86_64
--> Running transaction check
………………省略部分輸出信息………………
Installed:
 squid.x86_64 7:3.3.8-11.el7 
Dependency Installed:
 libecap.x86_64 0:0.2.0-8.el7 
 perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7 
 perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7 
 perl-DBI.x86_64 0:1.627-4.el7 
 perl-Data-Dumper.x86_64 0:2.145-3.el7 
 perl-Digest.noarch 0:1.17-245.el7 
 perl-Digest-MD5.x86_64 0:2.52-3.el7 
 perl-IO-Compress.noarch 0:2.061-2.el7 
 perl-Net-Daemon.noarch 0:0.48-5.el7 
 perl-PlRPC.noarch 0:0.2020-14.el7 
Complete!

與之前配置過的服務程序大致類似,Squid服務程序的配置文件也是存放在/etct目錄下一個以服務名稱命名的目錄中。表16-2羅列了一些常用的Squid服務程序配置參數,大家可以預先瀏覽一下。

表16-2???????????????????????????????? 常用的Squid服務程序配置參數以及作用

參數 作用
http_port 3128 監聽的端口號
cache_mem 64M 內存緩沖區的大小
cache_dir ufs /var/spool/squid 2000 16 256 硬盤緩沖區的大小
cache_effective_user squid 設置緩存的有效用戶
cache_effective_group squid 設置緩存的有效用戶組
dns_nameservers IP地址 一般不設置,而是用服務器默認的DNS地址
cache_access_log /var/log/squid/access.log 訪問日志文件的保存路徑
cache_log /var/log/squid/cache.log 緩存日志文件的保存路徑
visible_hostname linuxprobe.com 設置Squid服務器的名稱

16.3 正向代理
16.3.1 標準正向代理

Squid服務程序軟件包在正確安裝并啟動后,默認就已經可以為用戶提供標準正向代理模式服務了,而不再需要單獨修改配置文件或者進行其他操作。接下來在運行Windows 7系統的客戶端上面打開任意一款瀏覽器,然后單擊“Internet選項”命令,如圖16-4所示。

[[email protected] ~]# systemctl restart squid
[[email protected] ~]# systemctl enable squid
ln -s '/usr/lib/systemd/system/squid.service' '/etc/systemd/system/multi-user.target.wants/squid.service'

瀏覽器設置

圖16-4? 單擊瀏覽器中的“Internet選項”命令

要想使用Squid服務程序提供的標準正向代理模式服務,就必須在瀏覽器中填寫服務器的IP地址以及端口號信息。因此還需要在“連接”選項卡下單擊“局域網設置”按鈕(見圖16-5),并按照圖16-6所示填寫代理服務器的信息,然后保存并退出配置向導。

網絡選項

圖16-5? 在“連接”選項卡中單擊“局域網設置”按鈕

填寫Squid服務器的IP地址與端口號

圖16-6? 填寫代理服務器的IP地址與端口號

現在,用戶可以使用Squid服務程序提供的代理服務了。托代理服務器轉發的福,網卡被設置為僅主機模式(Hostonly)的虛擬機也能奇跡般地上網瀏覽了,如圖16-7所示。

圖16-7? 虛擬機可以正常網絡外網

如此公開而沒有密碼驗證的代理服務終歸讓人覺得不放心,萬一有人也來“蹭網”該怎么辦呢?Squid服務程序默認使用3128、3401與4827等端口號,因此可以把默認使用的端口號修改為其他值,以便起到一定的保護作用。現在大家應該都知道,在Linux系統配置服務程序其實就是修改該服務的配置文件,因此直接在/etc目錄下的Squid服務程序同名目錄中找到配置文件,把http_port參數后面原有的3128修改為10000,即把Squid服務程序的代理服務端口修改成了新值。最后一定不要忘記重啟服務程序。

[[email protected] ~]# vim /etc/squid/squid.conf
………………省略部分輸出信息………………
45 #
46 # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
47 #
48 
49 # Example rule allowing access from your local networks.
50 # Adapt localnet in the ACL section to list your (internal) IP networks
51 # from where browsing should be allowed
52 http_access allow localnet
53 http_access allow localhost
54 
55 # And finally deny all other access to this proxy
56 http_access deny all
57 
58 # Squid normally listens to port 3128
59 http_port 10000
60 
http_port 10000
………………省略部分輸出信息………………
[[email protected] ~]# systemctl restart squid 
[[email protected] ~]# systemctl enable squid 
 ln -s '/usr/lib/systemd/system/squid.service' '/etc/systemd/system/multi-user.target.wants/squid.service'

有沒有突然覺得這一幕似曾相識?在10.5.3節講解基于端口號來部署httpd服務程序的虛擬主機功能時,我們在編輯完httpd服務程序的配置文件并重啟服務程序后,被系統提示報錯。盡管現在重啟Squid服務程序后系統沒有報錯,但是用戶還不能使用代理服務。SElinux安全子系統認為Squid服務程序使用3128端口號是理所當然的,因此在默認策略規則中也是允許的,但是現在Squid服務程序卻嘗試使用新的10000端口號,而該端口原本并不屬于Squid服務程序應該使用的系統資源,因此還需要手動把新的端口號添加到Squid服務程序在SElinux域的允許列表中。

[[email protected] ~]# semanage port -l | grep squid_port_t
squid_port_t                   tcp      3128, 3401, 4827
squid_port_t                   udp      3401, 4827
[[email protected] ~]# semanage port -a -t squid_port_t -p tcp 10000
[[email protected] ~]# semanage port -l | grep squid_port_t
squid_port_t                   tcp      10000, 3128, 3401, 4827
squid_port_t                   udp      3401, 4827

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

16.3.2 ACL訪問控制

在日常工作中,企業員工一般是通過公司內部的網關服務器來訪問互聯網,當將Squid服務程序部署為公司網絡的網關服務器后,Squid服務程序的訪問控制列表(ACL)功能將發揮它的用武之地。它可以根據指定的策略條件來緩存數據或限制用戶的訪問。比如很多公司會分時段地禁止員工逛淘寶、打網頁游戲,這些禁止行為都可以通過Squid服務程序的ACL功能來實現。大家如果日后在人員流動較大的公司中從事運維工作,可以牢記本節內容,在公司網關服務器上部署的Squid服務程序中添加某些策略條件,禁止員工訪問某些招聘網站或競爭對手的網站,沒準還能有效降低員工的流失率。

Squid服務程序的ACL是由多個策略規則組成的,它可以根據指定的策略規則來允許或限制訪問請求,而且策略規則的匹配順序與防火墻策略規則一樣都是由上至下;在一旦形成匹配之后,則立即執行相應操作并結束匹配過程。為了避免ACL將所有流量全部禁止或全部放行,起不到預期的訪問控制效果,運維人員通常會在ACL的最下面寫上deny all或者allow all語句,以避免安全隱患。

劉遄老師將通過下面的4個實驗向大家演示Squid服務程序的ACL功能有多么強大。

實驗1只允許IP地址為192.168.10.20的客戶端使用服務器上的Squid服務程序提供的代理服務,禁止其余所有的主機代理請求。

下面的配置文件依然是Squid服務程序的配置文件,但是需要留心配置參數的填寫位置。如果寫的太靠前,則有些Squid服務程序自身的語句都沒有加載完,也會導致策略無效。當然也不用太靠后,大約在26~32行的位置就可以,而且采用分行填寫的方式也便于日后的修改。

[[email protected] ~]# vim /etc/squid/squid.conf
 1 #
 2 # Recommended minimum configuration:
 3 #
 4 
 5 # Example rule allowing access from your local networks.
 6 # Adapt to list your (internal) IP networks from where browsing
 7 # should be allowed
 8 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
 9 acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
 10 acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
 11 acl localnet src fc00::/7 # RFC 4193 local private network range
 12 acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) mac hines
 13 
 14 acl SSL_ports port 443
 15 acl Safe_ports port 80 # http
 16 acl Safe_ports port 21 # ftp
 17 acl Safe_ports port 443 # https
 18 acl Safe_ports port 70 # gopher
 19 acl Safe_ports port 210 # wais
 20 acl Safe_ports port 1025-65535 # unregistered ports
 21 acl Safe_ports port 280 # http-mgmt
 22 acl Safe_ports port 488 # gss-http
 23 acl Safe_ports port 591 # filemaker
 24 acl Safe_ports port 777 # multiling http
 25 acl CONNECT method CONNECT
 26 acl client src 192.168.10.20
 27 #
 28 # Recommended minimum Access Permission configuration:
 29 #
 30 # Deny requests to certain unsafe ports
 31 http_access allow client
 32 http_access deny all
 33 http_access deny !Safe_ports
 34
[[email protected] ~]# systemctl restart squid

上面的配置參數其實很容易理解。首先定義了一個名為client的別名。這其實類似于13.6節講解的DNS分離解析技術,當時我們分別定義了兩個名為china與american的別名變量,這樣當再遇到這個別名時也就意味著與之定義的IP地址了。保存配置文件后重啟Squid服務程序,這時由于客戶端主機的IP地址不符合我們的允許策略而被禁止使用代理服務,如圖16-8所示。

訪問被拒絕

圖16-8? 使用代理服務瀏覽網頁失敗

實驗2:禁止所有客戶端訪問網址中包含linux關鍵詞的網站。

Squid服務程序的這種ACL功能模式是比較粗獷暴力的,客戶端訪問的任何網址中只要包含了某個關鍵詞就會被立即禁止訪問,但是這并不影響訪問其他網站。

[[email protected] ~]# vim /etc/squid/squid.conf
 1 #
 2 # Recommended minimum configuration:
 3 #
 4 
 5 # Example rule allowing access from your local networks.
 6 # Adapt to list your (internal) IP networks from where browsing
 7 # should be allowed
 8 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
 9 acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
 10 acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
 11 acl localnet src fc00::/7 # RFC 4193 local private network range
 12 acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) mac hines
 13 
 14 acl SSL_ports port 443
 15 acl Safe_ports port 80 # http
 16 acl Safe_ports port 21 # ftp
 17 acl Safe_ports port 443 # https
 18 acl Safe_ports port 70 # gopher
 19 acl Safe_ports port 210 # wais
 20 acl Safe_ports port 1025-65535 # unregistered ports
 21 acl Safe_ports port 280 # http-mgmt
 22 acl Safe_ports port 488 # gss-http
 23 acl Safe_ports port 591 # filemaker
 24 acl Safe_ports port 777 # multiling http
 25 acl CONNECT method CONNECT
 26 acl deny_keyword url_regex -i linux
 27 #
 28 # Recommended minimum Access Permission configuration:
 29 #
 30 # Deny requests to certain unsafe ports
 31 http_access deny deny_keyword
 33 http_access deny !Safe_ports
 34
[[email protected] ~]# systemctl restart squid

劉遄老師建議大家在進行實驗之前,一定要先把前面實驗中的代碼清理干凈,以免不同的實驗之間產生沖突。在當前的實驗中,我們直接定義了一個名為deny_keyword的別名,然后把所有網址帶有linux關鍵詞的網站請求統統拒絕掉。當客戶端分別訪問帶有linux關鍵詞和不帶有linux關鍵詞的網站時,其結果如圖16-9所示。

訪問又被拒絕

圖16-9? 當客戶端分別訪問帶有linux關鍵詞和不帶linux關鍵詞的網站時,所呈現的結果

實驗3:禁止所有客戶端訪問某個特定的網站。

在實驗2中,由于我們禁止所有客戶端訪問網址中包含linux關鍵詞的網站,這將造成一大批網站被誤封,從而影響同事們的正常工作。其實通過禁止客戶端訪問某個特定的網址,也就避免了誤封的行為。下面按照如下所示的參數配置Squid服務程序并重啟,然后進行測試,其測試結果如圖16-10所示。

[[email protected] ~]# vim /etc/squid/squid.conf
 24 acl Safe_ports port 777 # multiling http
 25 acl CONNECT method CONNECT
 26 acl deny_url url_regex http://www.linuxcool.com
 27 #
 28 # Recommended minimum Access Permission configuration:
 29 #
 30 # Deny requests to certain unsafe ports
 31 http_access deny deny_url
 33 http_access deny !Safe_ports
 34
[[email protected] ~]# systemctl restart squid

圖16-10? 無法使用代理服務訪問這個特定的網站

實驗4:禁止員工在企業網內部下載帶有某些后綴的文件。

在企業網絡中,總會有一小部分人利用企業網絡的高速帶寬私自下載資源(比如游戲安裝文件、電影文件等),從而對其他同事的工作效率造成影響。通過禁止所有用戶訪問.rar或.avi等后綴文件的請求,可以防止他們繼續下載資源,讓他們知難而退。下面按照如下所示的參數配置Squid服務程序并重啟,然后進行測試,其測試結果如圖16-11所示。

如果這些員工是使用迅雷等P2P下載軟件來下載資源的話,就只能使用專業級的應用防火墻來禁止了。

[[email protected] ~]# vim /etc/squid/squid.conf
 24 acl Safe_ports port 777 # multiling http
 25 acl CONNECT method CONNECT
 26 acl badfile urlpath_regex -i \.mp3$ \.rar$
 27 #
 28 # Recommended minimum Access Permission configuration:
 29 #
 30 # Deny requests to certain unsafe ports
 31 http_access deny badfile
 33 http_access deny !Safe_ports
 34
[[email protected] ~]# systemctl restart squid

圖16-11? 無法使用代理服務下載具有指定后綴的文件

16.3.3 透明正向代理

正向代理服務一般是針對企業內部的所有員工設置的,鑒于每位員工所掌握的計算機知識不盡相同,如果您所在的公司不是IT行業的公司,想教會大家如何使用代理服務也不是一件容易的事情。再者,無論是什么行業的公司,公司領導都希望能采取某些措施限制員工在公司內的上網行為,這時就需要用到透明的正向代理模式了。

“透明”二字指的是讓用戶在沒有感知的情況下使用代理服務,這樣的好處是一方面不需要用戶手動配置代理服務器的信息,進而降低了代理服務的使用門檻;另一方面也可以更隱秘地監督員工的上網行為。

在透明代理模式中,用戶無須在瀏覽器或其他軟件中配置代理服務器地址、端口號等信息,而是由DHCP服務器將網絡配置信息分配給客戶端主機。這樣只要用戶打開瀏覽器便會自動使用代理服務了。如果大家此時并沒有配置DHCP服務器,可以像如圖16-12所示來手動配置客戶端主機的網卡參數。

配置網卡信息

圖16-12? 配置Windows客戶端的網絡信息

為了避免實驗之間互相影響,更好地體驗透明代理技術的效果,我們需要把客戶端瀏覽器的代理信息刪除(即圖16-6的操作),然后再刷新頁面,就會看到訪問任何網站都失敗了,如圖16-13所示。 嘗試訪問網站失敗

圖16-13? 停止使用代理服務后無法成功訪問網站

有些時候會因為Windows系統的緩存原因導致依然能看到網頁內容,這時可以換個網站嘗試一下訪問效果。

 

既然要讓用戶在無需過多配置系統的情況下就能使用代理服務,作為運維人員就必須提前將網絡配置信息與數據轉發功能配置好。前面已經配置好的網絡參數,接下來要使用8.3.2節介紹的SNAT技術完成數據的轉發,讓客戶端主機將數據交給Squid代理服務器,再由后者轉發到外網中。簡單來說,就是讓Squid服務器作為一個中間人,實現內網客戶端主機與外部網絡之間的數據傳輸。

由于當前還沒有部署SNAT功能,因此當前內網中的客戶端主機是不能訪問外網的:

C:\Users\linuxprobe>ping www.52437949.com
Ping 請求找不到主機 www.52437949.com。請檢查該名稱,然后重試。

第8章已經介紹了iptables與firewalld防火墻理論知識以及策略規則的配置方法,大家可以任選其中一款完成接下來的實驗。劉遄老師覺得firewalld防火墻實在太簡單了,因此決定使用純命令行的iptables防火墻管理工具來演示部署方法。

要想讓內網中的客戶端主機能夠訪問外網,客戶端主機首先要能獲取到DNS地址解析服務的數據,這樣才能在互聯網中找到對應網站的IP地址。下面通過iptables命令實現DNS地址解析服務53端口的數據轉發功能,并且允許Squid服務器轉發IPv4數據包。sysctl -p命令的作用是讓轉發參數立即生效:

[[email protected] ~]# iptables -F
[[email protected] ~]# iptables -t nat -A POSTROUTING -p udp --dport 53 -o eno33554968 -j MASQUERADE
[[email protected] ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[[email protected] ~]# sysctl -p 
net.ipv4.ip_forward = 1

現在回到客戶端主機,再次ping某個外網地址。此時可以發現,雖然不能連通網站,但是此時已經能夠獲取到外網DNS服務的域名解析數據。這個步驟非常重要,為接下來的SNAT技術打下了扎實的基礎。

C:\Users\linuxprobe>ping www.52437949.com
正在 Ping www.52437949.com [116.31.127.233] 具有 32 字節的數據:
請求超時。
請求超時。
請求超時。
請求超時。
116.31.127.233 的 Ping 統計信息:
    數據包: 已發送 = 4,已接收 = 0,丟失 = 4 (100% 丟失),

與配置DNS和SNAT技術轉發相比,Squid服務程序透明代理模式的配置過程就十分簡單了,只需要在主配置文件中服務器端口號后面追加上transparent單詞(意思為“透明的”),然后把第62行的井號(#)注釋符刪除,設置緩存的保存路徑就可以了。保存主配置文件并退出后再使用squid -k parse命令檢查主配置文件是否有錯誤,以及使用squid -z命令對Squid服務程序的透明代理技術進行初始化。

[[email protected] ~]# vim /etc/squid/squid.conf
………………省略部分輸出信息………………
58 # Squid normally listens to port 3128
59 http_port 3128 transparent
60
61 # Uncomment and adjust the following to add a disk cache directory.
62 cache_dir ufs /var/spool/squid 100 16 256
63 
………………省略部分輸出信息………………
[[email protected] ~]# squid -k parse
2017/04/13 06:40:44| Startup: Initializing Authentication Schemes ...
2017/04/13 06:40:44| Startup: Initialized Authentication Scheme 'basic'
2017/04/13 06:40:44| Startup: Initialized Authentication Scheme 'digest'
2017/04/13 06:40:44| Startup: Initialized Authentication Scheme 'negotiate'
2017/04/13 06:40:44| Startup: Initialized Authentication Scheme 'ntlm'
2017/04/13 06:40:44| Startup: Initialized Authentication.
………………省略部分輸出信息………………
[[email protected] ~]# squid -z
2017/04/13 06:41:26 kid1| Creating missing swap directories
2017/04/13 06:41:26 kid1| /var/spool/squid exists
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/00
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/01
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/02
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/03
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/04
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/05
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/06
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/07
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/08
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/09
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0A
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0B
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0C
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0D
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0E
2017/04/13 06:41:26 kid1| Making directories in /var/spool/squid/0F
[[email protected] ~]# systemctl restart squid

在配置妥當并重啟Squid服務程序且系統沒有提示報錯信息后,接下來就可以完成SNAT數據轉發功能了。它的原理其實很簡單,就是使用iptables防火墻管理命令把所有客戶端主機對網站80端口的請求轉發至Squid服務器本地的3128端口上。SNAT數據轉發功能的具體配置參數如下。

[root@linuxprobe ~]# iptables -t nat -A PREROUTING ?-p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
[root@linuxprobe ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eno33554968 -j SNAT --to 您的橋接網卡IP地址
[root@linuxprobe ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

這時客戶端主機再刷新一下瀏覽器,就又能訪問網絡了,如圖16-14所示。

再次嘗試訪問網站

圖16-14? 客戶端主機借助于透明代理技術成功訪問網絡

現在肯定有讀者在想,如果開啟了SNAT功能,數據不就直接被轉發到外網了么?內網中的客戶端主機是否還依然使用Squid服務程序提供的代理服務呢?其實,只要仔細看一下iptables防火墻命令就會發現,劉遄老師剛才并不是單純地開啟了SNAT功能,而是通過把客戶端主機訪問外網80端口的請求轉發到Squid服務器的3128端口號上,從而還是強制客戶端主機必須通過Squid服務程序來上網。為了驗證這個說法,我們編輯Squid服務程序的配置文件,單獨禁止本書的配套站點(http://www.52437949.com/),然后再次刷新客戶端主機的瀏覽器,發現網頁又被禁止顯示了,如圖16-15所示。

圖16-15? 客戶端主機再次無法訪問網絡

16.4 反向代理

網站頁面是由靜態資源和動態資源一起組成的,其中靜態資源包括網站架構CSS文件、大量的圖片、視頻等數據,這些數據相對于動態資源來說更加穩定,一般不會經常發生改變。但是,隨著建站技術的更新換代,外加人們不斷提升的審美能力,這些靜態資源占據的網站空間越來越多。如果能夠把這些靜態資源從網站頁面中抽離出去,然后在全國各地部署靜態資源的緩存節點,這樣不僅可以提升用戶訪問網站的速度,而且網站源服務器也會因為這些緩存節點的存在而降低負載。

反向代理是Squid服務程序的一種重要模式,其原理是把一部分原本向網站源服務器發起的用戶請求交給Squid服務器緩存節點來處理。但是這種技術的弊端也很明顯,如果有心懷不軌之徒將自己的域名和服務器反向代理到某個知名的網站上面,從理論上來講,當用戶訪問到這個域名時,也會看到與那個知名網站一樣的內容(有些詐騙網站就是這樣騙取用戶信任的)。因此,當前許多網站都默認禁止了反向代理功能。開啟了CDN(內容分發網絡)服務的網站也可以避免這種竊取行為。如果訪問開啟了防護功能的網站,一般會看到如圖16-16所示的報錯信息。

圖16-16? 訪問網站時提示報錯信息

劉遄老師為了實驗需要而臨時關閉了本書配套站點的CDN服務及防護插件,請大家盡量選擇用自己的網站或博客進行該實驗操作,避免影響到其他網站的正常運轉,給他人造成麻煩。

使用Squid服務程序來配置反向代理服務非常簡單。首先找到一個網站源服務器的IP地址,然后編輯Squid服務程序的主配置文件,把端口號3128修改為網站源服務器的地址和端口號,此時正向解析服務會被暫停(它不能與反向代理服務同時使用)。然后按照下面的參數形式寫入需要反向代理的網站源服務器的IP地址信息,保存退出后重啟Squid服務程序。正常網站使用反向代理服務的效果如圖16-17所示。

[[email protected] ~]# vim /etc/squid/squid.conf
………………省略部分輸出信息………………
57 
58 # Squid normally listens to port 3128
59 http_port 您的橋接網卡IP地址:80 vhost
60 cache_peer 網站源服務器IP地址 parent 80 0 originserver
61 
………………省略部分輸出信息………………
[[email protected] ~]# systemctl restart squid

圖16-17? 使用反向代理模式訪問網站

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

本章節的復習作業(答案就在問題的下一行哦,用鼠標選中即可看到的~)

1.簡述Squid服務程序提供的正向代理服務的主要作用。

答:實現代理上網、隱藏用戶的真實訪問信息以及對控制用戶訪問網站行為的訪問控制列表(ACL)進行限制。

2.簡述Squid服務程序提供的反向代理服務的主要作用。

答:加快用戶訪問網站的速度,降低網站源服務器的負載壓力。

3.Squid服務程序能夠提供的代理模式有哪些?

答:正向代理模式與反向代理模式,其中正向代理模式又分為標準正向代理模式與透明正向代理模式。

4.標準正向代理模式與透明正向代理模式的區別是什么?

答:區別在于用戶是否需要配置代理服務器的信息。若使用透明代理模式,則用戶感知不到代理服務的存在。

5.使用Squid服務程序提供的標準正向代理模式時,需要在瀏覽器中配置哪些信息?

答:需要填寫Squid服務器的IP地址及端口號信息。

6.若需要通過ACL功能限制用戶不能使用代理服務訪問指定網站,參數該怎么寫?

答:以本書的配套學習站點(www.52437949.com)為例,可使用參數“acl deny_url url_regex http://www.52437949.com”和“http_access deny deny_url”來禁止用戶訪問這個指定的網站。

7.若讓客戶端主機使用透明正向代理模式,則需要用DHCP服務器為客戶端主機分配什么信息?

答:需要為客戶端主機分配IP地址、子網掩碼、網關地址以及外部DNS服務

本文原創地址:http://www.52437949.com/chapter-16.html編輯:劉遄,審核員:暫無