1. 程式人生 > 實用技巧 >Linux系統通過Squid配置實現代理上網

Linux系統通過Squid配置實現代理上網

Squid是什麼

Squid是一種用來緩衝Internet資料的軟體。它接受來自人們需要下載的目標(object)的請求並適當地處理這些請求。也就是說,如果一個人想下載一web頁面,他請求Squid為他取得這個頁面。Squid隨之連線到遠端伺服器(比如:http://squid.nlanr.net) 並向這個頁面發出請求。然後,Squid顯式地聚集資料到客戶端機器,而且同時複製一份。當下一次有人需要同一頁面時,Squid可以簡單地從磁碟中讀到它,那樣資料迅即就會傳輸到客戶機上。當前的Squid可以處理HTTP,FTP,GOPHER,SSL和WAIS等協議。但它不能處理如POP,NNTP,RealAudio以及其它型別的東西。

我這裡的常用於做伺服器的統一出口,把squid作為能夠出公網的裝置,然後為所有需要出公網的伺服器進行代理設定,從而帶動內網伺服器能夠上網,但是我們上網也是僅僅使用公網的yum源以及公網的一些技術資源。

Squid的基本型別

傳統代理
也就是普通的代理服務,,必須在客戶端的瀏覽器、QQ聊天工具、下載軟體等程式中手動設定代理伺服器的地址和埠,然後才能使用代理服務來訪問網路。對於網頁瀏覽器,訪問網站時的域名解析請求也會發送給指定的代理伺服器。

透明代理
提供與傳統代理相同的功能和服務,其區別在於客戶機不需要指定代理伺服器的地址和埠,而是通過預設路由、防火牆策略將web訪問重定向,實際上仍然交給代理伺服器來處理。重定向的過程對於客戶機來說是“透明”的,使用者甚至並不知道自己在使用代理服務,所以稱為“透明代理”。

Squid部署

下載地址:http://www.squid-cache.org/Versions/v4/squid-4.8.tar.gz
如果你下載的Squid v3 版本,則任何 C++ 編譯器都可以,如果你下載的是Squid v4或者更高版本,那麼就需要 C++11 的編譯器。

yum install libtool-ltdl-devel libxml2-devel libcap-devel perl gcc autoconf automake make sudo wget
tar xf squid-4.8.tar.gz
cd squid-4.8
./configure --prefix=/usr/local/squid --enable-arp-acl --enable-linux-netfilter --enable-linux-tproxy --enable-async-io=100 --enable-err-language="Simplify_Chinese" --enable-underscore --enable-poll --enable-gnuregex

引數解釋:
./configure:檢查你的系統編譯器是否可用
--preifx:指定安裝路徑
--enable-arp-acl:可以在規則中設定為直接通過客戶端MAC進行管理,防止客戶端使用IP欺騙
--enable-linux-netfilter:使用核心過濾
--enable-linux-tproxy:支援透明模式
--enable-async-io=100:非同步I/O,提升儲存效能,相當於 --enable-pthreads   --enable-storeio=ufs,aufs
--enable-err-language="Simplify_Chinese":報錯時顯示的語音,這裡指定為Chinese
--enable-underscore:允許URL中有下劃線
--enable-poll:使用Poll()模式,提升效能
--enable-gnuregex:使用GUN正則表示式

make && make install
useradd -M -s /sbin/nologin squid
chown -R squid.squid /usr/local/squid/var
ln -s /usr/local/squid/sbin/squid  /usr/local/sbin/

初始化並啟動Squid

新增squid執行的使用者及組

echo 'cache_effective_user squid' >> /usr/local/squid/etc/squid.conf
echo 'cache_effective_group squid' >> /usr/local/squid/etc/squid.conf

初始化快取目錄

[root@host-10-200-86-163 /]# squid -z
2019/08/08 17:04:40| Created PID file (/usr/local/squid/var/run/squid.pid)
[root@host-10-200-86-163 /]# 2019/08/08 17:04:40 kid1| Set Current Directory to /usr/local/squid/var/cache/squid
2019/08/08 17:04:40 kid1| Creating missing swap directories
2019/08/08 17:04:40 kid1| No cache_dir stores are configured.
2019/08/08 17:04:40| Removing PID file (/usr/local/squid/var/run/squid.pid)

啟動Squid

[root@host-10-200-86-163 /]# squid
[root@host-10-200-86-163 /]# ss -anplt | grep 3128
LISTEN     0      128         :::3128                    :::*                   users:(("squid",pid=6304,fd=10))

檢視Squid的執行使用者

[root@host-10-200-86-163 /]# ps -ef|grep squid
root      6302     1  0 17:05 ?        00:00:00 squid
squid     6304  6302  0 17:05 ?        00:00:00 (squid-1) --kid squid-1
squid     6305  6304  0 17:05 ?        00:00:00 (logfile-daemon) /usr/local/squid/var/logs/access.log
root      6322 30305  0 17:06 pts/7    00:00:00 grep --color=auto squid

建立服務啟動指令碼

vim /etc/init.d/squid
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid"
CONF="/usr/local/squid/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 shutdown &> /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..."
      $CMD
     fi
   ;;
   stop)
     $CMD -k shutdown &> /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

