上一页
建立你自己的内核
OpenBSD FAQ 第六章:网络
下一页
键盘和显示控制

6-网络
6.1-在深入之前
如果你已经阅读甚至部分的理解本FAQ内核配置和设置部分,以及ifconfig(8)和netstat的手册页,那么是十分有利于本文档的阅读的。

如果你是一名网管,并且你要设置路由协议,如果你使用的是OpenBSD做路由器,而且你还深入的理解IP网络。你就非常需要去阅读"Understanding IP Addressing".这是一个非常好的文档。"Understanding IP Addressing"包含了建立IP网络的基础知识,特别是当你处理或者负责多于一个的网络时。

如果你天天和web服务器、ftp服务器和mail服务器等打交道,你就需要阅读RFCs.当然,你或许并不要求阅读所有这些。选择一些你感兴趣的,或者你的环境所使用的。搜索,并找出他们如何工作。RFCs定义了许多Internet上的协议标准和对他们的支持。

6.2初始化网络设置
6.2.1识别并设置你的网络界面(Interface).

首先,你必须识别出你的网络界面。在OpenBSD里面,界面是以卡的类型而非连接的类型来命名的。你可以在启动的时候看到你的网卡已初始化好了,或者在启动后用dmesg命令进行查看。你也可以用ifconfig命令来查看你的网络界面。比如,先面是Intel Fast Ethernet网卡的dmesg输出。其设备名为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).

通过ifconfig工具,你可得知系统识别出了什么网络界面。下面的命令将会显示出你系统上的所有网络界面。此例的输出仅显示了一个物理以太界面,一个fxp4:
$ ifconfig -a
lo0: flags=8049 mtu 33224
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5
lo1: flags=8008 mtu 33224
fxp0: flags=8843 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 mtu 296
sl1: flags=c010 mtu 296
ppp0: flags=8010 mtu 1500
ppp1: flags=8010 mtu 1500
tun0: flags=10 mtu 3000
tun1: flags=10 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 mtu 1450
gif0: flags=8010 mtu 1280
gif1: flags=8010 mtu 1280
gif2: flags=8010 mtu 1280
gif3: flags=8010 mtu 1280

在此你可看到,ifconfig给出了比我们所要的更多的信息。但是,它还是让我们看到了我们的界面。在上例中,该界面卡已经被配置好了。这是很明显的,因为fxp0上已经配置好了一个IP网络,其值为inet 10.0.0.38 netmask 0xffffff00 broadcast 10.0.0.255".此外,UP和RUNNING标记也设置了。

最后,你会注意到默认还列出了其他一些界面。它们都是些提供不同功能服务的虚拟界面。下面的手册页有它们的描述:
lo-回环界面(Loopback Interface)
pflog-包过滤记录界面。
sl-SLIP网络界面
ppp-点到点协议
tun-通道网络界面
enc-Encassulating界面
bridge-以太桥界面
vlan-IEEE 802.1Q Encapsulation界面
gre-GRE/移动IP Encapsulation界面
gif-通用Ipv4/Ipv6通道界面

如果你的界面没有被配置好,你首先要做的是创建/etc/hostname.xxx文件,其中xxx就是你的界面名。从上例的信息我们可以知道,该名字应该为/etc/hostname.fxp0.此文件的形式就简单为:
address_family address netmask broadcast [other options]
(此文件格式的更多信息请查阅hostname.if的手册页)
配置一个Ipv4地址的典型的界面文件,就像下面的文件一样:
$ cat /etc/hostname.fxp0
inet 10.0.0.38 255.255.255.0 NONE

 你也可以为以太网卡指定介质类型(media type),比如说,你想强迫使用100baseTX 全双工(full-duplex),模式:
