Eric @ EricBess WebHome

一味思考而不行动,将在不知不觉中变得无意义

Chinese (Simplified) flagItalian flagKorean flagPortuguese flagEnglish flagGerman flagFrench flagSpanish flagJapanese flagArabic flagRussian flagGreek flagDutch flagBulgarian flagCzech flagCroat flagDanish flagFinnish flagHindi flagPolish flagRumanian flagSwedish flagNorwegian flagCatalan flagFilipino flagHebrew flagIndonesian flagLatvian flagLithuanian flagSerbian flagSlovak flagSlovenian flagUkrainian flagVietnamese flag
By N2H

ucspi-tcp的原理和设置

  Qmail的开发者dan Bernstein 开发了ucspi-tcp(Unix Client-Server Program Interface, using the TCP protocol)包来取代inetd程序。Ucspi格式定义了一种程序来交换数据的方法,主要体现出三个优点:

  1、 ucspi端口独立于底层的通讯介质。
  2、 ucspi允许shell脚本程序利用网络的互联。
  3、 ucspi程序建立了unix环境变量,这些变量定义了可以被程序和用户使用的网络信息。

  Ucspi-tcp使用称为tool的程序在应用程序之间建立连接。有两种类型的ucspi tool ---客户tool(tcpclient)和服务器tool(tcpserver)。
  Ucspi-tcp的tcpserver程序就是替代unix的inetd程序的,有如下优点:

  1、他能够把来自服务器端的所有输入和输出都记到一个文件中。
  2、他能提供访问控制特征,拒绝或者允许来自客户端的连接,控制规则放在一个hash规则库(cdb)它很方便的来处理成千的规则。
  3、它包含了并发限制(默认40),tcpserver 可平缓的降低并发量来防止使unix系统过载。

Tcpserver 命令行的格式是:

  tcpserver options host port application

  host和prot参数制定了将要运行应用程序的本地服务器的主机名和端口号。Host参数可以是localhos、主机ip address、或者是主机的完整域名,如果是0表示可以访问所有local host。Port参数可以是一个数字或者是/etc/services文件中的一个tcp端口的名字,例如:smtp, 0 表示随机给个端口号。 Application是连接建立后要传输给应用程序(可多个参数)。

  Options参数定义了tcpserver程序的行为。有三种类型的选项:

  常规选项------定义用于ucspi tool的选项。
  连接选项-----处理到达的连接请求。
  数据收集选项-----如何获得在传给应用程序的unix环境变量中使用信息。

Tcpserver连接选项(1)

  0 or 1: 0表示接收数据,1发送数据

       -c n: 不接受多于n个同时连接(Default 40)-b n 允许n个连接请求的存储
  -x cdb: 使用hash数据库cdb中的规则来接受或拒绝远程客户端的访问
  -X: 当由-x选项指定的数据库不存在时允许连接
  -g gid: 当接受连接准备完成后改变活动组ID为gid
  -u uid 当接受连接准备完成后改变活动用户ID为uid
  -U 相当于-g $GID -u $UID,  $GID and $UID are set by envuidgid
  -B banner: 在连接建立后将banner(欢迎词)写到网络连接上
  -d 当主机相应较慢时延迟向远程主机发送数据
  -D 从不延迟向远程主机发送数据
  -l 打印本地端口号到standard output (stdout)
  -o 在连接的分组中不改变ip选项
  -O 删除ip选项为分组寻找路径

Tcpserver数据收集选项(2)

  -h:(default.) 使用dns查找远程主机
  -H: 不使用dns查找远程主机名。你必须对端口53使用此选项,删除环境变量$tcpremotehost
  -l localhost: 不使用dns查找本地服务器主机名,而使用localhost
  -p: 怀疑. 使用反向dns 查找远程主机ip地址,将其与主机名相比较。如果不匹配,删除环境变量$tcpremotehost
  -r:(default.) 试图从远程主机获得$tcpremoteinfi (默认)
  -R 不试图从远程主机获得$tcpremoteinfo数据。你必须为端口53和端口113使用这一选项
  -t n 在n秒之后停止试图连接到$tcpremoteinfo数据。默认26
  
  有几个unix环境变量tcpserver试图为其接受数据。这些环境变量帮助应用程序处理有关的网络间接信息。

