帶有 Lua 的 Dovecot 代理還是?
我已經建構了一個 Dovecot 代理,可以根據使用者的域將使用者發送到特定的後端。域 A 到伺服器 A,域 B 到伺服器 B,等等。域列表不是靜態的,但變化不大。使用 passdb 驅動程序 sql 和一個簡單的 SQL 語句,這完全可以正常工作,例如:
password_query = SELECT NULL as password, 'y' as nopassword, 'y' as proxy, NULL as destuser, 'y' as proxy_nopipelining, host, 'y' as nodelay, 'y' as nologin, 'any-cert' as 'starttls' FROM proxy_domain WHERE domain = '%d';
dovecot 配置包含:
passdb { args = /etc/dovecot/sql.conf driver = sql } userdb { args = static uid=5000 gid=5000 home=/dev/null driver = static }
我的“問題”並不是真正的問題 - 但是……我只需要為這項工作安裝和執行 Mysql/MariaDB 伺服器,我認為,必須有一種更簡單的方法來解析特定域的主機。並行 postfix 安裝使用簡單的傳輸映射來完成相同的工作。我不需要 SQL 伺服器來進行簡單的查找。
我考慮過Dovecot Lua passdb或static passdb但我找不到任何有用的範例來將域與帶有 Lua 的主機進行匹配,或者我如何返回所有必要的參數?
所以我已經安裝了 debian 包
dovecot-auth-lua
。我試過:
passdb { driver = lua args = file=/etc/dovecot/passdb.lua blocking=yes default_fields = password=NULL nopassword=y proxy=y destuser=NULL proxy_nopipelining=y nodelay=y nologin=y starttls=any-cert }
有必要在這裡屏蔽嗎?這是只讀操作,還是?
Lua 腳本:
local database = "/etc/dovecot/backends" function auth_passdb_lookup(req) for line in io.lines(database) do for domain, host in string.gmatch(line, "(.+)%s(.+)") do if (domain == req.domain) then return dovecot.auth.PASSDB_RESULT_OK, "host=" .. host end end end return dovecot.auth.PASSDB_RESULT_USER_UNKNOWN, "" end
<domain> <host>
當然還有每行的後端文件。但我在代理上遇到錯誤
pam_unix(dovecot:auth): check pass; user unknown pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=user@domain rhost=<my-ip> pam(user@domain,ip,<id>): pam_authenticate() failed: Authentication failure (Password mismatch?)
這是什麼意思?我不確定 - 但它是嗎,因為我在其中一些上返回“NULL”。當我刪除這兩個屬性時
password
,destuser
它具有相同的效果。
pam_authenticate 表示它正在嘗試系統使用者查找,通過註釋掉 10-auth.conf 中 auth-system.conf.ext 的包含來禁用 pam 查找。
ps:你讓LUA工作了嗎?我正在嘗試類似的東西。
編輯 - 通過將這些欄位添加到 passdb 查找函式返回欄位(不是 userdb 查找函式欄位)中,讓我的工作:
return dovecot.auth.PASSDB_RESULT_OK, “password=pass proxy=y host=imap.domain.com destuser=remote@user.com pass=anotherpass”