[OpenBSD]

[索引] [第五章 - 从源码构建系统] [第七章 - 键盘与显示控制]

6 - 网络


目录


6.1 - 在深入之前

如果您已经读过或者哪怕是仅仅部分理解了内核配置和创建ifconfig(8)netstat(1)的用户手册, 那么也会对您阅读理解本章的大部分内容会有所帮助。

如果您是一个网络管理员, 而且您正在建立路由协议, 如果您正使用OpenBSD系统作为一个路由器, 如果您需要更深入的了解IP网络, 那么您真的很需要阅读理解IP地址, 这是是一篇极好的文章。它包含了建立IP网络所需的基础知识, 特别是您处理或负责一个以上的网络时。

如果您管理着诸如web服务器、ftp服务器、mail服务器, 您会从reading the RFC上受益匪浅, 极可能您没无法阅读所有的文章, 找几篇您感兴趣的, 或与您工作环境相关的来阅读, RFC详细说明了Internet上很多(数千)种协议的标准及它们应该如何工作的。

6.2 - 网络配置

通常OpenBSD在安装过程中对网络进行了初次配置, 而且很容易让您明白它正在做什么和它如何做。所有的网络配置完成后以纯文本方式存放在/etc目录下。

6.2.1 - 识别和建立您的网络接口

在OpenBSD中接口被指定为网卡的类型而非连接类型, 您可以在启动过程中看到您的网卡被初始化, 或者启动后用dmesg(8)命令查看。您还可以使用ifconfig(8)命令来查看您的网络接口。例如, 这里有一个Intel Fast Ethernet网卡的dmesg输出, OpenBSD使用的设备名是fxp:


fxp0 at pci0 dev 10 function 0 "Intel 82557" rev 0x0c: irq 5, address 00:02:b3:2b:10:f7
inphy0 at fxp0 phy 1: i82555 10/100 media interface, rev. 4

如果您不清楚自己硬件的的设备名, 请参阅您平台下的支持硬件列表。您会发现很多常用网卡以及它们在OpenBSD里使用的设备名。用设备名符号(如fxp)和一个内核分配的数字组合出了您的设备名(如fxp0)。这个数字分配基于不同的标准, 取决于网卡和其它的系统具体细节。 一些网卡的数字代表了它们被总线探测出的顺序, 也有可能是基于硬件资源设置或网卡的MAC地址。

您可以使用ifconfig(8)命令查看那些已经被识别的接口, 下面的命令将显示系统中全部的网络接口, 在本例中仅有一个物理以太接口fxp(4)

$ ifconfig
lo0: flags=8049<UP, LOOPBACK, RUNNING, MULTICAST> mtu 33224
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5
lo1: flags=8008<LOOPBACK, MULTICAST> mtu 33224
fxp0: flags=8843<UP, BROADCAST, RUNNING, SIMPLEX, MULTICAST> mtu 1500
        address: 00:04:ac:dd:39:6a
        media: Ethernet autoselect (100baseTX full-duplex)
        status: active
        inet 10.0.0.38 netmask 0xffffff00 broadcast 10.0.0.255
        inet6 fe80::204:acff:fedd:396a%fxp0 prefixlen 64 scopeid 0x1
pflog0: flags=0<> mtu 33224
pfsync0: flags=0<> mtu 2020
sl0: flags=c010<POINTOPOINT, LINK2, MULTICAST> mtu 296
sl1: flags=c010<POINTOPOINT, LINK2, MULTICAST> mtu 296
ppp0: flags=8010<POINTOPOINT, MULTICAST> mtu 1500
ppp1: flags=8010<POINTOPOINT, MULTICAST> mtu 1500
tun0: flags=10<POINTOPOINT> mtu 3000
tun1: flags=10<POINTOPOINT> mtu 3000
enc0: flags=0<> mtu 1536
bridge0: flags=0<> mtu 1500
bridge1: flags=0<> mtu 1500
vlan0: flags=0<> mtu 1500
        address: 00:00:00:00:00:00
vlan1: flags=0<> mtu 1500
        address: 00:00:00:00:00:00
gre0: flags=9010<POINTOPOINT, LINK0, MULTICAST> mtu 1450
carp0: flags=0<> mtu 1500
carp1: flags=0<> mtu 1500
gif0: flags=8010<POINTOPOINT, MULTICAST> mtu 1280
gif1: flags=8010<POINTOPOINT, MULTICAST> mtu 1280
gif2: flags=8010<POINTOPOINT, MULTICAST> mtu 1280
gif3: flags=8010<POINTOPOINT, MULTICAST> mtu 1280 

您可以看见ifconfig(8)提供了比我们所需要的更为详细信息,可是里面也包括了我们的接口。上面的例子中网卡已经配置成功, 很明显, 因为在fxp0上已经配置了IP网络, 因此可以看到"inet 10.0.0.38 netmask 0xffffff00 broadcast 10.0.0.255"。 同样, UPRUNNING 标记也已经被设置了。

最后, 您会发现默认启用了很多其它的网络接口。这些是为不同功能设置的虚拟接口, 下面的用户手册详细的解释了这些虚拟接口:

接口在启动时被配置, 配置通过设置文件/etc/hostname.if(5) , 其中if会被您的接口的全名所代替, 如上面的例子:/etc/hostname.fxp0

设置这个文件很简单:

address_family address netmask broadcast [other options]
更多关于此文件格式的详细资料在hostname.if(5)的用户手册上. 您需要阅读它以便获取自己的相应的配置。

一个典型的IPv4接口配置文件像这样:

$ cat /etc/hostname.fxp0
inet 10.0.0.38 255.255.255.0 NONE  

这个例子中, 我们定义了一个IPv4(inet)地址, IP地址是10.0.0.38, 子网掩码是 255.255.255.0, 并且没指定广播地址 (系统会默认指定10.0.0.255做为广播地址)。

您也能为以太网指定介质类型, 比方说, 如果您想强制使用100baseTX全双工模式。

inet 10.0.0.38 255.255.255.0 NONE media 100baseTX mediaopt full-duplex

(当然, 您不应强制设置成全双工模式, 除非在双方全设定成此模式的前提下!否则会被拒绝。多数情况下应根据您的设备情况将它设置成10base-T或半双工模式)

或者您打算用一个特殊的标记指定一个接口, 但Hostname文件的格式不会有很大变化!

$ cat /etc/hostname.vlan0
inet 172.21.0.31 255.255.255.0 NONE vlan 2 vlandev fxp1 

6.2.2 - 默认网关

把您网关的IP地址写入文件/etc/mygate中, 这样, 计算机在启动时自动将网关设置成这个IP地址。这个文件只包含了一行内容, 也就是您计算机网关的IP地址:
10.0.0.1
您在这里可以使用一个域名(字符表示), 但是请注意:您不能假设在默认网关配置完成之前域名解析已经全部配置了, 甚至这个域名可能是无法解析的, 换句话说, 这里最好使用一个IP地址或者您预先在/etc/hosts文件里进行设置。

6.2.3 - DNS 解析

DNS解析由文件/etc/resolv.conf控制。例如:
search example.com
nameserver 125.2.3.4
nameserver 125.2.3.5
lookup file bind
这个例子中, 您主机的默认域名是example.com, 有两个DNS服务器分别为:125.2.3.4 和 125.2.3.5, 最后一行"lookup file bind"的意思是指只有在/etc/hosts文件没有指定时才使用这里的nameserver进行解析, 也就是/etc/hosts文件的优先级高于/etc/resolv.conf文件。

在许多Unix(还有很多的non-Unix)系统里全存在一个/etc/hosts文件, 它被用来指定那些不包含(或者不希望让它包含, 可以使用/etc/hosts)在正式DNS服务器内的解析地址, 同样你也可以使用上面说的"lookup"完成。

