第十二章 TCP/IP Network

壹. UNIX 網路設定命令

UNIX作業系統中網路設定與管理相關指令與功用程式包括:arprarppingnetstatifconfigtracerouteroute等。除traceroute外,其餘均為系統所附之工具,而這其中又以netstatifconfig在網路管理與設定中最常被使用;前者主要用於網路運作狀態監視,後者則用於網路界面的設定與管理 。

唯有超級使用者(superuser -root)可以使用網路相關設定指令(如routeifconfigarp等);但幾乎所有系統使用者均可被允許透過網路監視指令(pingnetstattraceroute),了解網路目前組態與運作狀況。  

一. IP位址設定

命令: netstat
設定IP位址前必須先了解系統網路卡名稱,此一名稱與網路卡廠牌無關,而是與UNIX的種類有關。在linux下第一張乙太網路卡名稱為eth0Solaris be0Ultrixle0),loopback網路介面名稱則為lo。一般而言,此一介面無須設定(使用系統預設值即可)

指令”netstat –in”告訴你系統目前存在(偵測到)網路介面的名稱。 

Example:

cc000:~# netstat -in

  Kernel Interface table

  Iface   MTU   Met   RX-OK  RX-ERR  RX-DRP   RX-OVR     TX-OK TX-ERR TX-DRP TX-OVR Flags

    Lo       3584       0        12                0           0                  0                       12             0             0          0            BLRU

    eth0     1500       0        1104            0           0                   0                       93            0             0           0            BRU

 

cc000:~# 

  命令: ifconfig

    UNIXIP位址設定所使用的標準指令為 ifconfig 其指令格式如下

ifconfig  if_name  inet  x.x.x.x  netmask  a.b.c.d  broadcast  e.f.g.h

其中,inetnetmaskbroadcastkeyword

if_name   :  網路介面名稱。(eth0 in linux)

x.x.x.x     :  指定給if_nameIP位址。

a.b.c.d      :  指定給if_name的網路遮罩。

e.f.g.h      :  指定給if_name的廣播位址。 

Example, 下面的例子顯示網路卡設定與運作記錄值:

cc000:~# ifconfig eth0            

eth0      Link encap:10Mbps Ethernet  HWaddr 00:00:E8:22:97:A4

          inet addr:140.120.153.1  Bcast:140.120.153.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:1261 errors:0 dropped:0 overruns:0

          TX packets:110 errors:0 dropped:0 overruns:0

          Interrupt:5 Base address:0x300

 

Example, 更改網路卡IP位址為140.120.153.20的例子:

cc000:~#ifconfig eth0 inet 140.120.153.20 netmask 255.255.255.0 broadcast 140.120.153.255

 

Example, 再看看網路卡設定, 請留意變動之欄位:

cc000:~# ifconfig eth0

eth0      Link encap:10Mbps Ethernet  HWaddr 00:00:E8:22:97:A4

          inet addr:140.120.153.20  Bcast:140.120.153.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:1261 errors:0 dropped:0 overruns:0

          TX packets:110 errors:0 dropped:0 overruns:0

          Interrupt:5 Base address:0x300

 

您可以看到界面的名稱( eth0 等)、界面類型( Ethernet 等)、界面實體位址、IP 位址、廣播位址、Net Mask、界面目前狀態、MTU(Maximum Transmission Unit)大小、路由 Metric 數目、接收(RX)封包狀態、發送(TX)封包狀態、網路碰撞、發送隊列、IRQ、IO地址等訊息。

  啟動與關閉網路介面的命令

     可以使用ifdown停用網路介面, 用ifup啟用網路界面。

      例如﹕

ifdown /etc/sysconfig/network-scripts/ifcfg-eth0
ifup 
/etc/sysconfig/network-scripts/ifcfg-eth0

 

二. Routing Table設定

Routing Table

UNIX作業系統透過TCP/IP網路對外連線時,routing table選擇路徑的依據,正確的routing 設定方能確保機器能上網。

路由設定方式可分動態與靜態兩種,基本上這兩種方式可以同時並存。

   1.動態路由(Dynamic Routing)設定

    所謂動態路由乃是透過路由協定(一般為RIP or OSPF),與鄰近之路由器或同樣執行路由協定之設備(例如另一台linux),彼此交換路由訊息,並自動建立起路由表。

    基本上動態路由均由一背景程式(daemon)負責更新路由表,無須人工手動設定 路由表,只要由超級使用者(root)執行這個背景程式(linux這個程式叫做”routed”)即可。   

  2. 靜態路由(Static routing)設定)

    靜態路由是由管理者本身依所在網路環境設定routing table之各欄位告訴系統所有往外之去路。 Static routing 設定包括增加一個路由、刪除已存在之路由及清除routing table 所有路由。 

