squid代理及常見的代理上網


Squid Cache(簡稱為Squid)是HTTP代理服務器軟件。Squid用途廣泛,可以作為緩存服務器,可以過濾流量幫助網絡安全,也可以作為代理服務器鏈中的一環,向上級代理轉發數據或直接連接互聯網。Squid程序在Unix一類系統運行。由於它是開源軟件,有網站修改Squid的源代碼,編譯為原生Windows版[2];用戶也可在Windows里安裝Cygwin,然后在Cygwin里編譯Squid。
Squid歷史悠久,功能完善。除了HTTP外,對FTP與HTTPS的支持也相當好,在3.0測試版中也支持了IPv6。但是Squid的上級代理不能使用SOCKS協議。

1、環境說明

本文中涉及兩台服務器,這兩台服務器均有內網ip地址,分別為

A: 192.168.0.200
B: 192.168.0.100
C: 192.168.0.101

其中A具有公網訪問能力,BC不具備公網訪問能力。

因此,可以讓B具有公網訪問能力或讓BC實現某些功能例如yum安裝軟件能正常使用,可行的方案有兩種:

  • 方案1

A服務器開啟數據包內核轉發功能,接收BC的數據包,BC將自己的網關配置成A的地址,這樣BC的上網能力全部通過A來代理轉發實現,這種做法簡單好用,但是不適用於雲廠商提供的虛擬主機例如阿里雲ECS,因為雲主機的ip和網卡配置一般是不支持自己定義的

  • 方案2

A服務器運行一個squid服務,BC的某些操作通過squid來代理轉發實現

本文通過在A服務器上搭建squid代理,並在BC服務器上實現了wgetyumdocker使用A的代理,以及把ABC這三台服務器作為k8s集群的節點利用kubeadm搭建一個k8s集群需要配置的地方

2、搭建squid服務

2.1、安裝服務

A服務器能上網,先把A服務器的yum源配置好,這里不做贅述,然后安裝squid服務

# rpm -qa | grep squid
# yum install -y squid

默認安裝的squid服務只需要配置一點,默認是拒絕所有服務器連接,只需要修改成允許所有服務器連接即可

# vim /etc/squid/squid.conf
http_access allow all

啟動服務並設置成開機啟動

# systemctl start squid.service
# systemctl enable squid.service

2.2、配置受信

這樣配置之后,squid代理服務器就可以使用了,默認的端口是3128,但是為了安全,只讓受信的服務器連接,通常還需要對squid配置賬號驗證授權使用,通過httpd-tools生成密碼文件,安裝

# yum install httpd-tools -y

生成密碼文件

# mkdir /etc/squid3/
# 生成密碼文件,指定文件路徑,其中squid是用戶名
# htpasswd -cd /etc/squid3/passwords squid
#提示輸入密碼,不能超過8個字符,輸入密碼123456

測試密碼文件

# /usr/lib64/squid/basic_ncsa_auth /etc/squid3/passwords                
squid 123456
OK 
# 測試完成,crtl + c 打斷

配置squid使用驗證,修改配置文件

# vim /etc/squid/squid.conf
# And finally deny all other access to this proxy
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid3/passwords #賬戶密碼文件
auth_param basic realm proxy
auth_param basic children 50 #最多 50 個賬戶同時運行
auth_param basic realm CoolTube Proxy Server #密碼框描述
auth_param basic credentialsttl 2 hours #認證持續時間
acl authenticated proxy_auth REQUIRED #對 authenticated 進行外部認證
http_access allow authenticated #允許 authenticated 中的成員訪問
http_access deny all #拒絕所有其他訪問
visible_hostname squid.CoolTube #代理機名字

# 這里是端口號,可以按需修改
# http_port 3128 這樣寫會同時監聽 ipv6 和 ipv4 的端口,推薦適應下面的配置方法。
http_port 0.0.0.0:3128

初始化服務並重新啟動

# squid -z
# systemctl restart squid.service

如果開啟了防火牆,還要在防火牆中允許端口3128的策略,以CentOS7為例

# 把 3128 端口加入防火牆過濾掉
# firewall-cmd --permanent --zone=public --add-port=3128/tcp
# 重啟防火牆
# firewall-cmd --reload

