如何配置树莓派4的Squid代理服务器,实现设备通过指定端口使用对应4G路由器网络
如何配置树莓派4的Squid代理服务器,实现设备通过指定端口使用对应4G路由器网络
我来帮你搞定这个问题!你的需求本质是实现Squid代理的多出口分流——让不同的代理端口对应不同的外网网关(比如你现在的4G路由器,以后扩展的其他路由器),之前你用cache_peer的思路不对,因为那是用来连接上游代理的,不是直接指定网卡出口。咱们一步步来配置:
一、先确认基础网络连通性
首先确保树莓派能同时正常访问两个网络,并且可以手动指定走wlan0的4G网关访问外网:
# 测试通过4G网关访问外网(示例用百度) ping -I wlan0 www.baidu.com
如果能ping通,说明wlan0的网络没问题;如果不通,先检查wlan0的IP、子网掩码和网关是否配置正确。
二、配置独立路由表(单4G路由器场景)
因为树莓派默认网关是eth0的本地ISP,咱们需要给wlan0单独建一个路由表,让指定的流量走这个表的网关:
- 编辑路由表配置文件,添加自定义路由表:
echo "100 4G_ROUTE" >> /etc/iproute2/rt_tables
这里100是路由表ID,4G_ROUTE是表名,取个好记的名字就行。
- 给这个路由表添加默认路由(指向4G路由器网关):
ip route add default via 192.168.10.1 dev wlan0 table 4G_ROUTE
- 添加路由规则:让标记过的流量走这个路由表:
ip rule add fwmark 0x1 table 4G_ROUTE
这条规则的意思是:凡是被标记了0x1的流量,都走4G_ROUTE表的路由。
三、配置iptables标记流量
我们需要把发往Squid指定端口(比如3129,你可以自己选)的流量打上标记,这样它会走上面的4G路由表:
# 标记从客户端来的、发往树莓派3129端口的流量 iptables -t mangle -A PREROUTING -p tcp --dport 3129 -j MARK --set-mark 0x1 # 确保回包也走正确的路由 iptables -t mangle -A OUTPUT -p tcp --sport 3129 -j MARK --set-mark 0x1
以后要加更多路由器的话,只需要重复上面的路由表、路由规则、iptables标记步骤,换不同的表ID、标记值和端口就行。
四、修改Squid配置文件
现在修改Squid的主配置(通常是/etc/squid/squid.conf):
- 保留默认的3128端口走eth0(如果需要的话),新增对应4G路由的端口:
# 默认端口,走系统默认网关(eth0) http_port 3128 # 新增的4G专用端口,绑定树莓派eth0的IP(因为客户端在192.168.1.x网段) http_port 192.168.1.41:3129 # 允许本地网段的设备访问代理 acl local_net src 192.168.1.0/24 http_access allow local_net http_access deny all # 关键:让3129端口的流量从wlan0的IP发出 acl port_4g_port myport 3129 tcp_outgoing_address 192.168.10.174 port_4g_port
这里tcp_outgoing_address指定了该端口的代理流量从wlan0的IP(192.168.10.174)发出,结合前面的iptables标记和路由表,就能确保流量走4G网关。
- 保存配置后,重启Squid服务:
sudo systemctl restart squid
五、验证配置
从你的客户端设备(比如192.168.1.42)做以下测试:
- 设置浏览器或系统代理为
192.168.1.41:3129 - 访问查公网IP的服务(比如执行
curl ifconfig.me),看返回的IP是不是4G路由器的公网IP - 如果用3128端口,返回的应该是本地ISP的公网IP,这样就说明分流生效了
六、扩展多路由器的注意事项
以后你要加10个路由器的话,只需要:
- 每个路由器对应一个网卡(或者多个wlan接口,比如wlan0、wlan1...)
- 每个网卡创建独立的路由表(比如101、102...)
- 每个路由表添加对应路由器的默认网关
- 每个路由器对应一个Squid端口(比如3130、3131...)
- 给每个端口配置对应的iptables标记和Squid的
tcp_outgoing_address
额外注意事项
- 确保树莓派开启了IP转发:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
- 检查防火墙规则,确保客户端能访问Squid的端口(比如3129):
sudo ufw allow 3129/tcp
备注:内容来源于stack exchange,提问作者Herbert Goes