Routing Table的設定

1. 增加一個路由(add a route) 

   指令格式: route add–net target_net  gw gateway

     à 告訴系統,通往外部網路target_net必須由router “gateway轉送。 

Example1: 

             route add –net 140.120.2.0 gw 140.120.153.25

    à告訴系統通往子網路140.120.2.0可經由gateway 140.120.153.25 

Example2: 

               route add –net default gw 140.120.153.254

   à設定系統default gateway若在routing table中找不到的相對應的子網路就 往140.120.153.254轉送。 

2. 刪除一個路由(delete a route)

   指令格式: route delete–net  target_net  gw  gateway

     à 刪除通往外部網路target_net 的路徑gateway 

Example1: 

          route delete–net 140.120.2.0 gw 140.120.153.25 

3. 清除routing table所有路由(flush routing table)

   在某些情況下(例如系統routing 無法正常運作,或重新設定網路卡),管理者必須清除routing table中所有之欄位。

清除routing table中所有之欄位的指令格式:route –f 

   4. 查看系統目前使用的路由表格設定﹕輸入route這個命令且不帶任何參數

   Example1:

Kernel IP routing table
Destination        Gateway                     mask                             Flags   Metric   Ref    Use   Iface
swtn184-1.adsl.     *                       255.255.255.255                 UH         0         0        0    ppp0
10.0.1.128             *                       255.255.255.224                 U           0          0        0    eth2
10.0.1.0                 *                       255.255.255.224                 U           0          0        0    eth1
192.168.100.0       *                       255.255.255.0                     U           0          0        0    eth0
127.0.0.0               *                       255.0.0.0                             U           0          0        0    lo
default                swtn184-1.adsl.    0.0.0.0                                UG         0          0        0    ppp0

 

從上面的命令結果中﹐我們可以看到﹕

附註: 將 windows 的 default gw 設定為 192.168.100.23, 也同樣可以的﹕控制台 --> 網路 --> TCP/IP --> 內容 --> 通訊閘 ﹕

 

三. Domain Name Service 設定

  Domain Name Server 設定

如果你想使用Naming service你必須正確的指定Domain Name Server

Linux中指定Domain Name Server的步驟相當簡單你只需編輯/etc/resolv.conf這個組態檔案即可並將更改過的檔案內容存檔所設定之內容即立刻生效無須重新開機。 

/etc/resolv.conf這個檔案內容只有root可以變更其內容一般如下: 

cc000:~# more /etc/resolv.conf

domain cyut.edu.tw

nameserver 163.17.1.1

nameserver 163.17.3.1

cc000:~# 

如有必要你可以指定一個以上的Domain Name Server。以上的例子中設定Domain Name cyut.edu.tw Domain Name Server則設定兩個:163.17.1.1163.17.3.1系統查詢的順序為:163.17.1.1,  if fail à 163.17.3.1 

 

  Local Host Table - /etc/hosts: 另一種Domain Name與IP address對應的設定

/etc/hosts是另一個可自行設定IP Addresshostname對應的檔案你可以在此定義local host 與一些重要電腦的名稱。 

 

  Domain Name 查詢的順序

根據不同版本的不同需要修正 /etc/nsswitch.conf 或者是 /etc/host.conf 檔案.

1. 修正/etc/nsswitch.conf

    這是一個很長的檔案,找出以 `hosts:' 作為開頭的那一行,它應該是這樣:

        hosts:      files dns      #先在 /etc/hosts 檔案裡找尋,然後根據 resolv.conf 詢問 DNS.  

    如果檔案裡沒有以 `hosts:' 作為開頭的行那麼把上面這一行加上去.

2. 修正/etc/host.conf

範例如下:

1. vi /etc/host.conf     

       order hosts, bind                # Lookup names via /etc/hosts first then fall back to DNS.

       Þ查詢順序:/etc/hosts,  if not found à Domain Name Server

 2. vi /etc/host.conf

       order bind, hosts                # Lookup names via DNS first then fall back to /etc/hosts.
          
       Þ查詢順序:Domain Name Server, if not found à /etc/hosts   

   如果檔案不存在, You may create /etc/hosts and /etc/hosts.conf by yourself.

