跳到主要内容

搭建 Squid 代理网关

· 阅读需 13 分钟
Apache王也道长
软件开发者与技术作者

本文记录如何在 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 限制、防火墙、安全组、密码强度、日志轮转和流量监控

本文阅读量:--

总访问量 -- · 访客数 --