如果您使用DHCP(Dynamic Host Configuration Protocol, 动态主机配置协议), 您需要阅读6.4 - DHCP并注意 resolv.conf.tail(5)

6.2.4 - 主机名

每台UNIX计算机都有一个名字, 在OpenBSD里主机名被指定为"完全限定域名" (FQDN)保存在文件/etc/myname里, 比如这台计算机名是"OpenBSD", 所在域是"jiarun.org", 那么这台计算机的完全限定域名就是Openbsd.jiarun.com, 您可以在/etc/myname用一行来表示:
OpenBSD.jiarun.org

6.2.5 - 启用新设定

启用新设定您可以重新启动计算机或运行/etc/netstart 脚本。您只需键入(需root身份):
# sh /etc/netstart
writing to routing socket: File exists
add net 127: gateway 127.0.0.1: File exists
writing to routing socket: File exists
add net 224.0.0.0: gateway 127.0.0.1: File exists  

注意这里产生了一些错误信息。这是因为通过运行脚本您重新设定了已存在的网络参数, 同样, 一些路由已经存在于内核的路由表上。这时您的新设定应该开始起作用了。再强调一下, 您可以通过ifconfig(8)检查您的网络接口设定以确保新设定是准确无误的。

虽然您在OpenBSD上您可以重新设定全部的网络参数而不必重新启动计算机就可以启用新设定, 但我们还是强烈建议您在修改了重要的配置后重新启动您的计算机, 原因是启动时和计算机正常运行时环境还是略有不同的, 例如:如果您在文件上用符号名称指定了DNS服务器, 您会发现您新设定的DNS服务器工作正常, 但是当您重新启动后可能会发现外部DNS服务器可能无法使用, 这说明上次的配置是有问题的。

6.2.6 - 检查路由

您可以用 netstat(1)route(8) 检查路由。如果您有路由错误, 您可能需要使用route(8)的–n参数, 这样可以打印出IP地址而不做DNS查询和显示主机名。下面的例子分别用这两个程序查询您的路由表:
$ netstat -rn
Routing tables
Internet:
Destination        Gateway            Flags     Refs     Use    Mtu  Interface
default            10.0.0.1           UGS         0       86      -  fxp0
127/8              127.0.0.1          UGRS        0        0      -  lo0
127.0.0.1          127.0.0.1          UH          0        0      -  lo0
10.0.0/24          link#1             UC          0        0      -  fxp0
10.0.0.1           aa:0:4:0:81:d      UHL         1        0      -  fxp0
10.0.0.38          127.0.0.1          UGHS        0        0      -  lo0
224/4              127.0.0.1          URS         0        0      -  lo0
Encap:
Source             Port  Destination        Port  Proto SA(Address/SPI/Proto)
$ route show
Routing tables
Internet:
Destination      Gateway            Flags
default          10.0.0.1           UG
127.0.0.0        LOCALHOST          UG
localhost        LOCALHOST          UH
10.0.0.0         link#1             U
10.0.0.1         aa:0:4:0:81:d      UH
10.0.0.38        LOCALHOST          UGH
BASE-ADDRESS.MCA LOCALHOST          U  

6.2.7 - 将您的OpenBSD主机设置成一个转发网关

这小节主要讲述把OpenBSD系统设置成一个网关(也被称为路由器)的基础知识。如果您用一台连接在Internet上的OpenBSD主机做路由器, 我们推荐您也阅读下一节中的关于设置包过滤的说明, 以便阻止潜在的恶意通讯。另外, 由于新的网络用户日益增加使网络服务商所能提供的IPv4地址严重不足, 所以您也许想学习一些网络地址转换的的知识以便节省您有限的IP空间。

OpenBSD的标准内核已经内嵌了IP转发功能, 但是这个功能默认是关闭的, 您可以用sysctl(8)工具启用IP转发功能(注意:必须用root启用它):

# sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1  

sysctl(8)命令可以不必重新启动计算机而直接启用IP转发功能, 可是, 一旦您重新启动计算机, 这个功能就失效了。如果要让系统默认启用IP转发功能, 您需要编辑/etc/sysctl.conf文件, 加上一行:

net.inet.ip.forwarding=1

(译者注:为方便您理解, 以上段落调整了原文的部分顺序。)

现在修改两边其它主机上的路由。有很多方法可以把OpenBSD主机设置成一个路由器, 比如利用OpenBSD自己的OpenBGPD, 或 routed(8), mrtd, zebraquagga.等软件, OpenBSD支持ports树中的zebra, quagga, 和 mrtd这些第三方软件包, 而OpenBGPD和routed做为系统组件已经嵌入在系统内了。OpenBSD支持T1, HSSI, ATM, FDDI, Ethernet和serial (PPP/SLIP)这几种网络接口。

6.2.8 - 为网络接口设置别名

(译者注:网络接口别名(network interface aliasing)又称为IP别名(IP aliasing)或逻辑接口(logical interface), 设置网络接口别名可以在一个网络接口上配置(绑定)多个IP地址。 虚拟主机能够在一台计算机上使用单网卡运行多个 Web 服务器。)

OpenBSD为接口的别名设置提供了一种简单的机制, 您只需编辑/etc/hostname.<if>这个文件。在启动时/etc/netstart(8)脚本会读取/etc/hostname.<if>文件的内容, /etc/netstart(8)是rc startup hierarchy的一部分。例如, 我们假设用户在网络192.168.0.0上有一个接口dc0, 其它的重要信息:

这里有一些关于别名的旁注。在OpenBSD里您只使用接口名, 第一个别名和第二个别名之间并无差别。与其它操作系统不同, OpenBSD不把它们称为dc0:0和dc0:1。如果您用ifconfig指定或增加一个IP别名, 不能只在命令行输入"ifconfig int"而要输入"ifconfig int alias", 您可以使用"ifconfig int delete"来删除别名。

假设您用同一个子网内的多个IP地址设置IP别名, 您的每个IP别名的子网掩码要设置成255.255.255.255, 它们不必按照接口上第一个IP地址的子网掩码进行设置, 本例中, 网络接口dc0原来已经设置为IP:192.168.0.2, 子网掩码: 255.255.255.0, 我们编辑 /etc/hostname.dc0 文件, 给接口dc0添加两个IP别名:

# cat /etc/hostname.dc0
inet 192.168.0.2 255.255.255.0 NONE media 100baseTX
inet alias 192.168.0.3 255.255.255.255
inet alias 192.168.0.4 255.255.255.255 

一旦您修改了/etc/hostname.dc0 文件, 您需要重新启动以便让它生效。当然您也可以用ifconfig(8)命令手动添加IP别名, 如:添加第一个IP别名, 您可以使用下面的命令:

# ifconfig dc0 inet alias 192.168.0.3 netmask 255.255.255.255
(再强调一下, 推荐您重新启动系统, 以确保您的修改后所有结果如您所愿!)

要看这些IP别名您应该用命令:

$ ifconfig -A
dc0: flags=8863<UP, BROADCAST, NOTRAILERS, RUNNING, SIMPLEX, MULTICAST>
        media: Ethernet manual
        inet 192.168.0.2  netmask 0xffffff00 broadcast 192.168.0.255
        inet 192.168.0.3 netmask 0xffffffff broadcast 192.168.0.3  

6.3 - 我怎样用OpenBSD作包过滤和防火墙?

Packet Filter(从这里开始我们称之为PF)是OpenBSD社区开发的具有过滤IP通讯和提供网络地址转换功能的系统。PF也能规范和调节网络通讯、提供网络带宽控制、设置传输的优先权限;PF还可以作为强大、灵活的防火墙。关于PF的详细描述参见 PF用户手册

6.4 - 动态主机配置协议(DHCP)

