我最近在 VPS 上设置了 MTA,在配置它时我意识到我对 Unix 中主机名的概念和实现感到非常困惑。
我对 DNS 有深入的了解,并且熟悉它的前身hosts
文件,但我对经典的内部网络没有经验,因为我一直使用直接连接到 Internet 的服务器。
如果有人搜索这个主题,那里有很多相互矛盾的解释,所以,首先,我想要求对主机名(不仅仅是简单的,而且是复杂的,多级名称)进行全面介绍,完全独立于DNS和互联网,并 再为自己的DNS关系的说明,以及错综复杂的“完全合格的域名”一词(这是一样的DNS,还是其他什么东西)。
我还想知道典型 Unix 机器上(或至少在 Debian/Ubuntu 上)上的哪些文件和命令在管理主机名方面发挥着作用,尤其是:
/etc/hostname
(简单或复杂的名称?这是有 A 记录的东西吗?)/etc/hosts
设置主机名方面的角色和正确设置(它不仅仅是为了解析?什么名称和指向哪里?)更详细的答案比试图简化主题的答案更受欢迎,因为后一种类型有很多,这是混淆的根源。
使用 Postfix (2.11.3) 我想将所有邮件重定向到外部地址。
/etc/postfix/main.cf
:
virtual_alias_maps = regexp:/etc/postfix/rewrite
Run Code Online (Sandbox Code Playgroud)
/etc/postfix/rewrite
:
/^.+$/ hijacked@example.com
Run Code Online (Sandbox Code Playgroud)
向 发送邮件destination@example.net
,出现以下错误:
[...] to=<hijacked@example.com>, orig_to=<destination@example.net> [...] status=bounced (User unknown in virtual alias table)
Run Code Online (Sandbox Code Playgroud)
文档说:
有效的收件人地址与 virtual_alias_maps 参数一起列出。Postfix SMTP 服务器通过“虚拟别名表中的用户未知”拒绝无效收件人。
事实证明,该错误与验证虚拟别名域有关:virtual_alias_domains
默认情况下是$virtual_alias_maps
,将其设置为其他任何内容(设置为不匹配的域或什至将其留空)可以解决问题。
我在答案中找到的另一个解决方案是以另一种形式给出正则表达式:
/^.+@.+$/ hijacked@example.com
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,当使用正则表达式表进行虚拟别名时,别名域的验证如何工作?为什么设置virtual_alias_domains
为其他任何内容都可以解决问题?上述两种地址映射方式的等效模式有何不同?
的输出postconf -n
是:
config_directory = /etc/postfix
inet_interfaces = loopback-only
inet_protocols = ipv4
mydestination =
myhostname = example.org
myorigin = $myhostname
virtual_alias_domains =
virtual_alias_maps = regexp:/etc/postfix/rewrite
Run Code Online (Sandbox Code Playgroud)