在 SENDMAIL 中阻止用户向外部发送电子邮件

在 SENDMAIL 中阻止用户向外部发送电子邮件

我有一台安装了 Sendmail 的 CentOS 服务器,并使用 Fetchmail 来检索邮件。我的电子邮件服务器运行正常,但现在我需要禁止用户向外部发送电子邮件。

我如何允许该用户在本地网络(同一域的电子邮件地址内)发送电子邮件,但阻止他们向外界发送电子邮件?

答案1

因为你想要的比你想要的更通用功能(兼容性检查)确实如此,首先确保您没有在 中启用它/etc/mail/sendmail.mc file。然后您可以编写自己的版本check_compat(请注意此处单词的反转)。sendmail 手册 (4e)在第 259 和 260 页中对您的问题进行了解决方案。

这是第二个:在 sendmail.mc 文件底部添加以下几行

LOCAL_CONFIG
Kput macro
D{put1}empty1
D{put2}empty2

LOCAL_RULESETS
STranslate
R$* $$| $*    $: $1 $| $2

Scheck_compat
R$* $| $*               $: $1 $| $>canonify $2
R$* $| $*               $: $(put {put2} $@ $2 $) $1
R$*             $: $>canonify $1
R$*             $: $(put {put1} $@ $1 $)
R$*             $: $&{put1} $| $&{put2}
# Now we can filter on sender and recipient
Ruser < @ $=w . > $| $* < $=w . >        $#OK
Ruser < @ $=w . > $| $*                  $#discard $: $2

事情是这样的:这一Kput macro行定义了一个映射,当我们在宏中存储某些值时,它将被使用。我们将要使用的宏在下一行中定义,它们带有put1一些put2通用默认值(empty1 和 empty2),用于调试。

check_compat被调用时,它是一个形式为的单个参数sender@address $| recipient@address。我们需要规范化这些地址,在我们的例子中,这意味着将它们转换为形式user < @ address . >。在执行任何其他操作之前,您几乎总是使用 sendmail 规范化地址。前两行check_compat处理规范化收件人的地址并将其放入{put2}宏中。

现在我们的工作区(即其余规则集所依据的字符串)只有发件人地址,我们也将其规范化。这意味着如果check_compat在第五行停止,其输出将如下所示:

sender < @ address . > $| recipient < @ address . >

因此,现在我们已准备好检查我们想要的任何组合。系统中的本地用户的形式为user < @ $=w .>$=w宏包含您的域名、localhost、hostname 的值,任何被视为本地的内容,包括中的值/etc/mail/local-host-names。因此,此行指示 sendmail,如果user(其中“用户”应替换为相关用户的用户名)向任何本地用户发送电子邮件(这是 的含义$* < @ $=w . >),则接受此邮件并继续所有其他过滤活动。但如果该用户试图将邮件发送到其他地方,则默默丢弃此邮件。

编辑完成后,sendmail.mc您需要运行/etc/mail/makebuildsendmail.cf并运行service sendmail restart以使用新更改重新启动 sendmail。请记住,规则的左侧与右侧用制表符而不是空格分隔。所以不要复制粘贴代码。手动输入。

上面还有一组规则,即Translate。在测试模式下,您不能$|直接使用。因此,如果您想在投入生产之前测试规则,则必须使用它:

root@machine # sendmail -bt
> Translate,check_compat sender@address $| recipient@address

看看会发生什么。

相关内容