动态主机配置协议用来"自动"配置接口。OpenBSD可以作为DHCP服务器(配置其它计算机的接口), 或者作为DHCP客户端(被其它计算机配置), 而且某些时候OpenBSD可以同时两者兼顾。

6.4.1 - DHCP 客户端

DHCP客户端dhclient(8)包含在OpenBSD中, 如果您想让接口自动获取IP地址, 您可以修改/etc/hostname.xl0, (我这里这里假设您的网络接口是xl0。实际上您的网络接口可能是ep0 、fxp0或其它什么接口名。)您仅需要把‘DHCP’写入hostname文件中:

# echo dhcp > /etc/hostname.xl0

这样就让OpenBSD在启动时自动启用DHCP客户端, OpenBSD会从DHCP服务器那里获得IP地址、默认网关及DNS服务器。

如果您想从命令行启用DHCP客户端, 先要确认/etc/dhclient.conf这个文件存在, 然后:

# dhclient fxp0

这里的fxp0是指您想要用它接收DHCP服务器信息的网络接口。

无论您采用哪种方式启动DHCP客户端, 您都可以通过编辑/etc/dhclient.conf文件, 这样您可以让DHCP服务器的按您的要求更新DNS信息, 首先您需要将'request'那一行前面的注释符去掉(这些是DHCP客户端的默认设置, 去掉注释符才可以应用您自己的设置.)

request subnet-mask, broadcast-address, time-offset, routers, 
   domain-name, domain-name-servers, host-name, lpr-servers, ntp-servers;

然后删除domain-name-servers, 当然, 您也许还想删除hostname或其它的什么。

通过改变dhclient.conf(5)文件里的选项您告诉DHCP客户端怎样建立您的resolv.conf(5)文件。DHCP客户端将会从DHCP上重新获取新的内容并修改原有的内容。因此您可能会因自己修改resolv.conf而丢失部分DNS信息。

这里有两个机制可以有效的防止上述情况的发生:

这个例子是您使用DHCP, 但是您想通过dhclient(8)给resolv.conf(5)附加"lookup file bind"功能。dhclient.conf里并没有这样的选项, 所以您需要使用resolv.conf.tail来添加进去。

# echo "lookup file bind" > /etc/resolv.conf.tail
现在您的resolv.conf(5)文件的最后应该已经加进了"lookup file bind" 的内容。
nameserver 192.168.1.1
nameserver 192.168.1.2
lookup file bind

6.4.2 - DHCP 服务器

如果您想用OpenBSD作为一个DHCP服务器, 参dhcpd(8), 编辑文件/etc/rc.conf.local文件, 使其包含一行内容:

dhcpd_flags="interface"

这里的interface用您想要监听的网络端口替代, 例如:

# echo 'dhcpd_flags="xl1 xl2 xl3"' >>/etc/rc.conf.local

然后, 编辑/etc/dhcpd.conf文件 , 这些选项的含义是不言而喻的。

    option  domain-name "jiarun.org";
    option  domain-name-servers 192.168.1.3, 192.168.1.5;
    subnet 192.168.1.0 netmask 255.255.255.0 {
           option routers 192.168.1.1;
           range 192.168.1.32 192.168.1.127;
        }

这会告诉您的DHCP客户端:添加到DNS的请求域是"jiarun.org"(所以, 如果用户键入’telnet openbsd’, 那么DHCP服务器会把这些请求发送到openbsd.jiarun.org上)。它会把它们指向DNS服务器192.168.1.3和192.168.1.5。安装OpenBSD并使用以太接口的计算机如果处于同一网络内, 它们的IP范围在192.168.1.0/24, DHCP服务器会在192.168.1.32至192.168.1.127范围内给计算机分配一个IP地址。计算机的默认网关会被设置为192.168.1.1。

如果您想从命令行启用dhcpd(8), 编辑完/etc/dhcpd.conf文件, 键入:

# touch /var/db/dhcpd.leases
# dhcpd fxp0 

这里‘touch /var/db/dhcpd.leases’命令的目的是在运行dhcpd(8)先建立一个dhcpd.leases的空白文件。如果您重新启动计算机OpenBSD启动脚本会根据需要自动建立这个文件, 但是因为您是手动启用dhcpd(8), 所以您必须先手动建立这个文件。fxp0是您想启用DHCP服务的接口。

如果您想为Window计算机提供DHCP服务, 您可能需要给客户提供一个'WINS' 服务器的地址。您只需把下面这行添加到/etc/dhcpd.conf文件中:

 option    netbios-name-servers    192.168.92.55;

(这里的192.168.92.55是您的Windows或Samba服务器的IP地址。) 更加详尽的信息请参阅dhcp-options(5)

6.5 - PPP

点到点协议(PPP)通常是用来通过拨号调试解调器与您的ISP建立一个连接。OpenBSD提供两种方法实现这个目的:

ppp 和 pppd 采用不同的方式实现同样的功能。pppd调用内核ppp(4)驱动进行工作, 与之相反ppp在用户级与tun(4)一同工作。这份文档仅涉及用户级PPP守护进程, 因为它的调试更简单, 兼容性更好。进行下一步之前, 您需要了解一些关于您ISP的简单信息, 下面有一份清单:

上面这些有的您不必非要清楚, 但是如果您知道会对您设置ppp有所帮助。 用户级PPP采用/etc/ppp/ppp.conf文件进行配置。在/etc/ppp目录下有很多帮助文件, 它们提供了在很多不同的条件下配置PPP的方案。您应该去了解一下。

为PPP(8) 做初始化设置

初始化设置用户级的PPP进程您需要编辑/etc/ppp/ppp.conf 文件。这个文件默认并不存在, 但是您可以编辑/etc/ppp/ppp.conf.sample 这个文件把它另存为您自己的ppp.conf文件。在这里我们做一个最简单、多数用户适用的初始化过程。下面是一个很简单的ppp.conf文件, 它仅包含了默认的部分核心内容。

default:
set log Phase Chat LCP IPCP CCP tun command     
set device /dev/cua01                           
set speed 115200     
set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"

default:标签下的一小段是每次启动程序时的运行内容。这里我们设置显示所有的关键信息, 用"set log"设置了登录时的显示级别, 你可以修改它:请参考ppp(8)以获取更多的关于登录显示级别方面的信息; 我们的硬件设备通过"set device"进行设置, 本例中调试解调器连接在com 2端口上, 所以您可以看出com 1端口应该用参数/dev/cua00 ;我们用 "set speed"设置拨号的连接速度;"set dial"设置拨号参数, 我们在这里通过它可以调整拨号的持续时间timeout time等,这行一定要有。

下面我们进行下一步, 设置发送给ISP的特定的信息。我们在,default标签下再添加一个标签, 这个标签您可以随便起个名字——你可以简单地使用您ISP的名称。我们在这里用myisp:, 因为标签下面的内容与ISP有关。内容我们输入我们全部连接所需要的信息:

myisp:
set phone 1234567   
set login "ABORT NO\\sCARRIER TIMEOUT 5 ogin:--ogin: ppp word: ppp"
set timeout 120   
set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
add default HISADDR 
enable dns

现在我们已经设置了ISP的基本信息。第一项"set phone"设置了ISP的拨号号码, "set login"这行设置了登录选项, 设置" timeout 5", 意思是如果拨号5秒钟后还没有连上就放弃本次拨号再重新拨号。如果拨号成功程序会等待ISP发入的"login:", 并发出您的用户名和密码。

这个例子中我们的Username = ppp 和 Password = ppp, 读者设置时请自行调整。"set timeout" 设置了全部拨号过程的持续时间为120秒。 "set ifaddr" 这行有点棘手, 这里我们将在这里展开说明。

set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0

