如何限制IP地址使用postfix SMTP中继

时间:2020-02-23 14:40:14  来源:igfitidea点击:

在本教程中,我们将涵盖以下问题:

  • 我如何限制我的后缀中继服务器仅由某些IP地址使用

  • 如何将带有后缀的中继限制到某些IP网络

  • 我如何只允许某些网络地址通过Postfix中的中继发送邮件

  • 如何通过访问后缀中继服务器将某些网络列入黑名单

实验室环境

我已经在CentOS 8 Linux上使用名为chroot DNS的设置了Intranet Postfix中继服务器。

以下是服务器和客户端的节点详细信息:

  • 后缀中继服务器:192.168.43.154(mail.example.com)

  • Postfix Client-1:``192.168.43.48(client-1.example.com)

  • Postfix Client-2:``192.168.43.148(client-2.example.com)

我的中继服务器的nslookup输出

# nslookup mail.example.com
Server:         192.168.43.154
Address:        192.168.43.154#53
mail.example.com        canonical name = server.example.com.
Name:   server.example.com
Address: 192.168.43.154

定义允许使用smtp中继服务器的子网

在postfix中,我们有两个变量来控制此行为以允许中继

  • mynetworks_style

  • mynetworks

mynetworks_style

生成mynetworks参数的默认值的方法。
这是中继访问控制等的受信任网络的列表。

  • 当Postfix仅信任本地计算机时,请指定mynetworks_style = host。

  • 当Postfix应该在与本地计算机相同的IP子网中信任远程SMTP客户端时,请指定mynetworks_style = subnet。

  • 当Postfix应该信任与本地计算机相同的IP类A/B/C网络中的远程SMTP客户端时,请指定mynetworks_style = class。

我的网络

  • 具有比陌生人更多特权的受信任的远程SMTP客户端列表

  • 特别是,允许受信任的SMTP客户端通过Postfix中继邮件

  • 我们可以手动指定受信任的网络地址列表,也可以让Postfix为我们完成(这是默认设置)

  • 如果我们手动指定" mynetworks"列表,则Postfix会忽略" mynetworks_style"设置。

  • 指定网络地址或者网络/网络掩码模式的列表,以逗号和/或者空格分隔。
    通过在下一行以空格开头继续长行。

  • 列表从左到右匹配,搜索从第一个匹配项停止。

  • 指定!pattern从列表中"排除"地址或者网络块。

例如:

mynetworks = 127.0.0.0/8 168.100.189.0/28
mynetworks = !192.168.0.1, 192.168.0.0/28

实施限制之前的现有行为

在我的环境中,当前我的中继服务器已配置为允许以下子网

mynetworks = 192.168.43.0/24, 127.0.0.0/8

让我们使用中继服务器" mail.example.com"将邮件从" client-1.example.com"发送到" client-2.example.com"。

# mail [email protected]
Subject: Test message
Hello
.
EOT

登录client-1.example.com`

Aug 02 00:33:09 client-1.example.com postfix/smtp[926]: 2C14D5FDFA: to=<[email protected]>, relay=mail.example.com[192.168.43.154]:25, delay=0.51, delays=0.12/0.12/0.21/0.05, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as A3EAD5FB32)

登录mail.example.com`

Aug 02 11:10:56 mail.example.com postfix/smtp[21464]: A3EAD5FB32: to=<[email protected]>, relay=client-2.example.com[192.168.43.148]:25, delay=0.21, delays=0.03/0.04/0.1/0.05, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 85A1C5FBDC)

登录到client-2.example.com

Aug 02 00:33:09 client-2.example.com postfix/local[21349]: 85A1C5FBDC: to=<[email protected]>, relay=local, delay=0.08, delays=0.04/0/0/0.04, dsn=2.0.0, status=sent (delivered to maildir)

因此,我们的邮件已使用我的后缀中继服务器(即mail.example.com)成功发送

