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'