上面这行设置时我们遵循"set ifaddr [myaddr[/nn] [hisaddr[/nn] [netmask [triggeraddr]]]]"的格式。第一个IP地址myaddr是指我们想要得到的IP地址, 如果您拥有一个静态的IP地址, 您可以把它设置在这, 本例中我们使用 /0 , 意思是不需要匹配特定的IP地址, 可以接受分配的任何IP地址。第二个IP地址hisaddr是我们期望对方的IP地址, 如果您知道您可以在这里指定它, 因为本例中我们不知道对方是如何分配IP地址的, 所以我们让对方告诉我们。第三个选项是我们的子网掩码, 这里设置成255.255.255.0。如果triggeraddr被指定了, 它通常被放在我们想要的IP地址那个位置进行初始的IPCP协商。不管怎么说myaddr那里只接受真正的IP地址, This is useful when negotiating with some PPP implementations that will not assign an IP number unless their peer requests ``0.0.0.0''.

下面的选项用"add default HISADDR"将我们的默认路由设置为对方的IP, 这项设定是有"粘"性的, 意思是如果对方IP发生了变化, 我们的路由地址也随对方新地址同时更新。用"enable dns"我们告诉我们的ISP验证我们的DNS服务器地址。如果您运行一个本地的DNS服务器就不要设置此项, 因为如果你在/etc/resolv.conf里定义了name server,PPP会采用这里定义的DNS服务器。

很多ISP现在采用CHAP 或者 PAP认证替代传统的登录方式, 如果您的ISP是这样, 我们配置要做一些调整:

myisp:
set phone 1234567   
set authname ppp
set authkey ppp
set login
set timeout 120   
set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
add default HISADDR 
enable dns

上面的例子中, 我们分别用authname指定了用户名为ppp,用authkey指定了密码为ppp,您不必指定采用CHAP 还是 PAP的认证方式, 程序会自动协商, "set login"设定了采用前面指定的用户名和密码的登录。

使用 PPP(8)

现在我们已经设定好了ppp.conf 文件, 我们可以开始连接我们的ISP了, 这里详细说明一下使用PPP过程中的一些常用参数:

如果上面的方法失败了, 您可以无参数运行/usr/sbin/ppp ——它将以交互模式运行PPP, 手动输入所有设定值, 这样可以检查错误或其它问题。建立初始化上面的设置后, PPP将把日志写入/var/log/ppp.log。这个日志文件和用户手册包含了有用帮助的信息。

ppp(8)其它

在某些情况下, 您可能希望在连接或挂断后马上执行某些命令。这里的您可以创建/etc/ppp/ppp.linkup/etc/ppp/ppp.linkdown这两个文件, 正好可以应付这种情况。这两个配置文件的例子看下面:

ppp(8) 变种

目前许多的ISP提供比传统拨号方式更快的xDSL服务, 这里包括ADSL和SDSL。虽然没有物理上的拨号过程发生, 但是连接方式依然是基于PPP(Point to Point Protocol-点到点协议), 例如:

PPPoE/PPPoA

PPPoE——The Point to Point Protocol over Ethernet, 意思是基于以太网的点对点协议, 采用的是通过以太网框架发送PPP数据包的方法。PPPoA——The Point to Point Protocol over ATM, 基于ATM网的点对点协议, 运行于ATM网络中, 英国和比利时采用这种网络。

通常这意味着您可以用一个普通的以太网卡和基于以太网的DSL modem与您的ISP建立连接(反之就用一个USB接口的modem)。

如果您有一个支持PPPoE/PPPoA协议的modem, 您可以直接在modem上直接配置连接。如果您的modem采用桥接模式, 数据经过modem, 到达一台上面有PPPoE软件的计算机上(见下),

OpenBSD上主要的PPPoE/PPPoA软件是pppoe(8), 它是一个用户级的应用程序(和我们上面讨论的ppp(8)很相似)。内核级的PPPoE软件是pppoe(4), 它已经被被嵌入到OpenBSD系统内了。

PPTP

The Point to Point Tunneling Protocol(PPTP)——点到点隧道协议是Microsoft的私有协议。一个pptp客户端可以通过pppd(8)连接上虚拟专用网络。pptp软件必须先通过packagesports安装。更多的关于pptp的信息可以参看随pptp软件同时安装的pptp用户手册。

6.6 - 调整网络参数

OpenBSD系统的一个目标就是让它能够正好适用于我们的绝大多数用户。删除您不明白的组件或功能以求极致地优化系统往往会取得与此相反的效果——让您的系统崩溃。您应该保持系统的默认设置, 除非您发现系统真的存在问题。

只有很少的人需要调节网络参数!

6.6.1 - 我不想让内核随机分配端口时占用某一特定端口

这也是使用sysctl(8)来实现, 从sysctl(8): 设置一份保留的TCP端口清单以便内核动态分配端口时避开这些端口。这样可以防止内核随机分配端口时占用某些特定程序(或服务)使用的端口, 如果有多个保留端口, 要将这些端口用逗号或空格分开:

# sysctl net.inet.tcp.baddynamic=749, 750, 751, 760, 761, 871

也可以从当前保留端口中添加或删除指定端口:

# sysctl net.inet.tcp.baddynamic=+748
# sysctl net.inet.tcp.baddynamic=-871

6.7 - 简易设置NFS

NFS是Network File System缩写, 中文意思是网络文件系统, 是通过网络共享一个目录。在您建立自己的NFS服务器前请阅读下面的一些文档:

这一小节将讨论如何简易设定NFS。这个例子详述了局域网环境下客户端怎样连接到NFS, 我们不在这里讨论NFS的安全问题, 我们假设您已经在Internet接口处设置了包过滤或其它防火墙, 如果您允许从Internet上登录您的NFS, 并且您的NFS上有重要数据, 我们强烈推荐您使用IPsec, 否则其他人可能窥探您的NFS通信, 还有可能伪装成您允许的IP地址进入您的NFS主机。目前有一些攻击方法可能对NFS产生危害, 但是通过合理的配置IPsec可以有效的防止这类攻击。

建立一个NFS 服务器

系统中必须已经启用了下列这些服务:

在OppenBSD中这些服务默认是关闭的。将下列几行加入rc.conf.local(8)中以启用它们:

portmap=YES
nfs_server=YES

接下来是配置客户端可以挂载哪些目录。

这个例子中我们NFS服务器的IP地址为10.0.0.1, 这台服务器仅对其所在子网内的客户端提供服务。我们在/etc/exports文件中进行这些设置, 这个文件列出了NFS可以使用哪些目录, 并定义了谁有权限访问这些目录。/etc/exports文件有很多选项, 您最好先阅读exports(5) 的用户手册。为了举例,我们在这里建立了一个exports文件:

#
# NFS exports Database
# See exports(5) for more information.  Be very careful, misconfiguration
# of this file can result in your filesystems being readable by the world.
/work -alldirs -ro -network=10.0.0 -mask=255.255.255.0

这里指定NFS使用本地,/work目录,-alldirs选项指定客户端可以挂载/work目录及其子目录。例如, 有一个子目录/work/Monday, 客户端可以把/work作为根目录挂载, 也可以把/work/Monday做为根目录挂载。-ro选项指定客户端的访问权限为只读。最后两个参数是指定只有那些位于10.0.0.0网段、子网掩码是255.255.255.0的客户端才可以挂载这些目录。这对那些可以被不同网络访问的服务器来说很重要。

另一个重要的安全注意事项:不要只将一个目录添加到/etc/exports而不建立允许登陆的主机清单, 如果没有设置可以挂载特定目录的主机清单, 也就意味着任何可以连接到NFS服务器的人都可以挂载你的输出目录。

现在您可以启动您的NFS服务器了。您可以重新启动计算机或者手动启用NFS服务。

# /usr/sbin/portmap
# echo -n >/var/db/mountdtab
# /sbin/mountd
# /sbin/nfsd -tun 4