. 簡易網路除錯

  ping – 測試網路上某台機器是否在線上是否開機或是否可以跟你的機器連線

.成功的例子

cc000:~# ping 140.120.2.110

PING 140.120.2.110 (140.120.2.110): 56 data bytes

64 bytes from 140.120.2.110: icmp_seq=0 ttl=127 time=1.3 ms

64 bytes from 140.120.2.110: icmp_seq=1 ttl=127 time=1.3 ms

64 bytes from 140.120.2.110: icmp_seq=2 ttl=127 time=1.3 ms

64 bytes from 140.120.2.110: icmp_seq=3 ttl=127 time=1.3 ms

64 bytes from 140.120.2.110: icmp_seq=4 ttl=127 time=1.3 ms

64 bytes from 140.120.2.110: icmp_seq=5 ttl=127 time=1.4 ms

 

[按下^c終止ping 指令執行]

--- 140.120.2.110 ping statistics ---

6 packets transmitted, 6 packets received, 0% packet loss

round-trip min/avg/max = 1.3/1.3/1.4 ms

 

 

在 Linux 使用 ping 命令﹐如果您不使用 -c N 參數來指定送出多少個封包的話﹐ping 命令會一直延續下去﹐直到您按 Ctrl + C 為止。從上面的命令結果我們可以確定連線是否成功之外﹐還可以根據它的 time 來判斷當前的連線速度﹐數值越低速度越快﹔在命令結束的兩行﹐還有一個總結﹐如果發現您的 packet loss 很嚴重的話﹐那就要檢察您的線路品質﹐或是上游的服務品質了﹔最後一行是 round-trip (來回)時間的最小值、平均值、最大值﹐它們的時間單位都是微秒 (ms)。

 

  .失敗的例子

cc000:~# ping 140.120.2.113

PING 140.120.2.113 (140.120.2.113): 56 data bytes

 

[按下^c終止ping 指令執行]

--- 140.120.2.113 ping statistics ---

5 packets transmitted, 0 packets received, 100% packet loss

 

. 線路不良的例子

cc000:~# ping www.psu.edu

PING www.cac.psu.edu (146.186.157.6): 56 data bytes

64 bytes from 146.186.157.6: icmp_seq=0 ttl=238 time=329.5 ms

64 bytes from 146.186.157.6: icmp_seq=2 ttl=238 time=347.9 ms

64 bytes from 146.186.157.6: icmp_seq=4 ttl=238 time=335.2 ms

64 bytes from 146.186.157.6: icmp_seq=7 ttl=238 time=322.6 ms

64 bytes from 146.186.157.6: icmp_seq=9 ttl=238 time=343.5 ms

64 bytes from 146.186.157.6: icmp_seq=11 ttl=238 time=333.3 ms

 

[按下^c終止ping 指令執行]

--- www.cac.psu.edu ping statistics ---

13 packets transmitted, 6 packets received, 53% packet loss

round-trip min/avg/max = 322.6/335.3/347.9 ms

cc000:~#

 

如果線材接續不良, 或傳輸距離過遠會導致封包遺失本例中,送往www.psu.edu的封包有53%不知去向  

traceroute – 測試連線路徑

 

cc000:~# traceroute www.nctu.edu.tw

traceroute to www.nctu.edu.tw (140.113.250.5), 30 hops max, 40 byte packets

 1  140.120.153.254 (140.120.153.254)  0.668 ms  0.568 ms  0.553 ms

 2  140.120.2.254 (140.120.2.254)  2.394 ms  2.25 ms  2.106 ms

 3  r7513.nchu.edu.tw (140.120.254.7)  2.546 ms  1.53 ms  1.444 ms

 4  TANetBackbone-NCHC.edu.tw (192.83.196.110)  4.037 ms  3.46 ms  3.59 ms

 5  NCHC-FDDI-NCTU.edu.tw (134.208.150.253)  3.944 ms  3.451 ms  3.764 ms

 6  www.nctu.edu.tw (140.113.250.5)  3.316 ms *  3.516 ms

cc000:~#

 

traceroute的結果告訴我們所在的機器到目的地(www.nctu.edu.w)總共經過了5router的轉送6個為目的地及每一個router的延遲

 

cc000:~# traceroute www.psu.edu

