如下是详细的配置指南,教你如何在Ubuntu 24.04上结合Postfix 3.8和postfwd实现SASL用户的发信频率控制。

安装和配置postfwd实现SASL用户发信频率控制

第一步:安装postfwd

首先安装postfwd包:

sudo apt update
sudo apt install postfwd

第二步:创建postfwd配置文件

创建postfwd的主配置文件:

sudo nano /etc/postfix/postfwd.cf

添加以下配置内容:

# SASL用户发信频率控制规则
# 每个SASL认证用户每天最多发送100封邮件

# 定义时间窗口:24小时
id=SASL_RATE_LIMIT
    sasl_username=~^.+$
    action=rate(sasl_username/100/86400/REJECT sender $sasl_username: mail quota exceeded (100 mails per day))

# 默认允许通过的规则(必须放在最后)
id=DEFAULT
    action=DUNNO

配置说明:

第三步:配置postfwd服务

编辑postfwd的systemd服务配置:

sudo nano /etc/default/postfwd

确保包含以下配置:

# postfwd daemon options
DAEMON_OPTS="--daemon --file=/etc/postfix/postfwd.cf --interface=127.0.0.1 --port=10040 --user=postfwd --group=postfwd --pidfile=/var/run/postfwd.pid"

第四步:配置Postfix主配置文件

编辑Postfix主配置文件:

sudo nano /etc/postfix/main.cf

smtpd_recipient_restrictionssmtpd_data_restrictions中添加postfwd检查。推荐在数据检查阶段进行,这样可以获取更准确的SASL用户信息:

# 在现有的smtpd_data_restrictions中添加,或者创建新的
smtpd_data_restrictions = 
    check_policy_service inet:127.0.0.1:10040,
    permit

# 确保SASL认证已正确配置
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes

# 确保submission端口需要认证
# 在master.cf中配置submission服务

第五步:配置Postfix master.cf

编辑master.cf确保submission服务正确配置:

sudo nano /etc/postfix/master.cf

确保包含以下submission配置:

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mta_client_restrictions
  -o smtpd_helo_restrictions=$mta_helo_restrictions
  -o smtpd_sender_restrictions=$mta_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_data_restrictions=check_policy_service inet:127.0.0.1:10040,permit
  -o milter_macro_daemon_name=ORIGINATING

第六步:创建postfwd数据目录

sudo mkdir -p /var/lib/postfwd
sudo chown postfwd:postfwd /var/lib/postfwd
sudo chmod 755 /var/lib/postfwd

第七步:启动和启用服务

# 启动postfwd服务
sudo systemctl start postfwd
sudo systemctl enable postfwd

# 重新加载Postfix配置
sudo systemctl reload postfix

# 检查服务状态
sudo systemctl status postfwd
sudo systemctl status postfix

第八步:测试配置

检查postfwd是否正常监听:

sudo netstat -tlnp | grep :10040

查看postfwd日志:

sudo tail -f /var/log/mail.log | grep postfwd

使用postfwd测试工具验证配置:

# 安装测试工具
sudo apt install postfwd-tools

# 模拟测试
postfwd-client --ip=127.0.0.1 --port=10040 --test --sasl_username=[email protected]

第九步:监控和日志

监控发信频率和限制情况:

# 查看Postfix日志中的频率限制记录
sudo grep "mail quota exceeded" /var/log/mail.log

# 实时监控邮件发送
sudo tail -f /var/log/mail.log | grep sasl_username

高级配置选项

如果你需要更精细的控制,可以修改postfwd.cf

# 不同用户组的不同限制
id=VIP_USERS
    sasl_username=~(admin|manager)@example\.com$
    action=rate(sasl_username/500/86400/REJECT VIP user $sasl_username: mail quota exceeded (500 mails per day))

id=NORMAL_USERS
    sasl_username=~^.+@example\.com$
    action=rate(sasl_username/100/86400/REJECT Normal user $sasl_username: mail quota exceeded (100 mails per day))

# 按小时限制
id=HOURLY_LIMIT
    sasl_username=~^.+$
    action=rate(sasl_username/20/3600/REJECT sender $sasl_username: hourly mail quota exceeded (20 mails per hour))

id=DEFAULT
    action=DUNNO

故障排除

如果遇到问题,检查以下几点:

  1. 确认postfwd服务正在运行:sudo systemctl status postfwd
  2. 检查端口是否被占用:sudo netstat -tlnp | grep 10040
  3. 查看详细的错误日志:sudo journalctl -u postfwd -f
  4. 验证SASL认证是否正常工作:检查/var/log/mail.log中的SASL认证记录
  5. 测试policy服务连接:telnet 127.0.0.1 10040

配置完成后,每个通过SASL认证的用户每天最多只能发送100封邮件,超出限制的邮件将被拒绝并记录在日志中。