最后一行"/sbin/nfsd -tun 4"中传递给nfsd的这些蓝色选项分别代表着三个含义:启用TCP (-t) 和 UDP (-u)连接, -n 4表示运行4个nfsd进程。这个进程数表示可以同时登录的用户数量。

您现在可以从客户端挂载NFS服务器的输出目录了。

请记住:如果您在NFS服务器运行时将目录更改为/etc/exports, 您要让"mount"(挂载程序)知道您的更改, 使用kill -HUP命令让mount重新挂载新目录。

# kill -HUP `cat /var/run/mountd.pid`

挂载NFS目录

NFS服务器上不用启用额外的服务或守护进程, 客户端可以直接挂载NFS目录, 像挂载其它目录一样。

NFS目录应该通过mount(8)挂载,或者更明确地用 mount_nfs(8)命令挂载, 这里我们把主机10.0.0.1的目录/work挂载到本地目录/mnt上, 输入以下命令(注意:这里您不必一定要使用IP地址,也可以使用域名, mount命令可以解析域名)

# mount -t nfs 10.0.0.1:/work /mnt

如果想在启动时挂载, 在/etc/fstab里面加上如下内容:

10.0.0.1:/work /mnt nfs rw 0 0

这一行命令后面加上的"0 0"是非常重要的, 因为它可以避免您的计算机在启动时fsck(检查和修复) NFS服务器的目录, 还有其它的安全选项, 例如noexec、nodev和 nosuid也应该适当地使用, 例如:

10.0.0.1:/work /mnt nfs rw, nodev, nosuid 0 0

这里的参数表示客户端不能通过NFS服务器上的设备或setuid程序修改服务器的安全措施。如果客户端不需要运行服务器上的程序, 您可以在上面的语句中加入noexec 选项。

如果您在客户端上以root的身份访问挂载的NFS目录, NFS服务器将自动把您在服务器上的身份降为用户名"nobody"和组"nobody", 从安全角度考虑这点是非常重要的。例如:NFS服务器上有一个"99.71"文件, 它的权限如下所示:

-rw-------    1 root     wheel           0 Dec 31 03:00    99.71
(译者注:这里文件99.71的权限设定成仅有root用户可以读写这个文件。)

如果"99.71"这个文件在NFS服务器的共享目录内, 客户端上的root用户要访问这个文件时, 服务器会拒绝来自客户端的访问要求。因为当客户端上的root用户企图登录服务器时, 在服务器上他的身份已经降到了"nobody", 因为在服务器上"nobody"无权读取这个文件, 所以被服务器拒绝了。

您可以通过exports(5)文件指定客户端root用户登录服务器后将被映射为这台服务器上的哪个用户以及属于哪个用户组。

查看NFS的统计信息

确认NFS服务器是否工作正常可以查看是否所有的进程已经在RPC上进行了注册, 使用rpcinfo(8)命令:

$ rpcinfo -p 10.0.0.1
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100005    1   udp    633  mountd
    100005    3   udp    633  mountd
    100005    1   tcp    916  mountd
    100005    3   tcp    916  mountd
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs 

除了一般用rpcinfo(8).查询外, 还有一些工具可以让您查看NFS服务器正在发生什么, 一个就是showmount(8), 它可以让您查询当前哪些目录被挂载, 谁挂载了这些目录。您也可以使用nfsstat(1)命令, 它可以提供更详细的统计信息。showmount(8)命令的使用格式是, /usr/bin/showmount -a host, 例如:

$ /usr/bin/showmount -a 10.0.0.1
All mount points on 10.0.0.1:
10.0.0.37:/work  

这个输出信息显示位于10.0.0.37的客户端上的用户挂载了10.0.0.1服务器上的/work目录。

6.9 - 用OpenBSD建立网桥

网桥负责连接两个或多个独立的网络, 不像路由器, 数据包"无形"地通过网桥——理论上, 由网桥连接的两个不同网段看起来更像是分布在网桥两侧的同一网段的不同节点, 网桥仅传送那些必须从一个网段传输到另一个网段的数据, 它为减少复合网络的流量提供了一个简单的方法并且也允许不同网段间的节点之间在需要时传输数据。

注意因为网桥的这个"无形"特点, 网桥中的一个接口可能有也可能没有它自己的IP地址, 如果它有IP地址, 这个接口就有两种工作模式, 一种是作为网桥的一部分, 另外一种是一个正常的独立的网卡。如果两块接口都没有IP地址, 网桥就允许数据通过, 但不会向外部发送数据(网桥的一个特点)。

一个应用网桥的例子

我的一个计算机架上摆了很多的老式计算机, 它们全没有安装10BASE-TX网卡, 但它们全有一个AUI或AAUI接口, 收发器的连接方式仅限于同轴电缆。在这个架子的上一台计算机是基于OpenBSD的终端服务器, 它总是开机并且连接着高速网络。增加一块有同轴电缆接口的网卡就可以把它做为连接同轴电缆网络的网桥。

现在这台计算机上有两块网卡, Intel EtherExpress/100 (fxp0) 、3c590-Combo card (ep0)——用来连接同轴电缆端口。 fxp0用来连接我其余网络, 因此它有一个IP地址;ep0是桥接专用, 所以没有IP地址。我访问同轴电缆网络内的计算机就像它们在我的其余网络内一样。那么, 我们要怎样做呢?

文件hostname.fxp0里包含了fxp0网卡的配置信息, 这台计算机是通过DHCP分配IP地址的, 所以这的文件看起来像这样:

$ cat /etc/hostname.fxp0
dhcp NONE NONE NONE  

这时文件的配置没有出奇的地方。

也许您可以猜出来, ep0卡有一些不同:

$ cat /etc/hostname.ep0
up media 10base2  

这里我们通知系统使用ifconfig(8)激活这块网卡并把它设置成10BASE-2 (coax)。不用为这块网卡指定IP地址或类似的其它信息, 关于ep卡选项的更多细节, 请参看它的用户手册

现在我们需要建立网桥。网桥的通过一个已经存在的文件, 名字有点像bridgename.bridge0。这里的例子是我的实际环境下的:

$ cat /etc/bridgename.bridge0
add fxp0
add ep0
up  

文件的意思是建立一个由两块网卡fxp0和ep0组成网桥, 并激活它。上面的网卡顺序有规矩吗?没有, 记住一个桥是非常对称的——数据包在双向流通。

好了! 重新启动, 您现在已经拥有一个正常运行的网桥了。

网桥过滤

尽管这个网桥很简单,但您可能也想进行过滤以便控制通过网桥的数据包。正如你希望的那样 ,你可以使用Packet Filter来限制哪些数据可以通过您的网桥。

别忘了网桥的特点, 两个接口通过同样的数据流, 所以您只需过滤一个接口的数据流。您默认的"Pass all"语句可能像这样:

pass in  on ep0  all
pass out on ep0  all
pass in  on fxp0 all
pass out on fxp0 all

现在, 比如说我希望过滤对老机器的网络数据包的冲击, 我只想让Web和SSH通讯传送到老机器那里。这个例子中我们要放行所有进出ep0的数据包, 但是过滤通过fxp0的数据。用reply参数处理回应信息:

# Pass all traffic through ep0
pass in quick on ep0 all
pass out quick on ep0 all
# Block fxp0 traffic
block in  on fxp0 all
block out on fxp0 all
pass in quick on fxp0 proto tcp from any to any port {22, 80} \
     flags S/SA keep state

注意在这里只允许做为网桥的计算机或它"后"面的节点与老机器之间的HTTP和SSH通讯, 除此以外限制任何通讯。还有就是限制了通讯使用的接口。

监控已经建立的网桥使用brconfig(8)命令, 这个命令也可用作在重新启动后建立一个网桥。

网桥的技巧

