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'