如果想新增用戶,只需要按照上面的步驟再次生成一次密碼文件就可以

3、配置代理

3.1、配置全局代理

修改環境變量文件並使其生效

vim /etc/profile
#在最后加入(有認證的情況)
export http_proxy="http://squid:123456@192.168.0.200:3128"
export https_proxy="http://squid:123456@192.168.0.200:3128"
如果沒有開啟認證
http_proxy=http://192.168.0.200:3128
https_proxy=http://192.168.0.200:3128
# source /etc/profile

3.2、配置wget代理

新增wget的環境變量文件

# vim ~/.wgetrc
http_proxy=http://192.168.0.200:3128
https_proxy=http://192.168.0.200:3128
use_proxy = on
wait = 30
# 驗證,如果返回值為0表示wget可用
# wget --spider -T 5 -q -t 2 www.baidu.com | echo $?
0

3.3、配置yum代理

編輯yum的配置文件,新增下面的內容

# vim /etc/yum.conf
# 有認證的情況
# Proxy
proxy=http://squid:123456@192.168.0.200:3128
# 沒有認證
# Proxy
proxy=http://192.168.0.200:3128

3.4、配置docker代理

docker配置代理是為了保證docker能從外網pull鏡像,在安裝了docker之后,在docker配置文件下新增配置並重啟docker

# mkdir -p /etc/systemd/system/docker.service.d
# vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://squid:123456@192.168.0.200:3128" 
# systemctl daemon-reload
# systemctl restart docker

驗證,通過docker pull命令pull一個公網的鏡像

docker pull busybox:latest

3.5、問題排查

如果在配置上述代理后進行驗證的時候,出現沒有返回,卡頓或超時的情況,可以通過查看A服務器即squid代理服務器的日志進行檢查,在日志中一般都可以查看到較為明顯的錯誤
cache.log

tail -f /var/log/squid/cache.log 
2020/02/12 22:56:12 kid1| Store logging disabled
2020/02/12 22:56:12 kid1| DNS Socket created at [::], FD 9
2020/02/12 22:56:12 kid1| DNS Socket created at 0.0.0.0, FD 10
2020/02/12 22:56:12 kid1| Adding nameserver 114.114.114.114 from /etc/resolv.conf
2020/02/12 22:56:12 kid1| Adding nameserver 114.114.115.115 from /etc/resolv.conf
2020/02/12 22:56:12 kid1| helperOpenServers: Starting 0/50 'basic_ncsa_auth' processes
2020/02/12 22:56:12 kid1| helperOpenServers: No 'basic_ncsa_auth' processes needed.
2020/02/12 22:56:12 kid1| HTCP Disabled.
2020/02/12 22:56:12 kid1| Finished loading MIME types and icons.
2020/02/12 22:56:12 kid1| Accepting HTTP Socket connections at local=0.0.0.0:3128 remote=[::] FD 11 flags=9

access.log

# tail -f /var/log/squid/access.log 
1581519614.049     47 192.168.0.100 TCP_TUNNEL/200 5383 CONNECT registry.cn-beijing.aliyuncs.com:443 - HIER_DIRECT/47.95.181.38 -
1581542724.596     39 192.168.0.100 TCP_MISS/503 397 HEAD http://url/ - HIER_NONE/- text/html
1581542754.860    256 192.168.0.100 TCP_TUNNEL/200 4460 CONNECT www.baidu.com:443 - HIER_DIRECT/180.101.49.41 -
1581542818.197    107 192.168.0.100 TCP_MISS/200 262 HEAD http://www.baidu.com/ - HIER_DIRECT/180.101.49.41 text/html
1581542820.465     53 192.168.0.100 TCP_MISS/200 262 HEAD http://www.baidu.com/ - HIER_DIRECT/180.101.49.41 text/html
1581542821.292     53 192.168.0.100 TCP_MISS/200 262 HEAD http://www.baidu.com/ - HIER_DIRECT/180.101.49.41 text/html
1581542821.864     54 192.168.0.100 TCP_MISS/200 262 HEAD http://www.baidu.com/ - HIER_DIRECT/180.101.49.41 text/html
1581542822.323     53 192.168.0.100 TCP_MISS/200 262 HEAD http://www.baidu.com/ - HIER_DIRECT/180.101.49.41 text/html
1581542822.764     53 192.168.0.100 TCP_MISS/200 262 HEAD http://www.baidu.com/ - HIER_DIRECT/180.101.49.41 text/html
1581542823.243     53 192.168.0.100 TCP_MISS/200 262 HEAD http://www.baidu.com/ - HIER_DIRECT/180.101.49.41 text/html