6.10 - 我怎样用PXE启动? (i386, amd64)

预启动执行环境(Preboot Execution Environment)也称PXE, 是一种通过网络启动计算机的方法。这种技术最先由Intel开发出来, 但是目前大多数网卡和计算机生产商已经支持这种技术了。注意, 有几种不同的网络启动协议, PXE相对来讲是比较新的技术, 传统上PXE启动是通过网卡或计算机主板上的ROM(只读存储器)完成的, 但是软盘因为可以包含不同的内容也同样允许PXE启动。很多旧的网卡的ROM支持网络启动, 但是不支持PXE;OpenBSD/i386 或 amd64目前不支持使用这些老网卡从网络启动。

PXE是如何工作的?

首先要清楚在i386和amd64平台上OpenBSD是怎样启动的。在开始启动前, 这台计算机上的具有PXE功能的网卡通过网络广播(发出)一个DHCP请求, DHCP服务器将分派一个合适的IP地址, 并提供一个tftp(1)服务器上文件名, 以便这台计算机下载并执行。这个文件负责余下的启动过程。对OpenBSD来说, 这个文件是pxeboot, 它取代了标准的标准的启动文件boot(8)。pxeboot(8)现在就可以从那台tftp(1)服务器引导并运行一个内核(例如bsd 或者 bsd.rd)。

我该怎样做?

首先显而易见您必须有一个支持PXE启动的计算机或网卡, 有些文档说现代的所有网卡和计算机全具备PXE能力, 但实际不是这样——许多廉价系统不包含PXE ROMS或者使用老的网络启动协议。另外您还需要正确的设置DHCP和TFTP 服务器。

我们假设由一台OpenBSD计算机提供启动文件(不是必须这样)。您的DHCP服务器的dhcpd.conf文件需要包含下面这行:

    filename "pxeboot";
需要DHCP服务器提供那个文件给待启动的计算机, 例如:
    shared-network LOCAL-NET {
            option  domain-name "example.com";
            option  domain-name-servers 192.168.1.3, 192.168.1.5;
            subnet 192.168.1.0 netmask 255.255.255.0 {
                    option routers 192.168.1.1;
                    filename "pxeboot";
                    range 192.168.1.32 192.168.1.127;
                    default-lease-time 86400;
                    max-lease-time 90000;
            }
    }

您也需要启用tftpd(8)服务. 它一般通过inetd(8)来执行。OpenBSD

默认情况下在inetd.conf文件里已经为您准备好了一行:

    #tftp  dgram   udp  wait  root  /usr/libexec/tftpd   tftpd -s /tftpboot

这里您只需去掉"#"并且发给inetd(8)一个 -HUP 指令让它重新读取自己的配置文件/etc/inetd.conf。tftpd(8) 服务器将文件存在在一个特定的目录, 这个例子中我们使用的是/tftpboot这个目录。很显然您需要先建立这个目录并拷入启动所需文件, 一般来说PXE启动只需很少的文件:

注意/etc/boot.conf文件仅在启动的内核不以bsd命名时才需要,或者默认的pxeboot不是您希望的时候才需要(例如你想使用控制台), 还有可能基本就不需要 (例如您想使用串口控制台)。 您应该先用tftp(1)客户端测试您的tftpd(8)服务器以确保这些文件可以正常下载。

当您的DHCP和TFTP服务器正常运行时, 您要先启用系统或网卡上的PXE功能, 请参看您系统的相关文档。一旦您设置完毕, 您可以看见类似下面的信息:

    Intel UNDI, PXE-2.0 (build 067)
    Copyright (C) 1997, 1998 Intel Corporation
    For Realtek RTL 8139(X) PCI Fast Ethernet Controller v1.00 (990420)
    DHCP MAC ADDR: 00 E0 C5 C8 CF E1
    CLIENT IP: 192.168.1.76  MASK: 255.255.255.0  DHCP IP: 192.168.1.252
    GATEWAY IP: 192.168.1.1
    probing: pc0 com0 com1 apm pxe![2.1] mem[540k 28m a20=on]
    disk: hd0*
    net: mac 00:e0:c5:c8:cf:e1, ip 192.168.1.76, server 192.168.1.252
    >> OpenBSD/i386 PXEBOOT 1.00
    boot>  
这时您看见了一个标准的OpenBSD启动提示符"boot>" , 您只需在它后面简单的输入"bsd.rd" , 您就能从TFTP服务器上获得这个bsd.rd文件 。
    >> OpenBSD/i386 PXEBOOT 2.03
    boot> bsd.rd
    booting tftp:bsd.rd: 4375152+733120 [58+122112+105468]=0x516d04
    entry point at 0x100120
    Copyright (c) 1982, 1986, 1989, 1991, 1993
            The Regents of the University of California.  All rights reserved.
    Copyright (c) 1995-2008 OpenBSD.  All rights reserved.  http://www.OpenBSD.org
    OpenBSD 4.5 (RAMDISK_CD) #1112: Sat Feb 28 15:06:26 MST 2009
现在bsd.rd安装内核就将启动了。

我能用PXE启动其它的内核吗?

没问题, OpenBSD 包含这些工具, PXE启动的主要目的是安装操作系统。

6.11 - 通用地址冗余协议(CARP)

6.11.1 - 什么是通用地址冗余协议及其如何工作?

CARP是一个通过在多台计算机中产生一个虚拟网络接口来帮助系统完成冗余的工具, 所以如果有计算机宕机其余的立刻上来顶替, 而且/或者在一定程度上均分了系统负载。CARP是一种改进了的虚拟路由冗余协议(VRRP)标准。因为VRRP有可能与Cisco的部分专利有重叠, 所以被认为不是完全自由的。 此后CARP继续独立发展, 有关CARP的起源以及围绕VRRP的法律问题, 请参阅自行参阅相关文档

为了避免法律纷争, Ryan McBride在Michael Shalayeff、 Marco Pfatschbacher和 Markus Friedl的帮助下, 重新设计了CARP, 使它与原来相比有了根本上的不同。CARP的密码系统进行了重大的改进, 但这只是它许多改进中的一小部分。

它是如何工作的: CARP采用组播协议。它用多台物理计算机组成一个或多个虚拟的服务地址。在这些计算机中由一台计算机作为主力计算机接受和发送的所有数据信息, 其它的计算机充当热备份。无论物理计算机的IP和MAC地址是什么, 发送给CARP的数据包得到的回馈全是CARP的虚拟地址数据信息。

在设定的时间间隔内, 主力机公告它工作在112号因特网IP协议上。如果主力机宕机, 其它在CARP组内的计算机就开始公告。公告最频繁的那台热备份计算机这时就升级为新的主力机, 当原来的主力机恢复后,这台新的主力机就又变回了默认的热备份计算机。热备份计算机可以在需要的时候升级为新的主力机这点是很重要的(例如一台计算机是很快的Sun Fire V120, 其余的是比较慢的SPARCstation IPCs), 您可以这样配置它们。

CARP需要高冗余度和最少量的容错, 如果系统硬件没有发生容错那么系统就有能力处理诸如某人不慎踢掉了电源线或者系统管理员在错误的窗口输入了重新启动命令。CARP在处理诸如安装补丁、不间断服务而重新启动计算机、以及测试软件或硬件升级时也很得心应手——如果主力机有问题时热备份就先顶上来 直至主力机被修复。

