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