Danted/Socks5_代理服务_多IP_多出口的配置_3proxy_gost_stunnel_haproxy
转载注明来源: 本文链接 来自osnosn的博客,写于 2020-03-01.
danted
danted 的配置文件为 /etc/danted.conf
查看,man danted.conf 中关于 external.rotation 的说明。
比如你有三个网口 eth0, eth1, eth2
- 让danted监听所有网口的1080
internal: 0.0.0.0 port = 1080 - 把三个网口都加入danted的出口。并指定由"系统路由"决定出口。
#external: 0.0.0.0 #这行0.0.0.0的写法不支持 external: eth0 external: eth1 external: eth2 external.rotation: route - 然后,修改系统路由表
ip route - 后面的
client pass/blocksocks pass/block请参考网上的文章设置。 - 【dante 主页】【Manual Page: SOCKD.CONF(5)】
- 只能使用系统账户(pam或/etc/passwd),或无验证。
CentOS 3proxy
- CentOS 没有dante-server这个包,可以考虑从源码编译安装。或者使用
3proxy这个包(在epel中)。- 3proxy (github), 3proxy.cfg(3) - Linux man page
- 在win8.1上用3proxy搭建socks4/4.5/5代理
- 3proxy.cfg 中,可以开启多个服务,比如 dns代理,http代理,socks5代理,pop3代理。
每个代理服务的定义通常由语句:auth,flush开始。
auth定义新的一种认证方式,flush清除之前的ACL规则(即allow和deny规则)。 - 3proxy 直接定义多条
external, 会自动根据系统route表选取出口。也可以直接写external 0.0.0.0或external ::
Debian 3proxy
- debian 10 中找不到3proxy的包,可以从源码编译。
- 从【github_3proxy-archive】, release中下载最新的源码tar.gz, 目前是0.8.13. (2020-03)
- 从【github_3proxy】, release中下载最新的源码tar.gz, 目前是0.9.4. (2021-12月)
- 解压,
ln -s Makefile.Linux Makefile,apt install make gcc,make,make install- 出现
gcc: error: unrecognized command line option '-mthreads'; did you mean '-pthread',
则需安装apt install libpthread-stubs0-dev
- 出现
- init.d 脚本为 源码目录的
script/rc.d/proxy.sh(需要修改,有bug) , 需要killall指令支持。apt install psmisc
如果不是WSL1的系统,可以用systemd的启动脚本。# /lib/systemd/system/3proxy.service [Unit] Description=3proxy Proxy Server After=syslog.target network.target [Service] Type=forking ExecStart=/usr/local/bin/3proxy /usr/local/etc/3proxy/3proxy.cfg [Install] WantedBy=multi-user.target - 3proxy.cfg 的注释。Comments: Any string beginning with space character or ´#´ character is comment. It´s ignored.
在一行末尾的 #注释,如auth iponly #comment3proxy不认,会导致3proxy启动失败。
以下的例子中,实际使用,需要把行末的注释,改为单独一行的注释。# 3proxy.cfg 例子 nscache 65536 timeouts 1 5 30 60 180 1800 15 60 users uuu:CL:uupwd daemon log /var/log/3proxy.log logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T" archiver gz /bin/gzip %F rotate 30 auth iponly #external 0.0.0.0 #只监听ipv4 #internal 0.0.0.0 #只监听ipv4 external :: #监听ipv4 & ipv6 internal :: #监听ipv4 & ipv6 ,但ipv4访问时,显示的来源IP是 ::ffff:192.168.1.100 的形式。 规则中,来源IP写192.168.1.0/24会匹配失败。 ## 具体写法是,192.168.1.0/24 -> ::ffff:192.168.1.0/120 ; 192.168.0.0/16 -> ::ffff:192.168.0.0/112 ; ## 即,掩码,原来是32-n*8 改为 128-n*8 ; auth strong #按账号认证。 flush #allow uuu * 10.22.33.0/24 * #parent 1000 socks5+ 10.33.44.55 1080 sss sspwd allow uuu * * * * proxy -n -p88 auth iponly strong #如果按IP匹配成功,无需账号认证。如果按IP匹配失败,则要求账号认证。 flush allow * 127.0.0.1 * allow uuu * * * * proxy -n -p8888 auth strong #按账号认证。 flush #allow uuu * 10.22.33.0/24 * #parent 1000 socks5 10.33.44.55 1080 sss sspwd #parent 1000 socks5+ 10.66.77.88 1080 sss sspwd #多级socks5级联,除最后一个代理外,中间级要用socks5,中间级不能用socks5+ allow uuu maxconn 20 socks socks -p1081
- 如果使用
external ::和internal ::提供ipv6支持。
则,IP规则要这么写
对于192.168.1.0/24写allow * ::ffff:192.168.1.0/120
对于192.168.0.0/16写allow * ::ffff:192.168.0.0/112 - 【3proxy】 的 GitHub 已经是0.9.3, 对于Debian,已经有.deb包下载。
- deb安装的 3proxy 如果要使用小于1024的端口会失败。
使用setcap 'cap_net_raw,cap_net_bind_service+ep' /bin/3proxy也不行。
需要修改/etc/3proxy/3proxy.cfg中chroot /usr/local/3proxy proxy proxy改为chroot /usr/local/3proxy - 3proxy-0.8.13, 3proxy-0.9.4 测试结果:
对于 proxy服务 和 socks服务 的表现是一样的。- 设
auth iponly strong
无论allow * 127.0.0.1 *的位置,是前面还是后面,都会优先按IP匹配,再按顺序匹配账号。 - 设
auth strong iponly,所有规则按顺序匹配。
如allow * 127.0.0.1 *的位置,在前面,则优先按IP匹配。
如allow * 127.0.0.1 *的位置,在后面,则优先按账号匹配。 auth iponly strong或auth strong iponly
如果 allow 都限制用户,无论是否有来源IP限制。都是按顺序匹配。
类似allow user 192.168.1.100,不会被 iponly匹配。只能被 strong匹配。auth iponly
只匹配无用户限制的行,如allow * 192.168.1.22
这种allow user 192.168.1.22,不会被匹配,除非加上strong。
- 设
- openWRT 中自己编译 3proxy 包,参考【创建编译环境_编译OPENWRT固件_用SDK为官方固件编译第三方软件3proxy】
- 在openwrt中,
配置log @3proxy,log记录会出现在系统记录 logread 中。访问多的话,log挺多的。
不配置log项,则无log输出。
win10 3proxy
- 2025-10 安装
- 【github 3proxy releases】 下载 3proxy-0.9.5-x64.zip
- win的防毒软件,会报告有"病毒威胁",下载多次报的病毒类型还不同。
只能"忽略威胁"。如果你担心的话,就放弃使用 3proxy 吧。
个人认为是乱报。 - 解压后,只需要两个文件。其他都可以不要。
3proxy.exe,3proxy.cfg.sample
我只使用它的链式代理功能。 - 3proxy.cfg.sample 改名 3proxy.cfg
把两个文件 (exe 和 cfg) 放在同一个目录中,目录全路径不含有中文。
- win的防毒软件,会报告有"病毒威胁",下载多次报的病毒类型还不同。
- 配置/修改 3proxy.cfg
- 指定文件使用如下格式。
其他配置,和linux中的配置一样。#daemon #注释这个linux用的daemon service #使用这个win用的service config D:\mysoftware\3proxy095\3proxy.cfg monitor D:\mysoftware\3proxy095\3proxy.cfg pidfile D:\mysoftware\3proxy095\3proxy.pid log D:\mysoftware\3proxy095\3proxy.log M #archiver gz /bin/gzip %F #注释这个,win中没有gzip命令 - 好像不能同时在 v4 和 v6上监听端口。这两行冲突。
internal 0.0.0.0 #internal :: - external可以指定两次
external 0.0.0.0 external :: - 因为有
monitor配置行。
直接修改 3proxy.cfg 无需重启 3proxy 服务,即可生效。
- 指定文件使用如下格式。
- 以管理员身份执行 cmd.exe 然后 执行
3proxy.exe --install注册为系统服务。即可。 - 如果想删除3proxy的系统服务。以管理员身份执行 cmd.exe
先停掉服务,net stop 3proxy,
然后 执行3proxy.exe --remove从win中删除系统服务。
immortalwrt-24.10
3proxy
- 安装
opkg install 3proxy,版本为 v0.9.5 (2025-10测试)
如果要配置 https://proxy,则opkg install 3proxy-lib-ssl certtool
安装完,占用硬盘大约 300KB. - 3proxy 的其他配置参考上面的内容。
- 配置 https 代理, (不稳定, 等版本更新后再说)
- 创建证书
cat > pki/ca.tmpl <<EOF cn=my proxy CA ou=proxy server CA expiration_days=10980 serial=1234 ca cert_signing_key EOF cat > pki/server.tmpl <<EOF cn=my https proxy serial=2345 expiration_days=10970 signing_key encryption_key dns_name = "192.168.123.123" ip_address = "192.168.123.123" EOF certtool --ecc --generate-privkey --outfile pki/ca-key.pem certtool --template pki/ca.tmpl --generate-self-signed --load-privkey pki/ca-key.pem --outfile pki/ca.pem certtool --ecc --generate-privkey --outfile pki/server-key.pem certtool --template pki/server.tmpl --generate-certificate --load-privkey pki/server-key.pem --load-ca-certificate pki/ca.pem --load-ca-privkey pki/ca-key.pem --outfile pki/server-cert.pem - 3proxy.cfg 配置,关于ssl_plugin 要放在配置文件的最后,因为ssl_noserv会报错。
# allow * # deny * proxy -n -p8888 socks -p1080 plugin /usr/libexec/3proxy/SSLPlugin.ld.so ssl_plugin ssl_server_cert /pathto/pki/server-cert.pem ssl_server_key /pathto/pki/server-key.key ssl_serv proxy -p38888 socks -p31080 # ssl_noserv #这句会报错 - 3proxy 的 log 中可以记录到真实的来源IP。
- 使用
curl --proxy https://usr:pwd@127.0.0.1:38888 --proxy-insecure http://github.com通过代理访问。
31080 口,curl不知道怎么使用,所以没测试。
3proxy.cfg 自己,parent 配置不支持 https 代理。 - 3proxy 的 https 代理有问题。curl使用时,有时会报错。
报错为error:1408F10B:SSL routines:ssl3_get_record:wrong version number - 放弃使用 SSLPlugin,只用 3proxy的其他功能。
- 创建证书
gost
- 安装
opkg install gost,版本为 v3.2.0 (2025-10测试)
安装完,占用硬盘大约 33MB,体积比较大。- 配置 gost.yml,【官方文档】,【github gost】
配置文件中的 server 证书,是用 certtool自己创建的。services: - name: proxy-https addr: :38888 handler: type: http auther: usr2 #metadata: # proxyProtocol: 1 #发送 proxy-protocol listener: type: tls tls: certFile: /pathto/pki/server-cert.pem keyFile: /pathto/pki/server-key.pem # caFile: /pathto/pki/ca.pem #metadata: # proxyProtocol: 1 #接受 proxy-protocol authers: - name: usr2 auths: - username: p-usr password: p-pwd log: output: /pathto/gost/log.gost.log level: info format: text rotation: maxSize: 10 maxBackups: 2 compress: true - 执行
gost -C gost.yml &启动服务。 - gost 的 log 中可以记录到真实的来源IP。
- 使用
curl --proxy https://p-usr:p-pwd@127.0.0.1:38888 --proxy-insecure http://github.com通过代理访问。
curl 使用此代理,不报错。 - gost 也可以配置 socks5+tls。(未测试)
- gost 功能强大,但体积太大。暂时停掉不用。
- 配置 gost.yml,【官方文档】,【github gost】
xray
- https代理还可以考虑使用 xray,见【xray SOCKS5+TLS】。
xray-core安装完,占用硬盘大约 31MB,体积比较大。
再装上 geoip 和 geosite 两个数据库,又增加 30MB。- 用 xray-25.8.3,curl通过这个https代理,访问http没问题,访问https报错
error:1408F1BB:SSL routines:ssl3_get_record:bad record type。
用 xray-25.9.11,xray-25.10.15,同时支持 https 和 socks5+tls。 curl 使用这个 https代理,工作正常,不报错。(2025-10测试) - xray 的 log 中可以记录到真实的来源IP。
- 用 stunnel 的 client模式连接这个端口,用 socks5+tls 模式,工作正常。
- 这个方案不错,如果本来就要使用 xray的话。
stunnel
- 安装
opkg install stunnel,版本为 v5.72 (2025-10测试)
安装完,占用硬盘大约 360KB。
装好,stunnel就已经启动运行了。- 配置,修改
/etc/config/stunnel增加一个section。【官方文档】
把 3proxy的http代理口 8888,封装成 https代理 38888。config service 'pxy_http' #可以有下划线,不能有减号 option enabled '1' option client '0' option accept_host '0.0.0.0' option accept_port '38888' option cert '/pathto/pki/server-cert.pem' #之前用certtool创建的证书 option key '/pathto/pki/server-key.pem' #之前用certtool创建的证书 list connect '127.0.0.1:8888' #3proxy的http代理端口
/etc/init.d/stunnel restart重启服务, 或 reload 刷新服务,使之生效。 - 使用
curl --proxy https://uuu:uupwd@127.0.0.1:38888 --proxy-insecure http://github.com通过代理访问,工作正常。
其中,账号看3proxy的设置。3proxy 的log记录的来源ip是 stunnel的IP,真实的来源IP要从stunnel的log中查看。 - 同理,也可以把 3proxy的socks5,封装成 socks5+tls。
- 配置,修改
- stunnel 的 log 中可以记录到真实的来源IP,但后端的服务不能记录到真实的来源IP。
- 用 stunnel 的 client模式连接 xray 的 socks5+tls 模式,工作正常。
- stunnel 体积小巧,功能专一。不错的方案。
Ubuntu-20.04.5LTS 中
apt install stunnel4,v5.56。【在Ubuntu安装stunnel4】
- 创建配置文件
/etc/stunnel/stunnel.confservice stunnel4 restart
debian 中也有这个包。
apt install stunnel4,v5.74。配置过程与Ubuntu相同。
- 创建配置文件
/etc/stunnel/stunnel.confsystemctl enable stunnel4; service stunnel4 restart
haproxy
- 安装
opkg install haproxy,版本为 v3.0.10 (2025-10测试)
安装完,占用硬盘大约 980KB。【文档3.0.12】
装好,haproxy就会启动运行,但默认配置文件有ip错误,haproxy会退出。 -
通过 SNI 对 TLS 连接,做端口复用。即,多个tls服务共用同一个端口。
- haproxy配置,global 和 defaults 原有的默认配置不改变。
后面增加配置行,所有的 backend 启用 proxy_protocol_v2,global ... #原有的默认配置 ssl-server-verify none ca-base /etc/ssl defaults ... #原有的默认配置 frontend tls_tcp bind :443 mode tcp log /dev/log local0 #op中的命令 logread 可以看到记录 option tcplog #定义log的内容格式 tcp-request inspect-delay 5s tcp-request content accept if { req.ssl_hello_type 1 } use_backend ocserv if { req.ssl_sni -i ocs.myxxx.com } use_backend socks5-tls if { req.ssl_sni -i pxy.myxxx.com } use_backend nginx if { req.ssl_sni -i www.myxxx.com } default_backend nginx backend ocserv mode tcp #option ssl-hello-chk #server ocserv 127.0.0.1:443 check send-proxy-v2 #server ocserv 127.0.0.1:443 check-ssl ca-file cert.pem send-proxy-v2 server ocserv 127.0.0.1:443 check-ssl check-send-proxy send-proxy-v2 timeout tunnel 1810s #配合ocserv的idle-timeout backend socks5-tls mode tcp server socks5 127.0.0.1:18080 check-ssl check-send-proxy send-proxy-v2 backend nginx mode tcp #server nginx 192.168.137.99:1443 check-ssl check-send-proxy send-proxy-v2 tcp-request content reject #拒绝连接/直接断开连接 - socks5-tls , 使用 xray, 对应的inbound 增加配置后,log能记录正确的来源IP。
"streamSettings": { ... //其他配置行 "sockopt": { "acceptProxyProtocol": true } } - MySQL 也可以在前面套一层ssl/tls,见【pymysql 连接套了 ssl/tls的mysql】。
- Nginx 增加配置后,log能记录正确的来源IP。
server { listen 443 ssl http2; #原有的配置行, listen 2443 ssl http2 proxy_protocol; #单独端口接受proxy_protocol set_real_ip_from 192.168.2.0/24; #信任的IP段来源 real_ip_header proxy_protocol; #设置client来源IP。 absolute_redirect off; #因前后端的端口不同,让redirect使用相对路径, 即不包含"host:port" ... //其他配置行 } #用http访问https时,log中记录不到真实IP,修改配置加上proxy_protocol_addr的记录, http { log_formart main ....... ' $proxy_protocol_addr'; } - 测试 socks5
配置,修改/etc/config/stunnel增加一个section。【stunnel 官方文档】
把 socks5+tls代理口 443,封装成 http本地代理 8880。config service 'test_s5' option enabled '1' option client '1' option accept_host '0.0.0.0' option accept_port '8880' list sni 'pxy.myxxx.com' list connect '192.168.2.100:443'
使用curl --proxy socks5://uuu:uupwd@127.0.0.1:8880 http://github.com通过代理访问,工作正常。 - 测试 web
使用curl https://www.myxxx.com访问,网站工作正常。
使用curl https://192.168.2.100访问,网站工作正常。 - 另外,如果haproxy的 backend指向 stunnel的server模式,则不能使用 send-proxy (可以check-ssl),因为stunnel不支持接受proxy-protocol。
- 因为 ocserv本身就有ssl,就无法用 haproxy的SSL Termination(SSL终止),让haproxy接管ssl部分。
再说,haproxy的TCP模式也无法做SSL终止。SSL终止似乎只能用于mode http。
所以,以上配置使用SSL-Pass-Through(SSL穿透/透传)。关于ocserv的配置【openwrt-22.03_debian_centos_ocserv】。
- haproxy配置,global 和 defaults 原有的默认配置不改变。
尝试在 Ubuntu-20.04.5LTS 中装 haproxy,发现版本比较旧,是 v2.0.33。【文档2.0.35】【文档2.0.28】
Debian tinyproxy
- debian 10 中 tinyproxy 的 upstream 配置,比起 3proxy来说差太多。
- tinyproxy 1.10.0 支持
upstream socks5 user:pwd@ip:port "xxx.xxx"
文档中说支持10.0.0.0/8的格式。socks5时,实际上并不支持ip段,只支持域名。
所以要把 IP 当域名配置 如"10.1.1.1","192.168.5.22", 非常不好用。 upstream none "10.0.0.0/8"是支持ip段,和 域名的。
- tinyproxy 1.10.0 支持
hev-socks5-server
- 项目【heiher/hev-socks5-server】,C 语言项目,体积很小。配置文件是yaml格式。可以用非root身份执行。
debian, win, openwrt 都支持。(2025-08)- ubuntu 中试过,挺好用的。简单小巧,纯socks5服务,支持用户认证。只是不支持 proxy chain代理链,不支持rules条件。
转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/12388465.html 来自osnosn的博客.

浙公网安备 33010602011771号