4、搭建k8s時配置代理

在使用kubeadm或二進制方式搭建k8s集群時,集群內部podservice會單獨占用不同的網絡,service網絡是一個虛擬的網段,這個時候還需要聲明流量不讓其走http/https代理,這種聲明方式也適用於對那些沒有域名解析通過綁定hosts文件來訪問的域名。

如果不聲明,在使用kubeadm部署k8s集群,執行kubeadm init初始化集群的時候會看到如下的提示並執行超時失敗

[WARNING HTTPProxyCIDR]: connection to "10.1.0.0/12" uses proxy "http://192.168.0.200:3128". This may lead to malfunctional cluster setup. Make sure that Pod and Services IP ranges specified correctly as exceptions in proxy configuration
[WARNING HTTPProxyCIDR]: connection to "10.244.0.0/16" uses proxy "http://192.168.0.200:3128". This may lead to malfunctional cluster setup. Make sure that Pod and Services IP ranges specified correctly as exceptions in proxy configuration

在不斷重試的時候可以查看代理服務器的squid日志,發現日志中一直不斷有來自kubeadm所在的機器向本機的6443端口發送的請求,卻被拒絕了

1581507643.783      0 192.168.0.100 TCP_DENIED/403 3927 CONNECT 192.168.0.8:6443 - HIER_NONE/- text/html
1581507644.283      0 192.168.0.100 TCP_DENIED/403 3927 CONNECT 192.168.0.8:6443 - HIER_NONE/- text/html
1581507644.783      0 192.168.0.100 TCP_DENIED/403 3927 CONNECT 192.168.0.8:6443 - HIER_NONE/- text/html
1581507645.283      0 192.168.0.100 TCP_DENIED/403 3927 CONNECT 192.168.0.8:6443 - HIER_NONE/- text/html
1581507645.783      0 192.168.0.100 TCP_DENIED/403 3927 CONNECT 192.168.0.8:6443 - HIER_NONE/- text/html
1581507646.283      0 192.168.0.100 TCP_DENIED/403 3927 CONNECT 192.168.0.8:6443 - HIER_NONE/- text/html
1581507646.783      0 192.168.0.100 TCP_DENIED/403 3927 CONNECT 192.168.0.8:6443 - HIER_NONE/- text/html
1581507647.283      0 192.168.0.100 TCP_DENIED/403 3927 CONNECT 192.168.0.8:6443 - HIER_NONE/- text/html

通過踩坑,正確可行的配置流程是:

  • 修改docker代理配置
# vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://squid:123456@192.168.0.200:3128" "NO_PROXY=localhost,127.0.0.1,192.168.0.200,192.168.0.100,192.168.0.101,10.244.0.0/16"
# systemctl daemon-reload
# systemctl restart docker
  • 修改全局代理配置
# vim /etc/profile
export http_proxy="http://squid:123456@192.168.0.200:3128"
export https_proxy="http://squid:123456@192.168.0.200:3128"
export no_proxy=localhost,127.0.0.1,192.168.0.200,192.168.0.100,192.168.0.101,10.244.0.0/16
# source /etc/profile
  • 命令行聲明
export http_proxy="http://squid:123456@192.168.0.200:3128"
export https_proxy="http://squid:123456@192.168.0.200:3128"
export no_proxy=localhost,127.0.0.1,192.168.0.200,192.168.0.100,192.168.0.101,10.244.0.0/16

然后再次執行kubeadm init初始化集群就成功了

5、總結

本文記錄了在特定的網絡環境下如何通過squid配置代理,實現內網機器常用功能上網的方法,當然,這里提到的yumwgetdockerk8s集群安裝常用的操作之外還有一些也需要通過上網代理,這里不一一提及。

好啦,疫情沒結束,只能在家上班熬夜失眠,願平安!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM