osnosn

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

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/block socks 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.0external ::

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 #comment 3proxy不认,会导致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/24allow * ::ffff:192.168.1.0/120
    对于192.168.0.0/16allow * ::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.cfgchroot /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 strongauth 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) 放在同一个目录中,目录全路径不含有中文。
  • 配置/修改 3proxy.cfg
    • 指定文件使用如下格式。
      #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命令
      
      其他配置,和linux中的配置一样。
    • 好像不能同时在 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 功能强大,但体积太大。暂时停掉不用

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。【官方文档
      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代理端口
      
      把 3proxy的http代理口 8888,封装成 https代理 38888。
      /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.conf
  • service stunnel4 restart

debian 中也有这个包。apt install stunnel4,v5.74。配置过程与Ubuntu相同。

  • 创建配置文件/etc/stunnel/stunnel.conf
  • systemctl 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 官方文档
      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'
      
      把 socks5+tls代理口 443,封装成 http本地代理 8880。
      使用 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】。

尝试在 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段,和 域名的。

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的博客.

posted on 2020-03-01 10:51  osnosn  阅读(7774)  评论(0)    收藏  举报