限制Postfix SMTP中继(smtpd_relay_restrictions)

  • Postfix SMTP服务器在" smtpd_recipient_restrictions"之前在" RCPT TO"命令的上下文中应用的邮件中继控制的访问限制。

  • 在2.10之前的Postfix版本中,中继权限和垃圾邮件阻止规则在smtpd_recipient_restrictions下合并,导致容易出错的配置

  • 从Postfix 2.10开始,中继许可规则最好用smtpd_relay_restrictions来实现,这样,在smtpd_recipient_restrictions下的垃圾邮件阻止策略将不再导致邮件中继策略。

默认情况下,Postfix SMTP服务器接受:

  • 来自IP地址与$mynetworks匹配的客户端的邮件,或者:

  • 邮寄到与$relay_domains相匹配的远程目的地,但包含发件人指定的路由的地址(user @ elsewhere @ domain)除外,或者:

  • 邮寄到与$inet_interfaces或者$proxy_interfaces,$mydestination,$virtual_alias_domains或者$virtual_mailbox_domains匹配的本地目标。

将单个IP地址列入黑名单以访问中继服务器

我们将使用smtpd_relay_restrictions限制client-1.example.com使用此中继服务器

在中继服务器上的/etc/postfix/main.cf中进行以下更改

mynetworks = !192.168.43.48, 192.168.43.0/24, 127.0.0.0/8

提示:

请注意,在给" 192.168.43.0/24"之前,我已经将该IP设置为被阻止,因为后缀将执行从左到右的查找,因此,如果将" 192.168.43.0/24"放置在黑名单的IP之前,则提供的IP将在""中匹配192.168.43.0/24子网,将允许中继,因此我们的设置将不起作用。

添加以下内容(如果已经在main.cf中定义,则修改现有值)

smtpd_relay_restrictions = permit_mynetworks, reject

因此,这里我们拒绝来自除" mynetworks"和" mynetworks"中定义之外的任何其他网络的请求,我已将客户的IP地址列入黑名单

重新加载后缀服务

# systemctl reload postfix

现在我们尝试从我们的client-1.example.com发送邮件

# mail [email protected]
Subject: Test message
Check bounce
.
EOT

登录client-1.example.com`

Aug 02 00:35:35 client-1.example.com postfix/smtp[926]: 970F25FDF4: to=<[email protected]>, relay=mail.example.com[192.168.43.154]:25, delay=0.44, delays=0.08/0/0.25/0.11, dsn=5.7.1, status=bounced (host mail.example.com[192.168.43.154] said: 554 5.7.1 <[email protected]>: Recipient address rejected: Access denied (in reply to RCPT TO command))

登录到client-2.example.com

No logs on client-2.example.com as the mail didn't reached here

登录mail.example.com`

Aug 02 11:13:10 mail.example.com postfix/smtpd[21642]: NOQUEUE: reject: RCPT from client-1[192.168.43.48]: 554 5.7.1 <[email protected]>: Recipient address rejected: Access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<client-1.example.com>

因此,我们的配置将使用SMTP中继服务器的单个IP地址列入黑名单的工作已按预期进行。

允许特定的网络地址使用中继服务器

同样,我们可以修改" mynetworks"值,以允许所有网络子网使用中继服务器发送邮件。

mynetworks = 192.168.43.0/24, 127.0.0.0/8

现在,我们允许192.168.43.0/24子网中的所有IP地址能够使用我们的中继服务器发送邮件。

重新加载后缀服务以激活我们的更改

# systemctl reload postfix

现在,通过从我们的client-1.example.com发送邮件来验证此配置

Aug 01 13:14:21 client-1.example.com sendmail[10202]: 0717iL9A010202: [email protected], ctladdr=root (0/0), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30231, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (Ok: queued as 1E91F5FDDE)
Aug 01 13:14:21 client-1.example.com postfix/smtpd[10203]: disconnect from localhost[127.0.0.1] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
Aug 01 13:14:21 client-1.example.com postfix/smtp[10207]: 1E91F5FDDE: to=<[email protected]>, relay=mail.example.com[192.168.43.154]:25, delay=0.21, delays=0.06/0.04/0.08/0.03, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 4B8745FCE3)

因此,这次中继服务器允许我们在192.168.43.0/24子网中从客户端发送邮件