我已经构建了一个 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 [email protected] pass=anotherpass"