[LinuxFocus-icon]
<--  | 首页  | 站点地图  | 索引  | 搜索

新闻 | 过往期刊 | 链接 | 关于LF
This document is available in: English  Castellano  ChineseGB  Deutsch  Francais  Nederlands  Turkce  

[Photo of the Author]
by Guido Socher (homepage)

关于作者:

Guido 非常喜欢 UUCP E-mail,因为这是一个和运行 Linux 的计算机完美集成的解决方案。


目录:

 

uucpssh.org: Linux 爱好者的 UUCP e-mail

uucp mail

摘要:

在 Windows 的世界里,使用 POP3 或 IMAP 接收邮件、直接使用 SMTP 发送邮件。这种两者相分离的设置会导致各种各样的麻烦,尤其是在同时使用不同 ISP 的时候。

UUCP 是以格很古老的协议,但确实是一个用来收发邮件的不错的解决方法。在 uucpssh.org 上,还另外提供了一些确实很灵活的先进特征。

_________________ _________________ _________________

 

概述

uucpssh.org 为 Linux 用户提供了一个非常好的 e-mail 解决方案。它把 UUCP e-mail 传输和 SSH 的安全性结合在了一起,并提工了一些灵活的高级选项。

UUCP 是一个非常古老的协议,最早用于在 Unix 系统之间拷贝各种类型的文件,它的名字的意思就是“Unix to Unix Copy”。这些早期的计算机系统并不永久地连接在计算机网络上,而是在一个规定好的时间间隔使用 modem 拨号连接交换数据。UUCP 最适合传输那些带有批处理工作性质的东西,比如 e-mail 或新闻。

今天的 UUCP 已经不再用于通常的文件传输了。不过它仍然非常适于传输 e-mail,特别是对于那些经常出行的人。当你在机场使用无线局域网连接的时候,收发邮件的操作可以和你在家中联网收发邮件使用完全相同的操作,无须改变任何设置参数。  

技术部分

现在让我们看看如何设置通过 SSH 隧道的 UUCP 上的 e-mail。

对于那些正在关心如何在 XP 或 98 或……上设置这些的人来说,你真正需要的是 Linux。通常,这时一个只用于 Linux 或 Unix 的解决方案。

一个 e-mail 系统通常由 MUA (Mail User Agent,邮件用户代理)和 MTA (Mail Transport Agent,邮件传送代理) ,MUA 也就是你用来输入邮件内容、读取邮件的程序,MTA 又被称做邮件服务器。常见的 MUA 包括 mutt、Kmail、Thunderbird 等等。MTA负责把邮件从一台计算机传送到其他计算机。既然 UUCP/SSH 是一个传输协议,那么显然,我们在这个解决方案中使用 UUCP/SSH 互联 MTA。

换句话说,我们将在我们的 Linux 系统中设置一个本地的邮件服务器,以便使用 UUCP 而不是 SMTP 来收发邮件。

UUCP 是 MTA 间的传输工具,并向 MTA 隐藏我们并不永远在线这一事实。UUCP 采用批处理的方式来传输邮件。

最后,SSH 是我们用来封装 UUCP 并连接到 uucpssh.org 的协议。

要使用 uucpssh.org 的 UUCP e-mail 服务,你需要拥有一个完整的域名,因为邮件的路由是以域名为基础的。本地的 MTA 负责为不同的用户来分检邮件。

既然 uucpssh.org 只按照域名分捡邮件,那你就可以对于用户部分 ("@"之前的部分) 拥有完全的灵活性了。只要你原意,你可以创建任意多的别名和用户名。  

什么是 MX 域名?

域名就是像 linuxfocus.org 一样东西,差不多地球人都知道。要拥有一个域名,你需要一个域名服务器。互联网在协议层并不使用域名,而是使用数字,也就是 IP 地址。域名服务器把名字翻译成 IP 地址,这个数字就被用来在主机之间建立连接了 (比如到 web 服务器或邮件服务器)。

如果你要在物理上分离的主机上提供 web 页面和 ftp 服务,你就必须给它们不同的名字。比如 linuxfocus.org 和 ftp.linuxfocus.org。
但这和 e-mail 的情况不太一样,因为在 DNS 中有一类特别为邮件设置的条目,称为 MX (Mail Exchanger, 邮件交换)。你可以在一台主机 (linuxfocus.org) 上提供网页服务,同时可以让你的 uucpssh.org 上的邮件也通过 linuxfocus.org (或 [email protected]) 传送。

换句话说,当你移动到 uucpssh.org 时,你移动的只是 MX 域名。  

设置, MTA 部分

我们将从 MTA 的设置开始。这篇文章里,我们讨论 exim、postfix 和 sendmail。它们都很擅长 UUCP。  

Exim 3

把这段内容加入 exim.conf 的 main 字段 (位于文件顶部):
trusted_users = uucp
primary_hostname = your.own.mail.domain
local_domains = your.own.mail.domain
在 transport 字段加入:
# Transport for uucp
uucp:
  driver = pipe
  user = nobody
  command = "/usr/bin/uux -r - ${host}!rmail ${pipe_addresses}"
  return_fail_output = true
