可以实现基于 IP 地址的限制为了Postfix 中的 SMTP AUTH?
场景:我正在运行一个 Postfix 邮件服务器,该服务器接收来自互联网各地的邮件。但该服务器不仅接收邮件,还允许经过身份验证的用户向内部用户或外部用户发送邮件。到目前为止没有问题。
不幸的是,每次读日志文件我都会有点害怕。每天有成千上万个来自世界各地的 IP 地址的非法登录尝试。
但实际上合法的发送方主机仅来自少数已知的 IP 地址范围。所以我知道仅有的某人(例如)
- 134.500.0.0/16
- 134.700.42.0/24
- 134.800.133.7
可能甚至根本不是合法的发件人。(我知道上面示例中给出的 IP 地址格式不正确。我只是不想揭露真实的 IP 地址。)
因此,如果发送者来自不同的 IP 范围,那么他肯定不是我的用户,因此不允许中继任何内容。
我不希望这些子网之外的人能够中继甚至如果他找到了有效的 SMTP AUTH 用户名/密码组合。如果他来自非白名单 IP 地址范围,他一定不能发送。在任何情况下都不能。仅此而已permit_sasl_authenticated
是不够的。只要有人来自“肯定”国家(我不想明确指出它们的名字......)能够使用被盗/暴力破解/监视的凭证登录,这不够安全。:-)(想想社会工程学,窃取帐户数据的木马键盘记录器,使用容易猜到的密码的头脑不清醒的用户等等)
=> 那么,是否可以对 SMTP AUTH 登录尝试实施 IP 地址限制?(接收传入邮件不得受此影响。为此,我有policyd-weight
等等。这里仅涉及传出/要中继的邮件。)
解决方案不起作用:
iptables
防火墙限制。由于我希望能够在端口 25 上接收来自 Internet 各地的邮件,因此无法在传输层级别实施限制。- 此外,我希望合法用户能够连接到端口 25,以便允许新的外发邮件进入服务器。因此,仅允许通过子网受限的神秘 TCP 端口(例如 24343)发送邮件也不是解决方案。permit_mynetworks
:并非所有来自已知 IP 范围的用户都是合法用户。因此,我不能允许那里的每个人都发送邮件。SMTP AUTH 登录对于确定某人是否是授权用户是必需的。
答案1
将您的 SMTP AUTH 放在另一个端口(例如 587)上,并使用 iptables 限制对该端口的访问,怎么样?587 不是隐藏端口,而是 RFC 定义的邮件提交端口。发送给您的邮件将于 25 日到达,通过您的邮件需要经过 587。
答案2
这个问题比较老了,但是如果你和我一样,可以从谷歌来这里 - 这可以通过smtpd_discard_ehlo_keyword_address_maps特征。
您只需添加参数
smtpd_discard_ehlo_keyword_address_maps = cidr:/etc/postfix/discard_ehlo_keyword
到您的 Postfixmain.cf
配置(通常位于/etc/postfix/main.cf
),其中/etc/postfix/discard_ehlo_keyword
是 Postfix 查找表的路径。
接下来让我们通过例如创建一个文件sudo nano /etc/postfix/discard_ehlo_keyword
并在其中放入内容:
# this is your trusted ip ranges you want to send AUTH:
134.500.0.0/16 silent-discard
134.700.42.0/24 silent-discard
# and this is another world you don't want to send AUTH to:
0.0.0.0/0 silent-discard, auth
::/0 silent-discard, auth
保存运行后sudo postmap /etc/postfix/discard_ehlo_keyword
生成 Postfix 查找表(每次编辑后都应执行此操作/etc/postfix/discard_ehlo_keyword
)。
别忘了重新启动 Postfix!
答案3
你想使用否定形式smtpd_sasl_exceptions_networks
。
smtpd_sasl_exceptions_networks = !134.500.0.0/16 !134.700.42.0/24 !134.800.133.7
你也可能对此有兴趣smtpd_client_connection_rate_limit
。
答案4
每天都有来自世界各地的 IP 地址进行数千次不成功的非法登录尝试。
安装 fail2ban 并调整现有过滤器或创建新过滤器来捕获这些内容。我使用:
failregex =\[<HOST>\]\: SASL LOGIN authentication failed