在有外网访问的机器上,安装Squid作为HTTP proxy server:
yum -y install squid
Squid的配置文件为/etc/squid/squid.conf
。
默认允许同一个子网的其他服务器使用Squid作为proxy server。
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
默认拒绝其他访问:
# And finally deny all other access to this proxy
http_access deny all
默认端口为3128:
# Squid normally listens to port 3128
http_port 3128
一般地,如果proxy server只是提供给同一个子网的客户端机器访问,不需要修改Squid配置文件。
以服务方式运行Squid:
systemctl enable squid
systemctl start squid
查看Squid服务状态:
systemctl status squid -l
查看3128端口:
netstat -tnlp | grep 3128
在客户端机器上先验证是否可以连接到Squid proxy server:
telnet proxy_server_ip 3128
如果访问不了,需要开放3128端口的网络防火墙或安全组的内网入方向访问。
新建/etc/profile.d/proxy.sh
,填入内容为:
PROXY_URL="http://proxy_server_ip:3128/"
NO_PROXY_ADDR="127.0.0.1,localhost,.local,.cluster.local,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
export http_proxy="$PROXY_URL"
export https_proxy="$PROXY_URL"
export no_proxy="$NO_PROXY_ADDR"
export HTTP_PROXY="$PROXY_URL"
export HTTPS_PROXY="$PROXY_URL"
export NO_PROXY="$NO_PROXY_ADDR"
说明:
proxy_server_ip
替换为Squid proxy server的IP。NO_PROXY_ADDR
中添加不需要走代理的地址,这里设置访问本机和子网内的机器时不走代理。让代理设置生效:
source /etc/profile.d/proxy.sh
测试:
# 测试访问网站
curl www.baidu.com
# 测试下载文件
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
curl -O http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
注意:不要用ping命令来测试,因为ping命令走的是ICMP协议不是HTTP协议。
# Check proxy settings
env | grep -i proxy
# Unset proxy
unset http_proxy
unset https_proxy
unset no_proxy
unset HTTP_PROXY
unset HTTPS_PROXY
unset NO_PROXY
no_proxy
支持以下几种配置:
127.0.0.1
。localhost
。example.com
,匹配example.com
和子域名any.example.com
。.
开头,比如.example.com
,匹配子域名any.example.com
,但不匹配父域名example.com
。比如.local
,可以用来匹配Kubernetes的内部域名。*
表示不使用proxy127.0.0.1:8080
或 example.com:8080
no_proxy
不支持以下配置:
192.168.0.0/16
。 (很多Linux工具不支持根据CIDR来配置no_proxy
,但是一些工具支持,比如Docker,Kubernetes, OpenShift)*.example.com
通配符语法来匹配子域名,只支持.example.com
来匹配子域名。192.168.*
通配符语法。参见:
用sudo测试访问网站时,代理不生效,无法访问:
sudo curl www.baidu.com
打印sudo时的http proxy环境变量,http_proxy
环境变量为空:
sudo printenv http_proxy
这是因为sudo时会将原来的环境重置(env_reset
),且只保留(env_keep
)非常少量的环境变量:
# 查看sudo后的环境变量
sudo env
解决方法一:
在sudo
命令后紧跟http_proxy
,再执行相应命令。比如:
sudo http_proxy=http://proxy_server_ip:3128 curl www.baidu.com
解决方法二:
如果只需要sudo yum
时代理生效,可以修改/etc/yum.conf
,添加
proxy=http://proxy_server_ip:3128
参见:
解决方法三:
修改/etc/sudoers
,保留HTTP proxy的环境变量。
Defaults env_keep = "http_proxy https_proxy no_proxy HTTP_PROXY HTTPS_PROXY NO_PROXY"
参见:
https://www.serverlab.ca/tutorials/linux/administration-linux/setting-a-proxy-in-centos-and-red-hat/
https://www.centlinux.com/2019/10/install-squid-proxy-server-on-centos-7.html
https://hostpresto.com/community/tutorials/how-to-install-and-configure-squid-proxy-on-centos-7/
https://www.tecmint.com/install-squid-http-proxy-on-centos-7/