搭建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全部放行,IP白名单由服务器控制。粘贴以下全部内容(可直接生产使用):
# 代理监听端口 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服务器14567端口全部放行,IP白名单由程序控制
# 代理监听端口 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白名单 acl allowed_clients src 20.24.225.13 acl allowed_clients src 19.23.66.104 acl allowed_clients src 147.119.125.5 # 仅允许白名单中的客户端访问 http_access allow allowed_clients # 拒绝其他所有未匹配的访问 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硬伤。搭配阿里云安全组使用,兼顾安全性、稳定性、易用性,非常适合企业服务器出站流量中转、业务代理场景。