在 router 字段的开始 (!) 部分加入:
# Router for uucp (which domains are uucp domains):
# This must come before lookuphost!
uucphost:
  transport = uucp
  driver = domainlist
  route_list = * uucpssh byname
使用 exim -bV 命令测试设置,之后重启 exim。 (/etc/init.d/exit restart)  

Exim 4

在 exim.conf 中加入下列设置
trusted_users = uucp
primary_hostname = your.own.mail.domain
domainlist local_domains =  your.own.mail.domain
domainlist relay_to_domains =
hostlist   relay_from_hosts = 127.0.0.1
在 transport 字段加入
# Transport for uucp
uucp:
  driver = pipe
  user = uucp
  command = "/usr/bin/uux -r - ${host}!rmail ${pipe_addresses}"
  path = /usr/local/bin:/usr/bin:/bin
  return_fail_output
在 router 字段的开头加入:
# Router for uucp (which domains are uucp domains):
# This must come at the beginning of the router section
uucphost:
  transport = uucp
  driver = manualroute
  domains = ! +local_domains
  route_list = * uucpssh byname
使用命令 exim -bV 测试设置,然后重新启动 exim (/etc/init.d/exit restart)  

Sendmail

Sendmail 使用基于 m4 宏的配置系统,m4 配置系统可能和 sandmail 不在一个软件包里面,看看你的发布版的光盘里有没有一个叫做 "sendmail-cf" 之类名字的包,你可能需要安装它才能配置 sendmail。

在 sendmail 的 cf 目录 (可能是 /usr/lib/sendmail-cf/cf) 新建一个叫做 sendmail-uucp.mc 的文件:

