如何使用OpenBSD3.2作ADSL路由

发表于:2007-07-04来源:作者:点击数: 标签:
一、这份HOWTO的目的 这份HOWTO描述了如何在一台个人 电脑 上安装OpenBSD 3.2,以及如何配置,使之成为一台DSL路由器。 在系统的配置中希望尽可能大地发挥它的功能。在 安全 性、功能性和易用性几方面的斟酌中,会牺牲一点安全性。但是我还是会一如既往,尽

  一、这份HOWTO的目的
  这份HOWTO描述了如何在一台个人电脑上安装OpenBSD 3.2,以及如何配置,使之成为一台DSL路由器。
  在系统的配置中希望尽可能大地发挥它的功能。在安全性、功能性和易用性几方面的斟酌中,会牺牲一点安全性。但是我还是会一如既往,尽力做到在这种要求下的尽可能高安全配置。同时,既然我因为功能性一定程序上降低了安全性,我也必须指出,这篇文章的论述和所描述的过程是尽我所能,但是我不是OpenBSD专家,错误或遗漏在所难免,因此对您的改进意见表示感谢。
  首先我要声明一点的是,OpenBSD目前还不能比如象Linux一样,给局域网内的其它机器提供一些网络服务(NetMeeting, 用ICQ或AIM收发文件等)。不过,如果是我搞错了的话,请写信告诉我,以便修正这篇HOWTO。
  
  现在进入正题:
  如果我按照这里的说明去配置,这台机器能做什么呢?
  
  它上面将运行OpenBSD -- 目前来说最安全的自由操作系统。这个系统由众多的安全专家不断地针对安全漏洞进行检查和改进着,更多的信息请查看 www.openbsd.org
  它能够建立DSL连接,并且断线后自动重拨
  网络通过NAT(就象Linux的masquerade一样)将局域网的机器与外网相连,做到完全透明,网内可以使用以下的服务:
  HTTP, HTTPS, SMTP, POP3, IRC, ... 等等所有的客户端应用
  FTP的主动和被动连接模式通过代理实现
  上面会架设FTP服务器,可以被内网和外网访问
  通过时间服务器使局域网内的所有机器时间准确同步
  它能过动态域名时刻被外界访问,,类似“my-router.no-ip.com”这样的域名,可以从www.no-ip.com 免费注册获得。
  通过SSH管理,也就是说通过局域网内任何一台机器或互联网上的机器来管理。一个很方便的客户端软件可以在这儿下载: SSHSecureShellClient-3.2.2.exe
  给局域网内的其它机器提供作域名服务器,方便这些机器的设置。
  有些IRC网(例如DALnet)必须有认证服务器,提供用户的身份信息才能连接,因此我们这儿会运行一个“假的”认证服务器,用以返回“假的”用户名字。
  那我需要具备什么呢
  
  一台旧电脑(最低要求:486DX2/66 - 32兆内存),配置:
  硬盘500MB以上,软驱
  两张网卡(最好是PCI的,因为这样会自动识别)
  如果有能启动的光驱更佳
  当然内存少于20MB也是可以安装的,但是具体如何做,这就要求好好阅读FAQ的内容了
  在安装过程中还需要一个键盘和显示器。
  已经连通的网络(对无光驱者),最好就是用自己将来使用的DSL线路。
  如果熟悉UNIX类操作系统的和它们的程序,比如*BSD或Linux,会很有帮助。OpenBSD的默认编辑器是vi,我会介绍怎样安装一些容易使用些的编辑器,当然,懂得一点vi的基本操作是没坏处的。
  然后就是耐心、良好的神经和极大的热情(取决于前面的步骤喽,;))
  
  二、安装 OpenBSD 3.2
  在安装过程中的注意事项的一些细节,这儿就不详细说了,关于这方面已经有足够多的资料了(比如安装FAQ或者其它FAQ,当然还有Google。
  用CD安装的话我建议购买OpenBSD的原装盘(也是在 www.openbsd.org )- 甚至单单是因为CD配给酷酷的不干胶标签就值,此外还可以同时用精美的海报和T恤包装一下自己 ;) 当然对此不感冒的或者没有没有支持光盘启动的光驱另作别论,可以从FTP安装。这样也有好处,总是安装最新的版本,只要机器是连网的,通过局网内另外一台机器(其实也就是一台当前的路由),和一张软盘。镜象文件可以到OpenBSD网站下载:floppy32.fs,解开的方法,在Linux或*BSD下:
  # dd if=floppy32.fs of=/dev/fd0 bs=32k
  或者在windows下用 rawwrite.exe 写到一张格式化好的 1.44MB 盘上。
  FTP安装过程中只需要一张网就行了,这张卡得是连外网的,然后放入软盘或光盘,开始吧。
  启动后,经过一长串蓝底白字的文字,出现这样的选项:
  (I)nstall,(U)pgrade or (S)hell? i
  当然我们选“安装(i)”了。之后会问终端类型:
  Specify terminal type [vt220] _
  我们只要按回车就好了。接下来是选择键盘布局:
  Do you wish to select a keyboard encoding table? [n] y
  Select your keyboard type: (P)C-AT/XT, (U)SB or 'done' [P] _
  The available keyboard encoding tables are:
  be de dk es fr it jp lt no pt ru sf sg sv ua uk us
  Table name? (or 'done') [us] de
  keyboard mapping set to de
  选完后会立即生效,这样我们就不用再在键盘上盲人摸象啦(译注:偶们中国人就不用管它,用默认的美式键盘就行了)。接下来有点意思,OpenBSD问我们在怎样的硬盘上安装。
  IS YOUR DATA BACKED UP? As with anything that modifies disk contens, this
  program can cause SIGNIFICANT data loss.
  It is often helpful to have the installation notes handy. For complex disk
  configurations, relevant disk hardware manuals and a calculator are useful.
  Proceed with install? [n] y
  Cool! Let's get to it...
  You will now initialize the disk(s) that OpenBSD will use. To enable all
  avaliable security features you should configure the disk(s) to allow the
  creation of separate filesystems for /, /tmp, /var, /usr, and /home.
  Available disks are: wd0
  Which one is the root disk? (or done) [wd0] _
  
  在这里我假设的是,这台机器只安装OpenBSD,所以用第一块硬盘(wd0)就对了。wdX表示IDE接口的硬盘:wd0 - primary master, wd1 - primary slave, wd2 - secondary master, wd3 - secondary slave. 接下来的问题:
  Do you want to use the *all* of wd0 for OpenBSD? [no] yes
  是否全归OpenBSD使用?当然我就在这里选“是”了。现在我们到了安装过程中较棘手的地方 - disklabels. 与windows或Linux不同的是,*BSD用disklabel来建立“子分区”,不要混淆了。还好,我们这里有且只有一个OpenBSD分区(上面回答“是”后,自动建立的),这个分区我们将用disklabel再划分。在出现提示符后我们用“p”来显示盘上的内容
  Initial label editor (enter '?' for help at any prompt)
  > p
  device: /dev/rwd0c
  type: ESDI
  disk: ESDI/IDE disk
  label: VMware Virtual I
  bytes/sector: 512
  sectors/track: 63
  tracks/cylinder: 15
  sectors/cylinder: 945
  cylinders: 6502
  total sectors: 6144390
  free sectors: 6136641
  rpm: 3600
  16 partitions:
  # size offset fstype [fsize bsize cpg]
  a: 6136641 63 unused 0 0
  c: 6144390 0 unused 0 0
  > _
  我们感兴趣的是的下面的部分,显示的是目前的disklabel(a, c)及它们的大小。这里我们要注意两点
  这里的disklabel(a,b,...)跟M$的盘符一点关系都没有。
  Label “c”总是表示整个硬盘。
  为更合理分盘,现在我们删除目前所有的label(当然除了“c”以外,不过反正我们也删不掉它),在这个例子里我们只要删除“a”就行了(“d a”)。然后我给根分区200MB空间,用“a”分区,接下来100MB交换分区(大约2倍的内存的大小),50MB给“/tmp”,还有50MB“/var”
  > d a
  > a a
  offset: [63]
  size: [6136641] 50m
  Rounding to nearest cylinder: 101997
  FS type: [4.2BSD]
  mount point: [none] /
  > a b
  offset: [102060]
  size: [6034644] 100m
  Rounding to nearest cylinder: 205065
  FS type: [swap]
  > a d
  offset: [307125]
  size: [5829579] 50m
  Rounding to nearest cylinder: 102060
  FS type: [4.2BSD]
  mount point: [none] /tmp
  > a e
  offset: [409185]
  size: [5727519] 80m
  Rounding to nearest cylinder: 163485
  FS type: [4.2BSD]
  mount point: [none] /var
  > a f
  offset: [572670]
  size: [5564034] 220m
  FS type: [4.2BSD]
  mount point: [none] /usr
  > _
  (译注:hmmm.... 好象作者从openbsd网站 copy & paste 过来,但忘记改数据了)
  专门的分区 /tmp 和 /var 我们最好不要舍弃,因为这是放临时文件和日志的地方。如果文件太多太大的超出空间的话,只会影响 /var 或 /tmp,而不会殃及根文件系统。如果硬盘足够大的话,还应该多分给 /var 一些。如果想安装图形界面或者自己编译OpenBSD团队的新东东的话,/usr 还得再大一些(比较合理的上限是2.2G)。剩余的空间可以作为 /home。这里也是后面我们要安装的FTP服务器所使用的分区,如果不想安装FTP的话,可以放心地减小这个分区,甚至不要都可以,空间分配给其它地方。
  > a g
  offset: [1023435]
  size: [5113269]
  FS type: [4.2BSD]
  mount point: [none] /home
  > _
  做完这些,我们再用命令“p”检验一下,应该大致如此
  > p
  device: /dev/rwd0c
  type: ESDI
  disk: ESDI/IDE disk
  label: VMware Virtual I
  bytes/sector: 512
  sectors/track: 63
  tracks/cylinder: 15
  sectors/cylinder: 945
  cylinders: 6502
  total sectors: 6144390
  free sectors: 0
  rpm: 3600
  16 partitions:
  # size offset fstype [fsize bsize cpg]
  a: 101997 63 4.2BSD 1024 8192 16 # /
  b: 205065 102060 swap
  c: 6144390 0 unused 0 0
  d: 102060 307125 4.2BSD 1024 8192 16 # /tmp
  e: 163485 409185 4.2BSD 1024 8192 16 # /var
  f: 450765 572670 4.2BSD 1024 8192 16 # /usr
  g: 5113269 1023435 4.2BSD 1024 8192 16 # /home
  > w
  > q
  
  如果都没问题了,就可以用“w”来写入,用“q”退出。屏幕上还会显示一下建立了哪些分区,挂接点,然后用“done”继续下一步。如果机器上还另外有硬盘,我们还可以依样画葫芦,在这个例子里我们分区就结束了,将要进行格式化。
  No label changes.
  The root filesystem will be mounted on wd0a.
  wd0b will be used for swap space.
  Mount point for wd0d (size=51030k), none or done? [/tmp] _
  Mount point for wd0e (size=81742k), none or done? [/var] _
  Mount point for wd0f (size=225382k), none or done? [/usr] _
  Mount point for wd0g (size=2556634k), none or done? [/home] _
  Mount point for wd0d (size=51030k), none or done? [/tmp] done
  Done - no availiable disks found.
  You have configured the following devices and mount points:
  wd0a /
  wd0d /tmp
  wd0e /var
  wd0f /usr
  wd0g /home
  The next step creates a filesystem on each partition, ERASING existing data.
  Are you really sure that you're ready to proceed? [n] y
  格式化之后会被问,要不要配置网络。(hostname 我们可以自已想一个更漂亮的名字,不一定非得象这里一样用router,不过应该只用小写字母)。
  Enter system hostname (short form, e.g. "foo"): [] router
  Configure the network? [y] _
  If any interface will be configured by DHCP, you should not enter
  information that will be supplied via DHCP, e.g. the DNS domain name.
  Enter DNS domain name (e.g. "bar.com"): [] foobar.privat
  Availiable interfaces are: rl0, rl1.
  Which one do you wish to initialize? (or done) [rl0] _
  设备名 rl0 和 rl1 指的是芯片组厂商(rl 就是著名的全世界最便宜的 RTL8139 芯片,而 de 就是 D-Link,等等)和该类卡的数目。这个例子里使用了两块 RTL8139 芯片的卡。如果你要问,“如果我用同类的卡,我怎样知道哪块是0,哪块是1啊?”,我只能答“不懂哦,我也不知道。”自己试一下就知道了嘛,网线换个位子还是很方便的吧。;)。两块卡的其中之一肯定是要配给内网,另外一块和DSL modem连在一起,什么都不用配置。当然,如果是用FTP安装的话,其中一块卡还是要设定和外网相通的。在这个例子中,我假设,局域网用网段 192.168.1.0/24 以及 192.168.1.1 还未被分配掉。
  Configure which interface? (or, enter 'done') [rl0]
  IP address (or 'dhcp') ? [] 192.168.1.1
  Symbolic (host) name? [router] _
  Netmask ? [255.255.255.0] _
  Done - Avaliable interfaces are: rl1.
  Which one do you wish to initialize? (or done) [rl1] done
  接下来,我们要给出“默认路由”,如果是从光盘安装的话,按预设的“none”回答就可以了,如果是用FTP安装,就得给出网关/路由的IP地址,域名服务器我们填写标准的T-online的就好了。(译注:作者是以T-online作为样本的,下同。其它人最好还是填写自己的提供商的域名服务器)。
  Enter IP address of default route: [none] _
  Enter IP address of primary nameserver: [none] 194.25.2.132
  Would you like to use the nameserver now? [y] _
  Do you want to do more, manual, network configuration? [n] _
  接着要做的事是要想一下管理员密码(*NIX系统下总是叫root),尽量使用复杂的密码,由大小写、数字组成。好的密码比如“eWr43sR6”,相反“gott”或“0815”就很糟糕,当然,这个密码你自己得记得住。;)
  Password for root account (will not echo): <root_passwort>
  Password (again): <root_passwort>
  .....
  Where are the install sets you want to use? (m, c, f, etc.) _
  这个问题当然看你是用什么安装的,“f”表示FTP,“c”表示光盘。如果选了FTP的话,还得从镜象站列表中选择合适的,如果选的是从光盘,还要被问放了光盘的CD-ROM的设备名,如果有多个光驱的话,可能会需要多试几次,如果找对了的话,就会继续下去:
  The following sets are available. Enter a filename, 'all' to select
  all the sets, or 'done'. You may de-select a set by prepennding a '-'
  to its name.
      [X] base32.tgz
      [X] etc32.tgz
      [X] misc32.tgz
      [X] comp32.tgz
      [X] man32.tgz
      [X] game32.tgz
      [ ] xbase32.tgz
      [ ] xshare32.tgz
      [ ] xfont32.tgz
      [ ] xserv32.tgz
      [X] bsd
  File name? (or 'done') [xbase32.tgz] done
  Ready to extract selected file sets? [y] _
  .....
  Extract more sets? [n] _
  Do you expect to run the X Window System? [y] n
  Saving configuration files......done.
  Generating initial host.random file ......done.
  What timezone are you in? ['?' for list] [US/Pacific] UTC
  时区我们之所以先UTC,是因为该机器还要拿来作时间服务器的。接下来的安装就需要等一段时间。安装完毕,取出光盘或软盘,敲入“reboot”,如果一切顺当,机器重启,一直到显示出“login: ”提示符,恭喜你,你的“OpenBSD DSL-Router”的第一步就大功告成了,现在放松一下,然后继续我们的配置工作。
  
  三、"afterboot" 后的配置工作
  系统安装好了,也重启了,我们现在用“root”来登录。为了简化挂接软驱和光驱的工作,我们先建立两个目录。
  # mkdir -p /mnt/cdrom
  # mkdir -p /mnt/floppy
  然后只要在文件 "/etc/fstab" 加入下面两行就行了
  /etc/fstab
     /dev/cd0a /mnt/cdrom cd9660 ro,nodev,nosuid,noauto 0 0
     /dev/fd0a /mnt/floppy msdos rw,nodev,nosuid,noauto 0 0
  之后,我们用 "mount /mnt/floppy" 或 "mount /mnt/cdrom" 就可以挂接软驱和光驱了。
  如果你希望有个简单好用一点编辑器,那我大力推荐 nano,包括下面安装 bash 一样,可以用 "pkg_add nano-1.0.9.tgz" 以及 "pkg_add http://ftp.leo.org/pub/OpenBSD/3.2/packages/i386/nano-1.0.9.tgz"; 安装。(译注:前者适用于光盘,后面适用于FTP。)
  各位如果不是受虐狂的话,我推荐安装bash(borne again shell),我自己反正是没有 TAB 和 光标键是没法活的,;)。公平地说,其实 korn shell “/bin/ksh”也有类似功能 - 只是我不太喜欢。
  i386/OpenBSD 3.2的 bash-2.05b-static.tgz 包可以通过 FTP, SSH, CD-Rom 得到,甚至软盘都行。如果用软盘拷来的话,要注意还原成原有的名字(用正确的名字拷到硬盘上)。之后就可以在相应目录下,用“pkg_add”来安装了。.
  # pkg_add bash-2.05b-static.tgz
  如果是连网的机器,也可以用
  # pkg_add http://ftp.leo.org/pub/OpenBSD/3.2/packages/i386/bash-2.05b-static.tgz ;
  来安装. 因为我们想用 bash 作为我的默认 shell,建议把它从 /usr/local/bin/bash 拷贝到 /bin/bash 下,这样才能一旦不幸机器重启,要进行文件系统检查(或类似情形)时它也能用,因为这种情况下,只有根分区是挂接的,而 /usr/local/bin/bash 就不能用了。
  # cp /usr/local/bin/bash /bin/
  根据安装说明,我在 /etc/shell 中加入 bash
  # echo "/bin/bash" >> /etc/shells
  为了以后使用更美观一点,可以在 /etc/skel/.bash_profile 加入下面的内容
  /etc/skel/.bash_profile
     PS1='\u@\h:\w\$ '
     export PS1
  这样,新建用户总是会在家目录下自动产生 .bash_profile 文件。对现有用户(这儿就是 root 了)手动拷一下(别忘记,用户本人须能够读写这个文件)
  # cp /etc/skel/.bash_profile /root/
  到现在为止,root 还是用 csh 作为默认 shell 的,我们用下面的命令
  # chsh
  把 "Shell: /bin/csh" 改成 "Shell: /bin/bash".
  默认的安装,OpenBSD 会开启一些我们不需要的服务,如果我们不想它启动后自动运行,可以在 /etc/rc.conf.local 中设定
  /etc/rc.conf.local
     inetd=NO
     ntpd=NO
  现在该建立新用户了。单单是为了不想看每次 root 登录时烦人的警告信息的理由,就该这么做。举例我这里建立一个叫 sepp 的用户。
  # adduser
  Couldn't find /etc/adduser.conf: creating a new adduser configuration file
  Reading /etc/shells
  Enter your default shell: bash csh ksh nologin sh [sh]: bash
  Your default shell is: bash -> /bin/bash
  Enter your default HOME partition: [/home]: _
  Copy dotfiles from: /etc/skel no [/etc/skel]: _
  Send message from file: /etc/adduser.message no [no]: _
  Do not send message
  Prompt for passwords by default (y/n) [y]: _
  Default encryption method for passwords blowfish des md5 old
  [blowfish]: _
  .....
  Enter username [a-z0-9_-]: sepp
  Enter full name []: Seppl
  Enter shell bash csh ksh nologin sh [bash]: _
  Uid [1000]: _
  Login group sepp [sepp]: _
  Login group is ``sepp'. Invite sepp into other groups: guest no
  [no]: wheel
  Enter password []: <sepps_passwort>
  Enter password again []: <sepps_passwort>
  .....
  OK? (y/n) [y]: _
  Added user ``sepp'
  Copy files from /etc/skel to /home/sepp
  Add another user? (y/n) [y]: n
  可能你也注意到了,sepp 被归到 wheel 组中去了,这样他就可以用 su 来变成超级用户。如果不希望它有这个权限,只要在相应的地方回答 no 就行了。
  在安装过程中如果是用的FTP方式,你设定了 gateway 和 default route。现在这个已经用不着了,甚至必须去掉,因为它现在自己就要作为 gateway 了。
  在这种情况下,会有一个文件 /etc/mygate 里面是网关的IP地址,不用多想,直接删了它。不用重新启动,default route 也可以手动删除
  # rm /etc/mygate
  # route delete default
  如果想改变机器的IP,最好的用和设备名相对应的文件 /etc/hostname.<device> (比如 /etc/hostname.rl0) 以及相应修改 /etc/hosts。参见 man hosts 和 man hostname.if。修改完后,不需要重启,运行 sh /etc/netstart 就行了。
  至于重新启动后其它设置的相关部分,有心的读者可以看 man afterboot。现在其实已经可以把机器安放停当,显示器和键盘也不再需要了。不过,要提醒一下喜好摆弄防火墙规则的家伙,一不小心就会把自己挡住,然后不得不重新连上显示器和键盘。
  
  四、DSL - 用 pppoe 连网
  建立DSL连接所需的所有程序和驱动都已经在OpenBSD中内建了,所以设置是相当简单的。第二块网卡,没有作任何配置的,现在就应该和DSL-modem相连了。随后,有三个文件需要在 /etc/ppp/ 下建立,ppp.conf, ppp.linkup, ppp.linkdown。这个目录下的其它文件可以不去动它。我们从 ppp.conf 着手:
  /etc/ppp/ppp.conf
  default:
     set log Phase Chat IPCP CCP tun command
     set redial 15 0
     set reconnect 15 10000
  pppoe:
     set device "!/usr/sbin/pppoe -i <interface>"
     disable acfcomp protocomp
     deny acfcomp
     set mtu max 1492
     set crtscts off
     set speed sync
     enable lqr
     set lqrperiod 5
     set cd 5
     set dial
     set login
     set timeout 0
     set authname "<benutzername>"
     set authkey <passwort>
     add! default HISADDR
     enable dns
     enable mssfixup
  这个文件和另外两个文件中的基本上每一行都是有意义的。多一个或少一个空格都有可能造成出错拨号中断。例如关键词“default”和“pppoe”必须在行首顶格写。所以最好把这个例子拷贝到你的机器上,然后做相应修改就好了。
  <interface> 处应该填入与DSL-modem相连的网卡的名称,在这个例子里是 rl1 (整句就是 set device "!/usr/sbin/pppoe -i rl1")
  <benutzername> 填 T-Online 用户名,线路+用户号(大致上看起来这样: 012345678901234567890123#0001@t-online.de - T-Online 号码大于11位的,就不需要#号了)。重要的是,名字必须放在引号中,不然的话会由于#号的关系出问题。
  <passwort> 处填你的密码,T-Online Passwort (据我所知)总是一个8位数(比如:01234567)
  /etc/ppp/ppp.linkup
  MYADDR:
   ! sh -c "/sbin/ifconfig pflog0 up"
   ! sh -c "/sbin/pflogd"
   ! sh -c "/sbin/pfctl -e -F all -f /etc/pf.conf"
  
  ppp.linkup 文件中的命令将在 PPP/DSL 成功连接后被执行。在本例中,首先是初始化 “log interface”,接着log守护进程启动,最后打开防火墙。当然了,因为我们现在还没定义防火墙规则,现在也没什么意义。格式上一定要注意(下面的文件也一样),感叹号“!”前必须要有一个空格,不然,这些行不会被执行。
  /etc/ppp/ppp.linkdown
  MYADDR:
   ! sh -c "/sbin/pfctl -d -F all"
   ! sh -c "kill `cat /var/run/pflogd.pid`"
   ! sh -c "/sbin/ifconfig pflog0 down"
   ! sh -c "/sbin/route delete default"
  类似地 ppp.linkup 还有上面这个文件 ppp.linkdown,它的命令将在DSL连接断开后被执行。首先关掉防火墙,然后停掉 log 守护进程,log interface 停用,最后清除 defaultroute,恢复拨号前的状态。
  现在我们就可以利用下面的命令建立连接了:
  # ifconfig <interface> up media 10baseT
  # ppp -ddial pppoe
  <interface> 指的就是与 DSL-Modem 相连的网卡的设备名。参数 -ddial 告诉 ppp 断线后自动重拨。如果只想拨一次,可以用参数 -background。
  为了使机器开机后就自动直接拨号,我们可以建立下面的文件 /etc/hostname.<interface>
  # echo "up media 10baseT" > /etc/hostname.<interface>
  并在文件 /etc/rc.local 中加入
  /etc/rc.local
     /usr/sbin/ppp -ddial pppoe
  <interface> 当然还是照例指的是相应的设备,DSL 连通,在这台机器上就应该可以连网了(例如:ping www.openbsd.org)局域网内其它机器暂时还不能共享。为了方便配置 client,我们现在要在这台机器上配置域名服务器。
  
  五、缓存域名服务器
  我们要架的域名服务器其实不是正式的name server,而是把请求转发往“真正的”T-online 的name server,因此也就被称为“Caching Nameserver”。此后局域网内的其它机器只要填上我们这台机器的内部IP就可以了。
  在配置文件 /var/named/named.boot 只需要加入下面的行
  /var/named/named.boot
     options forward-only
     forwarders 194.25.2.132 194.25.2.129
  nameserver 就配置好了,用 named -t /var/named -u named 就可以启动。为了使它能够重启后自动运行,需稍稍改动一下 /etc/rc.conf.local
  /etc/rc.conf.local
  inetd=NO
  ntpd=NO
  named_flags=""
  Caching nameserver 结束。到现在为止,我们已经能够上网冲浪了,但是从外界别人还无法连接我们的机器,因为我们的IP地址不固定,这样就需要一个固定的域名来帮助我们达到这个目的,这时就需要用到动态域名了。
  
  六、动态域名 — 时刻能被外界访问
  首先,我们可以在 www.no-ip.com 免费申请一个域名,比如说,my-router.no-ip.com (如果已经在 www.dyndns.org 申请了的,可以看一下我人旧版 HOWTO),如果顺利,很快就可以得到登录名、口令以及可以自己建立 hostname。动态域名服务需要客户端来告知当前的IP是多少,客户端可以用已经预编译好的package安装。
  # pkg_add http://ftp.leo.org/pub/OpenBSD/3.2/packages/i386/no-ip-1.6.tgz ;
  安装完会产生一个配置文件 /etc/no-ip.conf ,我们作一些修改,以适应我们的要求:
  /etc/no-ip.conf
    LOGIN = <loginname>
    PASSWORD = <passwort>
    GROUP = ;
    HOSTNAME = <hostname>
    DOMAIN = <domain>
    DAEMON = N
    PROXY = N
    INTERVAL = 10
    NAT = N
    DEVICE = tun0
  <loginname> 填入注册时用的电子邮件地址
  <passwort> 不用说就是相应的口令了
  <hostname> 只是指 hostname 部分(如本例中即 my-router)
  <domain> 指注册时挑选的域名(这里就是 no-ip.com )
  测试一下能不能正常运行,手工启动程序
  # /usr/local/sbin/noip
  稍等片刻(大约 2-5 分钟),我们用 ping <hostname>.<domain> 来测试是否成功。万一不成功的话,可以在日志文件 /var/log/message 中找到错误信息。如果成功了,我们把它补充到 /etc/ppp/ppp.linkup 中去,以使动态域名总是指向正确的IP。
  /etc/ppp/ppp.linkup
  MYADDR:
   ! sh -c "/sbin/ifconfig pflog0 up"
   ! sh -c "/sbin/pflogd"
   ! sh -c "/sbin/pfctl -e -F all -f /etc/pf.conf"
   !bg sh -c "/usr/local/sbin/noip"
  下面要做的三件事(时间服务器,FTP服务器和identd论证服务器)是可选的,如果不需要的话可以跳过,但是我觉得很实用,所以向你们推荐。
  (译注:国内也有提供相似的服务,并不一定非得要用文中所提及的 noip,关于这个可以网上查有关资料或问 jsn 大哥。)
  
  七、时间服务器
  为使局域网内的所有机器保持准确和一致,比较理想的就是用时间服务器了,开启 ntpd 这个守护进程,客户端用 ntpdate 时刻与时间服务器校对,获取当前的精确时间,以保证本地机器上的时钟准确无误。下面我们来安装在默认安装中没带的 ntpd。因为现在DSL应该是成功安装好了的,所以这后续安装非常方便。只要
  # pkg_add http://ftp.leo.org/pub/OpenBSD/3.2/packages/i386/ntp-4.1.72p1.tgz ;
  就能安装上一个可以正常运行的ntpd了。还要做的就是修改一下配置文件 /etc/ntp.conf ,与internet上哪台服务器校对本地时间。在我这 128.100.102.201 总的说来不错。
  /etc/ntp.conf
     server 128.100.102.201
     driftfile /etc/ntp.drift
  因为机器重启后通过 /etc/rc.conf.local 立即运行 ntp 是有问题的,因此我们自己来建立一个脚本 /etc/ppp/reset_ntp 来运行它
  /etc/ppp/reset_ntp
     #!/bin/sh
     if [ -f /var/run/ntpd.pid ]; then
        kill `cat /var/run/ntpd.pid`
        rm -f /var/run/ntpd.pid
     fi
     /usr/local/sbin/ntpd -p /var/run/ntpd.pid
  用 chmod 500 /etc/ppp/reset_ntp 使 root 加上读和运行这个文件权限,然后在 /etc/ppp/ppp.linkup 再加入一行就行了
  /etc/ppp/ppp.linkup
  MYADDR:
   ! sh -c "/sbin/ifconfig pflog0 up"
   ! sh -c "/sbin/pflogd"
   ! sh -c "/sbin/pfctl -e -F all -f /etc/pf.conf"
   ! sh -c "/etc/ppp/reset_ntp"
   !bg sh -c "/usr/local/sbin/noip"
  现在这台路由器的时钟应该总是能够保持准确的了,配置完成。
  那么局域网内的其它机器怎样通过这台机器来校时呢?在Linux/*BSD下是很简单,只要用ntpdate就好了,把它放入每台机器的crontab这个文件中,例如每半小时校时一次可以这样,root 用命令
  # crontab -e
  修改这个文件,加入这一行
  */30  *  *  *  *   /usr/sbin/ntpdate -u -b -s <ip_des_routers>
  <ip_des_routers> 理所当然就是指的你刚配置好的路由器的IP了(本例中192.168.1.1)。不过它不一定就在/usr/sbin目录下,最好自己用“type ntpdate”或“find / -name ntpdate”检查一下,并作相应修改。
  Windows下也有可以用来同步时间的客户端软件,例如 Automachron 和 AboutTime。在 WindowsXP 下其实已经集成在系统里了,在设置时钟选项里有一条“同步系统时间”,默认的是微软自己的时间服务器,你只要把它改成你的路由器的IP就可以了。
  
  八、FTP服务器
  FTP文本传输协议有个缺点,所有的数据(包括登录名和口令都是用明文传送的,所以应该给FTP服务器专门一个帐号,这个帐号不能也不允许用SSH登录,而其它用户名则加到配置文件 /etc/ftpusers 中,以封掉其FTP的登录权限。在本例中到现在为止我们只有一个叫 sepp 的新用户,我们把它加入 /etc/ftpusers。
  /etc/ftpusers
     sepp
  下面我们新那建一个用户,他应该没有正常登录权限。
  # adduser -silent
  Enter Username [a-z0-9_-]: ftpguy
  Enter full name []: FTP Guy
  Enter shell bash csh ksh nologin sh [bash]: nologin
  Uid [1001]: _
  Login group ftpguy [ftpguy]: _
  Login group is ``ftpguy'. Invite ftpguy into other groups: guest no
  [no]: _
  Enter password []: <ftpguy_passwort>
  Enter password again []: <ftpguy_passwort>
  .....
  OK? (y/n) [y]: _
  Added user 'ftpguy'
  Add another user? (y/n) [y]: n
  这里的<ftpguy_passwort> 处输入你为FTP用户预设的口令,同时要用 chroot 来限制他只能在自己的家目录下活动(非常必要),把他的名字加到 /etc/ftpchroot中去
  /etc/ftpchroot
     ftpguy
  然后,修改 /etc/inetd.conf,把所有的没有注释掉的行用#注释掉,只保留下面这一行(见 man ftpd)。
  /etc/inetd.conf
     ftp     stream tcp   nowait root  /usr/libexec/tcpd    ftpd -US -h -A -l -T 120 -t 60
  手动运行用命令 inetd 就可以了,现在 ftpguy 就已经可以登录FTP了。在 /etc/rc.conf.local 中加入
  /etc/rc.conf.local
     inetd=YES
     ntpd=NO
     named_flags=""
  以使机器启动后自动运行 inetd。
  (译注:个人观点,仅供参考:如果安全要求较高的话,不要采用系统自带的FTP,OpenBSD 自己的FTP站都不用它。有很多更强大、更安全的服务器软件,比如 Pure-ftpd、vsftpd等可以做为选择。)
  
  九、Identd认证服务器
  有些IRC网络(比如DALnet)要求idnetd服务器应答,正常情况下应该是发回聊天者的登记的正式用户名。但是,一来我们不愿这样做,二来也不怎么容易实现(聊天者并未登录到路由器上,而是在局域网内部其它机器的客户端上),所以我们就得用个小窍门。网上有很多“杜撰身份认证服务器”,使用假名字应答,也能通过,彼此都满意。我在下面这个网页找到一个相当不错的软件: http://www.clock.org/~fair/opinion/identd.html ;非常小而且很容易在OpenBSD 3.2下编译,把 identd.c 抓来,放到 /tmp 目录下进行编译:
  # cd /tmp
  # cc -o fake_identd identd.c
  # mv fake_identd /usr/local/libexec/
  编译完毕,拷到 /usr/local/libexec/ 下,在 /etc/inetd.conf 加入fake_identd
  /etc/inetd.conf
    ident    stream  tcp nowait nobody   /usr/local/libexec/fake_identd   fake_identd
  然后需要重新启动 inetd 使配置生效,不要忘记,在 /etc/rc.conf.local 有 inetd=YES 这一行(参见上面 八、FTP服务器)。
  
  十、NAT和防火墙
  我们的路由器现在其实已经有很多功能了,只是路由功能本身还不具备。现在我们把这一功能也加上,用命令行:
  # sysctl -w net.inet.ip.forwarding=1
  这样它就可以转发IP数据包了。为了使它能够在机器启动后直接进入这一状态,我们在 /etc/sysctl.conf dafür 加入
  /etc/sysctl.conf
     net.inet.ip.forwarding=1
  就可以了。
  接下来,我们想要考虑的是,是不是需要能够用主动模式访问外界FTP服务器,有些躲在防火墙后面FTP服务器是强制性必须用主动式。但这样的话,对我们的机器来说就有一点点潜在的安全隐患,因为这样一来,我们必须把大于49151的端口都打开。不过我个人以为,这种程度的“安全漏洞”还是可以忍受的,毕竟它给我们带来莫大的方便。
  如果我们想连接这类只允许主动模式的FTP服务器,就还要扩展一下 /etc/inetd.conf,填入 FTP-proxy:
  /etc/inetd.conf
    8081     stream  tcp  nowait  root   /usr/libexec/ftp-proxy  ftp-proxy
  同样,之后也需重启 inetd。如果 /etc/rc.conf.local 中还没有打开 inetd=YES 把它加上。(参见上面 八、FTP服务器)
  至于防火墙的配置文件在 /etc/pf.conf.
  /etc/pf.conf
     ### 变量 ###
     Ext = "tun0" # 与外界相连的设备名
     Int = "<internes_device>" # 与局域网相连的设备名
     IntNet = "192.168.1.0/24" # 局域网的网段
     RouterIP = "192.168.1.1" # 路由器的IP地址
     Loop = "lo0" # Loopback 本地环回设备名
     # 不被路由的地址
     NoRoute = "{ 127.0.0.1/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 255.255.255.255/32 }"
     # 将被打开的端口
     InServicesTCP = "{ ssh, ftp, auth }"
  
     ### 选项 ###
     # DSL连接的统计数据(pfctl -s info)
     set loginterface $Ext
     # 快速断开非活动状态的连接 - 减少内存消耗
     set optimization aggressive
     # IP碎片重组
     scrub in on $Ext all fragment reassemble
  
     ### NAT 和转发 ###
     # 激活NAT
     nat on $Ext from $IntNet to any -> $Ext
     # 激活 FTP - 转发到我们的 ftp-proxy 代理上
     rdr on $Int proto tcp from !$RouterIP to !$IntNet port 21 -> 127.0.0.1 port 8081
  
     ### 过滤规则 ###
     # 只是用来调试用....
     #pass in quick all # 测试一下允许所有进入的包
     #pass out quick all # 和发出的包
     # 先是总的原则:挡住所有进出的数据包
     block out on $Ext all
     block in on $Ext all
     
     # 我们宁愿一声不吭装聋作哑,;)
     block return-rst out log on $Ext proto tcp all
     block return-rst in log on $Ext proto tcp all
     block return-icmp out log on $Ext proto udp all
     block return-icmp in log on $Ext proto udp all
     # 不需要 IPv6.0
     block in quick inet6 all
     block out quick inet6 all
     # 本地环回允许通过
     pass in quick on $Loop all
     pass out quick on $Loop all
     # 给nmap等扫描器来点难度
     block in log quick on $Ext inet proto tcp from any to any flags FUP/FUP
     block in log quick on $Ext inet proto tcp from any to any flags SF/SFRA
     block in log quick on $Ext inet proto tcp from any to any flags /SFRA
     # 防止IP欺骗
     block in log quick on $Ext inet from $NoRoute to any
     block in log quick on $Ext inet from any to $NoRoute
     # 允许 FTP 主动模式
     pass in quick on $Ext inet proto tcp from any to any port > 49151 user proxy flags S/SAFR keep state
     # 允许被ping(禁止其实也没多大意义)
     pass in quick on $Ext inet proto icmp all icmp-type 8 code 0 keep state
     # 对外界开放的端口
     pass in quick on $Ext inet proto tcp from any to any port $InServicesTCP flags S/SAFR keep state
     # 允许通过由内向外的包
     pass out quick on $Ext all keep state
  这个配置文件你可以完全照搬照抄,只要把<internes_device>改成你自己的与内网相连的网卡的设备名就好了(本例中就是rl0)。其它也许要根据自己的情况改动的地方可能还有:内网的网段(变量$IntNet)、对外界开放的端口(变量 $InServicesTCP)或者路由器的IP地址(变量$RouterIP);如果不需要FTP主动模式的,只要把相应的两行注释掉就好了。
  定制好的规则可以用命令
  # /sbin/pfctl -e -F all -f /etc/pf.conf
  导入,由于我们之前配置 ppp.linkup 时已经加入了这一句,每次拨号以后就能够自动地重新初始化。
  好了,恭喜你,你的 OpenBSD 3.2 路由器现在是万事俱备了,内网的客户机以后只要在gateway和name server栏填上这台机器的内部IP就可以畅通无阻地上网了。
  

原文转自:http://www.ltesting.net