(译者注:
这段实在是搞得我头大, 无论自己的理解或是英文网站上查询的fault tolerance(容错)或fault-tolerant的含义还是中文网站上对容错的解释, 更多是指一种包容错误的能力, 但这个解释在原文里就不通顺了。后来查询了一个英文网站, 才知道fault tolerance(容错)还有另外一个意思——系统或部件崩溃前的错误数量。所以上面的容错请读者理解为错误(系统可以包容的), 但愿我没有误解作者的意思, 欢迎大家指正。
以下是原文:
While highly redundant and fault-tolerant hardware minimizes the need for CARP, it doesn't erase it. There's no hardware fault tolerance that's capable of helping if someone knocks out a power cord, or if your system administrator types reboot in the wrong window. CARP also makes it easier to make the patch and reboot cycle transparent to users, and easier to test a software or hardware upgrade--if it doesn't work, you can fall back to your spare until fixed.
以下是字典查询的解释:
fault tolerance architecture1. The ability of a system or component to continue normal operation despite the presence of hardware or software faults. This often involves some degree of redundancy.2. The number of faults a system or component can withstand before normal operation is impaired.(1995-04-06)
)

然而CARP也有不足之处。CARP的设计确实要求这组计算机处于同一个物理子网内并且有固定的IP地址, 尽管carp设备的说明中并未对物理接口的IP地址有更多的要求。同样那些需要与服务器有固定连接的服务(例如SSH或IRC)将不能直接地传输到其它的计算机——虽然在这个例子中, CARP可以最小化服务器的停机时间。CARP自己并不同步应用之间的数据, 有两个"渠道"都可以完成这项任务:pfsync(4) (提供冗余过滤);在计算机间手动复制数据可以用rsync, 或者随便使用什么顺手的工具。

6.11.2 - 配置

从两个地方可以控制CARP:sysctl(8)ifconfig(8)。我们先看sysctl的:

第一, sysctl的net.inet.carp.allow选项定义了是否让主机处理所有的CARP数据包, 显而易见, 这是使用CARP必需的,sysctl默认开启了这个选项。

第二, net.inet.carp.arpbalance选项的用途是负载均衡, 默认关闭。i如uoqiyonglezhege选项, CARP则source-hash请求的源IP地址,hash然后就会从池中选择一台虚拟主机处理请求。默认情况下这个选项没有启用。

第三, net.inet.carp.log选项记录CARP 错误, 默认没有启用这个选项。

第四, net.inet.carp.preempt选项,这个选项启用后将在CARP计算机中自然选择最适合(这里指公告最频繁的)的计算机将成为主力机。默认没有启用这个选项, 也就是说热备份计算机不(再)会自动成为主力机。

所有这些sysctl设置请参阅 sysctl(3).

我们通过ifconfig(8)来完成剩余的CARP配置。CVRP的专用命令advbaseadvskew用来设置公告间隔时间, 公式(以秒计)为advskew/256+advbaseadvbase可以减少网络流量或设置更长的主力机"轮循"时间(直至备份机来顶替它);advskew设置哪台热备份计算机在故障转移时优先成为主力机(这是必需的)。

接下来, pass设定一个密码, vhid设定CARP虚拟机的群组编号, 虽然虚拟机群组共享一个IP地址(负载均衡的目的), 但您仍然需要为每个群组设定唯一的编号。CARP最多可以有255群组。

最后, carpdev指定一个物理接口作为该群组指定的使用接口, 默认情况下该群组位于同一子网内的任何网络接口全可以做为该群组的指定使用接口。

我们将所有这些设定组合为一个简单的配置, 假设我们公司部署两台相同配置的Web服务器rachael (192.168.0.5) 和 pris (192.168.0.6)用来取代一个位于192.168.0.7的老系统, 先从rachael开始, 命令是:

rachael# ifconfig carp0 create
rachael# ifconfig carp0 vhid 1 pass tyrell carpdev fxp0 \
 192.168.0.7 netmask 255.255.255.0

产生carp0接口并把它的群组编号vhid设为1, 它的密码是tyrell、 IP地址是192.168.0.7、子网掩码是255.255.255.0。指定fxp0为该群组指定使用接口。您建立一个/etc/hostname.carp0文件, 有了它您只要重新启动计算机就可让设定永久生效, 文件像这样:

inet 192.168.0.7 255.255.255.0 192.168.0.255 vhid 1 pass tyrell carpdev fxp0

注意这行里指定了广播地址、vhid(群组编号)和密码。不做这个步骤会产生错误, 因为CARP运行需要这个文件。

pris进行同样的操作, 一台计算机必须指定为主力机, 它的网络接口才可成为群组使用接口(这里假设没有指定优先成为主力机的计算机;如果您指定了优先计算机就不用这样做了)。