#divert(-1)
# `This is config sends outgoing mail via uucp
#
# to generate a sendmail.cf out of this .mc file
# use the sendmail sources
# and run m4 thisfile.mc > sendmail.cf.'
divert(0)
include(`../m4/cf.m4')
VERSIONID(`UUCP, without DNS')
undefine(`BITNET_RELAY')
undefine(`DECNET_RELAY')
undefine(`UUCP_RELAY')
OSTYPE(`linux')
MASQUERADE_AS(your.own.mail.domain)
MASQUERADE_DOMAIN(localdomain)
MASQUERADE_DOMAIN(localhost)
# ` needed if you use an internal domain that does not exist: '
FEATURE(`masquerade_envelope')
FEATURE(always_add_domain)
# ` read allowed domains from cw file: '
FEATURE(use_cw_file)
FEATURE(local_procmail)
# `important for uucp:'
FEATURE(accept_unresolvable_domains)dnl
# `the /etc/passwd entry: mail:*:8:12:mail:/var/spool/mail:'
define(`confDEF_USER_ID',``8:12'')
define(`confSAFE_QUEUE',`True')
define(`confDELIVERY_MODE',`background')dnl
# 'replace mfic by the UUCP system name of your ISP:'
define(`SMART_HOST',uucp-uudom:uucpssh)dnl
define(`confSERVICE_SWITCH_FILE',/etc/service.switch)dnl
define(`confHOSTS_FILE',/etc/hosts)dnl
define(`UUCP_MAILER_MAX',1024000)dnl
MAILER(procmail)dnl
MAILER(local)dnl
MAILER(smtp)dnl
MAILER(uucp)dnl
使用如下命令编译该文件:
m4 sendmail-uucp.mc > sendmail.cf
把这个 sendmail.cf 文件拷贝到 /etc,重新启动 sendmail:
/etc/init.d/sendmail restart

在 /etc/service.switch 文件应该设置:
hosts   files
aliases files
 

Postfix

要使用 UUCP 作为缺省传输协议,可以参考 Postfix FAQ (http://www.postfix.org/faq.html#uucp-tcp)
在 /etc/postfix/main.cf 中加入:
relayhost=uucpssh
default_transport=uucp
并且在 /etc/postfix/master.cf 中应该加入如下设置:
uucp unix - n n - - pipe
  flags=F user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
 

设置, UUCP 部分

UUCP软件可以从 http://www.airs.com/ian/uucp.html 找到,不过你应该首先看一下你的 linux 发布版的光盘。所有的主要发布版都有 UUCP 的软件包。如果你还是想从源代码开始安装 UUCP,那就要注意了。UUCP (至少到版本 1.07) 使用了一些很奇怪的路径命名传统。比如,它把可执行文件安装到 /usr/lib/uucp。所有的在发布版中的软件包都修正了这些问题。特别说一下:gentoo linux 把版本 1.06 的软件安装到了正确的目录 (/usr/bin, /usr/sbin, /etc/uucp),但在一些情况下,编译路径仍然是错误的。

我将进一步描述一些如何在 uucp 安装过程中 debug 的小技巧。

要配置 UUCP,在目录 /etc/uucp/ 中至少要有如下文件:

在 uucp 的世界中,每一个安装上的 uucp 都有一个名字,这个名字要用于两个 uucp 系统开始通信前的握手操作。uucpssh.org 叫做 uucpssh (全小写),你的 uucp 系统的名字是你在 uucpssh.org 上建立帐号时自己起的。在这个例子中叫做 mailtux。

编辑 /etc/uucp/sys,在文件尾部加入:
system uucpssh
myname mailtux
time any
address main.uucpssh.org
port SSH
protocol t
remote-send /
remote-receive ~
chat ""
编辑 /etc/uucp/port,在文件尾部加入:
port SSH
type pipe
command /usr/bin/ssh -C -x -o batchmode=yes [email protected]
编辑 /etc/uucp/call,加入:
uucpssh mailtux your-random-string-get-it-from-uucpssh.org-admin-page

下载使用 "uuchk" 命令检查你的设置,改正发现的语法错误。

要把邮件转发到 uucpssh.org,我们将以 uucp 用户使用 ssh,首先请确保 /etc/passwd 中有意格用户名叫做 uucp,并且该用户有合法的 home 目录。
还要检查 uucio 属于用户 uucp 并且被设置了 SUID。这样,任何用户运行命令的时候,都表现成是 uucp 用户运行的这个命令。对 uux 也是如此:
-r-sr-sr-x    1 uucp     uucp  225008 Mar  7  2002 /usr/sbin/uucico
-r-sr-xr-x    1 uucp     uucp   93920 Mar  7  2002 /usr/bin/uux
 

设置, SSH 部分

现在,我们必须为 SSH 重新生成一个 DSA 密钥,并把它上船到 uucpssh.org 的管理页面。对于这个工作,在那个管理页面上已经有描述了,我只是在这里重复一下。
- Become uucp user (su - uucp)
- Execute ssh-keygen -t dsa
- Do not give any password.
- upload the content of ~uucp/.ssh/id_dsa.pub to your uucpssh.org admin page
 

测试

现在向你的主机外发一封信,使用下面的命令看看它是否出现在 UUCP 的队列中了
uustat -a

这封信最终应该到了 /var/spool/uucp/uucpssh/C./ 和 /var/spool/uucp/uucpssh/D./ 目录,运行
uulog -40
看看发生了什么。查看 /var/log 中的你的邮件发送程序的 log 文件和 /var/log/uucp 中的 uucp 的 log 文件。如果邮件发送的不正常的话,这些 log 可以给你一些启示。如果上边这些都没有发生,那错误应该在 MTA 的设置中。

如果上面的测试没问题的话,那就可以测试 SSH 连接了。以 uucp 登陆 (从 root su 到 uucp) 并运行
ssh [email protected] -v
接受服务器的 RSA 密钥,之后你应该收到一个 uucp 提示 (大概是 "Shere...")。

最后,我们测试发送已经送到队列中的 uucp 邮件,运行:
/usr/sbin/uucico -x 11 -S uucpssh
-x 11 参数要求输出最多的调试信息。如果什么事情不正常的话,你可以在 /var/log/uucp/Debug 里面找到一些线索。

要测试接收邮件,可以从外边发送一封信到 [email protected],然后从 uucpssh.org 取回这封信:
/usr/sbin/uucico -x 11 -S uucpssh
如果有问题的话,再看一下 /var/log/uucp/Debug 。收回的信首先会被加入到队列 /var/spool/uucp/uucpssh/X./ ,然后通过命令 /usr/sbin/uuxqt 和 /usr/bin/rmail 自动发送到你的 MTA。这里 gentoo linux 有一个 bug:他会在 /usr/lib/uucp/ 目录下寻找 uuxqt 命令,并在 /usr/conf/uucp 目录查找 uucp 的配置文件。我是通过建立一些符号链接来修正这些 gentoo 特有的问题的。
查看你的 MTA 的日志,你应该能够看到这封信被收到并传送给你了。  

日常使用

一旦正确安装了系统,你就不用做那么多了。只需要运行
/usr/sbin/uucico -S uucpssh
uulog -5
来和 Internet 交换邮件。我个人更喜欢对它有完全的控制,手动地运行脚本,但你可以把命令
/usr/sbin/uucico -S uucpssh
加入 /etc/ppp/ip-up ,它将会在你每次连接到 Internet 的时候自动运行的。
 

相关链接


享受 UUCP 邮件吧!  

对这篇文章发表评论

每篇文章都有各自的反馈页面。在这个页面里,您可以提交评论,也可以查看其他读者的评论:
 反馈页面 

<--, back to the index of this issue

主页由LinuxFocus编辑组维护
© Guido Socher, FDL
LinuxFocus.org
翻译信息:
en --> -- : Guido Socher (homepage)
en --> cn: 王旭 <gnawux(at)21cn.com>

2004-02-29, generated by lfparser version 2.46