我之前使用 Ubuntu 12.04LTS 设置了我的邮件服务器,一切运行正常(请参阅Postfix Dovecot SASL 身份验证未启用/正在运行 ubuntu 12.04 服务器),但我最近将所有内容移至新服务器并升级到 Ubuntu 14.04 LTS,并且我在 Dovecot SASL 配置中丢失了一些东西,因为我无法使用 Dovecot SASL 进行身份验证...我收到以下错误
Jun 12 05:15:30 example dovecot: auth: Error: pgsql(192.168.1.11:3145): Connect failed to database mwdmail: could not translate host name "192.168.1.11:3145" to address: Name or service not known
Jun 12 05:15:30 example dovecot: auth: Error: pgsql(192.168.1.11:3145): Connect failed to database mwdmail: could not translate host name "192.168.1.11:3145" to address: Name or service not known
Jun 12 05:16:31 example dovecot: auth: Error: pgsql: Query timed out (no free connections for 61 secs): SELECT username as user, password, '/mwdmail/mbox/example.com/cmadm' as userdb_home, 'maildir:/mwdmail/mbox/example.com/cmadm' as userdb_mail, 3205 as userdb_uid, 3205 as userdb_gid FROM mailbox WHERE username='[email protected]' AND active = true;
Jun 12 05:16:31 example dovecot: auth: Error: sql([email protected],127.0.0.1,<tYikAKD74gB/AAAB>): Password query failed: Not connected to database
Jun 12 05:17:44 example dovecot: auth: Error: pgsql(192.168.1.11:3145): Connect failed to database mwdmail: could not translate host name "192.168.1.11:3145" to address: Name or service not known
Jun 12 05:17:44 example dovecot: auth: Error: pgsql(192.168.1.11:3145): Connect failed to database mwdmail: could not translate host name "192.168.1.11:3145" to address: Name or service not known
postconf -n (main.cf 文件)
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
content_filter = amavis:[127.0.0.1]:10024
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
disable_vrfy_command = yes
dovecot_destination_recipient_limit = 1
enable_original_recipient = no
header_checks = regexp:/etc/postfix/header_checks
inet_interfaces = all
inet_protocols = ipv4
local_recipient_maps = $virtual_mailbox_maps
local_transport = virtual
mail_owner = mwdpost
mailbox_size_limit = 0
mailq_path = /usr/bin/mailq
manpage_directory = /usr/local/man
mydestination = example.com, localhost.com, localhost
mydomain = example.com
myhostname = example.com
mynetworks = 192.168.1.0/24, 127.0.0.0/8
mynetworks_style = host
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
recipient_delimiter = +
relay_domains = proxy:pgsql:/etc/postfix/pgsql/relay_domains.cf
relayhost =
setgid_group = mwdpdrop
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_use_tls = yes
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_client_restrictions = permit_sasl_authenticated, reject_rbl_client zen.spamhaus.org, reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_relay_restrictions = reject_sender_login_mismatch, permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sender_login_maps = hash:/etc/postfix/sasl/controlled_envelope_senders
smtpd_sender_restrictions = permit_sasl_authenticated, reject_unknown_sender_domain, permit_mynetworks
smtpd_tls_auth_only = no
smtpd_tls_cert_file = /etc/ssl/certs/ssl-mail.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-mail.key
smtpd_tls_loglevel = 1
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_mandatory_protocols = SSLv3, TLSv1
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_timeout = 3600s
smtpd_use_tls = yes
tls_random_source = dev:/dev/urandom
virtual_alias_maps = proxy:pgsql:/etc/postfix/pgsql/virtual_alias_map.cf
virtual_gid_maps = static:3205
virtual_mailbox_base = /mwdmail/mbox
virtual_mailbox_domains = proxy:pgsql:/etc/postfix/pgsql/virtual_domain_map.cf
virtual_mailbox_limit = 512000000
virtual_mailbox_maps = proxy:pgsql:/etc/postfix/pgsql/virtual_mailbox_map.cf
virtual_minimum_uid = 3205
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_uid_maps = static:3205
postconf -M (master.cf 文件)
#SMTP on port 25, unencrypted.
smtp inet n - - - - smtpd -v
smtpd pass - - - - - smtpd -v
# SMTP with TLS on port 587.
submission inet n - - - - smtpd -v
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_sasl_local_domain=$myhostname
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sender_login_maps=hash:/etc/postfix/sasl/controlled_envelope_senders
# -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
-o smtpd_sender_restrictions=reject_sender_login_mismatch
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
# SMTP over SSL on port 465.
smtps inet n - - - - smtpd -v
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
-o smtpd_sasl_security_options=noanonymous,noplaintext
-o smtpd_sasl_tls_security_options=noanonymous
#628 inet n - - - - qmqpd
pickup fifo n - - 60 1 pickup
-o content_filter=
-o receive_override_options=no_header_body_checks
cleanup unix n - - - 0 cleanup
qmgr fifo n - n 300 1 qmgr
#qmgr fifo n - n 300 1 oqmgr
tlsmgr unix - - - 1000? 1 tlsmgr
rewrite unix - - - - - trivial-rewrite
bounce unix - - - - 0 bounce
defer unix - - - - 0 bounce
trace unix - - - - 0 bounce
verify unix - - - - 1 verify
flush unix n - - 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - - - - smtp
relay unix - - - - - smtp
# -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq unix n - - - - showq
error unix - - - - - error
retry unix - - - - - error
discard unix - - - - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - - - - lmtp
anvil unix - - - - 1 anvil
scache unix - - - - 1 scache
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
dovecot unix - n n - - pipe
flags=DRhu user=mwdvm:mwdvm argv=/usr/bin/vendor_perl/spamc -f -e /usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
uucp unix - n n - - pipe
flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
ifmail unix - n n - - pipe
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp unix - n n - - pipe
flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix - n n - 2 pipe
flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman unix - n n - - pipe
flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
${nexthop} ${user}
# The next two entries integrate with Amavis for anti-virus/spam checks.
amavis unix - - - - 3 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
127.0.0.1:10025 inet n - - - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o mynetworks=192.168.1.0/32,127.0.0.0/8
# -o mynetworks=0.0.0.0
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
#
#
##############
# Integration with Dovecot - hand mail over to it for local delivery, and
# run the process under the vmail user and mail group.
dovecot unix - n n - - pipe
flags=DRhu user=mwdvm:mwdvm argv=/usr/lib/dovecot/dovecot-lda -d $(recipient)
每次 telnet 检查时均启用 SASL 身份验证
root@example:~# telnet 192.168.1.11 25
Trying 192.168.1.11...
Connected to 192.168.1.11.
Escape character is '^]'.
220 example.com ESMTP Postfix
ehlo example.com
250-example.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
doveconf-n
# 2.2.9: /etc/dovecot/dovecot.conf
# OS: Linux 3.13.0-29-generic x86_64 Ubuntu 14.04 LTS
auth_debug = yes
auth_debug_passwords = yes
auth_mechanisms = plain login
auth_verbose = yes
first_valid_uid = 3205
last_valid_uid = 3205
mail_gid = mwdvm
mail_location = maildir:~/Maildir
mail_uid = mwdvm
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date ihave
namespace inbox {
location =
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
special_use = \Junk
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Trash {
special_use = \Trash
}
prefix =
}
passdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
plugin {
sieve = ~/.dovecot.sieve
sieve_dir = ~/sieve
}
postmaster_address = [email protected]
protocols = imap pop3 sieve
service auth-worker {
user = $default_internal_user
}
service auth {
unix_listener /var/spool/postfix/private/auth {
group = mwdpost
mode = 0660
user = mwdpost
}
unix_listener /var/spool/postfix/private/dovecot-auth {
#group = postfix
group = mwdpost
mode = 0660
#user = postfix
user = mwdpost
}
unix_listener auth-userdb {
group = mwdvm
mode = 0600
user = mwdvm
}
user = dovecot
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
group = mwdpost
mode = 0600
user = mwdpost
}
}
ssl_cert = </etc/dovecot/dovecot.pem
ssl_cipher_list = ALL:!LOW:!SSLv2:ALL:!aNULL:!ADH:!eNULL:!EXP:RC4+RSA:+HIGH:+MEDIUM
ssl_key = </etc/dovecot/private/dovecot.pem
userdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
protocol imap {
imap_client_workarounds = delay-newmail
mail_max_userip_connections = 10
}
protocol pop3 {
mail_max_userip_connections = 10
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
protocol lda {
auth_socket_path = /var/run/dovecot/auth-master
deliver_log_format = msgid=%m: %$
log_path = /var/log/dovecot-lda.log
mail_plugins = sieve
postmaster_address = postmaster
quota_full_tempfail = yes
rejection_reason = Your message to <%t> was automatically rejected:%n%r
}
dovecot 认证文件:
# This file is opened as root, so it should be owned by root and mode 0600.
#
# http://wiki2.dovecot.org/AuthDatabase/SQL
#
# For the sql passdb module, you'll need a database with a table that
# contains fields for at least the username and password. If you want to
# use the user@domain syntax, you might want to have a separate domain
# field as well.
#
# If your users all have the same uig/gid, and have predictable home
# directories, you can use the static userdb module to generate the home
# dir based on the username and domain. In this case, you won't need fields
# for home, uid, or gid in the database.
#
# If you prefer to use the sql userdb module, you'll want to add fields
# for home, uid, and gid. Here is an example table:
#
# CREATE TABLE users (
# username VARCHAR(128) NOT NULL,
# domain VARCHAR(128) NOT NULL,
# password VARCHAR(64) NOT NULL,
# home VARCHAR(255) NOT NULL,
# uid INTEGER NOT NULL,
# gid INTEGER NOT NULL,
# active CHAR(1) DEFAULT 'Y' NOT NULL
# );
# Database driver: mysql, pgsql, sqlite
#driver =
driver = pgsql
# Database connection string. This is driver-specific setting.
#
# HA / round-robin load-balancing is supported by giving multiple host
# settings, like: host=sql1.host.org host=sql2.host.org
#
# pgsql:
# For available options, see the PostgreSQL documention for the
# PQconnectdb function of libpq.
# Use maxconns=n (default 5) to change how many connections Dovecot can
# create to pgsql.
#
# mysql:
# Basic options emulate PostgreSQL option names:
# host, port, user, password, dbname
#
# But also adds some new settings:
# client_flags - See MySQL manual
# ssl_ca, ssl_ca_path - Set either one or both to enable SSL
# ssl_cert, ssl_key - For sending client-side certificates to server
# ssl_cipher - Set minimum allowed cipher security (default: HIGH)
# option_file - Read options from the given file instead of
# the default my.cnf location
# option_group - Read options from the given group (default: client)
#
# You can connect to UNIX sockets by using host: host=/var/run/mysql.sock
# Note that currently you can't use spaces in parameters.
#
# sqlite:
# The path to the database file.
#
# Examples:
# connect = host=192.168.1.1 dbname=users
# connect = host=sql.example.com dbname=virtual user=virtual password=blarg
# connect = /etc/dovecot/authdb.sqlite
#
#connect =
connect = host=192.168.1.11:3145 dbname=mwdmail user=mwdmlusr password=t1mim@1l
# Default password scheme.
#
# List of supported schemes is in
# http://wiki2.dovecot.org/Authentication/PasswordSchemes
#
#default_pass_scheme = MD5
default_pass_scheme = SHA516-CRYPT
# passdb query to retrieve the password. It can return fields:
# password - The user's password. This field must be returned.
# user - user@domain from the database. Needed with case-insensitive lookups.
# username and domain - An alternative way to represent the "user" field.
#
# The "user" field is often necessary with case-insensitive lookups to avoid
# e.g. "name" and "nAme" logins creating two different mail directories. If
# your user and domain names are in separate fields, you can return "username"
# and "domain" fields instead of "user".
#
# The query can also return other fields which have a special meaning, see
# http://wiki2.dovecot.org/PasswordDatabase/ExtraFields
#
# Commonly used available substitutions (see http://wiki2.dovecot.org/Variables
# for full list):
# %u = entire user@domain
# %n = user part of user@domain
# %d = domain part of user@domain
#
# Note that these can be used only as input to SQL query. If the query outputs
# any of these substitutions, they're not touched. Otherwise it would be
# difficult to have eg. usernames containing '%' characters.
#
# Example:
# password_query = SELECT userid AS user, pw AS password \
# FROM users WHERE userid = '%u' AND active = 'Y'
#
#password_query = \
# SELECT username, domain, password \
# FROM users WHERE username = '%n' AND domain = '%d'
password_query = \
SELECT username as user, password, '/mwdmail/mbox/%d/%n' as userdb_home, 'maildir:/mwdmail/mbox/%d/%n' as userdb_mail, 3205 as userdb_uid, 3205 as userdb_gid \
FROM mailbox WHERE username='%u' AND active = true;
# userdb query to retrieve the user information. It can return fields:
# uid - System UID (overrides mail_uid setting)
# gid - System GID (overrides mail_gid setting)
# home - Home directory
# mail - Mail location (overrides mail_location setting)
#
# None of these are strictly required. If you use a single UID and GID, and
# home or mail directory fits to a template string, you could use userdb static
# instead. For a list of all fields that can be returned, see
# http://wiki2.dovecot.org/UserDatabase/ExtraFields
#
# Examples:
# user_query = SELECT home, uid, gid FROM users WHERE userid = '%u'
# user_query = SELECT dir AS home, user AS uid, group AS gid FROM users where userid = '%u'
# user_query = SELECT home, 501 AS uid, 501 AS gid FROM users WHERE userid = '%u'
#
#user_query = \
# SELECT home, uid, gid \
# FROM users WHERE username = '%n' AND domain = '%d'
user_query = \
SELECT '/mwdmail/mbox/%d/%n' as home, 'maildir:/mwdmail/mbox/%d/%n' as mail, 3205 AS uid, 3205 AS gid, 'dirsize:storage=' || quota AS quota FROM mailbox WHERE username = '%u' AND active = true
# If you wish to avoid two SQL lookups (passdb + userdb), you can use
# userdb prefetch instead of userdb sql in dovecot.conf. In that case you'll
# also have to return userdb fields in password_query prefixed with "userdb_"
# string. For example:
#password_query = \
# SELECT userid AS user, password, \
# home AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \
# FROM users WHERE userid = '%u'
# Query to get a list of all usernames.
#iterate_query = SELECT username AS user FROM users
我可以做下列:
- 从命令行 root 帐户发送电子邮件到外部地址
- 从命令行根帐户发送电子邮件到本地和虚拟邮箱
- 从外部电子邮件帐户接收电子邮件到虚拟邮箱*
我可以不是请执行下列操作:
- 从外部电子邮件账户接收电子邮件到虚拟邮箱(*已修复)
- 从 thunderbird 或 roundcube 等远程客户端登录虚拟邮箱
我知道一定是我遗漏了或者混淆了某些配置。请帮忙。谢谢
* **更新*** 2014 年 6 月 13 日 ******* 根据 @clement,我更新了帖子中的文件,并在执行 dovecot -n 时注意到文件 /etc/dovecot/conf.d/99-mail-stack-delivery.conf.ext 中的用户 ID/组 ID 有误,更正后错误消失。我也可以接收来自外部帐户的电子邮件,但出现新错误,当我尝试通过 thunderbird 或 roundcube 连接时,出现相同的错误(上面发布的错误)
新错误(来自系统日志)
Jun 13 12:48:59 example amavis[1636]: (01636-01) Connecting to SQL database server
Jun 13 12:48:59 example amavis[1636]: (01636-01) connect_to_sql: 'DBI:Pg:database=mwdmail;host=192.168.1.11;port=3145' succeeded
Jun 13 12:48:59 example amavis[1636]: (01636-01) ESMTP::10024 /var/lib/amavis/tmp/amavis-20140613T124859-01636-8zgfTr8G: <[email protected]> -> <[email protected]> SIZE=1994 Received: from example.com ([127.0.0.1]) by localhost (example.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP for <[email protected]>; Fri, 13 Jun 2014 12:48:59 -0400 (EDT)
Jun 13 12:48:59 example amavis[1636]: (01636-01) body hash: 3c1b1ba2edc70e49703dfd1f314cbf88
Jun 13 12:48:59 example amavis[1636]: (01636-01) dkim: FAILED Author+Sender+MailFrom signature by d=gmail.com, From: <[email protected]>, a=rsa-sha256, c=relaxed/relaxed, s=20120113, [email protected], fail (message has been altered)
Jun 13 12:48:59 example amavis[1636]: (01636-01) Checking: ir664hlqxaJx [209.85.128.170] <[email protected]> -> <[email protected]>
Jun 13 12:48:59 example amavis[1636]: (01636-01) 2822.From: <[email protected]>
Jun 13 12:48:59 example amavis[1636]: (01636-01) p001 1 Content-Type: text/plain, size: 769 B, name:
Jun 13 12:49:00 example amavis[1636]: (01636-01) Checking for banned types and filenames
Jun 13 12:49:00 example amavis[1636]: (01636-01) collect banned table[0]: [email protected], tables: DEFAULT=>Amavis::Lookup::RE=ARRAY(0x2541dc0)
Jun 13 12:49:00 example amavis[1636]: (01636-01) p.path [email protected]: "P=p001,L=1,M=text/plain,T=asc"
Jun 13 12:49:00 example amavis[1636]: (01636-01) run_av Using (ClamAV-clamd): (code) CONTSCAN /var/lib/amavis/tmp/amavis-20140613T124859-01636-8zgfTr8G/parts\n
Jun 13 12:49:00 example amavis[1636]: (01636-01) ClamAV-clamd: Connecting to socket /var/run/clamav/clamd.ctl
Jun 13 12:49:00 example amavis[1636]: (01636-01) new socket by IO::Socket::UNIX to /var/run/clamav/clamd.ctl, timeout 10
Jun 13 12:49:00 example amavis[1636]: (01636-01) ClamAV-clamd: Sending CONTSCAN /var/lib/amavis/tmp/amavis-20140613T124859-01636-8zgfTr8G/parts\n to socket /var/run/clamav/clamd.ctl
Jun 13 12:49:00 example amavis[1636]: (01636-01) rw_loop read: got eof
Jun 13 12:49:00 example amavis[1636]: (01636-01) run_av (ClamAV-clamd): CLEAN
Jun 13 12:49:00 example amavis[1636]: (01636-01) run_av (ClamAV-clamd) result: clean
答案1
@clement ..这个问题已经解决了。我重新安装了所有东西,并仔细更新了所有 postfix 和 dovecot 文件。我有几个拼写错误,我为 postfix 和 postdrop 创建的新用户 ID 和组 ID 在所有地方都没有正确的权限。我还有另一个问题,但会在另一篇文章中报告。
谢谢。