搭建Squid正向代理教程
一、前言
很多小伙伴会用Nginx做服务器正向代理,但是开源版Nginx不支持HTTPS CONNECT隧道请求。
导致 Java程序HTTPS请求报 405 Method Not Allowed,无法正常代理。
Squid 是专业的正向代理服务,原生支持 HTTP/HTTPS CONNECT 隧道,完美兼容 Java、curl、系统全局代理,非常适合做服务器出站流量中转。
本文适配 阿里云 Alibaba Cloud Linux(alinux),无需EPEL源、无需Docker、无需编译,官方源直接安装,生产可用。
核心特性:
✅ 支持 Java HTTPS CONNECT 隧道(解决405报错)
✅ 阿里云安全组白名单兜底,Squid无需配置IP白名单
✅ 无缓存、干净转发,适配业务代理场景
✅ 完整请求日志,方便排查接口代理问题
二、环境说明
系统:Alibaba Cloud Linux(阿里云默认ECS系统)
代理服务:Squid(系统官方源自带)
代理端口:14567(自定义端口,规避默认端口被扫描)
架构:服务器A(业务机)→ 服务器B(Squid代理机)→ 外网
三、一键安装Squid
Alinux 官方源自带 Squid,无需安装epel扩展源,直接执行安装命令:
# 安装squid
yum install squid -y
# 备份默认配置文件(关键,方便出错回滚)
cp /etc/squid/squid.conf /etc/squid/squid.conf.bak四、生产可用完整配置(核心)
本次方案采用 阿里云安全组做IP白名单,Squid内部不配置IP限制,简化维护,同时保证安全。
清空默认配置,写入以下最终完整版配置:
编辑配置文件:
vim /etc/squid/squid.conf粘贴以下全部内容(可直接生产使用):
# 代理监听端口
http_port 14567
# 固定必需规则:放行HTTP/HTTPS标准端口
acl Safe_ports port 80
acl Safe_ports port 443
acl SSL_ports port 443
# 允许HTTPS隧道CONNECT方法
acl CONNECT method CONNECT
# 禁止非标准端口的代理请求(防滥用)
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
# 安全策略:外层由阿里云安全组做IP白名单放行
# 内网可信机器可直接连接,无需在squid内重复配置IP
http_access allow all
http_access deny all
# 关闭缓存,纯转发,保证数据实时性
cache deny all
# 隐藏代理头部信息,避免被目标服务器识别为代理
forwarded_for off
via off
# 开启完整访问日志,用于排查请求报错、流量记录
access_log /var/log/squid/access.log五、初始化并启动Squid
1. 校验配置文件语法(必执行,避免启动失败)
squid -k parse✅ 无任何输出 = 配置语法正常
2. 初始化缓存目录(首次安装必执行)
squid -z3. 启动并设置开机自启
# 重置失败状态(解决历史启动失败报错)
systemctl reset-failed squid
# 启动服务
systemctl start squid
# 设置开机自启
systemctl enable squid4. 放行服务器防火墙端口
firewall-cmd --add-port=14567/tcp --permanent
firewall-cmd --reload5. 关键:阿里云安全组配置
进入ECS安全组,入方向规则添加:
端口:14567/TCP
授权对象:仅填写业务服务器A的公网IP(按需添加多台机器IP)
实现:外网无法访问代理,仅自己业务机器可用,彻底杜绝代理滥用风险。
六、Squid 常用核心命令
# 启动服务
systemctl start squid
# 停止服务
systemctl stop squid
# 重启服务(改配置后必执行)
systemctl restart squid
# 查看运行状态
systemctl status squid
# 校验配置语法
squid -k parse
# 重置失败启动状态
systemctl reset-failed squid
# 日志轮转(归档旧日志,生成新日志文件)
squid -k rotate七、日志查看方法(排查问题必备)
1. 实时查看所有代理请求(最常用)
tail -f /var/log/squid/access.log可实时看到Java CONNECT请求、请求状态、客户端IP、目标域名。
2. 筛选指定域名请求(排查业务接口问题)
tail -f /var/log/squid/access.log | grep xxx.com3. 查看历史全部请求日志
cat /var/log/squid/access.log4. 查看Squid启动报错日志
tail -50 /var/log/squid/cache.log八、常见问题避坑总结
1. 为什么Nginx代理Java HTTPS请求报405?
开源Nginx不支持CONNECT隧道方法,仅商业版Nginx Plus支持,Squid原生兼容,是最优解决方案。
2. 为什么不配置Squid内部IP白名单?
阿里云安全组可精准控制入站IP,层级更安全,且多机器场景无需频繁修改Squid配置,运维更简单。
3. Squid启动失败?
90%是配置缺少Safe_ports/SSL_ports规则或未初始化缓存目录,按本文完整配置+执行squid -z即可解决。
九、总结
Squid 是服务器正向代理的最优选择,完美兼容Java程序的HTTPS隧道请求,彻底解决Nginx正向代理的405硬伤。搭配阿里云安全组使用,兼顾安全性、稳定性、易用性,非常适合企业服务器出站流量中转、业务代理场景。