LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: probing

╭∩╮(︶︿︶)╭∩╮FreeBSD使用大全FreeBSD╭∩╮(︶︿︶)╭∩╮

[复制链接]
 楼主| 发表于 2003-2-11 12:29:56 | 显示全部楼层

FreeBSD连载(29):打印机配置:系统结构

打印机配置

  FreeBSD是多用户操作系统,因此可能有多个用户同时发出打印请求,如果每个请求都直接访问打印机,那么必然就会发生冲突问题。为了使打印机能为所有的用户服务,FreeBSD使用伪脱机的打印服务方式。在这种方式下,每个使用FreeBSD的打印用户并不直接访问打印机,而是通过一系列伪脱机打印程序来使用打印机。

  FreeBSD的打印系统提供了以下功能:

    * 控制用户对打印机的访问,包括本地的打印机和网络打印机;
    * 允许用户提交打印作业,并允许用户可以管理自己的打印作业;
    * 维护一个打印队列,防止多个用户同时使用打印机的现象发生;
    * 可以选择在文档的开始打印标志,使打印出的文档至于混淆;
    * 能通过过滤器支持不同的打印机;
    * 提供记帐功能;

    * 系统结构

  通常用户使用程序lpr进行打印,但lpr并没有直接将所有打印的文件发送到打印机上,而是将其放到打印缓冲目录中。通常这个缓冲区在/var/spool目录下,每个打印机有自己的spool目录,打印文件就被放到这里,存储为一个临时文件。而系统使用守护进程lpd监视spool目录,当发现一个缓冲目录中有需要打印的文档时,lpd就复制自身,为这个打印任务产生一个lpd进程,这个进程负责处理这个打印缓冲目录的文档,将其发送到这个目录对应的打印机中进行打印。由于一个打印机对应一个缓冲目录,并且由一个lpd进程管理,因此就不会发生多个打印任务同时访问打印机,发生资源冲突问题。

  在这种打印方式将普通的打印系统分为三个部分:

    * 用户接口:打印命令lpr等是用户用来实施打印和管理的程序,可以通过它将要打印的文件放到本地或远程的打印缓冲区中;
    * 打印缓冲区:每个打印机有自己的缓冲区,用户或管理员可以通过一系列命令进行维护;
    * 打印机管理程序:打印守护进程lpd是打印系统的中心,负责监视缓冲区,并将缓冲区中的打印作业送到打印机上进行打印;

  这种方式虽然与直接访问打印机相比看起来比较复杂,但是这样能够支持多用户和多打印机;而且使用打印缓冲区和后台打印守护程序使打印工作放到后台进行,用户不需等待打印结束。此外,这样也可以使得打印系统可以很好的和网络相结合,可以通过lpd将打印到其他主机上的打印作业通过网络发送出去,或者监视网络上发送来的打印文档,将其放入打印缓冲区中进行处理。

  将打印过程分为三个部分的另一个优点是可以使用过滤程序,对放置在打印缓冲区中的打印作业进行处理,这样可以完成转换格式、统计信息等很多功能,充分发挥了易管理的特点。

  这种BSD风格的打印系统是FreeBSD缺省提供的,为了支持多种打印机,以及支持对中文和图形的打印,还需要安装额外的软件包。包括ghostscript, psutils, apsfilter, gb2ps等,这些软件都通过Packages Collection进行安装。

  为了使用这个打印系统,就必须启动打印守护进程lpd,rc.conf中有一个选项lpd_enable就用于这个目的。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:30:45 | 显示全部楼层

FreeBSD连载(30):配置打印机

配置打印机

  本地打印机通常连接到计算机的并口上,因此在安装打印机之前,首先要查看并口的状态是否正常。正常情况下,缺省的硬件配置将能够自动侦测到计算机的并口,那么在启动时,系统将在控制台上显示下面的信息,如果由于滚屏太快而没有看到这一行的话,可以使用dmesg命令进行查看:

$ dmesg | grep lpt

nlpt0:  on ppbus 0

nlpt0: Interrupt-driven port

  在FreeBSD 3.0之前使用lpt作为打印机的驱动程序,这个老驱动程序对于现有具备多个模式的并口硬件支持能力不足。3.1之后系统的并口驱动程序更新了,使用了nlpt作为新的驱动程序名字,但设备文件的名字仍然为 /dev/lpt0。以后当老版本的驱动程序彻底从FreeBSD中消失之后,驱动程序名字会恢复为lpt。

  通常不需任何配置,并口就能正常工作。此时就可以通过设备文件/dev/lpt0来直接访问并口(0表示第一个并口,依次类推),如果并口和打印机的电缆连接也正常,就能测试打印机是否正常,此时需要root权限。

# lptest > /dev/lpt0

  如果对于普通行式打印机,这将打印出一页测试信息,但如果打印机是使用PostScript或其他页面描述语言,打印机并不一定进行打印,但打印机的状态指示灯将闪烁。如果打印机是PostScript打印机,可以使用下面命令来测试:

# lptest | a2ps -q -o - > /dev/lpt0

  这需要预先通过Packages Collection安装好a2ps软件,其中使用的-q参数表示不输出a2ps 的状态信息,-o -参数表示向标准输出输出转化后的PS数据,如果没有使用这个参数,则a2ps直接将PS数据发送给lpr命令,由于此时打印系统还未设置完毕,因此需要直接输出到打印机端口上以进行测试。

  当这个测试正常之后,就可以尝试使用lpr命令来打印文档了。当然此时打印系统的设置还没有完成,缺省的设置并不一定适合每个计算机。应该调整打印设置,使得打印系统适合本系统。

    * 打印机配置文件printcap

  当并口和打印机连接正确之后,可以进行下一步配置/etc/printcap文件了。在BSD打印系统中,使用这个printcap文件来定义打印机,包括命名打印机、将打印缓冲区和具体的打印机相联系等。下面的例子中配置了两个打印机,一个为本地的LaserJet 6P型打印机,另一个为远程FreeBSD计算机printersvr上的打印机。

lp|lj|ps|HP LaserJet 6P:\

     :lp=/dev/lpt0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:sh:mx#0:\

     :if=/usr/local/libexec/lpfilter:



rlp|remote printer:\

     :rm=printersvr:rp=lp:sd=/var/spool/output/lpd/printersvr:lf=/var/log/lpd-errs:

  从上面的例子可以看出printcap文件的格式:

  printcap中的每行描述由多个部分组成,每个部分用 “:” 分隔;由于对打印机的描述一行写不下,必须使用反斜杠 “\” 分隔,这是Unix和C语言的标准做法。为了避免出现配置错误等问题,不要在同一个描述部分的中间续行;

  每行中的第一个描述部分定义打印机的名字,通常可以用多个名字来称呼一个打印机,例如本例中第一个HP LaserJet 6P又有另外的名字lp、lj和ps,这些名字方便用户和不同的程序使用打印机。这些名字之间使用竖线 “|” 分隔,习惯上使用最后一个名字作为打印机的全名;

  每个打印机的各个定义部分定义了打印机的不同属性,定义方式就是上例中使用的方式,定义字符串使用 “=“ ,定义数值使用 “#” 。一个打印机应该具备下面的不同属性:

  lp(local printer)定义本地打印机使用的设备,通常为并口设备/dev/lpt0。

  rm(remote machine)定义远程计算机的名字,这在使用远程打印机时有用。

  rp(remote printer)的值应该为rm定义的远程计算机上的一个打印机名。远程打印机不需要l p来定义打印机端口,但需要使用rm和rp定义,以将打印文件发送到远程计算机上的正确打印机中。这个打印机名应该在远程计算机中/etc/printcap中进行了定义。如果没有使用rp定义而只使用了rm定义,则使用该计算机上的缺省打印机。

  sd(spool directory)定义这个打印机使用的缓冲区目录,这个目录一般放在/var/spo ol的下面,并拥有合适的权限设置,以使得打印系统能正确处理缓冲区。系统缺省使用/var/spool/lpd目录来放置要打印的文件,不同的打印机应使用这个目录下的不同子目录,习惯上这个目录名与前面定义的打印机名字相一致。

  lf(log file)定义与这个打印机相联系的日志文件,记录出现的错误信息,习惯上放在/var/lo g目录下。

  mx(maximum size)定义缓冲区中打印文件的最大尺寸,单位为千字节,缺省值为0,表示不限制打印文件的大小。

  if(input filter)定义一个输入打印过滤器,过滤器程序用于将用户打印作业的格式转变为打印机能够识别的格式。

  of(output filter)定义输出过滤器,这也是一个打印过滤器,习惯上使用if的多些,使用of 的少些。如果if和of都没有定义,打印系统则使用缺省的过滤器/usr/libexec/lpr/lpf。

  sh(suppress header),不打印标题页。

  mc(maximum coyies)定义最大的打印份数,缺省为0不限制打印份数。

  br(baud rate)定义串口波特率,只有在使用串口打印机时才有用。

  当将prinrcap文件设置正确之后,就能够使用打印命令lpr来打印文本文件了,由于没有设置打印中文或图形的过滤器,打印系统只能打印英文文件,它将处理过的文件直接发送到打印机上进行打印。

    * 在PostScript打印机上打印

  大多数打印机不但能打印字符,也能够打印图形,应用软件通过输出控制字符对打印机进行控制。这些控制字符就被称为打印机控制语言。为了将字符和图形文件输出到打印机上,就需要过滤器将打印文件转化为打印机识别的打印语言。

  打印过滤器是打印程序的一个重要部分,使Unix的打印系统更为灵活,从而能适合各种不同的打印机。除了将文档转换为打印机识别的语言之外,还可以对要打印的文件做其他处理,例如某些行式打印机需要文档同时使用回车和换行,而 Unix的文本文件只使用换行,此时直接打印文档就会造成行列不齐,这些情况下就需要一个过滤器进行转换。

  打印机控制语言可以分为两类,一种将操纵打印机进行绘图的命令及其他控制命令通过特殊字符(或特殊字符引导的命令)来表示,对普通字符文件不作处理,直接发送到打印机。此时普通英文字符文件可以直接发送到打印机上打印,但要打印包括图形在内的文件就是包括特殊控制字符的二进制文件,不能用文本方式进行查看。另一种为Postscript语言,它使用页面描述语言来描述要打印的内容,可以直接打印的文件就是一个符合一定语法规则的文本文件,因此对于一个Po stScript打印机来讲,一个普通文本文件只是一个不合乎语法的PostScript语言文件,不能被直接打印。

  因此如果要在仅支持PostScript的打印机上打印普通文档,也必须使用识别PostScript的过滤器进行转换,首先将普通文本文件转换为PostScript语言,再发送给PostScript打印机进行打印。Fr eeBSD的Packages Collection中专门有一个类别print,提供了很多打印相关的软件包,其中包括很多种将文本文件转换为PostScript文件的过滤器程序,如a2ps等。其中gb2ps能将GB编码的文本转换未内嵌中文的PostScript文件,从而能在PostScript打印机上将中文文件打印出来。

  因此首先应该安装这些转换软件包,当安装了这些转换程序之后,最简单的使用方式是先使用他们将文档转换为Po stscript文件,再发送给打印命令lpr,这可以通过管道来实现。一些打印工具内部就包括了使用管道,自动将生成的Postscript数据发送给lpr命令的指令,下面的a2ps指令就直接将PostScript文件发送给l pr命令。

  $ a2ps file

  或者可以在printcap文件中设置if参数,以自动使用这些过滤器,此时要设置过滤程序从标准输入上读入数据,将PostScript数据从标准输出上输出。

   :if=/usr/local/bin/a2ps -q -o -:

  对于要使用gb2ps来打印中文文件的情况,由于gb2ps使用参数读入源文件、并输出PostScript 中文文件,不使用标准输入输出,因此不能直接使用gb2ps作过滤器程序,而需要自己使用临时文件保存中间结果,生成 PostSript文件之后再打印。此外,gb2ps输出的PostScript文件都包括一页gb2ps的版权信息,对于打印来讲没有必要每次都打印这个版权页,可以使用psutils中包括的psselect程序,从原有文件中去除第一页,再进行打印。

  高级的过滤器程序应该能够识别各种不同格式的文档文件,并依据文档的格式,使用不同的过滤器功能来进行处理,最后生成符合打印机描述语言的打印文件。

    * PostScript与Ghostscript

  PostScript使用命令来描述页面,虽然也是文本文件,但这里都是绘图指令,需要一个PostScript 语言解释器对文件中描述的指令进行解释操作,才能得到正确的结果。因此PostScript文件在普通打印机上只能打印出源文件,同样普通文档在PostScript打印机上也不能正确解释、打印出来。下面是一个PostScript 文件的开始部分:

%!PS-Adobe-3.0

%%Creator: gb2ps

%%CreationDate: Fri Oct 31 18:36:45 1998

%%DocumentNeededResources: font Symbol

%%+ font Courier

%%+ font Times-Roman

%%DocumentSuppliedResources: file images/file.ps

%%Pages: 32

%%PageOrder: Ascend

%%Orientation: Portrait

%%EndComments

%%BeginProlog

  如果要查看PostScript的内容,则需要一个页面语言解释器。虽然存在不少商业PostScript解释器,但大部分并不见得比Ghostscript好,虽然GhostScript只是一个免费的PostScript 解释器。GhostScript能在X Window下正确显示PostScript文件的内容,并能实现各种强大的 PostScript处理能力。Ghostscript是一个相当复杂的程序,如果仅仅是要查看Postscript 文件的内容,可以使用命令 “gs psfile.ps” ,退出时在Ghostscript提示下输入 “quit ” 即可。

$ gs psfile.ps

Aladdin Ghostscript 5.50 (1998-9-16)

Copyright (C) 1998 Aladdin Enterprises, Menlo Park, CA.  All rights reserved.

This software comes with NO WARRANTY: see the file PUBLIC for details.

GS> quit

  另外,Ghostscript有一个前端程序Ghostview,能使用Ghostscript来浏览PostScript 文件,但使用了比较简单的图形操作方式。Ghostscirpt和Ghostview都可以通过Packages Collection 安装。

    * 在非PostScript打印机上打印

  通常非PostScript打印机使用特殊的ESC序列来表示命令,而对普通文本不做特殊处理,因此文本文件仍然被看作文本文件,能够直接打印文本文件,因此这些非PostScript的打印机能够直接设置为普通的文本打印机来使用。

  然而要想充分发挥打印机的能力,打印包括图形在内的文档,就必须有能理解这台非PostScirpt打印机使用的控制语言的过滤器。这些过滤器就相当于Windows下的打印机驱动,应该由生产这台打印机的厂商提供。但是很多低档打印机是专门为使用DOS或Windows的计算机生产的,没有为Unix配置过滤器,因此在这些打印机上打印图形就遇到了困难。幸运的是,Ghostscript能够识别很多种打印机,并能将PostScript文件在指定的设备上打印出来。

  因此在前面的操作中生成了Postscript文件之后,就可以使用Ghostscript在一台非Post Script打印机上打印PostScript文件,下面文件将在一台Laserjet4打印机上打印test.ps 文件。

