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'