搭建 Squid 代理网关
本文记录如何在 Linux 服务器上安装 Squid,并配置一个基于 Basic Auth 用户名密码认证的 HTTP/HTTPS 代理服务。
适用于需要对代理访问进行身份认证,并支持 HTTP、HTTPS CONNECT 隧道的场景。
一、什么是 Squid
Squid 是一个开源的代理服务器软件,常用于:
- HTTP 代理
- HTTPS 代理
- 访问控制
- 用户认证
- Web 缓存
- 内网代理
- 出口代理
- 服务器中转
本文使用 Squid 搭建一个需要用户名密码认证的代理。
客户端最终使用方式类似:
http://用户名:密码@服务器IP:4433
其中:
服务器IP:4433
就是 Squid 提供的代理地址。
二、安装 Squid
2.1 Ubuntu / Debian
Ubuntu 22.04、24.04 等系统可以直接通过 apt 安装。
sudo apt update
sudo apt install -y squid apache2-utils
其中:
squid:Squid 代理服务器apache2-utils:提供htpasswd,用于创建 Basic Auth 用户
检查版本:
squid -v
例如:
Squid Cache: Version 5.x
2.2 CentOS / Rocky Linux
CentOS、Rocky Linux 等系统可以使用:
sudo dnf install -y squid httpd-tools
旧版本 CentOS 可以使用:
yum install -y squid httpd-tools
检查:
squid -v
三、创建 Squid 认证用户
本文使用:
basic_ncsa_auth
配合:
/etc/squid/passwd
实现用户名密码认证。
首先创建密码文件:
sudo touch /etc/squid/passwd
然后创建第一个用户:
sudo htpasswd -c /etc/squid/passwd shab
执行后输入密码:
New password:
Re-type new password:
Adding password for user shab
注意:
第一次创建用户时需要使用:
-c
如果后面继续添加用户,不要再使用 -c。
例如:
sudo htpasswd /etc/squid/passwd user2
否则会重新创建密码文件,导致原来的用户消失。
3.1 查看用户
可以执行:
cat /etc/squid/passwd
内容类似:
shab:$apr1$xxxxxxxx$xxxxxxxxxxxxxxxx
密码经过哈希处理,不会直接保存明文密码。
四、配置 Squid
Squid 默认配置文件:
/etc/squid/squid.conf
建议先备份:
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
然后编辑:
sudo nano /etc/squid/squid.conf
或者:
sudo vi /etc/squid/squid.conf
可以使用下面这份配置。
五、完整 Squid 配置
http_port 4433
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic realm shab
auth_param basic credentialsttl 8 hours
auth_param basic casesensitive on
acl authenticated proxy_auth REQUIRED
acl CONNECT method CONNECT
http_access allow authenticated
cache deny all
forwarded_for delete
via off
httpd_suppress_version_string on
dns_nameservers 223.5.5.5 119.29.29.29 8.8.8.8
access_log /var/log/squid/open-proxy.log
cache_log /var/log/squid/open-proxy-cache.log
cache_store_log none
connect_timeout 30 seconds
read_timeout 15 minutes
下面逐项解释。
六、配置详解
6.1 设置代理端口
http_port 4433
表示 Squid 监听:
4433
端口。
例如服务器 IP:
1.2.3.4
那么代理地址就是:
1.2.3.4:4433
客户端可以配置:
HTTP Proxy:
1.2.3.4
4433
HTTPS 请求也可以通过 HTTP CONNECT 方法建立隧道。
七、配置 Basic Auth
7.1 指定认证程序
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
这里指定 Squid 使用:
basic_ncsa_auth
验证用户名密码。
密码文件:
/etc/squid/passwd
因此认证流程是:
客户端
|
| 用户名 + 密码
v
Squid
|
v
basic_ncsa_auth
|
v
/etc/squid/passwd
7.2 设置认证提示
auth_param basic realm shab
当客户端没有认证信息时,Squid 会返回 Basic Auth 认证要求。
客户端可能看到:
Proxy Authentication Required
以及:
realm="shab"
7.3 设置认证缓存时间
auth_param basic credentialsttl 8 hours
表示 Squid 对认证凭证缓存:
8 hours
在这个时间范围内,同一个客户端不需要反复执行认证。
7.4 用户名大小写敏感
auth_param basic casesensitive on
表示用户名大小写敏感。
例如:
shab
和:
SHAB
视为不同用户名。
八、配置认证 ACL
acl authenticated proxy_auth REQUIRED
定义一个 ACL:
authenticated
要求:
proxy_auth REQUIRED
也就是:
必须通过代理认证。
九、允许认证用户访问代理
http_access allow authenticated
这一条非常重要。
它表示:
认证成功
↓
允许代理访问
没有认证的客户端无法正常使用代理。
整个流程可以理解为:
客户端
|
| HTTP Proxy
v
Squid :4433
|
| 是否认证?
|
+---- 否 ----> 407 Proxy Authentication Required
|
+---- 是 ----> 允许访问
|
v
目标网站
十、CONNECT 方法
acl CONNECT method CONNECT
定义 HTTP CONNECT 方法。
HTTPS 代理通常使用:
CONNECT example.com:443 HTTP/1.1
例如:
客户端
|
| CONNECT www.example.com:443
v
Squid
|
| TCP Tunnel
v
www.example.com:443
这样客户端就可以通过 Squid 访问 HTTPS 网站。
需要注意:
acl CONNECT method CONNECT
只是定义 ACL。
当前配置中并没有单独:
http_access allow CONNECT
而是通过:
http_access allow authenticated
统一允许已经认证的请求。
十一、关闭缓存
cache deny all
表示:
不使用 Squid 的缓存功能。
也就是说,这个 Squid 更接近一个:
纯代理 / 出口代理
而不是传统的:
Web Cache
对于单纯做代理的场景,这种配置比较合适。
十二、删除客户端 Forwarded-For
forwarded_for delete
用于控制转发请求中的:
X-Forwarded-For
信息。
配置:
forwarded_for delete
后,Squid 不再向目标服务器提供原始客户端 IP 的 X-Forwarded-For 信息。
需要注意:
这并不意味着代理具备绝对匿名性。
目标服务器仍然可能通过其他方式识别代理服务器、连接特征、应用层信息等。
十三、关闭 Via
via off
关闭 Squid 添加的:
Via
头。
例如:
Via: 1.1 squid
不会再由 Squid 添加。
十四、隐藏 Squid 版本
httpd_suppress_version_string on
用于隐藏 HTTP 响应中的 Squid 版本信息。
主要用于减少服务端软件版本信息暴露。
十五、配置 DNS
dns_nameservers 223.5.5.5 119.29.29.29 8.8.8.8
指定 Squid 使用的 DNS:
223.5.5.5
119.29.29.29
8.8.8.8
分别属于不同 DNS 服务商。
可以根据服务器所在网络环境选择合适的 DNS。
例如:
dns_nameservers 223.5.5.5 119.29.29.29
或者:
dns_nameservers 8.8.8.8 1.1.1.1
十六、配置访问日志
access_log /var/log/squid/open-proxy.log
访问日志:
/var/log/squid/open-proxy.log
可以查看客户端访问了哪些目标地址。
例如:
tail -f /var/log/squid/open-proxy.log
十七、配置 Squid 错误日志
cache_log /var/log/squid/open-proxy-cache.log
Squid 的运行日志:
/var/log/squid/open-proxy-cache.log
出现启动失败、DNS、连接等问题时,可以重点查看:
tail -f /var/log/squid/open-proxy-cache.log
十八、关闭 cache_store_log
cache_store_log none
关闭缓存存储日志。
因为当前配置:
cache deny all
本身就不使用缓存,因此没有必要保留这类日志。
十九、连接超时时间
connect_timeout 30 seconds
表示建立目标连接时,超时时间为:
30 秒
例如:
客户端
|
Squid
|
|---- 连接目标服务器
|
| 30秒仍未建立
|
└---- Timeout
二十、读取超时时间
read_timeout 15 minutes
读取数据的超时时间:
15分钟
对于一些:
- HTTPS 长连接
- 下载
- API 请求
- 长时间保持连接
可以避免连接过早超时。
二十一、检查 Squid 配置
修改配置后,不要直接重启。
首先检查配置:
sudo squid -k parse
如果配置正确,一般不会出现:
FATAL
之类的错误。
如果出现:
WARNING
需要根据具体内容判断是否需要处理。
二十二、确认 basic_ncsa_auth 路径
不同 Linux 发行版中:
basic_ncsa_auth
的位置可能不同。
你的配置使用:
/usr/lib/squid/basic_ncsa_auth
可以检查:
ls -l /usr/lib/squid/basic_ncsa_auth
如果不存在,可以搜索:
find /usr -name basic_ncsa_auth 2>/dev/null
例如实际路径可能是:
/usr/lib/squid/basic_ncsa_auth
或者:
/usr/lib/squid/basic_ncsa_auth
如果实际路径不同,需要修改:
auth_param basic program ...
二十三、检查密码文件权限
建议:
sudo chown root:proxy /etc/squid/passwd
sudo chmod 640 /etc/squid/passwd
检查:
ls -l /etc/squid/passwd
确保 Squid 运行用户能够读取密码文件。
不同发行版的 Squid 用户组可能有所不同,可以通过:
ps aux | grep squid
查看。
二十四、启动 Squid
Ubuntu / Debian:
sudo systemctl enable squid
sudo systemctl restart squid
查看状态:
sudo systemctl status squid
如果看到:
Active: active (running)
说明 Squid 已经正常运行。
二十五、检查 4433 端口
执行:
ss -lntp | grep 4433
正常情况下类似:
LISTEN 0 511 0.0.0.0:4433 0.0.0.0:*
说明 Squid 正在监听:
4433
二十六、防火墙放行端口
如果服务器开启了 UFW:
sudo ufw allow 4433/tcp
查看:
sudo ufw status
如果使用云服务器,还需要检查云厂商的:
安全组
是否允许:
TCP 4433
二十七、使用 curl 测试
假设服务器 IP:
1.2.3.4
用户名:
shab
密码:
your-password
可以测试:
curl -x http://shab:your-password@1.2.3.4:4433 https://example.com
如果代理正常,应该能够得到目标网站响应。
27.1 HTTP 测试
curl -v -x http://shab:your-password@1.2.3.4:4433 http://example.com
27.2 HTTPS 测试
curl -v -x http://shab:your-password@1.2.3.4:4433 https://example.com
重点观察:
CONNECT example.com:443
如果看到:
HTTP/1.1 200 Connection established
说明 HTTPS CONNECT 隧道建立成功。
二十八、测试错误密码
故意使用错误密码:
curl -v -x http://shab:wrong-password@1.2.3.4:4433 https://example.com
应该无法通过认证。
通常会看到:
407 Proxy Authentication Required
这说明:
Basic Auth
正在正常工作。
二十九、测试不带用户名密码
执行:
curl -v -x http://1.2.3.4:4433 https://example.com
应该返回:
407 Proxy Authentication Required
而不是直接访问目标网站。
因此最终访问控制链路为:
┌──────────────────┐
│ 客户端 │
└────────┬─────────┘
│
Proxy :4433
│
▼
┌──────────────────┐
│ Squid │
└────────┬─────────┘
│
Basic Auth
│
┌──────────┴──────────┐
│ │
认证失败 认证成功
│ │
▼ ▼
HTTP 407 目标服务器
│
▼
Internet
三十、推荐的完整部署流程
整个安装过程可以简化为下面几个步骤。
第一步:安装
sudo apt update
sudo apt install -y squid apache2-utils
第二步:创建用户
sudo htpasswd -c /etc/squid/passwd shab
第三步:备份配置
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
第四步:修改配置
sudo vi /etc/squid/squid.conf
写入:
http_port 4433
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic realm shab
auth_param basic credentialsttl 8 hours
auth_param basic casesensitive on
acl authenticated proxy_auth REQUIRED
acl CONNECT method CONNECT
http_access allow authenticated
cache deny all
forwarded_for delete
via off
httpd_suppress_version_string on
dns_nameservers 223.5.5.5 119.29.29.29 8.8.8.8
access_log /var/log/squid/open-proxy.log
cache_log /var/log/squid/open-proxy-cache.log
cache_store_log none
connect_timeout 30 seconds
read_timeout 15 minutes
第五步:检查配置
sudo squid -k parse
第六步:启动
sudo systemctl enable squid
sudo systemctl restart squid
第七步:检查
sudo systemctl status squid
以及:
ss -lntp | grep 4433
第八步:测试代理
curl -v \
-x http://shab:your-password@1.2.3.4:4433 \
https://example.com
三十一、日志排查
Squid 出现问题时,最有用的是两个日志。
访问日志
tail -f /var/log/squid/open-proxy.log
Squid 运行日志
tail -f /var/log/squid/open-proxy-cache.log
也可以:
grep -i error /var/log/squid/open-proxy-cache.log
三十二、常见问题
32.1 启动失败
首先:
sudo squid -k parse
然后:
sudo journalctl -u squid -n 100 --no-pager
查看详细错误。
32.2 找不到 basic_ncsa_auth
检查:
find /usr -name basic_ncsa_auth 2>/dev/null
然后把:
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
修改为实际路径。
32.3 认证一直失败
检查密码文件:
cat /etc/squid/passwd
确认用户存在。
然后检查权限:
ls -l /etc/squid/passwd
同时查看:
tail -f /var/log/squid/open-proxy-cache.log
32.4 代理端口无法连接
检查 Squid:
systemctl status squid
检查监听:
ss -lntp | grep 4433
如果服务器本地正常监听,但外部无法访问,需要检查:
Linux 防火墙
+
云服务器安全组
+
上游网络策略
32.5 HTTPS 无法访问
首先使用:
curl -v \
-x http://shab:password@服务器IP:4433 \
https://example.com
重点查看:
CONNECT
是否成功。
如果 CONNECT 建立成功,但后续 TLS 失败,需要继续检查目标服务器连接、DNS、网络出口等问题。
三十三、安全注意事项
如果 Squid 监听:
http_port 4433
通常意味着监听所有接口。
如果服务器端口直接暴露到公网,那么任何知道:
服务器IP:4433
的人都可以尝试连接。
因此必须保证:
http_access allow authenticated
等访问控制规则生效。
不要为了排查问题随意添加:
http_access allow all
否则很容易把服务器变成一个未经认证的公网代理。
33.1 建议限制来源 IP
如果代理只给固定办公网络使用,可以进一步增加 IP ACL。
例如:
acl allowed_ip src 1.2.3.4/32
http_access allow allowed_ip authenticated
这样需要同时满足:
来源 IP
+
用户名密码
才能访问。
三十四、生产环境建议
如果用于生产环境,建议进一步考虑:
1. 限制来源 IP
减少公网暴露。
2. 使用强密码
不要使用简单密码,例如:
123456
password
admin
建议使用随机生成的高强度密码。
3. 定期检查日志
tail -f /var/log/squid/open-proxy.log
关注异常访问。
4. 做日志轮转
Squid 日志长期增长,需要配合:
logrotate
进行管理。
5. 监控服务器资源
重点关注:
CPU
内存
网络流量
连接数
磁盘
6. 不要开放无认证代理
尤其不要配置:
http_access allow all
然后把:
4433
直接暴露到公网。
三十五、最终配置
最终的 /etc/squid/squid.conf 可以保持为:
http_port 4433
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic realm shab
auth_param basic credentialsttl 8 hours
auth_param basic casesensitive on
acl authenticated proxy_auth REQUIRED
acl CONNECT method CONNECT
http_access allow authenticated
cache deny all
forwarded_for delete
via off
httpd_suppress_version_string on
dns_nameservers 223.5.5.5 119.29.29.29 8.8.8.8
access_log /var/log/squid/open-proxy.log
cache_log /var/log/squid/open-proxy-cache.log
cache_store_log none
connect_timeout 30 seconds
read_timeout 15 minutes
安装完成后:
sudo squid -k parse
sudo systemctl enable squid
sudo systemctl restart squid
然后:
ss -lntp | grep 4433
最后使用:
curl -v \
-x http://shab:your-password@服务器IP:4433 \
https://example.com
进行验证。
三十六、总结
通过 Squid + basic_ncsa_auth,可以快速搭建一个带用户名密码认证的 HTTP/HTTPS 代理。
整体架构非常简单:
Internet
▲
│
HTTP / HTTPS
│
│
┌─────────┴─────────┐
│ Squid │
│ :4433 │
└─────────┬─────────┘
│
Basic Auth
│
/etc/squid/passwd
│
▲
│
客户端
核心配置可以概括为:
4433
↓
Basic Auth
↓
/etc/squid/passwd
↓
认证成功
↓
允许代理
↓
HTTP / HTTPS
这种方案适合个人代理、开发测试、服务器出口代理以及需要简单账号认证的内部代理场景。
生产环境部署时,则应重点关注来源 IP 限制、防火墙、安全组、密码强度、日志轮转和流量监控。