Socks5 应用

创建应用前应该在全局配置/配置分区端口页面里,在需要 Socks5 应用的分区上添加类型为socks5_proxy的端口。

Socks5 认证类型

Socks 当前支持以下认证类型:

  • 普通方式:普通的用户密码认证
  • Lua:编写 Lua 代码实现认证逻辑
  • LADP:LDAP 认证
    • 自动同步: 启用后每10分钟会进行用户同步,同步过来的用户默认没有用户组,也可以点击同步按钮进行手动同步
    • LDAP 服务器:LDAP服务的域名或者 IP
    • 搜索 DN:如 dc=example,dc=org
    • 搜索方式: 用于登录用户名的字段, 如 uid
    • 管理DN:如 cn=admin,dc=example,dc=org

Socks5 用户

当使用普通方式进行认证时,需要添加用户和用户组,请求中携带的用户信息和添加的用户信息匹配时,则认证成功。

Socks5 授权规则

在认证通过后,会检查授权规则:

  • 没有授权规则:禁止访问。
  • 匹配到permit(允许访问)的规则:允许访问。
  • 匹配到deny(禁止访问)的规则:禁止访问。
  • 没有匹配上授权苟泽:禁止访问。

授权规则分为两种类型: basic: - 源类型:cidr / 用户组 / 用户名 - 源:按照源类型填写,支持填写多个 - 目标类型:cidr / 域名 - 目标:按照目标类型填写,支持填写多个 - 目标端口: 支持填写多个 lua:用户自行编写lua代码进行授权 - _M.run 函数是授权规则的入口 - 参数: - config:此应用的所有信息 - rule:当前授权规则的信息 - 返回值: - true:匹配规则 - false:不匹配规则 - nil, "error msg": 出错了,”error msg” 将会输出到访问日志的failure变量中。

其他授权规则字段说明:

  • 类型:permit (允许访问)和 deny(禁止访问)
  • 带宽:访问目标的带宽限制
  • 开始时间:规则生效时间
  • 结束时间:规则失效时间

Socks5 带宽规则

可以对用户的连接数和带宽进行限制,匹配规则之后不再检查后面的规则。

规则字段说明:

  • 源类型:CIDR/用户组/用户名
  • 源:按照源类型填写
  • 连接数:命中规则用户的最大连接数
  • 带宽:命中规则用户的带宽限制,单位是Mbps

示例:普通方式认证

选择认证类型为普通方式: Socks5 应用 - 图1

添加一条动作为 permit 的授权规则(类型为 basic 或 lua 都可以),示例中使用 lua 类型: Socks5 应用 - 图2

代码如下:

  1. local _M = {}
  2. --[[
  3. Entry point of Lua rule
  4. @config: config of socks5 application
  5. @rule: socks5 rule that includes this Lua code
  6. return: true, false, nil and error message
  7. ]]
  8. function _M.run(config, rule)
  9. ngx.log(ngx.ERR, "config = ", require("cjson.safe").encode(config))
  10. ngx.log(ngx.ERR, "rule = ", require("cjson.safe").encode(rule))
  11. return true
  12. end
  13. return _M

代码中打印的日志,默认情况下将在: /usr/local/oredge-node/logs/socks5_error.log

添加一个用户组:OpenRestySocks5 应用 - 图3

添加一个用户:abcde,密码:OpenResty@123Socks5 应用 - 图4

至此,配置完成,发布变更后,即可使用此用户发起 socks5 请求:

  1. curl --socks5 "{your-edge-node-host}:{your-socks5-proxy-port}" "openresty.com" --proxy-user 'abcde':'OpenResty@123'

示例:Lua 代码认证

选择 认证类型为 LuaSocks5 应用 - 图5

代码如下:

  1. local resty_sha1 = require "resty.sha1"
  2. local str = require "resty.string"
  3. local _M = {}
  4. local function auth_rule(config)
  5. local sha1 = resty_sha1:new()
  6. if not sha1 then
  7. return nil, "failed to create the sha1 object"
  8. end
  9. local ok = sha1:update("hello, world")
  10. if not ok then
  11. return nil, "failed to add data"
  12. end
  13. local digest = sha1:final() -- binary digest
  14. -- b7e23ec29af22b0b4e41da31e868d57226121c84
  15. local hex = str.to_hex(digest)
  16. -- ngx.log(ngx.ERR, "sha1: ", hex)
  17. if hex == config.username then
  18. return true
  19. end
  20. return false
  21. end
  22. --[[
  23. Entry point of Lua rule
  24. @config: config of socks5 application
  25. return: true, false, nil and error message
  26. ]]
  27. function _M.run(config)
  28. return auth_rule(config)
  29. end
  30. return _M

添加一条动作为 permit 的授权规则(类型为 basic 或 lua 都可以),示例中使用 basic 类型: Socks5 应用 - 图6

至此,配置完成,发布变更后,即可使用此用户发起 socks5 请求:

  1. curl --socks5 "{your-edge-node-host}:{your-socks5-proxy-port}" "openresty.com" --proxy-user 'b7e23ec29af22b0b4e41da31e868d57226121c84':'OpenResty@123'