但是pris的操作并不能像rachael那样从头开始, 因为Rachael 已经占用了192.168.0.7。那您怎样处理呢?幸运的是CARP可以处理这种情况, 您不用提供一个真实的IP地址, 只需指定为`carpdev'关键字。所有计算机使用一个IP地址显得更整齐——这样让监视和访问变得更简单。

我们再增加一点难度, 我们让rachael尽可能地充当主力机。这里有几个可能的 原因:硬件上的差别, 或只是个人喜好 ——例如:如果rachael计算机不能成为主力机的话, 肯定这里面有问题", 或众所周知的默认主机没有执行分析或邮寄的脚本。(译者注:这是作者杜撰的理由。读者不必深究。)

我们在rachael上继续操作, 我们使用前面生成的sysctl, 然后编辑/etc/sysctl.conf文件, 使它永久生效。

rachael# sysctl net.inet.carp.preempt=1

在pris上我们也要输入一些内容:

pris# ifconfig carp0 advskew 100

(译者注:advskew是用来设定公告时间间隔的, 见上面描述。)

这里稍微延迟了一下pris的公告时间, 意思是只要rachael不宕机将永远是主力机。

这里注意一下, 如果您在CARP的计算机上使用了PF, 您必须在所有与CARP有关的网络接口上允许carp协议通讯, 例如在PF的配置文件里加入像这样的一行:

pass on fxp0 proto carp keep state

6.11.3 - 负载均衡

就在几个月以后, 我们公司(上小节提到的)发展到要求仅用一个内部web服务器实现负载管理, 怎么办好? CARP能帮助您。我们正好尝试一下负载均衡。我们在rachael上建立一个新的CARP接口和组:

rachael# ifconfig carp1 create
rachael# ifconfig carp1 vhid 2 advskew 100 pass bryant \
carpdev fxp0 192.168.0.7 netmask 255.255.255.0

pris那里, 我们同样要建立新的组和接口, 然后设定"preempt" sysctl:

pris# ifconfig carp1 create
pris# ifconfig carp1 vhid 2 pass bryant carpdev fxp0 、
 192.168.0.7 netmask 255.255.255.0
pris# sysctl net.inet.carp.preempt=1

现在我们有使用同一个IP地址的两个CARP组, 而且每个组都对都倾向于不同的主机 , 也就是说rachael充当本组的主力机, 而pris则是另一个新组的主力机。

现在我们仅需要在两台计算机中使用sysctl启动负载均衡, 就像我们前面讨论的那样:

# sysctl net.inet.carp.arpbalance=1

虽然这些例子仅是对两台计算机的集群进行了负载均衡, 但是此方法同样适用于多台计算机的环境。请注意, 这不是您期望的两台机器各承担50%的负载的完美方案——CARP使用一个原始IP地址的哈希来判断由那台主机处理请求, 而不是机器的负载。

6.11.4 - 更多关于CARP的信息

6.12 - OpenNTPD

精确的时间对很多计算机程序来说十分重要, 很多人发现5美金的手表比2000美金的计算机的时间更精确。除了知道时间外, 精确的时间对同步计算机也很重要。有段时间ntp.org 提供了一个网络时间协议(RFC1305, RFC2030)应用程序, 您可以通过ports得到它, 它被用来通过Internet同步您计算机的时钟。不过它不是一个平常的程序, 它的代码不易审查, 并且在运行时需要占用大量的内存。总之, 对某些人来说它担当了重要的角色, 但是它还远远不能解决所有人的问题。

OpenNTPD就是为了在某些方面解决这些问题的做的一个尝试, 提供一个方便管理的、安全的和简单的NTD兼容方式来使您计算机拥有精确的时间。控制OpenBSD的ntpd(8)的是通过文件/etc/ntpd.conf配置的, 它很简单, 您很快就能上手。

pool.ntp.org服务器是一个虚拟的世界时间服务器集群。ntpd(8)可以使您的计算机时钟逐渐缓慢地与pool.ntp.org服务器上的标准时间同步, 您只需通过rc.conf.local文件就可以激活ntpd(8), 一旦您的计算机时钟被精确设置, ntpd 将使它保持高度精确, 然而如果您的计算机时钟误差大于几分钟, 我们强烈推荐您在最初把它调整成尽量精确的时间, 因为误差很大的时钟往往要花上几天或几周的时间才可以成功同步。您最初可以用ntpd(8) "-s"选项或其它什么方法精确设置您的计算机时钟。

6.12.1 - "但是OpenNTPD 不如ntp.org 上的服务器精确!"

这也有可能。那不是OpenNTPD的设计目标, OpenNTPD必须是自由、简单、可靠、安全的。如果您更在意微秒级的精密度而不是OpenNTPD长处, 随便您去用ntp.org的ntpd好喽, 您可以在ports树和package里找到它。我们目前没有计划用花哨的新功能把OpenNTPD"肿"起来。

6.12.2 - "有人宣称OpenNTPD 是 '有害的'!"

有些人还没有明白OpenNTPD的设计目标——用一个简单、安全、方便管理的方式精确您的计算机时钟。如果时间精确很重要, 许多用户报告OpenNTPD比 ntp.org的ntpd更好用;如果安全很重要, OpenNTPD的代码更易读(因而更便于审核), 并且代码中调用的是OpenBSD"自己"的函数, 如:strlcpy, 而不是portable function像strcpy, 还有在开始写代码时已经考虑了安全, 而不是"用户使用以后才考虑安全";如果让更多的人同步时间是有意义的, 对绝大多数人来说OpenNTPD更容易使用。如果这是"有害"的, 我们完全认同这种"有害"。

有一些应用软件与ntp.org的ntpd搭配更适合;然而, 对绝大多数用户来说OpenNTPD已经绰绰有余了。

OpenNTPD 的维护人员对这个宣称的更完整的回应可以在这里读到。

6.12.3 - 为什么我其余的计算机不能与OpenNTPD同步?

ntpd(8)默认并不监听任何地址。所以如果想把它当成server使用, 您需要在/etc/ntpd.conf文件中把"#listen on *"这行前面的注释符去掉并且重新启动ntpd(8)服务。当然了, 如果您不想监听所有可能的地址或接口, 而是一个指定的IP地址, 您就用那个IP地址替换"*"。

当您开启ntpd(8)的监听功能后, 也许还有其它计算机无法同步!一个刚运行的ntpd(8)服务(例如:您刚修改完ntpd.conf, 并重新启动了ntpd)拒绝为其它客户端提供时间信息, 直到它首次把自己的时间调整成合理的稳定状态, 当ntpd(8)认为自己的时间信息稳定后, 它会在/var/log/daemon文件里发布一个信息"clock now synced"。即使ntpd(8)刚开始运行时计算机时钟十分精确, 它也会继续用10分钟左右确保自己同步, 还有在开始时如果时钟偏差很大, 同步过程可能会用几天或几周。

6.13 - 我可以选择哪些无线网络设置?

OpenBSD支持一系列无线芯片集: (AP) 说明这块无线网卡可以作为一个无线接入点。
(NFF)说明芯片需要一个并非自由的固件, 这个固件不能包含在OpenBSD中。

基于这些芯片的适配器也像这些适配器一样把OpenBSD连接到现有的无线网络上, 配置这些适配器使用标准的ifconfig(8)(更详尽的细节请参看用户手册)命令。这些网卡中有一些也可以成为您防火墙的一部分工作在"基于主机的接入点"模式下。

注意为了使用某些网卡您需要得到这些网卡的固件文件, 这些固件文件由于制造商拒绝自由再发行, 所以无法包含在OpenBSD里面, 如果可能, 用户手册列出了以上链接和制造商联系信息, 您可以联系制造商的相关人员, 让他们明白您对此事的感受, 或者告诉他们您已经买了什么什么品牌的网卡替代了他们的产品。

用基于OpenBSD的防火墙提供无线接入点时另一个可考虑的选择是采用一块通用的网卡及一个外部的无线网桥接入点。这可使您更加方便地将天线布置在最佳位置而非直接处于防火墙之后。

6.14 - 如何配置等价多路径路由?

等价多路径路由是指在同一个网络内的路由表上存在多个路由, 就像默认路由0.0.0.0/0这样的。当内核进行路由查找时决定从哪里把数据包发送到那个网络, 它可以从等价路由中任意挑选一个。在多数情况下多路径路由被用来提供冗余的出站连接, 例如冗余的Internet连接。

route(8)命令用来添加/修改/删除 路由表中的路由。-mpath 选项被用来添加多路径路由。

# route add -mpath default 10.130.128.1
# route add -mpath default 10.132.0.1

校验路由:

# netstat -rnf inet | grep default
default     10.130.128.1      UGS       2      134      -     fxp1
default     10.132.0.1        UGS       0      172      -     fxp2 

这个例子中我们能看见一个默认路由指向了IP地址为10.130.128.1的fxp1接口, 另一个指向了10.132.0.1的fxp2接口。

因为mygate(5)文件还不支持多路径默认路由, 上面的命令应该加入到fxp1和fxp2接口hostname.if(5)文件的底部。然后再把/etc/mygate文件删除。

/etc/hostname.fxp1
!route add -mpath default 10.130.128.1
/etc/hostname.fxp2
!route add -mpath default 10.132.0.1

最后, 别忘了通过启用sysctl的相关选项来启用多路径路由。

# sysctl net.inet.ip.multipath=1
# sysctl net.inet6.ip6.multipath=1

确认您已经编辑了sysctl.conf(5)以便这些更改永久生效。

现在您可以使用traceroute命令试试不同的地址。内核将平衡经过每个多路径路由的流量。

# traceroute -n 154.11.0.4
traceroute to 154.11.0.4 (154.11.0.4), 64 hops max, 60 byte packets
 1  10.130.128.1  19.337 ms  18.194 ms  18.849 ms
 2  154.11.95.170  17.642 ms  18.176 ms  17.731 ms
 3  154.11.5.33  110.486 ms  19.478 ms  100.949 ms
 4  154.11.0.4  32.772 ms  33.534 ms  32.835 ms
# traceroute -n 154.11.0.5
traceroute to 154.11.0.5 (154.11.0.5), 64 hops max, 60 byte packets
 1  10.132.0.1  14.175 ms  14.503 ms  14.58 ms
 2  154.11.95.38  13.664 ms  13.962 ms  13.445 ms
 3  208.38.16.151  13.964 ms  13.347 ms  13.788 ms
 4  154.11.0.5  30.177 ms  30.95 ms  30.593 ms  

更多关于怎样选择路由的信息请参看 RFC2992, "Analysis of an Equal-Cost Multi-Path Algorithm".

值得注意的是如果一个多路径路由使用的接口有故障(例如, 丢包), 内核仍然会根据这个多路径路由的指向尝试往那个接口上发送数据包, 这些数据包肯定不能抵达目的地并会消失得无影无踪。所以这里我们强烈推荐使用ifstated(8)检查出有问题的接口的, 并据此调整路由表。

[索引] [第五章 - 从源码构建系统] [第七章 - 键盘与显示控制]


[back]www@openbsd.org
$OpenBSD: faq6.html, v 1.272 2009/01/30 22:25:57 sthen Exp $