traceroute to www.cac.psu.edu (146.186.157.6), 30 hops max, 40 byte packets

 1  140.120.153.254 (140.120.153.254)  0.657 ms  0.558 ms  0.55 ms

 2  140.120.2.254 (140.120.2.254)  3.132 ms  2.28 ms  2.535 ms

 3  r7513.nchu.edu.tw (140.120.254.7)  2.495 ms  1.465 ms  1.469 ms

 4  TANetBackbone-MOE.edu.tw (192.83.196.111)  6.695 ms  5.495 ms  5.996 ms

 5  204.59.160.173 (204.59.160.173)  249.789 ms  304.131 ms  267.947 ms

 6  gip-sl-stock-fddi-1.gip.net (204.59.128.198)  271.315 ms * *

 7  core4-hssi1-0.SanFrancisco.mci.net (206.157.77.65)  265.475 ms  278.866 ms *

8       * * *

9       * * *

[按下^c終止traceroute指令執行]

cc000:~#

 

這個例子告訴我們,所在機器無法連線到目的地連線中斷在router 206.157.77.65之後 

.從上面的 traceroute 結果﹐可以看到每一個節點都返回 3 個 round-trip 時間。這樣﹐就能夠判斷整個連線路由中﹐交通瓶頸所在的位置在哪裡。

.在實作中﹐未必所有路由設備都會送回 ICMP 封包。碰到這樣的情況﹐就會看到跳站的情形。假如 traceroute 最後的結果一直維持著 * 符號﹐那可能是因為 ICMP 封包被對方的防火牆攔下來的結果。這樣的話﹐可能就無法完成防火牆後的路由追蹤。

.從上面的例子來觀察﹐由第 5 個跳站開始明顯降慢下來﹐而根據名稱看來﹐應該就是 ISP 連出 backbond 的節點。  

netstat - 查看網路狀態
主要是用來檢查主機的網路狀態。先讓認識一下這個命令的一些參數﹕
參數 代表意思
-a 顯示所有 socket ﹐不管是否處於 listening 狀態。
-t 僅顯示 TCP 協定相關的項目。
-u 僅顯示 UDP 協定相關的項目。
-l 僅顯示處於 listen 狀態的項目。
-w 僅顯示 RAW 協定相關的項目。
-x 僅顯示 UNIX 協定相關的項目。
-r 顯示系統的路由表格。
-p 顯示與 socket 相關的程式名稱及 PID 。
-n 不進行名稱解析﹐直接以 IP 位址顯示。

Example1:

netstat -tna
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:515             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:113             0.0.0.0:*               LISTEN
tcp        0      0 211.74.184.205:53       0.0.0.0:*               LISTEN
tcp        0      0 10.0.1.131:53           0.0.0.0:*               LISTEN
tcp        0      0 10.0.1.1:53             0.0.0.0:*               LISTEN
tcp        0      0 192.168.100.23:53       0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN
tcp        0      0 192.168.100.23:22       192.168.100.20:2610     ESTABLISHED
tcp        0      0 192.168.100.23:139      192.168.100.20:2735     ESTABLISHED

上面的命令是將系統所打開的所有 TCP socket 都顯示出來﹐其中很重要的一個資訊是 Send-Q ﹐假如這個數值大於 0 並且有增加的趨勢﹐那就證明您的網路流量非常繁忙﹐要不是發生問題的話﹐那就是到了升級的時候了。如果您還想知道每一個 socket 是哪一個程式打開的﹐再加上一個 p 參數就可以了。

Example2:

關於 netstat 命令﹐您還可以用 -i 參數來顯示界面狀態﹕

netstat -i
Kernel Interface table
Iface   MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0   1500   0    10320      0      0      0     9490      0      0      0 BRU
eth1   1500   0    23623      0      0      0   353805      0      0      0 BRU
eth2   1500   0        0      0      0      0      477      0      0      0 BRU
lo    16436   0      585      0      0      0      585      0      0      0 LRU
ppp0   1492   0     1022   1538      0      0      954      0      0      0 OPRU

前面三項分別是﹕界面、最大傳送單位、路由成本(metric)。其後各欄位中的 RX 和 TX 分別代表接收和發送﹐其中 OK 是良好封包﹐ERR 是有問題的封包﹐DRP 是被丟棄的封包﹐OVR 則是來不及處理而溢出的封包。最後的 Flag 分別有如下這些旗標﹕

. 網路的設定檔