Tcpserver的unix环境变量(3)

  $PROTO 使用的协议(默认为TCP)
  $TCPLOCALIP 本机的IP地址
  $TCPLOCALPORT 本地TCP端口号
  $TCPLOCALHOST 本地主机的DNS查询值
  $TCPREMOTEIP 远程客户端的IP地址
  $TCPREMOTEPROT 远程客户端的TCP端口号
  $TCPREMOTEHOST 远程主机的DNS查询值
  $TCPREMOTEINFO 远程客户端的用户名

  当接受了一个远程客户端的连接,tcpserver就是图为应用程序提供环境变量,当他不能为一个特定的变量接受信息时,tcpserver不设置变量。
  

Tcprules程序

  tcprules程序是创建可以限制与应用程序连接的规则。是手工创建规则,来制定接受和拒绝单个地址、多个ip地址、全部网络地址的访问。规则在一个文本中创建,每行一条规则。文本建立后,使用cdb数据库格式将其转变成一个hash数据库。这使得tcpserver程序能够在远程客户向服务器请求连接时动态处理规则。

规则以这样的格式创建

  address :action,varible

  address是和到达连接的值相匹配的。此参数的几种格式都是基于表(3)环境变量的,可以使用这些变量的组合来创建有效的地址。下面列出了tcpserver能识别的不同地址:

tcpserver规则的地址格式

  -----------------------------------------------------------------------------

  地址 示例

  ------------------------------------------------------------------------------

  $tcpremoteinfo@tcpremteip mailto:peng@%5B192.168.3.11]

  $tcpremoteinfo@=$tcpremotehost peng@96633.net

  $tcpremoteip 192.168.3.11

  =$tcpremotehost mail.chinaunix.net

  部分$tcpremoteip 192.168

  部分$tcpremotehost chinaunix.net

  空 任何地址

  -------------------------------------------------------------------------------

action有两个选项:allow and deny

  除了动作以外,其他的以逗号分开的环境变量可以添加到action中,实现tcpserver在特定的远程客户连接请求时设置环境变量。这一特性可以实现选择转发等功能。

  举几个例子吧:

  ---------------------------------------------------------------------------------

  规则 描述

  -------------------------------------------------------------------------------

  192.168.0.1:deny 拒绝192.168.0.1的任何连接

  192.168.3:allow 允许192.168.3.0上的客户任何连接

  192.168.4.1-11:allow 允许192.168.4.1-192.168.44.11上的客户任何连接

  :deny 拒绝任何连接

  peng@chinaunix.net 允许peng@chinaunix.net 的连接

  192.168.3:allow,RELAYCLIENT=" " 接受192.168.3.0网络上的任何连接,设置环境变量RELAYCLIENT为空字符串。

  -------------------------------------------------------------------------------------

  本文建立SMTP转信规则[除本机外拒绝任何主机转发邮件,但不限制连接。]

  #vi /etc/tcp.smtp

  127.0.0.1:allow,RELAYCLIENT=""

  :allow

建立完文本文件,就用tcprules命令生成库文件,格式如下:

  tcprules database tmpfile

  本文中是这样的:

  # /usr/local/bin/tcprules /etc/qmail/tcp.smtp.cdb /etc/qmail/tcp.smtp.tmp

  这样,就生成了/etc/qmail/tcp.smtp.cdb文件了。tcp.smtp.cd表示适用于tcp协议,专用于smtp

  协议,文件是cdb数据库格式。

下一步,就是告诉tcpserver如何应用它,本文的如下启动smtp服务:

  /usr/local/bin/tcpserver -H -R -l 0 -t 1 -c 100 -v -p -x

  /etc/qmail/tcp.smtp.cdb -u QMAILDUID -g NOFILESGID 0 smtp

  /usr/local/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /usr/bin/true

  | /usr/local/qmail/bin/splogger &

  # /usr/local/qmail/bin/tcpserver -c 100 -v -l $_DOMAIN -U -H -R 0 pop3 /usr/local/qmail/bin/qmail-popup domain /home/vpopmail/bin/vchkpw /usr/local/qmail/bin/qmail-pop3d Maildir 2>&1 | /usr/local/qmail/bin/splogger &

1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5 out of 5)
Loading ... Loading ...
-欢迎为本文评级

相关日志

本文读者也关心以下内容:

  • N/A

12月 5th, 2007 作者: eric | Qmail/Postfix/Exchange | Trackback ? | 无评论| Email This Post Print This Post | 61 views

Add a Comment

Leave a reply

No Comments