# gs -sDEVICE=ljet4 -sOutput=/dev/lpt0  test.ps

使用gs -help能列出一系列Ghostscrit支持的设备文件,有些是打印机设备,有些是代表不同的图形格式的伪设备。

$ gs -help

Aladdin Ghostscript 5.50 (1998-9-16)

Copyright (C) 1998 Aladdin Enterprises, Menlo Park, CA.  All rights reserved.

Usage: gs [switches] [file1.ps file2.ps ...]

Most frequently used switches: (you can use # in place of =)

-dNOPAUSE           no pause after page   | -q       `quiet', fewer messages

-gx  page size in pixels   | -r  pixels/inch resolution

-sDEVICE=  select device         | -dBATCH  exit after last file

-sOutputFile= select output file: - for stdout, |command for pipe,

                                         embed %d or %ld for page #

Input formats: PostScript PostScriptLevel1 PostScriptLevel2 PDF

Available devices:

   appledmp iwhi iwlo iwlq hl7x0 bj10e bj200 bjc600 bjc800 lbp8 lips3 m8510

   uniprint la50 la70 la75 la75plus lj250 declj250 ln03 ap3250 epson eps9mid

   eps9high lp8000 lq850 epsonc st800 stcolor lp2563 dnj650c deskjet djet500

   cdeskjet djet500c cdjcolor cdjmono cdj500 cdj550 cdj670 cdj850 cdj890

   cdj1600 laserjet ljetplus ljet2p ljet3 ljet3d ljet4 lj4dith cljet5

   lj5mono lj5gray pj pjetxl pjxl paintjet pjxl300 pxlmono bbox pxlcolor

   ibmpro jetp3852 imagen cp50 necp6 oce9050 oki182 okiibm r4081 sj48 xes

   bmpmono bmp16 bmp256 bmp16m ccr cgmmono cgm8 cgm24 sxlcrt dfaxhigh

   dfaxlow faxg3 faxg32d faxg4 bit bitrgb bitcmyk cif miff24 inferno jpeg

   jpeggray mgrmono mgrgray2 mgrgray4 mgrgray8 mgr4 mgr8 pcxmono pcxgray

   pcx16 pcx256 pcx24b pcxcmyk pdfwrite plan9bm pbm pbmraw pgm pgmraw pgnm

   pgnmraw pnm pnmraw ppm ppmraw pkm pkmraw pngmono pnggray png16 png256

   png16m psmono psgray psrgb pswrite epswrite sgirgb t4693d2 t4693d4

   t4693d8 tek4696 tiffcrle tiffg3 tiffg32d tiffg4 tiff12nc tiff24nc tifflzw

   tiffpack x11 x11alpha x11cmyk x11cmyk2 x11cmyk4 x11cmyk8 x11gray2

   x11gray4 x11mono nullpage

Search path:

   . : /usr/local/share/ghostscript/5.50 :

   /usr/local/share/ghostscript/fonts

For more information, see /usr/local/share/ghostscript/5.50/doc/Use.htm.

Report bugs to ghost@aladdin.com, using the form in Bug-form.htm.

  从这些简单的名字中很难判断那个设备对应于自己的打印机型号,为了找出正确的设备文件名,需要阅读Ghost script的文档device.txt,或者选择相近的设备名并反复尝试。如果万一找不到自己的文件名,也许要升级 Ghostscript的版本,或者更新自己Ghostscript的设备驱动之后再重新安装Ghostscript 。

  当能够使用Ghostscript打印文档之后,就需要将它和FreeBSD的打印过滤器集成在一起了,因此首先要将打印的文档转换为PS文档,然后将PS文档转换为打印机支持的格式,因此就需要更改过滤程序。例如在一个EP SON行式打印机上输出文档,使用的标准过滤应该是,最后两个短横线表示标准输出和标准输入:

#! /bin/sh

a2ps -q -o - | \

gs -sDevice=epson -sOutfile=- -

# 使用apsfilter配置打印机

设置打印机要手工编辑/etc/printcap文件,安装并配置各种过滤器,安装Ghostscript等。这些操作都非常烦琐,幸好FreeBSD通过Ports Collection提供了一种自动配置打印机的apsfilter程序。

Ports Collection的机制、用法将在后面讨论。

为了使用apsfilter设置打印机并配置过滤器,就需要执行下列命令:

# cd /usr/ports/print/apsfilter/

# make install

  然后,系统将自动下载、编译安装必要的过滤器软件,此后将自动启动一个设置程序,通过菜单提示让用户选择打印机的各种属性,包括打印机的类型、端口、分辨率、纸张大小等等。最后将自动生成合适的printcap文件和各种过滤器。这些过滤器能分辨要打印文件的类型,进行正确的处理。

  apsfilter生成的过滤器是调用包括ghostscript在内的大量其他软件,因此上面的make过程就需要从网络上下载必要软件包,可以通过预先安装相应的Packages以减少下载任务。如果网络太慢,下载过程可能会出现问题导致软件安装问题,后面会讲到如何为Ports Collection手工下载必要的软件包。

    * 使用和控制打印机

  当一切都配置正确之后,使用打印机就非常简单了。为了自动启动lpd守护进程,需要将/etc/rc.con f文件中的lpd_enable项设置为lpd_enable=”Yes”,FreeBSD在下次系统启动时会自动启动lpd。当lpd没有启动时,也不需要重起计算机,简单使用root身份执行lpd就可以启动这个守护进程。有了l pd守护进程,打印系统就能正常进行打印工作,并能针对整个网络上的用户,提供打印服务了。

  使用者可以直接使用lpr命令打印文件,或者通过管道来使用lpr命令。

$ lpr hello.c

$ ls | lpr

  如果系统中某个打印机没有配置打印过滤器,用户可以直接使用自己的打印过滤器,通过管道将输出送到lpr中。这提供了一种较灵活的配置方式,使得用户不需要root权限,也能使用合适的打印机过滤器。下面是一个使用gs打印文件的例子:

$ gs -dNOPAUSE -q -sljet4 -sOutputFile=\|lpr -- tt.ps

  注意这个例子中使用反斜线取消竖线的特殊含义,将其和紧随其后的lpr一起作为参数发送给gs,gs再将其解释为管道操作。可以将上面的文件编制成shell程序,这样每次就能更方便的使用。

  当使用lpr将打印作业放入打印缓冲区之后,就能使用lpq命令来查看打印队列的内容:

$ lpq

waiting for lp to become ready (offline ?)

Rank   Owner   Job  Files                 Total Size

1st    user    1    hello.c                151 bytes

2nd    user    2    (standard input)      3359 bytes

3nd    user    3    (standard input)     43765 bytes

  在这个例子中,由于打印机lp没有被正常连接到系统上,因此lpq在第一行提醒使用者当前打印机不正常。由于这台打印机工作不正常,因此用户可能不想使用这个打印机进行打印了,而想通过其他打印机进行打印。为了避免在这台打印机正常之后,仍然打印这个作业,需要将这个打印作业删去。这可以通过命令lprm加上作业序号(显示在lpq中第三列)来完成:

$ lprm 1

dfA001freebsd.domain dequeued

cfA001freebsd.domain dequeued

  或者使用all作参数,这将删除该用户的所有打印作业。用户只能删除自己的打印作业,只有root才能删除其他用户的作业。如果root使用all参数,那么将会将这个打印机缓冲区中的所有打印作业全部清空。

  作为系统管理员,需要进一步的能力来管理打印守护程序。BSD风格的打印系统使用lpc来执行这个功能,以 root身份启动lpc,则进入lpc的交互模式,然后使用help命令可以得到管理命令的列表。一般可以使用start all 命令来启动所有的打印机,或者使用stop lp命令来停止一台名为lp的打印机。

# lpc

lpc > start all

  也可以用命令行的方式使用lpc,例如重新启动所有的打印机,使用带参数的lpc发出以下命令:

# lpc restart all

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:31:40 | 显示全部楼层

FreeBSD连载(31):系统日志

系统日志与备份

  由于FreeBSD是一个多用户系统,那么就需要管理员进行日常维护,特别是用做网络服务器的系统,一旦因为缺乏维护而造成停机故障,就会造成很大损失。即使对于单用户的FreeBSD系统,同样也要执行这些不可缺乏的维护任务,只是由于系统归个人使用,那么对维护的要求就不必那么高,维护任务就轻松一些。

    *
      系统日志

  系统的日志记录提供了对系统活动的详细审计,这些日志用于评估、审查系统的运行环境和各种操作。对于一般情况,日志记录包括记录用户登录时间、登录地点、进行什么操作等内容,如果使用得当,日志记录能向系统管理员提供有关危害安全的侵害或入侵试图等非常有用的信息。

  BSD提供了详细的各种日志记录,以及有关日志的大量工具和实用程序。这些审计记录通常由程序自动产生,是缺省设置的一部分,能够帮助Unix管理员来寻找系统中存在的问题,对系统维护十分有用。还有另一些日志记录,需要管理员进行设置才能生效。大部分日志记录文件被保存在/var/log目录中,在这个目录中除了保存系统生成日志之外,还包括一些应用软件的日志文件。当然/var目录下的其他子目录中也会记录下一些其他种类的日志记录文件,这依赖于具体的应用程序的设置。

$ ls /var/log

adduser            maillog.5.gz     sendmail.st.1

dmesg.today        maillog.6.gz     sendmail.st.10

dmesg.yesterday    maillog.7.gz     sendmail.st.2

httpd-access.log   messages         sendmail.st.3

httpd-error.log    messages.0.gz    sendmail.st.4

kerberos.log       messages.1.gz    sendmail.st.5

lastlog            messages.2.gz    sendmail.st.6

lpd-errs           messages.3.gz    sendmail.st.7

maillog            messages.4.gz    sendmail.st.8

maillog.0.gz       messages.5.gz    sendmail.st.9

maillog.1.gz       news             setuid.today

maillog.2.gz       ppp.log          setuid.yesterday

maillog.3.gz       sendmail.st      userlog

maillog.4.gz       sendmail.st.0    wtmp

    * 系统登录日志

  系统会保存每个用户的登录记录,这些信息包括这个用户的名字、登录起始结束时间以及从何处登录入系统的等等。它们被保存到/var/log/lastlog、/var/log/wtmp和/var/run/utmp文件中,这三个文件以二进制格式保存了这些用户的登录数据。

  其中/var/run/utmp文件中保存的是当前系统用户的登录记录,因此这个文件会随着用户进入和离开系统而不断变化,而它也不会为用户保留很长的记录,只保留当时联机的用户记录。系统中需要查询当前用户状态的程序,如 who、w等就需要访问这个文件。utmp可能不包括所有精确的信息,某些突发错误会终止用户登录会话,当没有及时更新 utmp记录,因此utmp的记录不是百分之百的可以信赖的。

  而/var/log/wtmp保存了所有的登录、退出信息,以及系统的启动、停机记录,因此随着系统正常运行时间的增加,它的大小也会越来越大,增加的速度依赖于系统用户登录次数。因此可以利用这个日志用来查看用户的登录记录,last命令就通过访问这个文件来获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端 tty或时间显示相应的记录。ac命令同样也使用wtmp中的数据产生报告,但它的显示方式不同。它可以根据用户(ac -p),或按日期(ap -d)显示信息,这样管理员就能获得一些非常有用的反常信息,如一个平时不太活跃的用户突然登录并连接很长时间,就有理由怀疑这个帐户被窃取了。

  注意:X Window由于会同时打开多个终端窗口,因此会使得用户登录连接时间迅速增加。

  lastlog文件保存的是每个用户的最后一次登录信息,包括登录时间和地点,这个文件一般只有login程序使用,通过用户的UID,来在lastlog文件中查找相应记录,然后报告其最后一次登录时间和终端tty。然后, login程序就使用新的记录更新这个文件。

  这三个文件是使用二进制格式保存的,因此不能直接查看其中的内容,而需要使用相关命令。当然也可以通过程序来访问这三个文件,这就需要了解它们使用的数据结构。其中utmp和wtmp使用同样的数据结构,而lastlog使用另外一个数据结构,可使用man来进行查询具体结构。如果系统的用户数量很多,那么wtmp文件的大小会迅速增加,在系统/var文件系统空间紧张的情况下,就导致这个文件系统被占满。系统不会主动控制这个文件的大小,因此这需要管理员的干预,需要手工及时清除,或编写shell脚本定期保存和清除。

  系统还可以提供记账统计的功能,要打开系统的计账功能,需要使用accton命令,注意,accton必须跟随记账日志文件的名字作参数,而不带参数的accton将关闭记账进程。

  当打开了记账功能后,可以使用lastcomm来检查在系统中执行的所有命令的信息,包括执行的命令、执行命令的用户、用户使用的终端tty,命令完成的时间,执行时间等。从lastcomm的输出也能帮助管理员检查可能的入侵行为。

  此外可以使用ac命令来查询用户的连接时间的报告,sa命令来查询用户消耗的处理器时间的报告。

    * Syslog日志记录

  最初,syslog只是为了sendmail而设计的消息日志工具,由于它提供了一个中心控制点,使得sys log非常好用和易配置,因此当今很多程序都使用syslog来发送它们的记录信息。syslog是一种强大的日志记录方式,不但可以将日志保存在本地文件中,还可以根据设置将syslog记录发送到网络上的另一台主机中。

  支持syslog方式的系统启动了syslogd守护进程,这个程序从本地的Unix套接字和监听在514端口(UDP)上的Internet套接字,来获得syslog的记录。本机中进程使用syslog系统调用发送来sy slog记录,然后由syslogd将他们保存到正确的文件或发送到网络上另一台运行syslogd主机中去。

  syslogd的设置文件为/etc/syslog.conf,定义消息对应的相应目标,一条消息可以达到多个目标,也可能被忽略。

#       $Id: syslog.conf,v 1.9 1998/10/14 21:59:55 nate Exp $

#

#       Spaces are NOT valid field separators in this file.

#       Consult the syslog.conf(5) manpage.

*.err;kern.debug;auth.notice;mail.crit          /dev/console

*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages

mail.info                                       /var/log/maillog

lpr.info                                        /var/log/lpd-errs

cron.*                                          /var/cron/log

*.err                                           root

*.notice;news.err                               root

*.alert                                         root

*.emerg                                         *

!ppp

*.*                                             /var/log/ppp.log

  syslog.conf的配置可以分为两个部分,第一部分用于区分消息的类型,另一个用于设置消息发送的目的地。通常,消息的类型包括消息的产生者,例如kern表示内核产生的消息,auth表示认证系统产生的消息,等等,还包括消息的级别,例如emerg表示非常重要的紧急信息,alert表示系统告警状态,crit表示关键状态,err 表示一般的错误信息,warning表示警告信息,notice表示提示信息,但还不是错误,info表示一般信息, debug表示调试信息等,因此一个消息的类型可能为:kern.debug、mail.info等,但页可以使用通配符*进行匹配。

  从上面的syslog.conf的设置可以看出,系统正常运行中的很多重要的信息,如错误信息*.err、内核调试信息kern.debuf、认证报告auth.notice等被直接输出的console中,另外还有一些比较重要的信息被输出到/var/log/messages文件中,发送邮件的记录将被保存在/var/log/mail log文件中,打印记录为/var/log/lpd-errs等,使得管理员可以根据这些文件来查询相关记录,进行统计或寻找系统问题。其中使用syslog记录的messages文件中包括root登录的信息、用户多次登录失败的尝试等对系统安全相当重要的信息,因此也是系统遭受攻击之后,攻击者会根据syslog.conf中设置试图清除相关文件中自己的登录记录。因此对于安全性要求更高的系统,可以尝试将syslog发送到另一台计算机上,或者输出到一些设备文件中,如在打印机上立即打印输出。

  系统会使用newsyslog定期检查syslog输出的messages文件和maillog文件,将旧数据压缩保存为备份文件,如messages.1.gz等。

    * 其他日志

  除了系统登录记录和syslog记录之外,其他还有一些应用程序使用自己的记录方式。

  系统每天都会自动检查系统的安全设置,包括对SetUID、SetGID的执行文件的检查,其结果将输出到/ var/log/security.today文件中,管理员可以与/var/log/security.yeste rday文件对比,寻找系统安全设置的变化。

  如果系统使用sendmail,那么sendmail.st文件中以二进制形式保存了sendmail的统计信息。

  在系统启动的时候,就将内核的检测信息输出到屏幕上,这些信息可以帮助用户分析系统中的硬件状态。一般使用d mesg命令来查看最后一次启动时输出的这个检测信息。这个信息也被系统保存在/var/log/dmesg.tod ay文件中,系统中同时也存在另一个文件dmesg.yesterday,是上次的启动检测信息,对比这两个文件,就可以了解到系统硬件和内核配置的变化。

  lpd-errs记录了系统中lpd产生的错误信息。

  此外,各种shell还会记录用户使用的命令历史,它使用用户主目录下的文件来记录这些命令历史,通常这个文件的名字为.history(csh),或.bash-history等。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:32:57 | 显示全部楼层

FreeBSD连载(32):系统备份

系统备份

  不管系统是多么可靠,总会发生一些意想不到的事情,致使系统数据丢失。例如硬件故障或人为操作失误等。因此使用备份来保护数据不丢失是一种非常重要的手段,尤其在系统数据非常重要的时候。经常进行数据备份能够减少偶然破坏造成的损失,保证系统能够从错误中恢复正常运行。

    * 备份策略

  在进行备份之前,首先要选择使用的备份策略,这将决定何时需要进行备份,以及出现故障时进行恢复的方式。通常使用的备份方式有三种:

  完全备份:每隔一定时间就对系统进行一次全面的备份,这样在备份间隔期间出现数据丢失等问题,可以使用上一次的备份数据恢复到前次备份时情况。这是最基本的备份方式,但是每次都需要备份所有的数据,并且每次备份的工作量也很大大,需要太多的备份介质,因此这种备份不能进行的太频繁,只能每隔一段较长时间才进行一次完整的备份,例如以一个月为一个备份周期。但是这样一旦发生数据丢失,只能恢复到上次备份的数据,这个月内更新的数据就有可能丢失。

  增量备份:首先进行一次完全备份,然后每隔一个较短时间进行一次备份,但仅仅备份在这个期间更改的内容。当经过一个较长的时间后再重新进行一次完全备份,开始前面的循环过程。由于只有每个备份周期的第一次进行完全备份,其他只进行改变的文件的备份,因此工作量小,就能够进行更频繁的备份。例如以一个月为一个周期,一个月进行一次完全备份,每天晚上0点进行这一天改变的数据备份。这样一旦发生数据丢失,首先恢复前一个完全备份,然后按日期一个一个恢复每天的备份,就能恢复到前一天的情况。这种备份方法比较经济。

  更新备份:这种备份方法与增量备份相似,首先每月进行一次完全备份,然后每天进行一次更新数据的备份。但不同在于,增量备份是备份该天更改的数据,而更新备份是备份从上次进行完全备份后更改的全部数据文件。一旦发生数据丢失,可以使用前一个完全备份恢复到前一个月的状态,再使用前一个更新备份恢复到前一天的情况。这样做的缺点是每次作小备份工作的任务比增量备份的工作量要大,但好处在于,增量备份每天都有备份,因此要保存数据备份数量太多,而更新备份则不然,只需保存一个完全备份和一个更新备份就可以恢复故障以前的状态。另外在进行恢复工作时,增量备份要顺序进行多次备份的恢复,而更新备份只需两次恢复,因此它的恢复工作相对简单。

  增量备份和更新备份都能以比较经济的方式对系统进行完全备份,在这些不同的策略之间进行选择不但与系统数据更新的方式相关,也依赖于管理员的习惯。通常在系统数据更新不是太频繁的话,可以选用更新备份的方式。但是如果系统数据更新太快,使每个备份周期后面几次更新备份的数据量已经相当大,这样使用更新备份已经不太经济了。这时候可以考虑增量备份或混用更新备份和增量备份的方式,或者缩短备份周期。

    * 操作磁带设备

  FreeBSD下SCSI接口的磁带设备文件名为/dev/rsa0或/dev/nrsa0,其中n代表非回卷类型,每次在nrsa0上存储数据之后磁带没有回卷,这样就能在磁带中保存多次备份。而rsa0设备在每次保存数据并关闭磁带时会回卷,这样只能存储一次备份。由于磁带容量大,一次不会用完一个磁带的容量,因此一般使用nrsa0设备,以进行多次备份。

  3.1-release之前使用老SCSI驱动程序的磁带设备为st,对应的设备文件就为rst0和nrst 0,而非SCSI的磁带设备有rwt0,rft0,分别为IDE和软盘控制器接口的磁带设备。

  n表示非回卷模式,r代表raw方式,代表字符设备。而sa为磁带设备的驱动程序名。0表示设备序号,如果有多个磁带,下一个设备将为rsa1。

  一般使用/dev/nrsa0作为备份设备,因为这个设备是非回卷的,那么每次备份之后磁带仍然停留在最后移动的位置上,这样就可以在下次备份时接续往磁带中写入,使用一个磁带进行多次备份。但是如果读取具体的备份,必须使磁带卷到具体备份的起始位置才行。需要回卷磁带要使用mt命令来完成。

  # mt /dev/nrsa0 rewind

  回卷磁带到最开始地方;

  # mt /dev/nrsa0 reten

  先向前卷到尾部再回卷磁带,保持磁带前后松紧一致;

  # mt /dev/nrsa0 fsf 1

  跳到下一个备份文件,使用2将跳到下面第二个文件;因此要定位一个磁带上第4次备份的文件,可以使用rete n回卷磁带,再使用fsf 4跳到第4个备份。

  每次使用mt均需使用mt来确定磁带的位置,一般的应用程序并不能自动确定文件的开头,而在磁带上每两个备份文件当中必然有一段无用的数据,如果再读完一个备份之后立即去读取下一个备份文件,就不能识别这些备份文件之间的无用信息,必然导致报告错误。

    * 使用tar进行备份

  选定了备份方式之后,可以使用tar、cpio、dump等备份工具软件将数据备份到磁带上。对于一般的备份,使用tar就足够了。tar的参数有:

  参数c是创建备份(Create)

  参数v表示回显模式(Verbose),将产生一系列所备份的文件列表

  参数f指定使用的备份文件,它后面的参数为输出的备份文件名

  参数x是展开备份文件

  参数t是显示备份文件的内容

  参数T后面跟随一个文件参数,指定从这个文件中读取要备份的各个文件的路径

  参数z是使用压缩方式创建和解开备份文件,这是GNU的新版tar的功能,需要同时安装gzip

  如果不使用T参数,那么就需要一个参数,指明进行备份文件和目录的路径

  这些选项参数可以使用Unix下的标准参数符号 “-” 进行引导,如 “-c” 、 “-f” 等,大部分参数都是单独使用的参数,而有些如 “-f” 、 “-T” ,其后面还要跟随一个文件名作参数。因此可以将单独的参数写在一起,如 “-cv” 就等同于 “-c -v” ,也可以与一个需要参数的选项写在一起,如 “-cvf f ilenam” 就等同于 “-c -v -f filename” 。如果不使用 “-” 引导参数,tar也能识别这些命令选项。如 “tar tvf filename” 就等同于 “tar -cvf filename” 。 tar能够创建备份文档,能够备份到磁带上或者产生一个文件,如:

  # tar cf root.tar /root

  将/root目录下的所有文档备份到root.tar文件中,root.tar指定输出的备份文件,/roo t指出要做备份的目录。如果要备份到磁带上,将输出的备份文件指定为磁带设备文件即可:

  # tar cf /dev/nrsa0 /root

  如果设置了环境变量TAPE,则可以不使用参数f指定输出磁带设备名字。

  # TAPE=/dev/nrsa0; export TAPE

  # tar c /root

  从备份文档中解出所有文件或某个文件,只需要使用x选项替换前面的c选项,例如从磁带中解出hello.c文件:

  tar xv hello.c

  列出tar备份文档中的内容,可以使用t选项,tar tv将列出磁带上的所有文件内容,而tar tf r oot.tar将root.tar文件上的内容列出。

  tar本身不支持文件压缩,因此创建的文件要比较大。但tar可以和GNU的压缩软件gzip合作,直接生成压缩文件,所需要的是在参数中增加z选项。压缩的备份文件和普通tar备份是不同的,因此凡是压缩的备份操作,均需使用z参数。如:

  # tar czvf root.tar.gz /root

  # tar xzvf root.tar.gz hello.c

  # tar tzvf root.tar.gz

  要进行增量备份和更新备份,必须找出那些文件在这个期间进行更新。这个任务可以由程序find来完成,例如查找过去七天更改的文件,并使用tar的-T参数制定进行备份的文件,进行备份:

  # find / -mtime -7 -print > /tmp/filelist

  # tar -c -T /tmp/filelist -f /dev/nrsa0

  由于要使用find来找出需要备份的文件列表,那么就需要使用文件的修改时间进行查询,需要使用-mtime 参数。另一个更有用的参数是-newer,可以查找出所有比某个文件更新的文件,由于备份是周期进行的,因此可以在完全备份之后生成一个标记文件,那么所有比这个文件新的文件都需要进行更新备份。

  # find / -newer full_back_tag_file -print > /tmp /filelist

  进行备份需要定期执行,不能完全依赖于管理员手工进行备份。备份也应该选择在系统比较空闲时进行,以免影响系统的正常处理任务。通常可以选择半夜0:00点之后进行备份,这样更不能将这个任务由管理员手工完成了。Unix提供了定时服务cron,能够在确定的时间中执行一系列任务,因此备份必须和cron合作来完成,或者使用/etc下的d aily,weekly,monthly文件定时操作。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:33:43 | 显示全部楼层

FreeBSD连载(33):DOD参考模型

第4章 网络配置与使用

  60年代末,美国国防部(DOD)对建立分组交换的广域网很感兴趣,其基本想法是通过连接多个地域的分散网络,那么局部地区的网络故障不影响其他部分网络的正常运行。主要是由于当时正处于冷战的形势下,他们要求建立能够在部分地区被袭击的情况下,仍正常运行的军事网络。

  研究机构ARPA开始了这个称为ARPAnet的网络项目的研究,由于这个项目要求在不同的计算机之间进行通信,而不同的计算机上会运行不同的操作系统,因此就存在不同系统之间如何按照同样的规则进行交流的问题。因此最重要的问题就是开发所有的系统都遵守的标准协议,让它来实现应用程序对应用程序的通信,并独立于具体的计算机平台。因此,他们开发了独立于特定计算机系统的标准协议,以实现各种计算机之间的通信。

  由于存在多种应用程序,因此协议也并非一个,而是一组协议。而TCP协议和IP协议就是他们开发的这些协议中最重要的两个,因此通常就以TCP/IP来称呼整个协议族,称为TCP/IP协议,这正是当前流行的Internet 使用的协议标准。

  TCP/IP的成功与BSD Unix分不开的,由于TCP/IP是平台独立的,而当时大学的研究机构主要使用BSD Unix,因而加州大学伯克利分校最先在BSD Unix中实现了TCP/IP。于是这一技术很快推广到使用BSD Unix的大学中,TCP/IP得到迅速推广,越来越多的网络使用这个协议,越来越多的网络也通过这个协议进行了互联,逐渐形成了今天的Internet。

    *
      DOD参考模型

  参考模型是关于计算机之间如何进行通信的一种形象化表示方式,它将进行通信所需要的每一步骤按照层次的概念组织起来。如果一个步骤处理的事情是负责物理线路的具体传输,就认为属于模型中的低层,反过来,如果一个步骤是与具体的应用程序打交道,就认为属于模型中的高层,在高层和低层之间按照逻辑关系,还有一些中间层次。

  将通信过程划分为不同层次的原因是因为通信过程是一个复杂的过程,对于用户来讲,能使用WWW浏览信息,能发送电子邮件就能满足需要,他们只关心这些应用程序,而不关心具体的通信过程;另外一些软件驻留在后台处理通信过程中必要的任务,如建立连接,发送数据等,而不关心数据是如何发送出去的;还有一些硬件专门用来负载信号的传递;这样不同的软硬件有着层次分明的调用关系,自然就形成了层次的概念,而参考模型正是对这些层次进行区分和定义。

  在参考模型中,数据的物理传送是由应用程序──属于模型的最高层,向低层传送,直至具体传输数据的传输协议层,由这个层将数据通过物理介质──如电缆、光缆、微波等传送到目的计算机。当数据到达目的计算机时,它沿模型向上传递,最终到达目的计算机中的应用程序。这个过程就是传送数据的物理过程。

  可以使用一个简单例子来解释这个通信过程。例如朋友之间互相传递信函是另一种较容易理解的通信过程,这个过程中有寄信者、收信者、邮递员、邮车等等。由寄信者将信交给邮递员,邮递员处理信件之后将信通过邮车发到对方的城市,对方城市的邮递员再将信交给收信者。这样就可以将这个过程按层次划分,寄信者和收信者可以看作一个层次,他们使用邮政服务,可以看成应用层;所有层次的邮政员工是一个层次,进行具体的处理通信工作,可以称为通信层;而邮车可以看成另一个层次,处理具体发送邮件工作,称为传输层;这只是一个简单例子,具体网络通信过程则要复杂的多。

  从上图可以看出,虽然物理数据的传送是先从上到下,再从下到上回到另一台计算机的应用程序中,如果不考虑低层是如何进行具体处理的,就可以将通信看成在每一层与另一个计算机中的相应层之间进行的。这样在每层与另一台计算机相应层之间就存在逻辑上的连接通信和传递数据的能力。如果还使用前面的寄信的例子来说明的话,就是寄信者只考虑收信者,收信者也只考虑寄信者,而不管邮递员是如何处理信件的,在逻辑上就是朋友之间的通信关系。

  这样用逻辑通信的方式将数据传送归结到各层中的协议上,每一个协议只定义了完成通信的一个任务,成功的完成整个通信过程要求多个协议协同进行,这些协议将分属参考模型的不同层次,而且每个协议只与对方相应的协议通信,而不需考虑整个通信过程,这样复杂的通信过程就得到了简化,从而能更容易实现。

  按照对网络的不同理解,可以有不同的参考模型,将通信分为不同的层次结构,其中影响最大的就是国际标准化组织开发的OSI标准七层模型和TCP/IP中使用DOD四层模型。

  DOD模型的四层分别为:

          o 应用层(Application)

          o 主机到主机层(Host to Host)

          o 网络互连层(Internet)

          o 网络访问层(Network Access)

    * 网络访问层

  TCP/IP并没有定义任何网络访问层的协议,这个层的协议大部分是由其他通信组织定义的,这反而使TCP/IP 能适合几乎全部硬件平台。网络访问层和硬件相关,负责基本的通信,这一层最常见硬件的是以太网和使用普通电话线的拨号连接。对于以太网,这一层定义了介质访问控制地址(MAC地址),用于标识不同的计算机。有了网络访问层,计算机之间就有了物理连接,计算机之间就为相互交换数据提供了条件。

  在FreeBSD下,网络硬件是以网络界面(Interface)的形式存在的,如果计算机的网卡被正确探测到的话,则就有一个相应的网络界面。例如第一个3C905网卡的网络界面是xl0,第一个Ne2000兼容网卡网络界面是ed0,使用内核级PPP驱动的ppp网络界面为ppp0等。这些网络界面都对应于内核中的硬件驱动程序,只有在硬件被检测到之后,这些网络界面才能被正常使用。除此之外,还有一个本地环路网络界面lo0,这使得即使没有任何网络界面的硬件存在,也能使用FreeBSD运行网络程序为本机提供网络服务。

    * 网际层(Internet层)

  Internet层负责确定一台计算机能在网络上的位置,并找出通向它的路径,然后才能够相互交换数据。这种路径选择功能既复杂又重要,因此实现这个功能的IP协议是整个TCP/IP协议组中的最基本协议。

    * IP地址

  IP协议给每个计算机都分配了一个唯一的IP地址,这个地址是一个分为四部分的32位长的数,每个部分为8位,使用点将其分开,例如192.168.1.64,这样IP地址就表示的比较清晰;每个IP地址被划分为两个部分,一个为网络地址(Network Address),用于表示计算机所在的子网络,一个为节点地址(Node Addr ess),用于标识计算机在子网络中的位置;网络地址和节点地址通过网络掩码(netmask)进行区分,对应网络掩码二进制位为一的IP地址部分为网络部分,其他的为节点部分。

  例如网络掩码255.255.255.0(16进制形式为0xffffff00)将192.168.1.64 的网络部分分为192.168.1和64两部分,因此其网络地址为192.168.1.0,节点部分为0.0.0.6 4。这个IP地址在FreeBSD下可以写作192.168.1.64/255.255.255.0或者192.16 8.1.64/24,后面一种形式和前一个是等价的,表示子网掩码的二进制位中前面为1的位共有24位,即255.2 55.255.0。

  同一个网络中的网络地址应该相同,但节点地址应该不同,因而子网掩码可以决定这个网络中可以拥有的TCP/I P主机的数量,即节点地址的范围减2,其中节点地址二进制位全为0的地址为网络地址,表示这个网络本身,而节点地址二进制位全为0的地址为广播地址,用于在网络中发送广播包。

  在IP协议中,为了便于管理,为不同种类的IP地址定义了缺省的网络掩码,而定义的具备不同网络掩码的IP地址就组成不同的网络类别。

  A类网络:1.0.0.0到127.0.0.0,缺省网络掩码为255.0.0.0,每个网络可以容纳16, 777,214台计算机;

  B类网络:128.0.0.0到191.0.0.0,缺省网络掩码为255.255.0.0,每个网络可以容纳65,534台计算机;

  C类网络:192.0.0.0到223.0.0.0,缺省网络掩码为255.255.255.0,每个网络只能容纳254台计算机;

  其他的IP地址属于D、E、F类地址,被IP协议保留用在了mutlicast等其他方面。

  这样划分的目的是为了让IP地址可以同时满足要求不同IP地址数量的大型网络和小型网络的需要。然而随着In ternet的发展,IP地址开始变得紧张起来,当前已经提出了IPv6标准,以扩展IP地址的范围,解决地址紧张的问题。当前绝大多数网络还没有支持IPv6,因此完全转向IPv6还是一个漫长的过程,这也是FreeBSD不将比较成熟的FreeBSD IPv6计划──KAME,包括入FreeBSD发行版本的原因之一。当前主要使用另一种IP 地址转换技术(NAT, Network Address Translete)来解决IP地址紧张的问题。

    * 路由

  有了IP地址,计算机就能确定在它在网络上的位置。当一台计算机要和另外计算机通信时,它首先必须知道对方的 IP地址,如果该IP的网络地址和它相同,两台计算机就处在同一个子网上,能通过网络访问层进行通信。直接通过IP地址请求获得对方的MAC地址,以通过网络访问层进行通信,这需要通过另一个协议──ARP协议,从IP地址获得对方的 MAC地址。

  如果两台计算机不在同一个网络内,就需要一些特殊的计算机──路由器的帮助,才能将IP数据包发送到对方计算机上。当两台计算机不在同一个网络内时,计算机将查看自己的路由表,找出通往对方的合适路由器的IP地址,将IP数据包发送给这台路由器,由各级路由器负责将IP包发送到目的地。因此一台计算机要想和子网外的计算机通信,至少要知道一台路由器,由这台路由器负责将数据发送到子网外,通常称这台路由器为缺省网关(default Gateway)。

  那么,路由器就必须了解到通往其他子网的通路,这些路径可以通过route命令由管理员手工加进去,也可以通过路由器之间相互交换数据,使路由器学习到更多的路由信息。路由器之间交换路由数据的协议主要有RIP、OSPF、B GP等协议。FreeBSD也能很好的支持这些路由交换功能,因此FreeBSD也是用做软件路由器的最佳选择。

    * DNS与名字解析

  通常IP地址不易记忆,实际使用中是通过使用主机名来标记一台计算机,而主机名可以自动转换为IP地址,再进行实际的连接。主机名与IP地址的对应关系可以配置在主机名配置文件/etc/hosts中,但在网络上更普遍的是通过DNS协议,将对应关系保存在网络上多台名字服务器(DNS server)中,这样就能通过名字服务器来维护自己组织机构的名字解析数据。

  由于网络上不同的计算机属于不同的网络和组织机构,因此计算机的名字可以分为区分组织的域名(Domain Name)和在组织内区分计算机的主机名,形成一种多级的结构。例如一台计算机的名字为wb.example.com .cn,其中wb为主机名,example.com.cn为域名,其中example代表工作的单位,com是类别代码,代表这个单位是公司机构,cn是国别代码,代表这个机构位于中国。

    * 主机-主机层

  这一层负责维护不同计算机上的两个进程的通信,它的主要作用就是将应用程序与网络的复杂性相隔离,应用层只需发出请求,而不必顾及任务是如何完成的。这一层包括两个协议:传输控制协议TCP和数据报协议UDP。

  TCP协议是一种面向连接、有分组顺序控制和差错控制的安全准确的协议,因此必须在网络上传送额外的维护信息,网络开销大,但也是最常用的网络协议。TCP协议在不同机器之间建立了虚拟连接,它使用一个16位的端口地址(po rt number)来区分不同连接。应用程序必须使用一个或几个端口地址用来提供网络服务,因此对于常用的网络服务,其使用的端口地址就是固定的。FreeBSD下在/etc/services就定义了一些常用的端口地址。

  UDP协议不建立连接,因此也不保证数据正确完整,相对来讲网络开销小,然而对于不可靠的网络连接,数据完整性无法保证。UDP也使用端口地址发送和接受属于不同应用程序的数据。

    * 应用层

  应用层就是为了让应用程序在不同的计算机上运行并相互通信而实现的多种协议,每种协议都对应一类应用程序。并且随着Internet上的应用程序的不断增加,应用协议的种类也越来越多。在/etc/services文件中定义的每一行就对应一个固定端口,就可能对应于一种应用程序类型。除此之外还有很多非标准应用程序,当然一个系统中并不会同时运行所有种类的应用程序。

  大部分TCP/IP应用程序是属于客户机/服务器类型的,这种类型的应用程序包含两个部分,其中服务器程序通常运行在服务器系统的后台,称为守护程序(daemon)。守护进程运行在后台,随时接受客户连接以提供服务;客户软件就是应用程序的用户接口,用户通过它使用服务器上的资源。

  由于希望在需要的时候服务器能立即提供服务,这样就需要启动大量并不常用的守护进程运行在系统中,就浪费了系统资源。因此Unix使用一个超级守护程序inetd来监控这些不常用到的服务请求。只有在inetd接到客户程序的连接请求后,才启动相应的应用服务程序进行处理,这样系统中就不必运行过多的守护进程了,从而节约系统资源。inet d的配置文件为/etc/inetd.conf,管理员必须配置这个文件,以便指定系统提供那种服务。

#

# Internet server configuration database

#

#        @(#)inetd.conf        5.4 (Berkeley) 6/30/90

#

ftp        stream        tcp        nowait        root         /usr/libexec/ftpd        ftpd -l

telnet        stream        tcp        nowait        root         /usr/libexec/telnetd        telnetd

shell        stream        tcp        nowait        root         /usr/libexec/rshd        rshd

login        stream        tcp        nowait        root         /usr/libexec/rlogind        rlogind

finger        stream        tcp        nowait        nobody        /usr/libexec/fingerd        fingerd -s

#exec        stream        tcp        nowait        root         /usr/libexec/rexecd        rexecd

#uucpd        stream        tcp        nowait        root         /usr/libexec/uucpd        uucpd

#nntp        stream        tcp        nowait        usenet        /usr/libexec/nntpd        nntpd

comsat        dgram        udp        wait         root         /usr/libexec/comsat        comsat

ntalk        dgram        udp        wait         root         /usr/libexec/ntalkd        ntalkd

#tftp        dgram        udp        wait         nobody        /usr/libexec/tftpd        tftpd /tftpboot

  inetd.conf中的第一列为使用的端口地址,通常在/etc/services中进行定义,第二列和第三列为连接种类,stream为tcp连接,dgram为udp,第四列可以为非daemon方式启动的进程配置为n owait,为以daemon方式启动的进程设置为wait。然后为执行程序的用户,要执行的程序位置和要执行的程序命令及其参数。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:35:07 | 显示全部楼层

FreeBSD连载(34):手工配置网络

基本网络设置

  在FreeBSD系统中,网络能力十分重要,对于一个标准的FreeBSD系统,至少要有一个网络界面以便与其他计算机通信。最常见的网络界面为以太网卡。此外FreeBSD也支持Token Ring和FDDI,以及普通电话拨号连接、ISDN、ATM等广域网连接方式。在计算机网络领域内最常使用的连接方式是本地多台计算机使用局域网互联,再通过一台专用计算机与广域网连接,因此一个计算机最常使用的是局域网连接方式,并且局域网是永久连接方式,设置十分简单。

  FreeBSD对网卡的支持是在系统内核中实现的,要使一个网卡工作正常,就需要系统内核拥有这个网卡的驱动,并配置好它占用的硬件资源。为了保证网卡被正确的检测到,应该使用dmesg来查看系统的检测信息。

  使用sysinstall可以完成最基本的网络配置,可以配置主机名、域名、IP地址、缺省网关、DNS服务器等。配置的这些内容被写入系统的配置文件rc.conf中保留下来。当系统安装完成之后,在sysinstall的网络配置界面下试图重新配置网络时,由于网络正在运行,sysinstall将提示 “Running multi- user, assume that the network is already configured?” 此时需要回答No,表明需要重新设置网络,才会进入配置界面。

    *
      手工配置网络

  使用sysinstall进行网络配置的优点是所有的网络数据将在同一个界面下进行设置,不容易发生错误和遗漏现象。但熟练的Unix用户在平时维护系统的时候更喜欢使用手工配置,因为手工配置有很多优点:

    * 熟悉命令之后,手工配置更快速,并且不需要重新启动;

    * 能够使用配置命令的高级特性;

    * 更容易维护配置文件,找出系统故障;

    * 能更深刻的了解系统配置是如何进行的。

  仅仅使用sysinstall进行设置,不可能对系统设置有深刻的了解,因而一旦发生问题,就容易束手无策。对于管理员来讲,不能被动的仅仅停留在能够使用和操作的阶段,而是要了解系统是如何进行工作的,才能更好的进行系统维护和管理。因而需要使用命令行方式。一旦熟悉之后,就会发现命令行才能提供全部灵活的操作能力,而全屏幕方式限制很多,过于呆板。

    * 配置计算机名字

  每个系统都应该有一个名字,这个名字通常在系统安装时确定,可以使用hostname命令来获得当前系统的名字。同样设置计算机的名字也需要使用hostname命令,但这需要root权限:

# hostname wb.example.com.cn

# hostname

wb.example.com.cn

    * 配置网络界面

  网络界面实际就是网卡的驱动程序,操作系统使用它与网络硬件打交道,而配置网络界面的操作应该通过命令ifconfig来完成。理解了IP协议之后,使用ifconfig设置网络界面相当简单。

# ifconfig  xl0  inet  192.168.1.64  netmask  255.255.255.0 up

  其中xl0标识一个3c905B的网络界面,inet为inetnet的简写,标识IP协议,FreeBSD也支持其他几种协议,如ipx、atalk等。设置本网络界面地址为192.168.1.64,网络掩码为255.255.255.0,up表示将这个网络界面运行起来。通常不需要这么复杂的写法,简单的使用下面命令将使用缺省网络掩码配置这个网络。

# ifconfig  xl0  192.168.1.64

  使用down参数可以简单停止网络界面的工作:

# ifconfig xl0 down

  此外,还可以在一个网络界面上捆绑上多个IP地址,第二个及其之后的IP地址可以使用alias参数指定,如果不再想使用这个地址,可以使用delete命令删除这个ip别名。

# ifconfig xl0 192.168.100.100 alias

# ifconfig xl0 delete 192.168.100.100

  ifconfig的另一个重要的作用是用来观察当前网络的所有界面的配置状态,-a参数将列出所有界面的配置信息。更改配置之后最好使用这个命令查看效果。

# ifconfig -a

xl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500

        inet 192.168.1.64 netmask 0xffffff00 broadcast 192.168.1.255

        ether 00:90:27:4e:f6:67

        media: autoselect

        supported media: autoselect 100baseTX <full-duplex> 100baseTX 10baseT/UTP <full
-duplex> 10baseT/UTP

lp0: flags=8810<OINTOPOINT,SIMPLEX,MULTICAST> mtu 1500

tun0: flags=8050<OINTOPOINT,RUNNING,MULTICAST> mtu 1500

sl0: flags=c010<OINTOPOINT,LINK2,MULTICAST> mtu 552

ppp0: flags=8010<OINTOPOINT,MULTICAST> mtu 1500

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384

        inet 127.0.0.1 netmask 0xff000000

  上图显示的信息包括各个网络界面,如以太网界面xl0,并行口界面lp0,用于ppp拨号的tun0和ppp0界面,用于slip拨号的sl0界面等各个网络界面的设置数据。

  对于点对点的PPP界面,ppp0或tun0,通常要求指定另一端的IP地址,如果没有另一端的IP地址,就不能正常设置网络,事实上PPP软件会自动完成这些设置,而不需手工执行ifconfig。

# ifconfig  tun0 inet 10.10.1.42 10.10.1.29

    * 配置路由表

  在同一个局域网上的计算机是直接连通的,但是不同的网络上的计算机并没有直接相连,只能通过一台特殊的专用计算机-路由器来完成连通。路由器连接有多个网络界面,每一个网络界面连接到一个相应的网络上,有一个相应的IP地址。而网络内部的计算机要向外连接,必须通过路由器进行转接,因此计算机必须知道路由器的IP地址。

  缺省网关就是一个网络中的最基本的路由器,负责几乎所有的向外连接任务。假设缺省网关的地址为 192.168.1.254,则设置缺省网关的命令为:

# route add default 192.168.1.254

  更复杂的情况下,网络中可以有多个路由器,每个路由器负责到一些网络的转发任务,因此应该在计算机中配置这个网络上所有路由器及这些路由器负责的网络的路由数据。可以使用route命令增加到各个网络的静态路由数据,其中-net参数是一个可选参数,否则route从所给予的IP地址中判断它是网络还是计算机,同样可以指定 -host参数为一个远程计算机指定路由。

# route add -net 192.168.10.0/24 192.168.1.253

# route add -net 192.168.20.0 192.168.1.253

  这个语句将在路由表中增加到网络192.168.2.0和192.168.3.0的路由,其中ip地址后面的24用于指示网络掩码,它代表二进制方式的网络掩码前面非0位的长度,24个非0位的掩码等价于255.255.255.0。如果没有指定网络掩码,route就使用该ip对应的缺省网络掩码。

  设置完路由表之后,可以使用netstat -r命令来查看当前的路由表的内容。

# netstat -r

Routing tables



Internet:

Destination        Gateway            Flags     Refs     Use     Netif Expire

default            192.168.1.254      UGSc        1      941      xl0

127.0.0.1          127.0.0.1          UH          1      644      lo0

192.168.1          link#1             UC          0        0      xl0

192.168.1.254      0:e0:1e:ce:85:a9   UHLW        2        0      xl0

192.168.1.64       0:90:27:4e:f6:67   UHLW        1        6      lo0

192.168.1.253      link#1             UHLW        2        0      xl0

192.168.10         192.168.1.253      UGSc        0        0      xl0

192.168.20         192.168.1.253      UGSc        0        0      xl0

  除了显示到达其他网络的路由器之外,路由表中,还能显示出到达本地网段计算机的方式,例如link#1表示通过第一个网络界面,也能显示直接连接的其他主机的MAC地址。

    * 保存配置

  上面的命令都是立即生效的命令,但是并没有将信息写入配置文件中,因此要想让系统重起之后配置仍然有效,就必须更改配置文件/etc/rc.conf。这里可以设置主机名,各个网络界面的属性,以及各个路由设置等。

hostname="wb.example.com.cn"

network_interfaces="xl0 ppp0 lo0"  

ifconfig_xl0="inet 192.168.1.64  netmask 255.255.255.0"

ifconfig_ppp0="inet 10.10.1.42  10.10.1.29"

ifconfig_lo0="inet 127.0.0.1"

defaultrouter=”192.168.1.254”

static_routes=”static_route1 static_route2”

static_route1=”-net 192.168.10.0/24 192.168.1.253”

static_route2=”-net 192.168.20.0/24 192.168.1.253”

  其中network_interfaces定义了多个网络界面的名字,此后相对应的ifconfig_xl0等项的值是相应的 ifconfig的参数。同样static_routes参数也使用相同方式,来定义多个静态路由。

    * 配置名字解析

  在Inetnet发展的早期,仅仅使用主机名配置文件来作主机名/IP之间的映射,这对于互连的计算机较少时十分有效,而随着相连的计算机的增多,hosts文件会越来越大,如果用当前Internet上的计算机数量去衡量的话,使用hosts文件根本不可能。

# cat /etc/hosts

127.0.0.1                 localhost

192.168.1.64         wb.example.com.cn  wb

192.168.1.254         gateway

192.168.1.253        gateway2

192.168.1.252        gateway3

202.102.245.49        www.online.ha.cn

  因此人们发展了一种分级的方式管理名字与IP地址对应关系,称为域名解析系统。在这个系统中采用一种分级结构,每个组织负责自己的域及通过这个域内的名字服务器,对域内的计算机名字和IP地址的对应关系进行维护,每个域内还可以划分为几个不同的子域,子域由子域内的名字服务器负责解析,这样就降低了维护任务的复杂程度。通过标准协议DNS,Internet上所有的名字服务器可以相互交换数据,这样每台计算机都能通过查询名字服务器来查询Internet上所有的计算机名字。

  要使用域名解析系统DNS,当用作普通的DNS客户时,只需配置/etc/resolv.conf文件,指出所使用的名字服务器。

# cat /etc/resolv.conf

domain example.com.cn

nameserver  192.168.1.250

nameserver  192.168.2.210

  这个配置文件指出本机使用的域为example.com.cn,这样如果查名字www,将会首先使用 www.example.com.cn作为全名 ... 器192.168.2.210。

  注意,因为此时还不能通过DNS查询名字,因此这里要使用IP地址而非主机名来指定名字服务器。

  由于可以同时使用/etc/hosts主机文件和/etc/resolv.conf中配置的DNS服务器都能进行计算机名字与IP 地址之间的转换,就可以规定查找的顺序,在/etc/host.conf文件中规定了进行名字转换时查找的顺序。

bind

hosts

  系统缺省设置的顺序如上,第一行为bind,(Berkeley Internet Name Domain)这是DNS域名系统的标准实现,第二行为hosts,因此这表示先查找DNS服务器,然后再查找本机中的文件hosts。由于从DNS 服务器上查找名字可以得到域名的全部信息,因此如果本机具备DNS名字的情况下,应该设置为查找DNS服务器优先。

  虽然一般DNS名字解析速度并不会造成太大的影响,但如果本地的DNS反应较慢或者这台FreeBSD计算机的名字没有登记到DNS服务器上,那么服务器试图查找本机名字的行动就影响网络应用程序的连接速度,造成很多依赖于主机名的应用程序启动非常缓慢,为了加速计算机名字解析速度,可以更改这个文件设置为先查找本机文件优先。

    * 使用基本网络工具

  当配置好网络之后,就可以使用系统提供的网络程序来访问网络,如使用ftp来从远程计算机上下载文件、telnet登录上远程系统等。FreeBSD下不但提供了这些普通的网络应用程序,而且还提供了相当丰富网络工具,帮助进行判断网络状态,发现网络故障。

  最基本的查看本地网络设置的程序,包括前面提到的设置程序ifconfig、route,以及查看网络状态的程序netstat。还有另外的一些程序,可以用来判断网络连接状态。

  前面提到的netstat的用法是使用-r参数来获得路由器的信息,而不使用这个参数启动netstat将报告当前的连接状态,包括TCP/IP连接和Unix socket连接。

# netstat

Active Internet connections

Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)

tcp        0      2  wb.online.ha.cn.telne www.1030                ESTABLISHED

tcp        0      0  wb.online.ha.cn.49157 wcarchive.cdrom..20    ESTABLISHED

tcp        0      0  wb.online.ha.cn.1139  wcarchive.cdrom..ftp   ESTABLISHED

tcp        0      0  wb.online.ha.cn.telne www.1029                ESTABLISHED

tcp       56      0  wb.online.ha.cn.1138  wcarchive.cdrom..ftp   CLOSE_WAIT

tcp        0      0  wb.online.ha.cn.telne www.1028                ESTABLISHED

tcp        0      0  wb.online.ha.cn.telne www.1027                ESTABLISHED

tcp        0      0  wb.online.ha.cn.1101  email.9999             ESTABLISHED

Active UNIX domain sockets

Address  Type   Recv-Q Send-Q    Inode     Conn     Refs  Nextref Addr

f458af00 dgram       0      0        0 f4571fc0        0 f458ae40

f458ae40 dgram       0      0        0 f4571fc0        0 f458af40

f458af40 dgram       0      0        0 f4571fc0        0 f458af80

f458af80 dgram       0      0        0 f4571fc0        0 f458afc0

f458afc0 dgram       0      0        0 f4571fc0        0        0

f4571fc0 dgram       0      0 f45705c0        0 f458af00        0 /var/run/log

  可以使用ping来判断与远程计算机是否能够连通。

$ ping ftp.freebsd.org

PING wcarchive.cdrom.com (209.155.82.18): 56 data bytes

64 bytes from 209.155.82.18: icmp_seq=1 ttl=240 time=520.726 ms

64 bytes from 209.155.82.18: icmp_seq=2 ttl=240 time=773.465 ms

^C

  要想知道这台计算机是怎样和远程计算机相连接的,可以使用traceroute来获得从本机达到远程计算机所经过的路由器,以及到达各个路由器的开销等信息。

$ traceroute www.pku.edu.cn

traceroute to sun1000e.pku.edu.cn (162.105.254.12), 30 hops max, 40 byte packets

1  202.102.245.1 (202.102.245.1)  1.078 ms  0.862 ms  0.850 ms

2  202.102.235.165 (202.102.235.165)  157.337 ms  157.957 ms  174.054 ms

3  202.97.26.217 (202.97.26.217)  134.037 ms  57.994 ms  55.602 ms

4  1S7-rtr1-r-1-hbwh.cn.net (202.97.26.165)  274.626 ms  120.154 ms  580.097 ms

5  202.97.10.113 (202.97.10.113)  623.421 ms  888.556 ms  794.748 ms

6  6A05-rtr2-c-1-bjbj.cn.net (202.97.1.189)  411.728 ms  247.819 ms  245.688 ms

7  202.97.9.1 (202.97.9.1)  762.538 ms  945.893 ms  920.904 ms

8  202.97.8.254 (202.97.8.254)  1181.508 ms  1107.783 ms  374.649 ms

9  1F0-rtr1-r-1-bjbj.cn.net (202.97.2.14)  960.674 ms  635.770 ms  700.182 ms

10  202.97.16.190 (202.97.16.190)  391.926 ms  214.433 ms  721.839 ms

11  * 202.112.63.100 (202.112.63.100)  313.066 ms *

12  * * *

13  * * beijing-rgw-lan.cernet.net (202.112.1.66)  434.928 ms

14  * * *

15  * 202.112.5.194 (202.112.5.194)  282.973 ms  340.009 ms

16  sun1000e.pku.edu.cn (202.112.7.12)  827.202 ms * *

  由于traceroute会在网络上产生大量的数据流,因此一般不要频繁使用这个命令,以免造成无谓的网络流量。

  为了获得从一个计算机名字获得其IP地址,或者从IP地址得到计算机名字,可以直接使用nslookup来查询DNS服务器。

$ nslookup ftp.freebsd.org

Server:  ns.hazzptt.net.cn

Address:  202.102.224.68



Non-authoritative answer:

Name:    wcarchive.cdrom.com

Address:  209.155.82.18

Aliases:  ftp.freebsd.org

$ nslookup 209.155.82.18

Server:  ns.hazzptt.net.cn

Address:  202.102.224.68



Name:    wcarchive.cdrom.com

Address:  209.155.82.18

  nslookup不仅能用于查询普通的IP地址,还可以查询其他更复杂的DNS信息,如某个域的名字服务器的地址,邮件服务器地址等。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:36:52 | 显示全部楼层

FreeBSD连载(35):串口和modem

拨号网络

  局域网上的FreeBSD要和Internet(或其他广域网)连接,就需要使用广域网界面。对于一般用户,采用普通电话线进行拨号的方式,是比较常见的做法。这就需要首先使用计算机的串口连接到modem(调制解调器)上,再通过modem连接到Internet上。

    * 串口和modem

  因此如果采用拨号方式连接一台计算机到远端,则必须配置好计算机的串口和modem。

  个人计算机一般有两个串口,在DOS下称为COM1、COM2,FreeBSD使用Unix的习惯从0开始排列数字,相应的串口硬件为sio0、sio1。启动时系统将自动检测这些硬件,检测结果显示在屏幕上,可以在登录后使用dmesg来查看这些启动信息,判断硬件是否真的被检测到了。如果串口被检测到,就能使用连接到相应串口上的外置 modem进行连接。

  如果使用内置modem卡,卡上将包括一个串口设备,根据这个卡的设置,这个串口设备可以为sio2或sio3 ,因此必须保证内核支持第三、第四个串口设备sio2和sio3。但与DOS不同的是,modem卡使用的IRQ不能与已有串口共享硬件资源。由于DOS是单任务操作系统,不可能同时使用两个串口,共享IRQ是可以的,因此COM1 与COM3共享IRQ 4,COM2与COM4共享IRQ 3。但是对于多用户操作系统FreeBSD来讲,同时会有多个进程访问设备,每个设备必须单独占有IRQ,因此必须在内核中将modem卡的IRQ设为另外的空闲值。

  要更改卡上的跳线或在DOS下运行设置程序更改卡上的设置,以使硬件上设置与内核配置相一致。通常PNP的 modem卡能正确设置硬件资源,也可以通过UserConfig重新设置。

  当FreeBSD的内核检测到串口设备之后,就能够通过相应的设备文件来访问这些串口了。对应第一个串口sio0 的设备文件为/dev/ttyd0和/dev/cuaa0,对应第二个串口sio2的设备文件为/dev/tty d1和/dev/cuaa1,依次类推。

  FreeBSD对一个串口提供了两个设备文件,事实上它们对应同样的硬件,只是属性略有不同。cuaa0主要用来拨出,ttyd0主要用于拨入和直接连接。设置这两个设备文件的原因是计算机与modem相互通信的数据有两类,一种为计算机通过串口发送给modem的控制指令,常用的为Hayes的AT指令,这些数据是发送给modem的,而另一种数据是计算机通过modem发送到电话网上的传输数据,这些数据只需要让modem进行调制解调即可。而对于应用程序来讲,要想非常简单的来区分这两种数据,就可以使用两个初始状态不同的设备文件。

  当外部拨入内部时,电话连接已经设置好了,数据传输是在计算机与电话网之间,modem只进行调制解调,此时就使用ttyd0。而当向外拨号时,modem还没有建立连接,计算机应该向modem发送指令,控制modem执行拨号等操作,此时就使用设备文件cuaa0。一旦连接建立之后,系统将重置设备文件的属性,使得cuaa0同样也是将数据发送向电话网上。

  因此ttyd0和cuaa0这两个设备文件,只是初始状态不同,而并没有本质的差别。事实上大多数拨号软件会重置设备文件的状态,使用哪个设备都可以正确完成拨号过程。然而习惯的做法仍然是使用cuaa0用于拨出,ttyd0 作为拨入,这样能避免某些软件不能正确重置设备文件的状态的问题。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:39:12 | 显示全部楼层

FreeBSD连载(36):PPP协议

PPP协议

  通过电话连接使用IP协议有两种协议,一种为SLIP协议,另一种为PPP协议,FreeBSD支持这两种协议,但是SLIP协议已经过时,当前已经很少有ISP使用这种方式提供接入服务了,而PPP协议则成为了标准。

  建立一个PPP连接需要以下过程:

    * 在PPP的两端建立一条物理连接,通常为电话连接,但也有直接电缆连接或虚拟的tunnel连接的形式。具体如何建立连接,例如拨号等,并不属于PPP协议本身的任务。

    * 由PPP的服务器端对客户端进行验证,可以有最简单登录的验证方式、PAP或CHAP等验证方式。由于PAP和CHAP并不在线路上传输口令本身,因此更为安全,不必担心口令会泄露出去。

    * 验证完毕之后,PPP服务器将按照配置,分配给客户IP地址,并将网关地址和其他的一些配置信息传送给客户。如果是Microsoft客户,还可以按照MS的扩展协议分配给客户NetBIOS名字服务器的地址。这样就建立了一条PPP连接。

  FreeBSD对PPP提供了两种不同方式的支持,一种为内核级PPP,它将PPP协议代码编译进内核,并运行一个PPP守护进程pppd,提供对PPP的支持,这是一种传统的方法,但配置起来较困难。另一种为用户级PPP,它使用一个应用程序ppp,通过通用tunnel设备传递PPP数据,配置较为容易。一般情况下可以使用用户级PPP 来建立拨号方式的Internet连接。

  要建立PPP连接,首先要检查串口、modem和电话线连接是否正确。可以使用一些通信软件来帮助进行诊断,例如minicom,如果使用minicom能正常拨号,并在拨ISP的拨号服务器时能出现username和password 提示,就说明串口和modem的配置正确无误。接下来就可以配置PPP连接。

    * 用户级PPP设置

  用户级PPP使用tunnel设备进行PPP数据的传递,因此内核中必须支持相应的tunnel设备,通常为 tun0。缺省内核中支持这个伪设备(pesudo-device tun),/dev目录下也具备相应的设备文件t un0。如果同时需要多个拨号连接,就可以增加内核中支持的伪设备数量和相应的设备文件。

  要使用ppp,还需要设置它的配置文件,这些文件位于/etc/ppp目录中。缺省情况下,/etc/ppp 目录下安装了这些文件的例子:

# ls -l /etc/ppp

  total 21

  drwxr-xr-x   2 root     wheel         512 Aug 17 16:18 .

  drwxr-xr-x   8 root     wheel        1536 Aug 29 18:31 ..

  -rw-r--r--   1 root     wheel        5112 May 20 20:06 ppp.conf.sample

  -rw-r--r--   1 root     wheel        1130 May 20 20:06 ppp.conf.server.sample

  -rw-r--r--   1 root     wheel        1894 May 20 20:06 ppp.deny

  -rw-r--r--   1 root     wheel        1665 May 20 20:06 ppp.dialup.sample

  -rw-r--r--   1 root     wheel        1402 May 20 20:06 ppp.linkdown.sample

  -rw-r--r--   1 root     wheel        1422 May 20 20:06 ppp.linkup.sample

  -rw-r--r--   1 root     wheel        1705 May 20 20:06 ppp.pap.dialup.sample

  -rw-r--r--   1 root     wheel         313 May 20 20:06 ppp.secret.sample

  这些以sample结尾的文件都给出了最常用的配置,因此只需复制生成正确的设置文件,再稍加修改,就能用于使用者自己的拨号连接。

    * 手工拨号

  ppp.conf是用户级PPP的主要配置文件,可以从ppp.conf.sample生成适合自己的ppp.conf。ppp.conf 文件使用带有冒号的标签标识不同的选项,第一项标签通常为default:,用于设置缺省的选项。

default:

set log Phase Chat Connect Carrier LCP IPCP CCP tun command

set device /dev/cuaa2

set speed 115200

deny lqr

set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \"\"
AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"

  注意default:为这一项的标签,必须位于一行的开始,而其他的行是这一项的具体配置,因此使用一个空白字符开头。否则语法错误就造成不能ppp不能正常建立连接的问题。

  第一个设置set log用于设置连接过程中要记录的日志内容,这有助于帮助解决连接过程中出现的故障;第二项设置set device设置连接使用的串口设备,本文件中设为第三个串口cuaa2;第三项设置了串口与mode m的连接速度,115200为PC常用的串口通信芯片UART 16550的最大通信速率;第四项在该medom上屏蔽线路质量请求lpr;最后一项为发送到medom的一些命令和相应的回应,通常称这些为交谈脚本(chat script ),上例中这个设备跨越了两行,实际上它应该位于同一行内。

  设置了default项之后,就可以进入ppp程序测试这些设置是否正确了。

# ppp

ppp > term

atdt 163

username: pppuser

password:

PPP >

  进入ppp程序之后,输入term命令可以进入终端模式,这个模式下用户可以直接输入modem认可的AT指令控制modem,本例中使用atdt 163拨接163,连接之后系统将进行提示输入用户名和口令,此后ppp就建立起PPP连接,而ppp的提示符改变为大写的PPP。

    * 设置拨号连接

  使用手工输入的连接方法不很方便,而且也不适合使用PAP或CHAP等安全认证方式的连接,因此最好在ppp.conf对指定的连接进行配置。这要求对每个要连接的ISP,都配置相应的设置。例如对CHINANET 的接入,使用下列chinanet标签配置:

chinanet:

set phone 163

set login "TIMEOUT 5 ogin:--sername: pppuser word: key123"

set timeout 120

set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0

delete ALL

add 0 0 HISADDR

  这个例子中使用chinanet作为设置的标签,设置了电话号码为163,登录时使用sername匹配对用户名的提示Username,接收到这个字符串后自动输入用户名pppuser,使用word匹配对口令的提示Pas sword,然后自动输入口令。这里只使用了提示信息的一部分来进行匹配,这是为了避免匹配时出现问题。对于不同的系统,这些提示还有所不同,对于使用Unix作登录服务器的提示为通常的Login,而大多数专用拨号服务器的提示为U sername。

  set ifaddr用于设置本地PPP连接的IP地址,由于PPP协议在客户和服务器之间协商客户的IP地址,通常由拨号服务器从自己控制的自由IP地址池中分配给拨号的计算机一个动态IP地址,因此这里的设置只是客户端对地址协商进行的限制。可以针对本地要申请的IP地址,和远端计算机的IP地址进行限制,本地的IP地址和网络掩码为s et ifaddr的第一个参数,而远端的IP地址和网络掩码为set ifaddr的第二个参数,前两个参数的网络掩码是用于限制IP地址所在的网络,可以是真实网络的网络掩码,也可以不是,第三个参数才是用来指定PPP界面使用的网络掩码。

  一般情况下,不需要对双方的IP地址范围进行限制,拨号之后可以接受任意的IP地址,就如上例中设置本地IP 地址和远端IP地址的限制网络掩码长度都为0,由于网络掩码长度为0使得任意IP地址都符合要求,此时掩码前面的IP 地址就没有意义了。

  如果想让拨号的计算机拥有一个静态IP地址,就必须设置网络掩码为32,明确指定IP地址,此时也可以省略掩码,直接使用IP地址本身。例如,本地每次连接都使用静态IP地址192.168.1.98,另一端的IP地址为19 2.168.1.64,那么这一项就应为:

  set ifaddr 192.168.1.98 192.168.1.64 255.255.255.0

  使用静态IP地址就能使FreeBSD使用固定的IP地址,从而能使用DNS域名,以方便提供更多的服务。然而,这个set ifaddr的配置命令可以更灵活,可以在协商IP地址时指定本机使用的IP地址范围,或者指定对方所在的IP地址范围,进行地址限制。例如:

  set ifaddr 192.168.1.98/24 192.168.1.64/24 255.255. 255.0

  这种限制拨号网络IP地址范围的机制对于使用自动拨号的情况十分有用,通常可以使用带参数的命令ppp -a uto将ppp程序放入后台,一旦有网络请求就立即拨号建立连接。但是FreeBSD上有多个网络界面,就需要判断这个网络请求需要使用哪个拨号网络界面进行网络传输,否则如果使用错误的拨号网络进行拨号,即使建立了连接,也不能找到目的计算机建立连接。由于每个连接请求中都具备目的IP地址,便需要根据这个IP地址来进行判断。然而普通的拨号网络在建立连接之前是没有分配IP地址的,因此还是无法确定对这个IP地址的连接请求应该通过那个拨号网络界面进行传输。但是,如果指定了ppp网络界面的IP地址范围,就可以根据这个地址范围来判断连接请求中的IP地址是否在这个范围内,以决定是否使用这个网络界面进行拨号。

  delete all指出删除不必要的路由配置,add 0 0 HISADDR指出将缺省路由设为对方的地址,由于使用动态IP时,在建立连接前对方的IP是未知的,因此使用HISADDR代替。如果已知拨号服务器的IP地址,也可以直接填上这个IP地址。也可以不将拨号服务器作为缺省路由,而只将它作为对某个子网的路由,那么在这个配置中就不可以使用0作为IP地址和网络掩码,必须使用正确的IP地址和子网掩码进行设置。例如add 192.168. 1.0 255.255.255.0 HISADDR,就将对方作为通向192.168.1子网的路由器。事实上这些设置路由的指令等价于执行对应的route指令,以设置路由,如route add 192.168.1.0 HIS ADDR -netmask 255.255.255.0。

  然而对于动态分配IP的情况,问题在于在ppp进行拨号的时候,对方的IP地址HISADDR还没有确定,因此这些设置路由的指令往往不能正确执行。必须在拨号完成,建立了PPP连接之后,HISADDR才能确定,因此设置路由的命令应该放在更合适的位置:ppp连接建立之后立即执行的文件ppp.linkup中。

MYADDR:

delete 0

add 0 0 HISADDR

192.168.1.98:

add 192.168.1.0 0 HISADDR

chinanet:

delete ALL

add 0 0 HISADDR

!bg /etc/ppp/ppp.fetchemail

  ppp.linkup文件格式与ppp.conf文件相同,它在PPP连接建立后执行,执行与拨号使用的标签相同的项,以及客户获得的地址为标签的项。通常使用MYADDR表示本机得到的IP地址,因此这个标签下的内容都将执行;而192.168.1.98项表示获得这个地址时增加下面的路由,最后一项以chinanet为标签,与ppp. conf相同,表示进行这个chinanet拨号后执行的相关动作,其中包括在后台执行的取邮件的脚本ppp.fet chmail。

  如果拨号服务器要求使用PAP或CHAP认证,而不是普通的登录认证方式,则要在ppp.conf中的使用不同的配置选项:

chinanet:

set phone 163

set login

set authname pppuser

set authkey key123

set timeout 120

set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0

delete ALL

add 0 0 HISADDR

  使用authname和authkey来定义PAP或CHAP认证方式下的用户名和口令,就能连接到使用PAP或CHAP 的拨号服务器,而具体使用哪种认证方式则由拨号服务器决定。

    * 进行拨号连接

  设置了针对具体拨号连接的配置之后,拨号就非常方便了,直接使用该拨号服务的标签进行操作。

# ppp

ppp > dial chinanet

PPP >

  使用ppp的dial命令发起连接之后,ppp连接被建立,提示符也由原来的小写ppp>变为大写PPP>,这就表示PPP连接已经正确设立了。这个时候如果使用ifconfig进行查看,就可以看到网络界面tun0 已经设置正确,并可以使用了。

  当要结束连接时,使用close或quit命令关闭连接。结束连接时将执行/etc/ppp目录下的ppp.linkdown 脚本。ppp.linkdown脚本和ppp.linkup格式相同,都会依据相同的标签执行操作。

  如果使用者租用了一条模拟专线,专门用于Internet连接。这样就不希望每次传输时都重新进行连接,而希望建立一条永久连接,ppp在后台自动拨号连接到Internet上,并一直维护这个连接。这样就可以使用-ddial 参数启动ppp。

# ppp -ddial chinanet

  -ddial参数使得ppp立即使用相应参数对应标签设置的拨号连接建立永久连接,而不管有没有实际的数据传输。而绝大多数情况下,使用者并没有租用专线,还是希望在有数据传输时才建立网络连接,在没有数据传输时断开网络连接,以减少电话连接时间。这样就可以使用-auto参数启动ppp。

# ppp -auto chinanet

  这样启动的ppp将一直停留在后台,但并不立即进行连接,而是在应用程序发出网络请求时才进行拨号,这个网络请求的目的地址应该在chinanet标签定义的网络地址范围内。而如果一段时间内没有任何数据传输,就断开连接(这个时间由set timeout命令设置,单位为秒)。

# ppp -backgroud chinanet

  -background选项使PPP立即进行拨号,并停留在后台。但与-auto不同在于,在一段没有数据传输的时间间隔后ppp将断开连接,但是ppp程序也停止执行,而不象auto参数那样,ppp一直驻留在后台监视网络连接,要再次建立连接必须重新执行ppp程序。这个选项适合最普通的网络客户,使用户能明确什么时候才建立连接。

# ppp -alias -ddial chinanet

  ppp程序的另一个有用的选项是alias。如果拨号用户内部有自己的局域网,用户或许希望让整个网络内的计算机共享一个拨号连接。使用ppp的alias选项能使FreeBSD将局域网上的网络连接请求中的本地IP地址替换为FreeBSD系统的ppp网络使用的IP地址,从而使其他用户也能访问外部网络。-alias参数应该和auto或ddial参数联合使用,以驻留在后台提供服务。这种方式比较简洁、易用,当然代理服务器和网络地址转换的方法能提供更多的控制能力。

  当使用这些参数执行ppp程序时,ppp程序将切换在后台维护PPP连接。然而由于ppp程序在后台运行,就无法输入指令以控制ppp程序的执行。为了方便使用者控制后台运行的ppp程序,ppp提供了通过socket连接的方式来接受外部输入。为了支持这个特性,便需要设置set server选项。

    set server 6670 MySecretpassword

  这个选项将使ppp程序监听6670端口,并使用MySecretpassword作为连接时认证的口令,以免ppp程序被非法控制。此后,就可以使用pppctl向ppp程序发送指令,这些指令都是ppp的标准指令。

# pppctl -p MySecretpassword 6670 set timeout 300\; dial

  除了使用标准的Intenet套接字接收pppctl的连接之外,ppp还能通过本地Unix套接字来接收输入。这就需要设置一个套接字使用的文件及其访问属性,具备更好的安全性。

    set server /tmp/ppp MySecretPassword 0177

  而在pppctl中应该使用对应的参数以指明相应的Unix套接字:

# pppctl -p MySecretpassword /tmp/ppp set timeout 300\; dial

    * 内核级PPP及拨号程序

  PPP协议只是定义了两台计算机之间如何进行通信的方式,并没有定义如何进行拨号建立连接。用户级PPP由于以应用程序的方式来实现了PPP协议,因此它可以集成拨号程序,使用起来很方便。但内核级PPP并非如此,它使用一个守护进程pppd来实现ppp协议,因而必须首先使用外部拨号程序建立连接。内核级PPP比较难以使用,因此FreeBSD使用者通常使用用户级ppp。

  但是pppd是实现PPP协议的最早方式,其他继承BSD Unix网络代码的Unix系统中也使用这种 PPP实现方式,这样pppd使用的广泛性就不仅局限于FreeBSD。很多使用者对内核级PPP进行封装,实现了多种图形化的连接工具,假如想使用这些图形化拨号连接工具的话,就需要对pppd有一定了解。因此这里只对pppd的拨号方式加以简单介绍,事实上使用ppp程序建立连接更为常用和方便。

  用来配合pppd的拨号程序有很多,最常使用的是chat,此外如kermit、tip也可以用于和 pppd进行配合。由于拨号程序要和pppd相互配合,因此需要将要发送给拨号程序的命令放入一个文件中,而在启动拨号程序时使用相关参数告诉它到该文件中读取命令。

  对于chat拨号程序,通常将它的拨号程序命名为chat.script,放在/etc/ppp目录下。

ABORT BUSY
ABORT 'NO CARRIER'
# Wait up to 5 seconds for the reply to each of these
TIMEOUT 5
'' ATZ
OK ATDT163
# Wait 40 seconds for connection
TIMEOUT 40
CONNECT
TIMEOUT 5
serrname:-\\r-sername: pppuser
assword: 123456

  使用chat -f /etc/ppp/chat.script可以启动chat进行拨号,chat程序等待PPP服务器发送 Username:提示,发送用户名,等待PPP服务器发送Password:提示,发送用户口令。然而,chat程序只能负责拨号,至于拨号完成之后的任务,就必须由pppd来负责了。

  pppd使用网络界面ppp0,当然可以在内核配置中增添配置值并重新编译核心,就可以根据需要增加可使用的ppp界面的数量。例如将可以使用的ppp界面改变为3个,则内核配置文件应包括 “ pseudo-device ppp 3” ,这样在重新编译内核,建立相应的设备文件并重新启动后,就可以使用ifconfig命令来查看可以利用的网络界面:

# ifconfig -a

ppp0: flags=8010<OINTOPOINT,MULTICAST> mtu 1500

ppp1: flags=8010<OINTOPOINT,MULTICAST> mtu 1500

ppp2: flags=8010<OINTOPOINT,MULTICAST> mtu 1500

lo0: flags=8008<LOOPBACK,MULTICAST> mtu 16384

        inet 127.0.0.1 netmask 0xff000000

  内核还可以配置ppp界面在传输时对ppp数据进行压缩,事实上用户级ppp和内核级ppp都支持传输压缩,但内核级ppp多支持两种方式,一种是ppp的BSD压缩标准,另一种为delalte压缩标准。一般都可以在内核配置中加上这两个选项,使ppp连接中可以使用这些选项,以提供更高的传输效率。那么内核配置文件中的ppp相应配置应包括:

pseudo-device   ppp     3

options PPP_BSDCOMP

options PPP_DEFLATE

  内核级ppp使用的配置文件也放在/etc/ppp目录下,文件名为options,此外各个用户可以使用自己的配置文件~/.ppprc。

# cat /etc/ppp/options

defaultroute

domain example.com.cn

crtscts

modem

deflate 12,12

idle 300

lock

  defaultroute项将在ppp连接设定之后,将缺省网关设置为PPP服务器上;domain设置本机的域名;crtscts告诉ppp使用modem的硬件流量控制,如果硬件不支持这种方式,就只好使用另一种软件流量控制方式为xonxoff;modem行使ppp使用DCD信号来判断连接是否正常,有无掉线现象;deflate 使pppd使用defalte压缩方式;idle设置了一个时间限制,当在300秒的时间内没有数据传送,就断开连接;lock则创建一个锁定文件,其他程序在发现存在这个文件后,就能得知相应的串口已经被使用。

  配置好配置文件之后,就可以使用pppd进行连接了:

# pppd /dev/cuaa1 57600 connect 'chat -f /etc/ppp/chat.script' user pppuser

  缺省情况下,使用pppd命令立即进行拨号连接,在超过idle参数设定的时间内没有数据传送的条件下断开连接并退出。然而在options文件中可以使用persist参数告诉pppd建立一条永久连接,或者使用demond参数告诉pppd停留在后台,监视网络数据,一旦有要求就立即进行连网,超时后就断开连接,但pppd仍然停留在后台等待下次数据传送。这两种形式分别等价于ppp程序的ddial和auto模式。

    * 拨号访问FreeBSD

  FreeBSD不但能够能通过PPP协议和远程拨号服务器相连接,也能够提供拨号服务,让其他计算机能够拨入本机。事实上PPP协议本身,并不没有区分客户机和服务器,PPP服务器只需要比客户机多完成一些额外的工作,如用户认证、分配IP等。然而PPP必须建立在已经设定好的连接上,而为了设定连接,拨号服务器和客户端的设置就有不同的地方。首先在硬件上,服务器上的modem必须能接受连接,建立物理连接,然后服务器和客户软件要进行额外的验证过程,最后双方才启动ppp,设定ppp连接。

    * 接受拨号终端访问

  早期的Unix使用字符终端访问主机,将字符终端通过串口连接到计算机上之后,就能通过这些终端登录进Unix系统了。但是FreeBSD下缺省屏蔽了串口的终端登录过程,要完成这个任务,管理员还必须更改/etc/ttys文件,为串口指定一个getty进程,以监视串口,一旦发现有连接请求,便立即启动登录进程login接受用户的登录。

  在/etc/ttys中有下面的行是与串行端口相关的,对应于个人计算机的四个串口,使用getty进程进行监控,但缺省状态为off,并没有打开这个功能。如果要使用某个串口进行终端连接,就需要改变相应行的设置为on,同时还可以改变第三列中的终端类型设置及最后一列的安全设置。

ttyd0     "/usr/libexec/getty std.9600" unknown   off secure

ttyd1     "/usr/libexec/getty std.9600" unknown   off secure

ttyd2     "/usr/libexec/getty std.9600" unknown   off secure

ttyd3     "/usr/libexec/getty std.9600" unknown   off secure

  getty的第一个参数std.9600指明了串口的各项参数,这个参数在/etc/gettytab中定义,定义了如波特率、校验方式、数据位、停止位以及流控方式等。缺省使用9600,指明了连接速率为9600bps,现代串口连接通常使用的连接速率要比这个设置高,因此要根据自己的串口和modem的型号,选择gettytab中的更高速率,如std.19200或std.57600。

  更改系统之后,可以使用kill -1 1使FreeBSD重新读取ttys文件,或者重起计算机,才可以使用终端连接。这时在连接在串口上的终端键盘上按下几次回车键后,字符终端将连接到计算机上,会出现登录提示。如果没有出现提示,就说明终端设置和使用的gettytab文件中的设置项不匹配,可以更改终端设置或gettytab文件中的设置,使两者使用的校验、停止位、流控等设置选项保持一致。

  如果没有专用的字符终端设备,可以使用终端仿真软件,如Windows下的超级终端,Unix下的minicom 等,都能通过串口登录到FreeBSD下。

  可以看到,使用串口连接,那么再加上modem和电话,就能够使得远程计算机能连接到这个FreeBSD系统上了。对于提供登录服务的计算机来讲,并不会注意一个连接是从串口直接相连的,还是通过modem建立的。然而这就要设置服务器的modem,必须设置为能进行应答,以接通客户计算机打入的电话来设定连接。因此必须首先初始化modem ,需要使用AT命令AT&C1&D2&S0=1&R2&W。可以通过mi nicom或ppp的term模式,直接输入这个AT指令设置modem。

  当双方都配置好串口,连接设置好modem,并且连接上电话线之后,两台远程计算机相连接的准备工作就完成了。这时可以使用通信软件,例如minicom或kermit,从一台计算机远程登录到另一台计算机上,除了需要拨号,与本地连接没有什么两样。

    * 设定PPP服务器

  如果远程计算机能正常登录进入FreeBSD,那么说明拨号连接没有问题,那么下一步就是分别配置PPP客户端和服务器端。事实上对于PPP来讲,建立连接之后,客户端和服务器端就没有区别了,区别在于建立连接的过程中,服务器要验证用户的登录并为其分配IP地址等。

  使用用户级PPP和内核级PPP均可实现PPP服务器,由于用户级PPP配置起来更为容易,因此更为常用。同样,这也需要更改配置文件/etc/ppp/ppp.conf。

dailserver:

allow users

enable proxy

set ifaddr 192.168.1.64 192.168.1.123

  以上是一个ppp程序做拨入服务器的设置例子,这个例子中允许普通可以启动这个ppp程序,并打开了代理ARP功能,使其他计算机能通过这个计算机同客户正常通信,为连接上的客户计算机分配IP地址。

  当ppp客户计算机连接到ppp服务器上之后,通过ppp服务器的路由能力,ppp客户就能和外部计算机通信了。并且两个ppp客户机之间的通信也必须经过ppp服务器转发。由于在每个ppp客户看来,其他的ppp客户是与它自己位于同一个网段内,因而它就广播ARP请求询问对方的MAC地址,以便进行直接通信。而在事实上,ppp客户之间并没有物理连接,它们之间无法直接通信,因而广播的ARP请求也不可能传送给目的计算机。此时,具备代理ARP能力的ppp服务器就能代替某个客户,回应发送ARP请求的客户。此后这个客户就以为ppp客户的物理地址就为ppp服务器的物理地址,所有的数据包都先转发给ppp服务器,然后它再转发到另一个ppp客户机中。这个代理内部的计算机回应ARP请求的功能就被称为Proxy ARP,它能够对外隐藏内部的网络结构,如内部子网或ppp连接。

  同时配置PPP用户的登录脚本为立即启动使用服务器标签的ppp程序,因此一个简单PPP用户登录脚本应为:

#! /bin/sh

exec /usr/sbin/ppp -direct dialserver

  direct参数就用于在标准Unix认证之后,立即启动ppp进程,使客户端直接与服务器端ppp交谈,以建立ppp 连接。这个文件应该是一个可执行的文件,最简单的登录脚本可以让不同的PPP用户共同使用一个拨号服务器标签,更复杂的情况应该为每个拨号用户都设置独立的选项,并在登录脚本区分用户,启动不同的拨号选项。

  由于getty在接收到连接请求之后,就立即执行login认证过程,因此系统认证提示为Login,而与前面ppp客户设置中使用Username的认证提示不同,需要修改前面的设置,才能使用前面的认证登录上服务器。但也由于getty 必须执行login认证,因此使用getty作为ppp服务器的端口监控进程,就无法进一步支持PAP或CHAP认证。为了支持这些复杂的认证方式,就需要使用mgetty或类似的端口监控进程来监视是否有连接请求。

  在FreeBSD的Handbook中有使用mgetty设置ppp服务器的例子。

    * PPP程序的其他功能

  除了最常见拨号连接上Internet之外,还可以利用ppp程序的功能来完成其他几种任务。在缺省的ppp.conf中给出了几个例子,这些例子能帮助使用者进一步了解ppp程序的能力。

    * 串口线连接

  使用串口线直接连接与使用medom除了不需要拨号之外并无不同,但是通常要在两端都使用LQR,用于帮助判断电缆的连接情况。此时客户端的ppp.conf中的设置应为:

direct-client:

set dial ""

set line /dev/cuaa0

set sp 115200

set timeout 900 10 3

set log Phase Chat LQM

set login "TIMEOUT 5 ogin:--ogin: ppp word: ppp HELLO"

set ifaddr 10.0.4.2 10.0.4.1

enable lqr

accept lqr

  而ppp服务器应该设置为:

direct-server:

set timeout 900 10 3

set log Phase LQM

set ifaddr 10.0.4.1 10.0.4.2

enable lqr

accept lqr

    * TCP上的PPP通道

  可以将PPP建立在TCP网络连接之础上,而非通过电话网络,这样就在TCP/IP网络上建立了一条 PPP通道。tcp-client为客户端计算机的设置,这里使用一个网络连接作为连接设备,tcpsrv为远程计算机的主机名,1234为tcpsrv上的TCP端口:

tcp-client:

set device tcpsrv:1234

set dial

set login

set escape 0xff

set ifaddr 10.0.5.1 10.0.4.1 255.255.255.0

  tcp-server为服务器端计算机的设置:

tcp-server:

set escape 0xff

set ifaddr 10.0.4.1 10.0.5.1 255.255.255.0

  当ppp客户端使用tcp-client进行连接时,它将向tcpsrv的1234端口发送ppp连接请求。这就要求 tcpsrv能侦测到对1234端口的连接请求,并启动ppp服务器来建立连接。因此就可以使用inetd监听上面定义的端口1234,并负责启动ppp服务器。就需要在/etc/services中应该增加相应的端口:

pppsrv                  1234/tcp

并在/etc/inetd.conf中增加相应的选项:

pppsrv         stream        tcp        nowait        root        /usr/sbin/ppp ppp -direct tcp-server

  修改好inetd.conf之后,向inetd发送SIGHUP信号使得其重读设置文件。然后就可以使用ppp建立虚拟连接了。在ssh等加密传输软件的帮助下,还可以进一步设定为安全的虚拟通道连接。

    * 数据包过滤

  在ppp的auto模式下,需要根据超时设置断开连接,但是网络中一些协议会定时发送一些数据包,这些数据包主要用于保持网络数据的及时更新,大部分情况下不影响网络应用。但是这些数据包会引起ppp刷新时间设置,从而使得ppp一直保持拨号连接。

  这时可以使用ppp的过滤机制中的afilter过滤器,它定义了在auto模式时应滤掉的数据包,使得数据包不会影响超时时间。下面的三行分别不允许ICMP包和DNS包通过,最后一行允许其余的包通过。

    set afilter 0 deny icmp

    set afilter 1 deny udp src eq 53

    set afilter 2 deny udp dst eq 53

    set afilter 3 permit 0/0 0/0

  使用dial参数的情况下,也有相似的限制,这时使用dfilter主要来限制icmp数据包。

    set dfilter 0 deny icmp

    set dfilter 1 permit 0/0 0/0

  另外,还可以使用包过滤能力,按照端口、地址来允许或屏蔽某些TCP数据包。

    set ifilter 0 permit tcp dst eq 80

    set ofilter 0 permit tcp src eq 80

    set ifilter 1 permit 192.168.1.0/24 0/0

    set ofilter 1 permit 0/0 192.168.1.0/24

  ifilter表示对进入的数据包进行过滤,ofilter表示对出去的数据包进行过滤,因此上面的设置允许进行WWW浏览(80端口),并允许与192.168.1.0这个网段内的计算机进行连接。每一个过滤器最多可以定义20个规则。

    * 拨号网关

  当一个局域网上的一台FreeBSD通过PPP连接到Internet上之后,其他计算机也能通过这台FreeBSD 访问Internet,从而共享同一条拨号线路。这必须使用ppp的alias选项启动ppp,这样当内部计算机的数据包到达这台FreeBSD之后,由ppp将这些数据包中的IP地址更换为本机ppp界面上的IP,同时也会对端口地址进行调整,再发送到外部的Internet上。

  要完成这个任务,还需要将这台FreeBSD配置为允许转发IP数据包,在/etc/rc.conf中配置 gateway的值为YES。但为了使得路由保持正确,不能启动routed或gated等动态路由程序,因为这些程序会动态更改路由表,如果改动与ppp相关的路由数据,就会使得FreeBSD不能正确路由数据包。

  使用这种连接方式,再加上ppp的简单过滤能力,FreeBSD就能作为一个简易的具备一定防火墙能力的 Internet访问网关,能够提供整个内部网络访问Internet的能力,并将内部网与Internet相隔离。然而这个简易的拨号网关仅限于使用ppp界面,并且功能也有限。FreeBSD提供了更强大的防火墙能力,能完成要求更为复杂的各种任务。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:41:00 | 显示全部楼层

FreeBSD连载(37):DNS的体系结构

DNS服务

  通常,一台计算机只需要配置域名解析就可以了,不需要自己运行名字服务器守护进程,然而有些时候需要设置自己的名字服务器,这就需要FreeBSD下配置名字服务器BIND(Berkeley Internet Name D omain)。BIND也是由伯克利开发的一个著名软件,它的执行程序为named,运行在Internet上几乎所有的名字服务器上,构成Internet的名字系统。

  由于普通的客户计算机并不需要运行named,因此在其/etc/rc.conf配置文件中,named_enable 应为NO。当需要运行named以提供DNS服务的时候,就要将这个参数的值改为”YES”。

    *
      DNS的体系结构

  Internet上的DNS名字服务为一种分布式的体系,由分布在Internet各地的DNS服务器上的named 守护进程为整个Internet提供本域内计算机的名字解析服务。DNS域名结构为分级方式,例如www.online.ha.cn 中最后面的cn为顶级域名,由后向前分别划分为不同级别的域。

  Internet上的顶级域名有两种,一种象cn这样的国别代码,另一种是如同edu、org、net、com 等分类代码。国别顶级域下的次级域名同样可以按照地域或组织结构来分类划分。

  那么要进行名字解析,就需要从域名的后面向前,一级级查找这个域名。因此Internet上就有一些DNS服务器为Internet的顶级域提供解析任务,这些DNS服务器称为根DNS服务器。知道了根DNS服务器的地址,就能按级查找任何具有DNS域名的主机名字,BIND代码中就包括了这些根DNS服务器的地址。

  名字服务使用zone的概念来表示一个域内的主机,然而zone与域也有所区别,zone只是域的一部分,而不是整个域。因为zone中不包括域下的子域。例如域名www.example.org.cn的域为example.org.cn ,这是一个独立的zone。这个域下可由子域组成,例如www.sub.example.org.cn就属于 ... 在example.org.cn 这个zone之内,作为域的example.org.cn中就包括sub.example.org.cn子域。

  除了从名字查找主机的IP地址这种正向的查找方式之外,另外还有从IP地址反查主机域名的解析方式。很多情况下网络中使用这种反向解析来确定主机的身份,因此也很重要。查找名字的反向解析是从前面的网络地址向后面的节点地址,逐级查找,因此IP地址zone是IP地址的前面部分。然而由于一个主机的域名可以任意设置,并不一定与IP地址相关,因此正向查找和反向查找是两个不同的查找过程,需要配置不同的zone。

    * 使用DNS查询工具

  用来进行DNS查询的一个非常有用的工具是nslookup,可以使用它来查询DNS中的各种数据。除了可以在命令行下直接进行基本的DNS查询之外,直接启动nslookup将进入一个交互模式,这里能查询各种类型的DNS 数据。

  的名字解析数据可以有各种不同的类型,有设置这个zone的参数的SOA类型数据,有设置名字对应的IP地址的A类型数据,有设置从IP地址反向解析DNS名字的PTR数据,有定义服务与这个zone的DNS服务器的NS数据,以及定义主机别名的CNAME数据。这些不同类型的数据均可以通过nslookup的交互模式来查询,需要使用 set type命令设置相应的查询类型。

$ nslookup

Default Server:  ns.hazzptt.net.cn

Address:  202.102.224.68



> set type=ns

> yahoo.com

Server:  ns.hazzptt.net.cn

Address:  202.102.224.68



Non-authoritative answer:

yahoo.com       nameserver = NS2.DCA.yahoo.com

yahoo.com       nameserver = NS5.DCX.yahoo.com

yahoo.com       nameserver = NS.EUROPE.yahoo.com

yahoo.com       nameserver = NS1.yahoo.com



Authoritative answers can be found from:

NS2.DCA.yahoo.com       internet address = 209.143.200.34

NS5.DCX.yahoo.com       internet address = 216.32.74.10

NS.EUROPE.yahoo.com     internet address = 195.67.49.25

NS1.yahoo.com   internet address = 204.71.200.33

>

  这个例子就使用nslookup来查询yahoo.com这个zone的名字服务器,需要将类型设置为ns来执行查询。用来帮助获得DNS数据的工具还有很多,如dig能迅速返回整个zone的名字解析数据,dnswalk可以用来帮助查询名字服务器的设置。这些工具都可以用来帮助查找DNS的设置问题。

未完,待续。。。  
 楼主| 发表于 2003-2-11 19:25:51 | 显示全部楼层

FreeBSD连载(38):配置缓冲或转发方式的named

配置缓冲或转发方式的named

  在Internet中主要使用名字进行连接,因此网络中的DNS查询会十分频繁。很多情况下,会有大量且重复的DNS查询。尤其在使用拨号连接的条件下,由于名字服务器位于ISP端,即使是曾经查询过的名字,其信息仍然保存在线路的另一端的名字服务器的缓冲区内,重复的DNS查询将占据宝贵的线路带宽。并且DNS查询还往往使得网络连接软件不能正确获得超时信息,不能适时断开连接以节省电话连接时间。

  因此,最好的办法是将查询结果保存在本地计算机上,以避免重复查询造成的无谓的网络流量。虽然很多TCP/IP 客户机能够在本机内保存一个名字解析缓冲区,但这个缓冲区相对来讲太小了,起不到很有效的作用,然而如果要将这个缓冲区设置的较大,又不能及时刷新名字解析数据。要想很好的缓冲DNS数据,最好的缓冲区还是DNS服务器本身,因为DNS 的实现方式就是一种经常刷新的缓冲方式,并且named可以根据不同zone的不同设置,来实现数据刷新。

  因此,最简单的办法就是设置一个具备缓冲能力的名字服务器,它将能够用做名字解析的缓冲,这就要需要设置名字服务器的过程。

    * 在/etc/resolv.conf中,将127.0.0.1作为第一个可选服务器,其他DNS服务器作为备份,使得名字查询通过本地的名字服务器进行,以利用它的缓冲机制;

    * 在/etc/rc.conf中,将named_enable设置为”YES”,允许启动named,rc.conf中有关named的其他选项不需改变;

    * 改变到/etc/namedb目录下,运行make-localhost程序,这将产生针对本计算机的解析数据localhost.rev文件;

    * 修改/etc/namedb/named.conf文件,使其符合一个转发系统的要求。

    * 启动名字服务器,可以使用root身份直接执行named守护进程,并在rc.conf中更改named_enable的设置值。

    * 设置named.conf

  要成功配置named,最重要的一步就是改变配置文件named.conf,一个用于转发的设置文件应为:

options {
        directory "/var/namedb";
        datasize 20M;
        forward only;
        forwarders {
            202.102.224.68
        };
};
zone "." {
        type hint;
        file "named.root";
};
zone "0.0.127.in-addr.arpa" {
        type master;
        file "localhost.rev";
};

  这个设置文件中去除了任何注释项,named中使用与C++相同的注释方式,即用两个斜线来表示一行注释,而设置语句也类似C的语法。

  第一个语句options用于设置named的参数,directory指明named的工作目录为/etc /namedb,datasize用于设置缓冲区的大小,forward only和forwarders用于指明这个服务器只是一个转发服务器,并设置转发的名字服务器的地址。这两个转发选项不是必须设置的,不进行设置时named 就能很好的适应解析和缓冲任务。这样名字服务器初始时就从根名字服务器中获得信息,这些信息将保存在named的缓冲区内,此后就可以查询缓冲区内的相关服务器来获得进一步的名字解析。

  第二个语句用于设置根zone,这用于设置Internet上的根名字服务器,一切本地无法解析的数据将发送给那些根名字服务器进行解析,设置了工作目录下的named.root文件中记录了这些根名字服务器的地址,记录根名字服务器的文件名字也可能为root.hints。第三句定义了对127.0.0.0的反向查询的数据,0.0.12 7.in-addr.arpa为一个反向解析zone,其IP地址也是反序排列的,并且使用in-addr.arpa 后缀,而对应的反向解析数据在localhost.rev文件中定义。

  BIND的当前版本为8,之前的版本为4.9.x,它们使用named.boot作为named的配置文件。大多数Unix版本,包括大多数商业Unix在内,还没有更新他们的名字服务器到当前的BIND 8,仍然运行老版本的named。但必须注意named.boot文件的格式与named.conf不同,不能混用。BIND 8提供了很多优秀的特性,因此最好立即升级到新版本。

  named.root文件给出了Internet上的多个根名字服务器,用于初始化named的缓冲区。借助这些名字服务器的帮助,一台名字服务器能对整个Internet进行查询。一般不需要改变这些文件的内容,但是如果要建设一个内部网,不与Internet连接,就不需要named.root中的这些根名字服务器的地址,而要更改为自己网络内的根名字服务器的地址。事实上,没有任何内部网络能和Internet相比拟,需要使用多台根名字服务器来维护其域名解析系统,直接设置一台或几台名字服务器,并指定客户计算机使用这些名字服务器就满足要求了。

    * zone数据文件的格式

@        IN        SOA        freebsd.example.org.cn. root.freebsd.example.org.cn.  (
                                1998012314        ; Serial
                                3600        ; Refresh
                                900        ; Retry
                                3600000        ; Expire
                                3600 )        ; Minimum
        IN        NS        freebsd.example.org.cn.
1        IN        PTR        localhost.

  这是根据计算机的名字和域名产生的localhost.rev文件,这个文件定义了对127.0.0.0这个反向zone的反向名字解析数据,可以用于从IP地址查询主机的名字。

  第一个设置定义了一个SOA记录,这个类型的记录定义了包含一个zone的开始,并用于设置zone中数据刷新时间等参数。在这个记录中,@代表一个zone,由于这个设置文件中没有设置它的值,那么它就是named.con f中的定义语句中zone的值,这里就为0.0.127.in-addr.arpa。空白字符分隔之后为IN,这是用于表示定义的关键字,SOA表示这一行的类型为SOA记录,接下来的freebsd.example.org.cn. 为这台主机的全名,注意,这里以 ”.” 结尾,如果在名字解析配置文件中不以点结尾,named将自动附加上当前 zone的值;此后给出了一个联系用的email地址,这里为root@freebsd.expampleorg.or g.cn,但是由于@在设置文件中有特殊含义,因此使用点代替;

  再后面就是SOA记录的参数,这些参数使用了括号,并分在几行分别设置,这主要是为了使得设置更为清楚,将它们放在同一行内也可以。SOA记录的参数有序列号,用于标识SOA记录数据 ── 其他名字服务器使用这个数据与自己缓冲区内的数据对比,来判断这个zone的数据是否更新,否则就没有必要传输全部zone的数据。因此可以使用日期来表示不同的序列号,以使得更改过SOA记录之后,其他名字服务器能即使刷新数据;刷新时间 ── 用于告诉其他名字服务器何时来检查zone中的数据是否更新,这里配置为1小时(3600秒),这个时间间隔对于不经常改变的服务器来讲太小了,应该配置为一天或更大;第三个参数为连接的尝试次数;然后是过期时间,表示一旦某个zone的正式名字服务器不能提供其服务,其他名字服务器在其缓冲区中保存多久该zone的缓冲数据;最后一个参数指出其他名字服务器缓冲这个文件内容的最小时间间隔,在这个间隔内不应该刷新该zone的名字解析数据。

  当括号结束之后,这个SOA设置项就结束了。而第二项设置定义了一个名字服务器记录,这个设置直接用空格和IN 开头,表示这一项仍然使用上一项中的设置,这里就是@。NS代表这一项定义是名字服务器类型,最后给出了名字服务器的名字freebsd.example.org.cn.,表示这个zone的名字解析数据位于这个名字服务器中。

  第三项定义了一个反向查询指针记录PTR,第一列为1,由于没有使用点结尾,因此其全形式应为127.0.0.1 ,第三列PTR表示这个记录为PTR记录,是给定IP地址返回名字的查询形式,最后一列即是127.0.0.1的名字localhost。

未完,待续。。。  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表