也许我正在查找错误,但我正在尝试设置某种 smtp 代理。我有一个 postfix 服务器,它接收一组服务器/客户端的所有电子邮件。它使用智能主机 (relayhost=...) 将邮件转发到我们公司的 MTA。我想限制单个服务器可以中继的消息数量,以防止公司 MTA 被淹没。Postfix 有一个名为“anvil”的程序,它能够跟踪有关邮件的统计信息以用于此类事情,但它似乎没有被执行。我在启动 postfix 时运行了“inotifywait -m /usr/lib/postfix/anvil”,并通过它从远程服务器发送了一些消息。inotifywait 指示 anvil 从未运行过。有人让 postfix/anvil 速率控制工作了吗?
主配置文件
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
myhostname = site-server-q9
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
relayhost = Out outgoing mail relay
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 10.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = 10.X.X.X
smtpd_client_message_rate_limit = 1
anvil_rate_time_unit = 1h
master.cf 提取
anvil unix - - - - 1 anvil
smtp inet n - - - - smtpd
答案1
最后我使用了 policyd,它就是做这种事情的。我将其配置为将单个 IP 地址限制为每小时不超过 10000 条消息和 1 GB。以下是我自己写的文档的副本,以防有人觉得有用。
配置 postfix 和 policyd
安装软件包后,对其配置进行以下更改。在 /etc/postfix/main.cf 中添加以下行
smtpd_client_restrictions = check_policy_service inet:127.0.0.1:10031
在 /etc/postfix-policyd.conf 中
- 改成
WHITELISTING=1
WHITELISTING=0
- 改成
GREYLISTING=1
GREYLISTING=0
- 改成
SENDERTHROTTLE=0
SENDERTHROTTLE=1
- 改成
QUOTA_EXCEEDED_TEMP_REJECT=1
QUOTA_EXCEEDED_TEMP_REJECT=0
- 改成
SENDER_QUOTA_REJECTION="Quota Exceeded."
SENDER_QUOTA_REJECTION="Quota Exceeded, 10,000 messages/hour max!"
- 改成
SENDER_SIZE_REJECTION="Message size too big."
SENDER_SIZE_REJECTION="Message size too big. 10Mb per message or 1 Gb/hour max!"
- 改成
SENDERMSGLIMIT=512
SENDERMSGLIMIT=10000
- 改成
SENDERRCPTLIMIT=3600
SENDERRCPTLIMIT=10000
- 改成
SENDERQUOTALIMIT=250000000
SENDERQUOTALIMIT=1000000000
- 改成
SENDERMSGSIZE=10240000
SENDERMSGSIZE=50000000
- 改成
SENDER_INACTIVE_EXPIRE=31d
SENDER_INACTIVE_EXPIRE=1h
答案2
您的实施可能会感兴趣:
default_destination_concurrency_limit (default: 20)
The default maximal number of parallel deliveries to the same destination. This is the default limit for delivery via the lmtp(8), pipe(8), smtp(8) and virtual(8) delivery agents. With per-destination recipient limit > 1, a destination is a domain, otherwise it is a recipient.
Use transport_destination_concurrency_limit to specify a transport-specific override, where transport is the master.cf name of the message delivery transport.
答案3
Anvil 的真正目的是限制传入消息速率,而不是限制传出消息速率。可以将其视为一个粗糙的 DoS 过滤器。
您可能需要查看与管理者后缀部分。具体来说,你可能想要设置你的并发限制到非常低的程度,而你的排队等候时间很高。 您需要设置延迟较大的事物的交付率,并且还希望降低master.cf中的交付流程数量。
你使用 qshape 观察确定您的内部 MTA 可接受的速率是多少?
答案4
Anvil 为 postfix 进行日志记录,我已将其添加到 main.cf 中,似乎对我有用
#### Prevent server sending excess mail from clients add to /etc/postfix/main.cf
####
anvil_rate_time_unit = 60s
anvil_status_update_time = 120s
smtpd_error_sleep_time = 2s
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20
smtpd_client_message_rate_limit =
#### End Prevent server sending excess mail