指令碼測試

[root@host-10-200-86-163 init.d]# netstat -anplt | grep squid
[root@host-10-200-86-163 init.d]# service squid start
正在啟動 squid...
[root@host-10-200-86-163 init.d]# netstat -anplt | grep squid
tcp6       0      0 :::3128                 :::*                    LISTEN      8260/(squid-1)      
[root@host-10-200-86-163 init.d]# service squid stop
[root@host-10-200-86-163 init.d]# netstat -anplt | grep squid

建立傳統代理

主要修改下圖中所圈出的內容

# And finally deny all other access to this proxy
http_access allow all       #在deny all前新增allow all
http_access deny all

# Squid normally listens to port 3128
http_port 3128              #squid對外埠
cache_mem 128 MB            #指定快取功能所使用的記憶體空間大小,便於保持訪問較頻繁的WEB物件,容量最好為4的倍數,單位為MB,建議設為實體記憶體的1/4
reply_body_max_size 10 MB   #允許使用者下載的最大檔案大小,以位元組為單位。預設設定0表示不進行限制
maximum_object_size 4096 KB #允許儲存到快取空間的最大物件大小,以KB為單位,超過大小限制的檔案將不被快取,而是直接轉發給使用者
# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /usr/local/squid/var/cache/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
cache_effective_user squid  #squid執行使用者
cache_effective_group squid #squid執行組

重啟Squid

#進行配置檢查
[root@host-10-200-86-163 init.d]# /usr/local/squid/sbin/squid -k reconfigure
[root@host-10-200-86-163 init.d]# /usr/local/squid/sbin/squid -k check

#重啟
[root@host-10-200-86-163 init.d]# service squid restart
正在關閉 squid...
正在啟動 squid...

[root@host-10-200-86-163 init.d]# netstat -anplt | grep 3128
tcp6       0      0 :::3128                 :::*                    LISTEN      8774/(squid-1)  

設定Linux伺服器內網上網
重新找一臺內網的linux伺服器
沒有設定代理上網前,去curl百度是失敗的

[root@sx-sj-mcn-redis-1 ~]# curl www.baidu.com -I
curl: (6) Could not resolve host: www.baidu.com; Unknown error

臨時設定代理

[root@sx-sj-mcn-redis-1 ~]# export proxy=http://10.200.86.163:3128;             #proxy=http代理http協議的請求
[root@sx-sj-mcn-redis-1 ~]# export http_proxy="http://10.200.86.163:3128";
[root@sx-sj-mcn-redis-1 ~]# export https_proxy="http://10.200.86.163:3128";     #https=proxy代理https協議的請求

臨時設定代理後再次curl百度

[root@sx-sj-mcn-redis-1 ~]# curl www.baidu.com -I                          
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 277
Content-Type: text/html
Date: Thu, 08 Aug 2019 12:40:01 GMT
ETag: "575e1f60-115"
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
X-Cache: MISS from host-10-200-86-163
Via: 1.1 host-10-200-86-163 (squid/4.8)
Connection: keep-alive

永久設定代理

#在/etc/profile中全域性設定的最後新增以下配置
[root@sx-sj-mcn-vgateway-2 ~]# vim /etc/profile
export proxy=http://10.200.86.163:3128
export http_proxy="http://10.200.86.163:3128"
export https_proxy="http://10.200.86.163:3128"
export ftp_proxy="http://10.200.86.163:3128"

[root@sx-sj-mcn-vgateway-2 ~]# source /etc/profile
[root@sx-sj-mcn-vgateway-2 ~]# curl www.baidu.com -I
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 277
Content-Type: text/html
Date: Thu, 08 Aug 2019 12:50:07 GMT
ETag: "575e1f60-115"
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
X-Cache: MISS from host-10-200-86-163
Via: 1.1 host-10-200-86-163 (squid/4.8)
Connection: keep-alive

注意:yum使用的話,我們把我們squid伺服器的yum源拷貝到Linux內網裝置中然後指定yum makecache生成快取就可以執行

透明代理

透明代理需要squid伺服器擁有兩塊網絡卡,我這裡的squid伺服器就只有一塊,就不做演示。

阿里雲K8s實戰手冊 K8s