inet 10.0.0.38 255.255.255.0 NONE media 100baseTX mediaopt full-duplex
(当然,你从来不需要强迫使用全双工模式,除非网络连接的双方都这样设置。一般情况下,介质设置会被拒绝。)
或者,你会想使用特殊的标记来指定某界面。但是hostname文件的格式并不会有很大的变化。
$ cat /etc/hostname.vlan0
inet 172.21.0.0 255.255.255.0 NONE vlan 2 vlandev fxp1
  下一步就是设置默认网关。为此,只要简单的将网关地址写入/etc/mygate文件。这就可以使系统在启动时设置好默认网关。到此,你还需要设置好你的nameserver和/etc/hosts文件(查看hosts(5)手册页)。为了设置你的nameserver,你需要创建一名为/etc/resolv.conf的文件。你可以在resolv.conf(5)的手册页中了解到该文件格式的更多信息。但是对于一般使用,这里有个例子。在此例中,你的域名服务器(domain server)是 125.2.3.4和125.2.3.5。你也可以把它们放在域名"example.com"之后:
$ cat /etc/resolv.conf
search example.com
nameserver 125.2.3.4
nameserver 125.2.3.5
lookup file bind
 到此,你既可以重起计算机也可以运行/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来确定你的界面已经被正确设置。你也可以通过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.2-将你的OpenBSD设置为网关
 这是将你的OpenBSD设置成网关(也叫路由)的基本信息。如果你在Internet上使用OpenBSD作为路由器,我们建议你同时阅读下面的Packet Filter设置说明来拒绝潜在的恶意连接。另外,由于Ipv4地址的不足,你也许想使用网络地址转换(NAT)来节省你的IP地址空间。

 通用(GENERIC)内核已经支持IP Forwarding,但是你需要打开此项。你可以用sysctl工具来完成此项设置。为了永久的让IP Forwarding有效,你需要修改/etc/sysctl.conf文件。为此,需要在该文件中加入:
net.inet.ip.forwarding=1
为了完成此项设置而无须重起,你需要直接使用sysctl工具。要记住这样的改变在重起之后是不存在的,并且你需要用root来运行。
# sysctl -w net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
 现在,修改两边host上的路由。使用OpenBSD做路由有很多种可能性,可以使用一些软件,比如routed(8),gated(8),mrtd和zebra.OpenBSD支持T1,HSSI,ATM,FDDI,Ethernet和串行(PPP/SLIP)界面。
6.2.3-设置界面别名
 OpenBSD有一个简单的机制来设置界面别名。只要简单的编辑文件/etc/hostname. 就可以了。此文件在系统启动时有/etc/rc脚本读取。例如,我们假设用户有一界面dc0位于网络192.168.0.0上。另一个重要的信息:
*dc0的IP为192.168.0.0
*子网掩码为:255.255.255.0
使用别名的注意点。在OpenbSD中,你仅仅使用界面名。第一个别名和第二个别名间并无差别。不象其他操作系统,OpenBSD并不把它们当作dc0:0,dc0:1来引用。如果你使用ifconfig来引用一个指定的IP地址别名,或者增加一个IP别名,请注意用"ifconfig int alias"而不是仅在命令行输入"ifconfig int".你可以使用"ifconfig int delete"来删除别名。假设你使用在同一子网中的多个IP地址来做别名,你需要为每个别名设置子网掩码为"255.255.255.255".它们不能按照绑定在界面上的第一个IP地址来指定子网掩码。在此例中,/etc/hostname.dc0,在设备dc0上增加两个别名。将192.168.0.2的子网掩码配置为:255.255.255.0
# cat /etc/hostname.dc0
inet 192.168.0.2 255.255.255.0 media 100baseTX
inet alias 192.168.0.3 255.255.255.255
inet alias 192.168.0.4 255.255.255.255
一旦你设置好了此文件,你就需要重起计算机来使之生效派。当然,你也可以使用ifconfig来使别名立即生效。启用第一个别名,用如下命令:
# ifconfig dc0 inet alias 192.168.0.3 netmask 255.255.255.255
为了查看别名,需要使用命令:
$ ifconfig -A
dc0: flags=8863
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来做Filter或防火墙
Packet Filter(PF)是OpenBSD的TCP/IP连接过滤及NAT系统。PF 也可用来进行TCP/IP连接的状态控制及带宽控制等。在PF用户指南中有详细的描述。
6.4-DHCP
6.4.1-DHCP Client
为了使用OpenBSD自带的DHCP Client---dhclient,需要编辑文件/etc/hostname.xl0(这里假设你的主以太界面是xl0.你的可能是ep0或者fxp0或者其他的!)并且在该文件中写入"dhcp":
# echo dhcp >/etc/hostname.xl0

