要实现本文功能,你需要:
- 一台能够科学上网的服务器A
- 一台代理服务器B,能够访问科学上网服务器A
- 一台HTTP服务器C,在局域网中可以访问
可选:
- 支持一些高级设置的本地DHCP或/和本地DNS
A、B、C服务器可以在同一台机器上。也可以按需分开。
在代理服务器B上搭建自己的SOCKS或者HTTP代理服务
在Ubuntu系统中,可以通过安装dante-server实现SOCKS代理,或者安装tinyproxy实现HTTP代理。
二者择一即可。
代理服务器B需要能够连接到科学上网服务器A,也可以将A和B搭在同一个机器上。但是把B搭在局域网内能够获得更好的响应速度。
SOCKS代理
在代理服务器B上安装dante-server:
sudo apt update
sudo apt install dante-server
修改配置文件,配置出入的网络接口,以及允许匿名登录:
vi /etc/danted.conf
主要的配置如下:
logoutput: stderr
# 接收请求的网络接口和端口
# 需要在局域网内能够访问
# 端口随意设置
internal: INT_IF port = 1080
# 转发请求的网络接口
# 需要能够科学上网
external: EXT_IF
# 匿名访问
socksmethod: none
clientmethod: none
user.privileged: proxy
user.unprivileged: nobody
user.libwrap: nobody
client pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
}
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
}
有两个配置INT_IF和EXT_IF,分别需要替换为B上的网络接口名称(如eth0)或IP地址,可以在B上运行ifconfig查看。
启动服务:
sudo systemctl enable danted
sudo systemctl start danted
HTTP代理
在代理服务器B上安装tinyproxy:
sudo apt update
sudo apt install tinyproxy
修改配置文件,配置出入的网络接口:
vi /etc/tinyproxy/tinyproxy.conf
主要配置如下:
# 端口随意设置
Port 3128
# 传入连接的IP地址,注释则不限制
# 需要在局域网内能够访问
# Listen x.x.x.x
# 传出代理的IP地址
# 需要能够科学上网
Bind y.y.y.y
启动服务:
sudo systemctl enable tinyproxy
sudo systemctl start tinyproxy
搞一份带科学上网网址列表的PAC文件
一般从gfwlist2pac项目直接获取:
https://raw.githubusercontent.com/petronny/gfwlist2pac/master/gfwlist.pac
替换自己的代理服务器B。
如为SOCKS,则:
var proxy = 'SOCKS5 IP:端口';
如为HTTP,则:
var proxy = 'PROXY IP:端口';
将PAC文件放到局域网内能够访问到的HTTP服务器C上
例如:
http://192.168.3.1/proxy.pac
在各个系统的代理设置中,这个连接可以用于填入自动代理配置脚本,如在Windows 11中:
可选:PAC文件的自动发现
部分系统允许从局域网中自动发现和应用PAC。因为安全问题和软件兼容问题,PAC自动发现不一定总是可靠。但是,自动发现PAC省去了手动输入PAC地址的工作。
在Windows 11中,PAC自动发现可以在这里选择打开:
实现PAC自动发现有两种途径。
DHCP实现
需要配合DHCP服务器使用。在DHCP过程中,自动分发指定的PAC地址。例如,在Ubnt路由器中:
DNS实现
需要配合DNS服务器使用。局域网内将名为wpad的机器解析到HTTP服务器C上,并将PAC文件重命名为wpad.dat,使得通过
http://wpad/wpad.dat
能够在局域网访问PAC文件,则算配置成功。