| FreeBSD連載(34):手工配置網路 
 1999年12月6日 11:44 王波
 
 基本網路設置  在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參數可以簡單停止網路界面的工作:   此外,還可以在一個網路界面上捆綁上多個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<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
 tun0: flags=8050<POINTOPOINT,RUNNING,MULTICAST> mtu 1500
 sl0: flags=c010<POINTOPOINT,LINK2,MULTICAST> mtu 552
 ppp0: flags=8010<POINTOPOINT,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.1.250,第二個為
備用名字伺服器192.168.2.210。   注意,因為此時還不能通過DNS查詢名字,因此這裡要使用IP地址而非主機名來指定名字服
務器。   由於可以同時使用/etc/hosts主機檔案和/etc/resolv.conf中配置的DNS伺服器都能進行電腦名字與IP
地址之間的轉換,就可以規定查找的順序,在/etc/host.conf檔案中規定了進行名字轉換時查找的順序。   系統預設設置的順序如上,第一行為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信息,如某個域的名字服務
器的地址,郵件伺服器地址等。 
 |