让多个 FreeBSD jail 共享同一套 MTA
FreeBSD 从 4.0 版本开始提供了非常强大的虚拟化工具—-jail。对于许多应用来说,jail能够在确保应用程序之间的有效隔离的前提下,最大限度地发挥硬件性能(每个jail不会单独运行自己的内核),而在 jail 内部看来,则基本上与真正的服务器无异,且性能损失很小;通过内核提供的 ABI 模拟,jail能够提供 FreeBSD 早期版本,以及 Linux 2.4.x 或 2.6.x 的兼容能力。
许多传统的 Unix 应用程序假定系统中存在一个可用的 MTA。FreeBSD 中内建了 sendmail,但在 jail 中配置 sendmail 会遇到一个比较麻烦的问题,即在 jail 中,127.0.0.1 指代的是 jail 的 IP 地址而不是本地 loopback 设备。换言之,原本监听本地 socket 的 MTA 变成了监听 jail 对外的 IP,这会是一个安全隐患。
个人在 tarsier 系统上采用的配置是:
- 在主机上配置一个 postfix,并令其监听本机的全部 IP 地址;
- 在一个 jail 中运行邮件系统,并且确保在主机上的 postfix 不监听这个 jail 的 IP 上的 25 端口;
- 在所有其他 jail 中,使用默认的 sendmail,但在 /etc/rc.conf 中裁减如下:
sendmail_enable=“NO”
sendmail_submit_enable=“NO”
sendmail_outbound_enable=“NO”
sendmail_msp_queue_enable=“YES”
如此,sendmail的"msp"服务会连接本机(127.0.0.1)上的25端口,这个端口由于主机上 postfix 的存在,而会由后者提供服务,从而解决了这个问题。