在 Ubuntu 上搭建邮件服务器(如 Postfix、Exim、Sendmail 等)时,“限流发信”通常涉及连接级限流、用户/域名级限流、队列限流等。下面以 Postfix(最常见) 为主,介绍常用限流方法,并补充其他方案。
编辑 /etc/postfix/main.cf:
# 同一 IP 最大并发 SMTP 连接
smtpd_client_connection_count_limit = 5
# 同一 IP 每秒新建连接数
anvil_rate_time_unit = 60s
smtpd_client_connection_rate_limit = 20
# 同一 IP 在一定时间内最大邮件数
smtpd_client_message_rate_limit = 50
重启:
systemctl restart postfix
适用于 authenticated 用户:
# 每个用户每分钟最多发信
smtpd_sender_login_maps = hash:/etc/postfix/sender_login
smtpd_sender_restrictions =
reject_authenticated_sender_login_mismatch
更精细限流(每用户):
# 使用 policy service(如 postfwd)
# 每目标域名并发
default_destination_concurrency_limit = 5
# 每目标域名每分钟邮件数
default_destination_rate_delay = 1s
针对远程域:
smtp_destination_concurrency_limit = 5
smtp_destination_rate_delay = 2s
# 队列最大长度
qmgr_message_active_limit = 20000
# 重试间隔
bounce_queue_lifetime = 1d
maximal_queue_lifetime = 1d
postfwd 可基于 用户 / IP / 域名 做复杂限流。
apt install postfwd
/etc/postfwd.cf
id=LIMIT_USER
sasl_username=~./^([^@]+)@/
action=rate(sasl_username/30/60)
id=LIMIT_IP
client_address=~./^192\.168\./
action=rate(client_address/50/60)
smtpd_recipient_restrictions =
check_policy_service inet:127.0.0.1:10040
smtpd_relay_restrictions =
permit_sasl_authenticated
reject_unauth_destination
# 修改 sendmail 权限
chmod 700 /usr/sbin/sendmail
smtp_accept_max = 20
smtp_accept_reserve = 5
ratelimit
通过 RateCtl 和 confCONNECTION_RATE_LIMIT
tail -f /var/log/mail.log
postqueue -p
如果你能告诉我:
我可以给你一份可直接用的配置。