在 Linux 系統上﹐我們要做網路設定時, 也常常直接修改設定檔﹐若熟悉文字模式的操作, 直接在檔案中修改, 會比用圖形介面工具來修改, 要快的多。

關鍵點是找到設定檔案和 scripts 放在哪裡﹐以及各檔案的作用。在不同的 distribution 裡面﹐各檔的路徑和名稱或有不同﹐例如﹐有些套件﹐會將所有的網路設定寫在 /etc/rc.d/rc.inet1 和 /etc/rc.d/rc.inet2 這兩個檔案裡面。而 RedHat 的產品中設定多集中在 /etc/sysconfig 目錄中。

/etc/sysconfig/network
這個檔包含了系統的主要網路設定﹐參考內容如下﹕
NETWORKING=yes			# 開啟網路功能。
FORWARD_IPV4="yes"		# 啟動封包轉送的功能。
HOSTNAME=test.cyut.edu.tw	# 主機的名稱
# DOMAINNAME=cyut.edu.tw	# 這是 nis domainname ﹐沒用 NIS 可以不設。
GATEWAY="163.17.9.254"	        # 這是預設 gateway 的位址
GATEWAYDEV="eth0"		# 連接 gateway 的界面

 

/etc/sysconfig/network-scripts/
在這個目錄下面﹐保存了網路界面相關的設定﹐所有以 ifcfg- 開頭的檔案都是。例如﹐ifcfg-eth0 就是第一張網路卡的設定內容﹕
DEVICE=eth0		        # 指定網路設備名稱。
BOOTPROTO=static		# 界面啟動使用的協定﹐可以是 dhcp 。
IPADDR=192.168.100.23	       # IP 位址。
NETMASK=255.255.255.0	       # netmask 設定值。
NETWORK=192.168.100.0	        # 網路位址。
BROADCAST=192.168.100.255	# 廣播位址。
ONBOOT=yes		       # 是否在開機的時候啟動﹐請設定為 yes 

其中的 BOOTPROTO﹐如果這個界面是透過別 DHCP 伺服器取得 IP 的話﹐請設定為 dhcp﹐ 其後的  IPADDR、NETMASK、NETWORK、BROADCAST 就無需設定。  

 

如果是第一次增加靜態路徑, 需要新建一個檔案, 檔案名稱為 /etc/sysconfig/network-scripts/route-ethX,其中X是你要增加静態路徑的網路卡編號。下面這個例子表示為eth0這個網路卡配置了兩個靜態路徑。

Example:

/etc/sysconfig/network-scripts/route-eth0
GATEWAY0=10.10.0.1
NETMASK0=255.0.0.0
ADDRESS0=10.0.0.0

GATEWAY1=10.2.0.1
NETMASK1=255.255.0.0
ADDRESS1=192.168.0.0

有些Linux的版本是使用 /etc/sysconfig/static-routes這個檔案來設定

 

/etc/rc.d/init.d/network
網路服務啟動及關閉的shell script, 透過它您可以關閉和啟用網路服務, 如下面的例子﹕
service network stop
service network start

service network restart

參. 好用的設定工具

Linux 除了用命令和設定檔﹐也有大量的 Linux 工具可搞定網路設定。

如果對設定檔不熟悉﹐而又不知道如何修改的話﹐可以先將檔案備份起來﹐然後使用工具去修改﹐在將設定內容前後對比﹐觀察檔案中改變的部份﹐多練習數遍就知道怎麼修改。

 

1. netconf
基本上﹐關於網路相關的設定﹐都可以用這個工具來搞定﹕

首先﹐我們可以用‘Host name and IP network devices’來設定基本的網路設定。事實上﹐這個工具就是幫您設定 /etc/sysconfig/network 和 /etc/sysconfig/network-scripts/ifcfg-eth* ﹐以及 /etc/modules.conf 這些檔案,

關於路由方面的設定﹐則可使用‘ Routing and gateways’。如果您不知道如何修改 /etc/sysconfig/network 和 /etc/sysconfig/static-routes 中的路由﹐那就用這個工具﹕

 

 

2 linuxconf
也是幾乎在 Linux 上的所有設定都能搞定﹗

這個工具被認為是 Linux 未來的最完整的設定工具﹐開發者的目標就是提供一個統一的設定界面﹐讓 Linux 管理員簡化煩瑣的設定事項。前面介紹的 netconf 命令﹐事實上也是包含在 linuxconf 工具中的﹐如果您的系統還沒安裝 linuxconf﹐那就上網找來安裝 。