我有一台安装了 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/make
buildsendmail.cf
并运行service sendmail restart
以使用新更改重新启动 sendmail。请记住,规则的左侧与右侧用制表符而不是空格分隔。所以不要复制粘贴代码。手动输入。
上面还有一组规则,即Translate
。在测试模式下,您不能$|
直接使用。因此,如果您想在投入生产之前测试规则,则必须使用它:
root@machine # sendmail -bt
> Translate,check_compat sender@address $| recipient@address
看看会发生什么。