这就可以使OpenBSD在启动时自动启动DHCP Client.OpenBSD会从DHCP服务器上得到它的IP,默认网关,DNS服务器。
如果你想从命令行启动dhcp client,请确定/etc/dhclient.conf文件存在,然后
#dhclient fxp0

fxp0即你想运行dhcp的界面。
不管你如何启动你dhclient,你可以编辑/etc/dhclient.conf文件,这样就可以不按照DHCP 服务器上的DNS 信息来更新你的DNS。这样的话,首先需要反注释掉该文件中"request"行:
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, host-name, lpr-servers, ntp-servers
;
然后删除DNS。当然,你也许还想删除hostname和其他设置。

6.4.2-DHCP服务器
如果你想使用OpenBSD来作为一个DHCP服务器dhcpd,编辑文件/etc/rc.conf.设置dhcpd_flags="-q"来代替dhcpd_flags=NO.
在/etc/dhcpd.insterfaces中写入你想让dhcpd监听的界面。
# echo xl1 xl2 xl3 >/etc/dhcpd.interfaces

然后,编辑/etc/dhcpd.conf。那些选项的含义也不言而喻。
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;
range 192.168.1.32 192.168.1.127;
}

这将会告诉你的DHCP Client附加到DNS请求的域是"example.com"。它会把它们指向DNS服务器192.168.1.3和192.168.1.5。对于在OpenBSD机器中,作为以太界面位于同一网络上的主机,它们的范围为192.168.1.0/24,它将会将它们的IP分配为192.168.1.32和192.168.1.127中的值。它会将它们的默认网关设置为:192.168.1.1。
如果你想从命令行启动dhcpd.在编辑/etc/dhcpd.conf后:
#dhcpd -q fxp0

fxp0即你想开启DHCP服务的界面.-q参数使dhcpd安静.否则,它就会很吵(noisy)。:p
如果你为一个Windows提供DHCP服务,你就想让dhcpd提供给子机(client)一个WINS服务器地址。为此,只需要在/etc/dhcpd.conf中加入:
option netbios-name-servers 192.168.92.55;

(192.168.92.55就是Windows或者Samba服务器的IP)。查看dhcp-options(5)来获得DHCP 客户端所需要的更多其他选项。

6.5-PPP


6.6-调节网络参数
6.6.1-我如何调节内核来获得更高的retries值和更长的TCP会话时间?
一般路由或者连接出现问题时才需要调节这些。当然,为了使之更有效,连接的两边需要使用相似的值。
使用sysctl增加:
net.inet.tcp.keepinittime
net.inet.tcp.keepidle
net.inet.tcp.keepintvl

的参数值来调节。使用sysctl -a,你可以得到这些参数的当前值。使用sysctl -w进行修改。如:
net.inet.tcp.keepidle=28800

6.6.2-我如何开启directed广播?
一般来说,你不需要这样做。如果你使用OpenBSD做路由器的话,这会允许某些人发送数据报到你所控制网络的广播地址。
在封闭网络中,有一些很有帮助的例子(特别对于老的NetBIOS协议实现)。这是另一个sysctl.
# sysctl -w net.inet.tcp.baddynamic=749,750,751,760,761,871

6.6.3-我不想让内核自动分配一个端口。
这也是一个sysctl设置项。从sysctl(8):
Set the list of reserved TCP ports that should not be allocated by the
kernel dynamically. This can be used to keep daemons from stealing a
specific port that another program needs to function. List elements may
be separated by commas and/or whitespace.
# sysctl -w net.inet.tcp.baddynamic=749,750,751,760,761,871
也可以从当前列表中增加和删除某端口:
# sysctl -w net.inet.tcp.baddynamic=+748 ------------>增加
# sysctl -w net.inet.tcp.baddynamic=-871 ------------>删除

6.7-简单NFS使用
NFS,或者说Network File System,是用来在网络上共享一个文件系统的。在设置NFS服务器前,请先阅读如下的手册页:
● nfsd(8)
● nountd(8)
● exports(5)