在Ubuntu和CentOS中配置Squid正向代理
背景
所谓正向代理,就是代替真实的client去做请求;反向代理,就是代替真实的server提供服务(我们最熟悉的nginx一般用在反向代理中)。
在某些场景下,我们需要配置一个正向代理的服务器,让特定的服务请求,从这台代理服务器发出。
下面尝试用Squid分别在ubuntu和centos系统中配置一个正向代理服务器。
操作步骤
安装
首先安装依赖包和squid;
ubuntu:
sudo apt update
sudo apt install apache2-utils apt-transport-https gnupg2 software-properties-common
sudo apt install squid
centos:
sudo yum update
sudo yum install -y vim
sudo yum install -y squid
配置参数
Squid配置文件位置如下:
/etc/squid/squid.conf
这里先做一个配置备份;
cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
然后执行
sudo vim /etc/squid/squid.conf
进行如下内容的编辑。
请注意:下述内容是以ubuntu系统的默认squid.conf作为示例进行说明的,我发现centos的默认squid.conf文件的内容比ubuntu的要少。如果使用的是centos系统,在squid.conf文件中没有看到下面描述的参数,则直接添加到文件中即可。
配置访问控制
http_access deny all
这一行,前面添加#注释掉;然后在它前面加一行
http_access allow all
配置缓存
# cache_dir ufs /var/spool/squid 100 16 256
这一行,删除前面的#注释,让其生效。
配置Squid日志
找到
# access_log daemon:/var/log/squid/access.log squid
# cache_log /var/log/squid/cache.log
改为
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log
配置端口
找到
http_port 3128
改为
http_port 31000
配置缓存文件大小
找到
# cache_mem 256 MB
这一行,删除前面的#注释,让其生效。
做完上述配置后:wq保存退出。
注:squid.conf中还有很多很多其他参数可以设置,这里只是做基本的配置。有其他需求可以参考squid.conf中的注释说明或者网上资料按需配置。
启动服务
重启squid服务,设置开机启动,并检查服务状态;
sudo systemctl restart squid
sudo systemctl enable squid
sudo systemctl status squid
修改服务器防火墙
centos系统默认防火墙是开启的。我们需要开放提供服务的tcp 31000端口,好让其他服务器使用我们配置的代理服务。
sudo firewall-cmd --list-all
sudo firewall-cmd --permanent --add-port=31000/tcp
sudo firewall-cmd --reload
sudo systemctl restart squid
sudo systemctl enable squid
sudo systemctl status squid
我的ubuntu系统没有设置系统防火墙,所以没有做这部分操作。
验证可用性
在该服务器上执行
curl -x 127.0.0.1:31000 www.baidu.com
可以curl出结果;
我这台服务器的内网IP是10.55.4.20;
因此我从其他服务器上执行
curl -x 10.55.4.20:31000 www.baidu.com
也可以成功curl出结果。
证明代理服务器工作正常。
配置使用代理的Client服务器
上面我们完成了提供Squid正向代理的服务器。下面就可以配置实际的Client服务器来使用这个代理了。
这部分我参考了这个文章https://blog.csdn.net/Richardlygo/article/details/107496011。
临时设置代理
在Client服务器中执行
export proxy=http://10.55.4.20:31000
export http_proxy="http://10.55.4.20:31000"
export https_proxy="http://10.55.4.20:31000"
然后curl www.baidu.com成功后,在squid服务器中cat /var/log/squid/access.log,就可以看到这个请求的log,证明请求是走的代理服务器。
永久设置代理
在/etc/profile中全局设置的最前面,或最后部分,添加以下配置
# sudo vim /etc/profile
export proxy=http://10.55.4.20:31000
export http_proxy="http://10.55.4.20:31000"
export https_proxy="http://10.55.4.20:31000"
export ftp_proxy="http://10.55.4.20:31000"
保存文件后,执行
source /etc/profile
这样即使重启client服务器,代理配置依旧会生效。
上述指令中,还可添加类似如下的指令,来设置不通过代理的域名或者IP列表;
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
export no_proxy=docker.ilanni.com,172.10.10.10
export no_proxy="*.xxx.com,10.*,www.baidu.com"
其他
其他可能有用的操作
根据上面的配置,通过cat /var/log/squid/access.log 可以查看访问的log,类似下图
如下指令可检查服务端口是否正常。
netstat -anplt | grep 31000
ss -anplt | grep 31000
生产环境需要注意的地方
1. 我这里是测试,所以访问控制是全放开的,实际上这部分应该限制的更严格;在/etc/squid/squid.conf中配置格式类似如下;
acl localnet src 192.168.1.0/24 //定义本地网段
http_access allow localnet //允许本地网段使用
2. 如果是云端部署的机器,建议服务器的安全组只针对使用代理服务器的公网IP开放指定的服务端口,如本文中的31000;
3. 根据网上的资料,还可给代理服务器配置身份验证,这样请求的时候需要带上用户名密码,这部分可参考链接 https://blog.csdn.net/avatar_2009/article/details/131116230;
参考链接
https://pythonjishu.com/sseqmypcdpqxdku/
https://blog.csdn.net/Richardlygo/article/details/107496011
发表回复