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

示例:普通方式认证

选择认证类型为 普通方式:

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

代码如下:

local _M = {}

--[[
  Entry point of Lua rule
  @config: config of socks5 application
  @rule: socks5 rule that includes this Lua code
  return: true, false, nil and error message
]]
function _M.run(config, rule)
  ngx.log(ngx.ERR, "config = ", require("cjson.safe").encode(config))
  ngx.log(ngx.ERR, "rule = ", require("cjson.safe").encode(rule))
  return true
end

return _M

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

添加一个用户组:OpenResty

添加一个用户:abcde,密码:OpenResty@123

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

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

示例:Lua 代码认证

选择 认证类型为 Lua

代码如下:

local resty_sha1 = require "resty.sha1"
local str = require "resty.string"
local _M = {}


local function auth_rule(config)
    local sha1 = resty_sha1:new()
    if not sha1 then
        return nil, "failed to create the sha1 object"
    end

    local ok = sha1:update("hello, world")
    if not ok then
        return nil, "failed to add data"
    end

    local digest = sha1:final()  -- binary digest

    -- b7e23ec29af22b0b4e41da31e868d57226121c84
    local hex = str.to_hex(digest)
    -- ngx.log(ngx.ERR, "sha1: ", hex)

    if hex == config.username then
        return true
    end

    return false
end

--[[
  Entry point of Lua rule
  @config: config of socks5 application
  return: true, false, nil and error message
]]
function _M.run(config)
  return auth_rule(config)
end

return _M

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

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

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