作者:陳柏菁 E-mail
第十一章 網路組態設定與服務

索引:
11.1 IP 簡介
  11.1.1 IP 位址的類型
  11.1.2 網路遮罩
  11.1.3 CIDR (不分級的網路尋徑) --- 子網路規劃網路段整合
11.2 設定網路連線
  11.2.1 設定固定 IP 上網 ---
設定網路介面:/etc/sysconfig/network/ifcfg-eth-id-xxxx
設定 Default Gateway:/etc/sysconfig/network/routes
指令 DNS 位址:/etc/resolv.conf
  11.2.2 設定 ADSL 撥接上網
  11.2.3 自動取得 IP 位址來上網
  11.2.4 使用 YaST 做網路相關的設定
11.3 常用的網路相關指令
  11.3.1 網路偵測指令 --- pingtraceroute
  11.3.2 網路設定指令 --- ifconfig (IP Alias)、route
  11.3.3 遠端連線指令 --- telnet 與 sshftp 與 ncftp
  11.3.4 檢視網路指令 --- netstat
11.4 認識服務 (Services) 與 daemon
  11.4.1 服務與 daemon 概述 --- /etc/services
  11.4.2 Super daemon --- inetd
  11.4.3 inetd 相關檔案 --- /etc/xinetd.conf/etc/xinetd.d/*
  11.4.4 TCP_Wrapper --- /etc/hosts.allow、/etc/hosts.deny



學習本章之前,必須先了解 IP 位址的概念,不然待會兒在設定網路相關組態時,會不明白一些設定項目,所以一開始就先來了解這個 IP 囉 !

11.1 IP (Internet Protocol:網際網路通訊協定) 簡介

IP 位址就是用來讓大家在平時能連線上網際網路的一串數字碼,透過這串數字碼,才可以讓電腦在 internet 中能彼此辨識,以達訊息資料傳送的目的。您可以將其想像成家裡的門牌號碼一樣,有了這個位址,封包才曉得要往哪裡送,而不至於迷失方向。

目前 IP 位址有幾個不同的版本,現在大家所使用的大都為第四版的 IP位址,即所謂的 IPv4,這就是今天要討論的重點了。

IPv4 位址由 32 bits 所組成,每一個 bit 可以是 0 與 1,而 32 bits 中又將其分成四組,每組八個 bits,以十進位來表示而形成如 61.219.18.224 這類的表示法,若將其用二進位展開,就得到如 00111101.11011011.00010010.11100000 這一長串的數字串,此二進位數字即是網路上實際傳輸的數字串。

11.1.1 IP 位址的類型


一般 IP 位址區分成兩部分,即網路位元 (Network bits) 和主機位元 (Host bits),網路位元是用來對網路區段進行識別,而主機位元則是用來對該網路區段內的主機進行識別。另外 IPv4 將 IP 位址分為 A、B、C、D、E 等五個類型,即 class A ~ class E,至於各類型的區別方式,則是藉由最左邊所規定的幾個位元來進行判定,等等再說明。

目前我們所使用的 IP 位址大都為 class A、class B 及 class C,而 class D 是用來做多點群播 (以一對多的方式進行資料傳送),class E 則是保留給實驗網路來使用,所以這裡將只探討 class A ~ class C。緊接著就來看看如何定義這些類型:

Class A:最左邊第一個位元固定為 0

 
0 N N N N N N N . H H H H H H H H . H H H H H H H H . H H H H H H H H
|----- Net Bits----| |-----------------------------Host Bits------------------------------|  

N 代表網路位元,H 代表主機位元。剛剛提到過網路位元是用來對網路區段進行識別,假使現在有兩個 class A 的 IP 位址,其 Network bits 完全相同,這就表示此兩個 IP 位址是位於同一個網路區段內,也就是說只要有一個 Network bit 不同,就分別屬於不同的網路區段。所以由這裡我們可以得知 class A 扣除最左邊的一個位元外,還有 7 個 Network bits 可以做不同的排列組合,有幾種排列組合就代表可以有幾個網路區段,以這裡來說就是 2 的七次方 = 128 個網路段。若將前面 8 個位元換算成十進位,其範圍是從 0 ~ 127,但扣除 0 (default route)127 (loopback address) 不能使用以外,真正可用者為 1 ~ 126。如果您主機的 IP Address 為 61.221.37.20,那麼光從第一個數字我們就可以判定它是屬於 class A 的 IP Address。

再來看看主機位元的部分。在同一個網路區段內若主機位元不同,那當然其所形成的 IP Address 也會不一樣,也就是說只要算出這些主機位元總共有幾種排列組合,就表示這個網路段內可以擁有多少個 IP Address 或多少台主機的意思,以這裡來說就是 2 的 24 次方個 IP Address,但是 Host bits 全為 0 及 1 時須扣除,Host bits 全部為 0 時所得到的是網路位址,代表的是這個網路區段的位址 ; Host bits 全部為 1 時所得到的是廣播位址,代表的是對同一個網路區段內的主機進行廣播的位址 ; 所以 class A 真正可用的 IP Address 為 2 的 24 次方減 2 個。


Class B:最左邊兩個位元固定為 10

 
1 0 N N N N N N . N N N N N N N N . H H H H H H H H . H H H H H H H H
|----------------- Net Bits-----------------| |-----------------Host Bits-----------------|  

class B 扣除最左邊的兩個位元外,還有 14 個 Network bits 可以做不同的排列組合,因此可提供 2 的 14 次方個網路區段,若將前面 8 個 bits 換算成十進位,其範圍是從 128 ~ 191。至於每個網路區段可提供 2 的 16 次方減 2 個 IP Address。


Class C:最左邊三個位元固定為 110

 
1 1 0 N N N N N . N N N N N N N N . N N N N N N N N . H H H H H H H H
|------------------------------- Net Bits-----------------------------| |----Host Bits----|  

class C 扣除最左邊的三個位元外,還有 21 個 Network bits 可以做不同的排列組合,因此可提供 2 的 21 次方個網路區段,若將前面 8 個 bits 換算成十進位,其範圍是從 192 ~ 223。至於每個網路區段可提供 2 的 8 次方減 2 個 IP Address。

平常想要連線上網時,都必須要向 ISP 申請 IP Address,而這個經由合法程序申請回來的 IP Address 稱為 Public Address ,但是若您不想連接 Internet,只想讓內部電腦間彼此能夠通訊的話,就不須向 ISP 申請合法的 IP Address,只須使用 Private Address 就行了。以下就列出可使用的 Private Address 範圍:

  10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255

以上這些 IP Address 是提供做企業內部網路架構的設定範圍,可不與外界連線,亦可透過具 NAT 功能的 Router 或主機來與 internet 連線溝通。另外若是將來您學會了架設 Proxy Sever 後,亦可讓其來幫您做代理連線的工作。

11.1.2 網路遮罩 (Network Mask)

同一個網路區段內的主機,其網路位元必定相同,主機位元必定不同,那要分辨這些主機到底是不是屬於同一個網段就須靠網路遮罩了。當我們將網路位元設為 1,主機位元設為 0,所得到的結果就是網路遮罩,比方說 class A 的網路遮罩為:
1 1 1 1 1 1 1 1 . 0 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 0
換算成十進位就是 255.0.0.0,同理 class B 255.255.0.0class C255.255.255.0

在設定靜態 IP Address 時,必須要同時指定其網路遮罩為何。比如主機的 IP Address 為 192.168.1.100,Netmask 為 255.255.255.0,則由 Netmask 得知有 24 個 Network bits 及 8 個 Host bits,而將 Host bits 全設為 0 可以得到網路位址 192.168.1.0,一樣的道理將 Host bits 全設為 1 可以得到廣播位址 192.168.1.255,所以只要位於 192.168.1.0/24 (24 是表示有 24 個 network bits) 這個網路段內的主機就可以彼此直接進行溝通而不需要依賴一些路由設備。藉由這種方式可以很快的知道網路位址及廣播位址為何,但實際上網路位址是將二進位的 IP Address 及 Network Mask 經由 and 邏輯運算而來,以剛剛的 192.168.1.100 做例子:

1 1 0 0 0 0 0 0 . 1 0 1 0 1 0 0 0 . 0 0 0 0 0 0 0 1 . 0 1 1 0 0 1 0 0
            and
1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 0 0 0 0 0 0 0 0
            結果
1 1 0 0 0 0 0 0 . 1 0 1 0 1 0 0 0 . 0 0 0 0 0 0 0 1 . 0 0 0 0 0 0 0 0

如此所以得到網路位址就是 192.168.1.0。

至於廣播位址是先將 Network Mask 做 not 運算,再與 IP Address 做 or 運算:

1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 0 0 0 0 0 0 0 0
           not
0 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 0 . 1 1 1 1 1 1 1 1
            or
1 1 0 0 0 0 0 0 . 1 0 1 0 1 0 0 0 . 0 0 0 0 0 0 0 1 . 0 1 1 0 0 1 0 0
              結果
1 1 0 0 0 0 0 0 . 1 0 1 0 1 0 0 0 . 0 0 0 0 0 0 0 1 . 1 1 1 1 1 1 1 1

所以得到廣播位址為 192.168.1.255。

11.1.3 CIDR (Classless Inter-Domain Routing):不分級的網域尋徑

由以上所學不難發現一般傳統的 class A 可以使用的 IP 位址數非常的多,在這種情形下如果沒有好好的規劃,便容易形成位址浪費與傳輸效率不彰等現象。而 class C 可以使用的 IP 位址數又過少,有時候為了解決位址數的不足,必須再申請幾個 class C 的網路段,因此需要額外添購一些昂貴的路由設備,且存在過多的網路段會導致 Routing table 內的路由資訊過於龐大,以致影響 Router 的執行效率。

為了解決以上種種的問題,由 IETF (Internet Engineering Task Force) 提出了 CIDR 的架構,也就是網路位元不再受限於 8、16、24 位元,而是根據網路遮罩來定義,這使得位址的分配更具有彈性,也比較符合實際需求。

子網路 (Subnet) 規劃

 

將一個網路區段再切割成幾個子網段 (subnet) 的規劃,就是我們要探討的主題,以 class B 來說,一個 class B 的網路區段原本有 16 個 Host bits,此時藉由向主機位元借位元的方式而讓 IP 位址區分成網路位元、子網路位元及主機位元三部份,其中網路位元由 NIC 分配,子網路位元及主機位元則由該網段的擁有者逕行分配。當我們向 Host bits 借的位元數愈多,所能區分的子網段也愈多。

以下使用 172.85.0.0/16 這個網路段做範例來跟各位說明,看看如何透過借位元方式而能再切割子網段出來。

假使現在要跟主機位元借三個 bits,就形成如下的狀況:

1 0 1 0 1 1 0 0 . 0 1 0 1 0 1 0 1 . N N N H H H H H . H H H H H H H H
|----------Network Bits---------|    |--------------Host Bits------------|
            Subnet bits

網路位元向主機位元借位後,就形成了三個子網位元,所以可切割成 2 的三次方等於 8 個子網段,每個子網段可提供給主機來使用的 IP 位址為 2 的 13 次方減 2 個。而將網路位元設為 1 (包括子網位元),主機位元設為 0 而得到子網遮罩 (Subnet Mask) 為 255.255.224.0。

第一個子網路區段

 

1 0 1 0 1 1 0 0 . 0 1 0 1 0 1 0 1 . 0 0 0 H H H H H . H H H H H H H H

子網位址:將主機位元設為 0 而得到 172.85.0.0。
廣播位址:將主機位元設為 1 而得到 172.85.31.255。

172.85.0.0/19 子網路段所分配的 IP Address 範圍:

1 0 1 0 1 1 0 0 . 0 1 0 1 0 1 0 1 . 0 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 1
       :        :
1 0 1 0 1 1 0 0 . 0 1 0 1 0 1 0 1 . 0 0 0 1 1 1 1 1 . 1 1 1 1 1 1 1 0

換算成十進位就是 172.85.0.1 ~ 172.85.31.254。

第二個子網路區段

 

1 0 1 0 1 1 0 0 . 0 1 0 1 0 1 0 1 . 0 0 1 H H H H H . H H H H H H H H

子網位址:將主機位元設為 0 而得到 172.85.32.0。
廣播位址:將主機位元設為 1 而得到 172.85.63.255。

172.85.32.0/19 子網路段所分配的 IP Address 範圍:

1 0 1 0 1 1 0 0 . 0 1 0 1 0 1 0 1 . 0 0 1 0 0 0 0 0 . 0 0 0 0 0 0 0 1
       :        :
1 0 1 0 1 1 0 0 . 0 1 0 1 0 1 0 1 . 0 0 1 1 1 1 1 1 . 1 1 1 1 1 1 1 0

換算成十進位就是 172.85.32.1 ~ 172.85.63.254。

第三個子網路區段

 

1 0 1 0 1 1 0 0 . 0 1 0 1 0 1 0 1 . 0 1 0 H H H H H . H H H H H H H H

子網位址:將主機位元設為 0 而得到 172.85.64.0。
廣播位址:將主機位元設為 1 而得到 172.85.95.255。

172.85.64.0/19 子網路段所分配的 IP Address 範圍:

1 0 1 0 1 1 0 0 . 0 1 0 1 0 1 0 1 . 0 1 0 0 0 0 0 0 . 0 0 0 0 0 0 0 1
       :        :
1 0 1 0 1 1 0 0 . 0 1 0 1 0 1 0 1 . 0 1 0 1 1 1 1 1 . 1 1 1 1 1 1 1 0

換算成十進位就是 172.85.64.1 ~ 172.85.95.254。

做到這裡或許各位已經發覺有個規律性,就是每個網段都是以等差級數來增加,所以您可以很快的把剩下的子網段都推算出來,這就交給各位去練習了。

網路段整合 (Supernet)

  當您申請了數個 class C 的網路區段後,可以透過整合的方式來將其合併成一個網段,比如您目前申請了 210.10.36.0、210.10.37.0、210.10.38.0、210.10.39.0 等四個標準的 class C 網段,接著先將其網路位址用二進位顯示如下:

210.10.36.0 =>11010010.00001010.00100100.00000000
210.10.37.0 =>11010010.00001010.00100101.00000000
210.10.38.0 =>11010010.00001010.00100110.00000000
210.10.39.0 =>11010010.00001010.00100111.00000000

這時候您可以把這四個網段中二進位相同的部分整合在一起,並將其視為 Network bits (22 bits),那剩下的 10 個變動位元當然就是 Host bits,所以整合後其 Network Mask 為 255.255.252.0,Network Address 為 210.10.36.0,Broadcast Address 為 210.10.39.255。

11.2 設定網路連線

本節將教大家如何讓您的 Linux 連上 internet,不過自己要先清楚目前主機的連線方式為何,是使用 ADSL 撥接、Cable Modem 還是已經有固定 IP 位址。以下我們就分別針對這三種常見的連線方式做說明。

11.2.1 設定固定 IP 上網

假使您目前可以使用的固定 IP 位址是 220.132.78.75,Default Gateway 為 220.132.78.254,DNS 為 168.95.1.1 及 168.95.192.1,接著請按照以下步驟做設定:

1. 設定網路介面
suselinux:~ # cd /etc/sysconfig/network
suselinux:/etc/sysconfig/network # vi ifcfg-eth-id-00:05:5d:69:dd:b3

STARTMODE='onboot' 當執行 /etc/init.d/network 來啟動網路服務時,也同時啟動該網路介面。開機時預設一定會啟動網路服務,所以該行設定簡單的說,就是希望在開機時啟動網路介面的意思啦。
BOOTPROTO='static' 設定靜態 ip 位址。如果您是 DHCP 的 Client 端 (比如 Cable Modem),請設定成 BOOTPROTO='dhcp'。
IPADDR=220.132.78.75 設定靜態 IP Address。
NETMASK=255.255.255.0 設定網路遮罩。
NETWORK=220.132.78.0 設定網路位址。
BROADCAST=220.132.78.255 設定廣播位址。
PERSISTENT_NAME=eth0 指定該介面名稱為 eth0。當您存在兩片網卡時,就可以使用這個參數來個別指定介面名稱,這樣就不容易搞混,當然您要是區分得出來,不設定也無所謂啦。
   
2. 設定 Default Gateway
suselinux:/etc/sysconfig/network # vi routes

default
220.132.78.254
0.0.0.0
eth0
預設閘道器
網路遮罩
介面名稱

另外也可以把封包在傳送至每個網路段時所使用的 Gateway 設定在這裡,如:
192.168.3.0 192.168.6.254 255.255.255.0
192.168.6.0 192.168.3.254 255.255.255.0
   
3. 指定 DNS 位址
suselinux:~ # vi /etc/resolv.conf

nameserver 168.95.1.1
nameserver 168.95.192.1

DNS 的相關說明,在下一章會有詳細的解說。

以上三個步驟設定完成後,請重新啟動網路服務:

suselinux:~ # /etc/init.d/network restart

或者執行 rcnetwork 也行:

suselinux:~ # rcnetwork restart

另外一種重新啟動網路服務的方式,是使用 ifdown 及 ifup:

suselinux:~ # ifdown eth0
suselinux:~ # ifup eth0

使用 ifdown 及 ifup 時,於 /etc/sysconfig/network 目錄下需存在相關網路介面設定檔才行。

11.2.2 設定 ADSL 撥接上網

先確定 rp-pppoe 套件有安裝:

suselinux:~ # rpm -qa | grep rp-pppoe
rp-pppoe-3.5-333.1

再來才開始作設定:

suselinux:~ # adsl-setup  開始設定 ADSL 囉 !
Welcome to the Roaring Penguin ADSL client setup. First, I will run
some checks on your system to make sure the PPPoE client is installed
properly...

Looks good! Now, please enter some information:

USER NAME

>>> Enter your PPPoE user name (default 85576560@hinet.net): 85576566@hinet.net
                            

INTERFACE                     輸入您在 ISP 所取得的帳號                       
>>> Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethn, where 'n' is a number.
(default eth0): ← 指定連接至 ADSL modem 的介面。如要採用預設的 eth0,直接按下 Enter 鍵即可,否則請另行指定。

MODEM TYPE

We will try to detect if your modem is compliant with RFC 2516
or not. 3COM's 3CP4130 is *NOT* compliant, for instance.

Searching for a modem at interface eth0...
Found a RFC 2516 compliant modem, congratulations! :)

Do you want the link to come up on demand, or stay up continuously?
If you want it to come up on demand, enter the idle time in seconds
after which the link should be dropped. If you want the link to
stay up permanently, enter 'no' (two letters, lower-case.)
NOTE: Demand-activated links do not interact well with dynamic IP
addresses. You may have some problems with demand-activated links.
>>> Enter the demand value (default no): ← 直接按下 Enter 鍵來採用預設值即可,表示希望能持續保持連線。

DNS

Please enter the IP address of your ISP's primary DNS server.
If your ISP claims that 'the server will provide DNS addresses',
enter 'server' (all lower-case) here.
If you just press enter, I will assume you know what you are
doing and not modify your DNS setup.
>>> Enter the DNS information here: 168.95.1.1 ← 設定 DNS 的位址。

>>> Enter the secondary DNS server address here: 168.95.192.1 ← 要不要指定第二台 DNS 就看您自己囉。

PASSWORD

>>> Please enter your PPPoE password: ← 輸入您在 ISP 所取得的密碼。
>>> Please re-enter your PPPoE password: ← 再次輸入密碼做確認。

FIREWALLING

The firewall choices are:
0 - NONE: This script will not set any firewall rules. You are responsible
for ensuring the security of your machine. You are STRONGLY
recommended to use some kind of firewall rules.
1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
for a LAN
>>> Choose a type of firewall (0-2): 0 ← 設定 0 表示不設防火牆。

** Summary of what you entered ** ← 以下列出的是您剛剛所做的設定,檢查一下有沒有問題。

Ethernet Interface: eth0
User name: 85576566@hinet.net
Activate-on-demand: No
Primary DNS: 168.95.1.1
Secondary DNS: 168.95.192.1
Firewalling: NONE

>>> Accept these settings and adjust configuration files (y/n)? y ← 沒問題的話請輸入 y,接著就會幫您自動寫入相關的檔案。
Adjusting /etc/ppp/pppoe.conf
Adjusting /etc/resolv.conf
 (But first backing it up to /etc/resolv.conf-bak)
Adjusting /etc/ppp/pap-secrets and /etc/ppp/chap-secrets
 (But first backing it up to /etc/ppp/pap-secrets-bak)
 (But first backing it up to /etc/ppp/chap-secrets-bak)

Congratulations, it should be all set up!

Type 'adsl-start' to bring up your ADSL link and 'adsl-stop' to bring
it down. Type 'adsl-status' to see the link status.

這樣就設定完成了。接著可執行 "adsl-start" 來啟動 ADSL 連線,再來執行 "adsl-status" 來檢查連線狀態,最後執行 "adsl-stop" 來中斷連線,自行練習看看囉 !

設定開機時啟動 ADSL 連線

 
suselinux:~ # chkconfig --level 35 adsl on
suselinux:~ # chkconfig -l adsl ← 做個確認。

adsl  0:off 1:off 2:off 3:on 4:off 5:on 6:off

11.2.3 自動取得 IP 位址 (透過 DHCP) 來上網

如果是使用 Cable Modem 或者您有 IP 分享器 (兼具 DHCP 功能 ) 的話,要設定上網就非常簡單了:

suselinux:/etc/sysconfig/network # vi ifcfg-eth-id-00:05:5d:69:dd:b3

STARTMODE='onboot'
BOOTPROTO='dhcp' ← 由 static 改成 dhcp 即可。當設定成 dhcp 時,以下的那些參數會無法發揮作用噢。
IPADDR=220.132.78.75
NETMASK=255.255.255.0
NETWORK=220.132.78.0

suselinux:~ # rcnetwork restart

一般透過 DHCP 協定來取得 IP 位址時,會自動幫您指定其他的參數,比如 Default Gateway 及 DNS 等,因此您不需額外去做設定。
另外如果您是使用 11.2.2 節介紹的ADSL 撥接時,在這個網路介面設定檔裡最好指派靜態位址給 eth0,也就是不要把 BOOTPROTO 設定成 dhcp,不然在開機過程會因為 eth0 介面索取不到 IP 而耽誤一些開機時間。

主機名稱的設定,就在 /etc/HOSTNAME 裡搞定就行了:
suselinux:~ # vi /etc/HOSTNAME

suselinux.paching.com.tw

另外也可使用 hostname 指令來臨時指派您的主機名稱:
suselinux:~ # hostname linux.paching.com.tw

11.2.4 使用 YaST 做網路相關的設定


圖一:點選 [Network Card] 進入


圖二:這是網卡設定畫面,請點選 [Change] 來作修改


圖三:點選 [Edit] 進去編輯

接著就看是要使用 DHCP 取得 IP 位址還是設定靜態位址。這裡我們是以設定靜態 IP 位址為例,並同時點選 [Host Name and Name Server] 來設定主機名稱及 DNS 位址:


圖四:網路位址設定畫面


圖五:主機名稱及 DNS 位址的設定


再來如果要設定預設閘道器,請從圖四的 [Routing] 選項進入:


圖六:Default Gateway 設定畫面

設定完成後,請點選 [ok] 而回到網路位址設定的畫面:


圖七:於網路位址設定畫面中點選 [Next]


圖八:在網卡設定的主畫面中點選 [Finish] 即完成


11.3常用的網路相關指令

11.3.1 網路偵測指令

ping:send ICMP ECHO_REQUEST to network hosts.

  ping 算是最簡單的網路偵測指令,可以用來對兩主機之間的連線狀況進行偵測。
當傳送端下 ping 指令 ping 對方 IP 位址或主機名稱時,實際上就是送出一個 Echo Request 的回應請求訊息給目的端,而在目的端收到訊息後,會送出 Echo Reply 的回應回覆訊息給傳送端,如果傳送端沒有收到對方主機的正常回應訊息 (排除防火牆等因素),表示兩主機之間的連線出了問題。

IP 協定的主要功能是將封包儘可能的送達目的端,但在傳送過程中或許順利,或許會因對方主機的問題或網路的問題而造成封包無法順利送達目的端,此時傳送端就會接收到一些不同狀況的訊息,而這些問題 IP 協定並無能力解決,其主要是靠 ICMP (Internet Control Message Protocol) 來處理的。

ICMP 總共有 13 種訊息類別,像 Echo Request (Type 8)Echo Reply (Type 0) 就是屬於 ICMP 的其中兩種有關查詢的訊息類別。其他像 Destination Unreachable (Type 3)Time Exceeded (Type 11) 等則是屬於 ICMP 的錯誤訊息類別,用以通知傳送端無法連線的原因所在。

範例說明
suselinux:~ # ping 168.95.1.1
PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data.
64 bytes from 168.95.1.1: icmp_seq=1 ttl=248 time=43.4 ms
64 bytes from 168.95.1.1: icmp_seq=2 ttl=248 time=42.7 ms
64 bytes from 168.95.1.1: icmp_seq=3 ttl=248 time=43.9 ms
64 bytes from 168.95.1.1: icmp_seq=4 ttl=248 time=44.0 ms
64 bytes from 168.95.1.1: icmp_seq=5 ttl=248 time=42.2 ms

--- 168.95.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 42.237/43.275/44.068/0.705 ms

→ ping 指令未加 " -c " 參數時,會持續送出 echo-request 封包給目的端,直至按下 Ctrl-C 為止。

suselinux:~ # ping -c 3 www.google.com  只送出三個 echo-request 封包。
PING www.l.google.com (66.249.89.99) 56(84) bytes of data.
64 bytes from 66.249.89.99: icmp_seq=1 ttl=243 time=161 ms
64 bytes from 66.249.89.99: icmp_seq=2 ttl=243 time=155 ms
64 bytes from 66.249.89.99: icmp_seq=3 ttl=243 time=151 ms ← time=151 微秒,是表示連線速度。時間愈短代表連線品質愈佳。

--- www.l.google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 151.056/156.160/161.522/4.300 ms


ping 一台主機不會通,並不代表無法與其建立連線,因為對方主機可能:
1. 防火牆有設定拒絕接受 echo-request 的請求。
2. 在 /proc/sys/net/ipv4/icmp_echo_ignore_all 當中的值設為 1:
suselinux:~ # echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all

這就表示要忽略所有 echo-request 的封包。

雖然 ping 不成功,但對方所提供的服務還是可以正常存取。比如這台主機是 web server 的話,那您還是可以瀏覽網頁的。



traceroute:print the route packets take to network host.
 
追蹤封包從來源端到目的端的路由過程所經節點。當連線出了問題時,就可以使用這個指令來幫您追蹤封包到底卡在哪個節點上。

範例說明
suselinux:~ # traceroute 168.95.1.1
traceroute to 168.95.1.1 (168.95.1.1), 30 hops max, 40 byte packets
1 61-231-96-254.dynamic.hinet.net (61.231.96.254) 41.919 ms 47.254 ms 48.241 ms
2 ty-fo-c6r2.router.hinet.net (168.95.95.90) 50.315 ms 58.291 ms 56.301 ms
3 211.22.39.54 59.274 ms 63.197 ms 66.235 ms
4 220-128-8-122.HINET-IP.hinet.net (220.128.8.122) 68.246 ms 70.240 ms 74.234 ms
5 220-128-1-30.HINET-IP.hinet.net (220.128.1.30) 78.227 ms 81.227 ms 84.245 ms
6 220-128-1-113.HINET-IP.hinet.net (220.128.1.113) 86.238 ms 89.226 ms 92.249 ms
7 tp-s2-c6r8.router.hinet.net (211.22.35.185) 79.702 ms 82.220 ms 85.224 ms
8 tp-b-c6r2.router.hinet.net (168.95.1.61) 80.493 ms 83.631 ms 87.237 ms

如果要略過名稱解析的話,可加上 -n 參數,這樣會比較快看到回應的結果:

suselinux:~ # traceroute -n 168.95.1.1
traceroute to 168.95.1.1 (168.95.1.1), 30 hops max, 40 byte packets
1 61.231.96.254 44.298 ms 49.598 ms 48.612 ms
2 168.95.95.90 51.045 ms 52.603 ms 55.544 ms
3 211.22.39.54 106.051 ms 104.235 ms 102.285 ms
4 220.128.8.122 68.291 ms 70.590 ms 73.611 ms
5 220.128.1.30 78.609 ms 81.575 ms 84.603 ms
6 220.128.1.113 88.678 ms 89.609 ms 92.629 ms
7 211.22.35.185 79.792 ms 84.085 ms 87.674 ms
8 168.95.1.61 87.706 ms 92.594 ms 95.001 ms


11.3.2 網路設定指令

ifconfig: configure a network interface.
 
這是常用來設定網路介面的指令。只單純的執行 ifconfig,可以顯示目前已啟動的網路介面相關資訊。

指令語法 ifconfig [interface]
ifconfig interface [address] options

  interface 是指網卡介面名稱,如 eth0、eth1 等。至於 options 請參看以下:

常用 options 說明
netmask 用來設定介面位址的網路遮罩。
broadcast 廣播位址。
up 啟動此介面。
down 關閉此介面。

範例說明
suselinux:~ # ifconfig
eth0 Link encap:Ethernet HWaddr 00:05:5D:69:DD:B3
inet addr:192.168.1.111 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::205:5dff:fe69:ddb3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets : 1634 errors:0 dropped:0 overruns:0 frame:0
TX packets : 951 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:136692 (133.4 Kb) TX bytes:189633 (185.1 Kb)
Interrupt:11 Base address:0xe000
   
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets : 3 errors:0 dropped:0 overruns:0 frame:0
TX packets : 3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:176 (176.0 b) TX bytes:176 (176.0 b)

→ 顯示已啟動介面的相關訊息。如果要顯示所有介面的資訊,請加上 " -a " 參數即可。

suselinux:~ # ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:05:5D:69:DD:B3
inet addr:192.168.1.111 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::205:5dff:fe69:ddb3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets : 1634 errors:0 dropped:0 overruns:0 frame:0
TX packets : 951 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:136692 (133.4 Kb) TX bytes:189633 (185.1 Kb)
Interrupt:11 Base address:0xe000

→ 只顯示 eth0 介面的資訊。

suselinux:~ # ifconfig eth0 down ← 關閉網路介面
suselinux:~ # ifconfig eth0 up ← 啟動網路介面。

suselinux:~ # ifconfig eth0 192.168.2.15 netmask 255.255.255.224 broadcast 192.168.2.31

→ 設定網路介面,應該看得懂吧 ! 設定完後檢視一下:

suselinux:~ # ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:05:5D:69:DD:B3
inet addr : 192.168.2.15 Bcast : 192.168.2.31 Mask : 255.255.255.224
inet6 addr: fe80::205:5dff:fe69:ddb3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets : 1634 errors:0 dropped:0 overruns:0 frame:0
TX packets : 951 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:136692 (133.4 Kb) TX bytes:189633 (185.1 Kb)
Interrupt:11 Base address:0xe000

補充說明: 在 eth0 介面資訊中有個 Ethernet HWaddr,這是所謂的硬體位址,也就是該介面的實體位址。
之前我們所介紹的 IP 位址,只能說是主機之間用以通訊的邏輯位址 ( logical address ),至於真正在兩節點間執行通訊傳輸的位址則是實體位址 ( physical address ),而在 Ethernet 架構下,此實體位址即是所謂的 MAC (Medium Access Control) 位址。
MAC 位址是由 6 組16 進位數字所組成,前 3 組是供應商代號,後 3 組是網卡生產序號,因此可以說每一片網卡的 MAC 位址是獨一無二的。

設定 IP Alias

  一般來說,一個介面是配一個 IP 位址,但如果想讓一個介面能擁有多個位址的話,就可以使用 IP Alias 的方式,比如 eth0 已存在一個 Address,您還想設定其他的 IP Alias,則可以在 eth0 名稱後加上個 ":",並在之後指定一個數字,如 eth0:0、eth0:1 之類的。

範例說明
suselinux:~ # ifconfig eth0:0 192.168.5.5 netmask 255.255.255.0
suselinux:~ # ifconfig
eth0 Link encap : Ethernet HWaddr 00:05:5D:69:DD:B3
inet addr : 192.168.2.15 Bcast : 192.168.2.31 Mask : 255.255.255.224
inet6 addr: fe80::205:5dff:fe69:ddb3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets : 1634 errors:0 dropped:0 overruns:0 frame:0
TX packets : 951 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:136692 (133.4 Kb) TX bytes:189633 (185.1 Kb)
Interrupt:11 Base address:0xe000
   
eth0:0 Link encap : Ethernet HWaddr 00:05:5D:69:DD:B3
inet addr : 192.168.5.5 Bcast : 192.168.5.255 Mask : 255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:11 Base address:0xe000

→ 您可以看出 eth0 及 eth0:0 的實體位址是相同的,表示這兩個 IP Address 是屬於同一個介面的。



route:show / manipulate the IP routing table.
 
route 指令可以用來顯示及修改 routing table。如果只單純的執行 route 指令,則可以顯示目前的路由資訊。

指令語法route [ add | del ] [ -net | -host ] target [ netmask ] [ gw ] [ dev ]

  當您使用 " -net " 時,target 就必須指定網路段的位址 ; 而使用 " -host " 時,則 target 必須為主機位址。

參數說明
add 增加一筆路由資訊。
del 刪除一筆路由資訊。
-net 增加或刪除一筆網路段的路由資訊。
-host 增加或刪除一筆主機的路由資訊。
netmask 當增加一筆網路段的路由資訊時,需指定該網路段的網路遮罩。
gw 指定 Gateway 的位址。
dev 指定封包從本機的哪個網路介面出去。

範例說明
suselinux:~ # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
loopback * 255.0.0.0 U 0 0 0 lo
default 192.168.1.254 0.0.0.0 UG 0 0 0 eth0

當我們下達 route 指令時,若延遲了一些時間才顯示結果,有可能是名稱解析出了問題,此時可以加上 " -n " 參數 來讓 routing table 只顯示 IP Address 而略過名稱查詢,那這樣就不會發生延遲的問題了:

suselinux:~ # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0

針對以上 routing table 所顯示的資訊做個大略的解說:
Destination 表示封包要抵達的目的地位址,其可以是一台主機的 IP Address 或者是 Network Address。另外還有一個 default ( 0.0.0.0),其代表的是 Default Route。當封包要抵達的目的地在路由表上找不到相關的路由資訊時,則會將封包傳給預設路由所指定的 Default Gateway 主機來處理。
Gateway 封包要往哪個 gateway 位址來傳送。當這個欄位出現 " * " 或 " 0.0.0.0 " 時,表示封包傳送過程不需使用到 gateway。
Genmask 目的地的網路遮罩。如果目的地是一台主機就是 255.255.255.255,如果是 Default Route 就是 0.0.0.0。
Flags 就是旗標的意思。" U " 表示路由已啟用, " G " 代表要使用到 gateway," H " 則表示目的地是一台主機。
Iface 表示通往目的的封包是從哪個介面出去的。

從剛剛 routing table 所顯示的資訊再來做個說明,假使現在有一個從本機 eth0 介面出去的封包,其抵達的目的地是 192.168.1.0/24 的網路段內的主機時,就會根據 Destination 為 192.168.1.0 那一筆的路由資訊來傳送封包。又如果封包的目的為 192.168.5.55 時,由於所抵達的目的地在 routing table 裡找不到可套用的路由資訊,因此會把封包交由 Default Gateway 主機 (192.168.1.254) 來處理。

以下舉幾個簡單的靜態路由設定範例:

 
1. 新增一筆網路段 192.168.3.0/24 的路由資訊,並且指定所使用的 gateway 為 192.168.1.253:
suselinux:~ # route add -net 192.168.3.0 netmask 255.255.255.0 \
> gw 192.168.1.253 dev eth0

完成後,執行 route 指令去看看 routing table 有沒有多增加一筆路由資訊出來。
   
2. 新增一筆主機的路由資訊 (假設目的主機與本機位於同網段):
suselinux:~ # route add -host 192.168.1.222 dev eth0

這裡不需指定 netmask。另外如果目的主機與本機分屬不同網段,則可使用 gw 來指定 gateway。
   
3. 設定 Default Gateway:
suselinux:~ # route add default gw 192.168.1.254 dev eth0
   
4. 刪除一筆網路段的路由資訊:
suselinux:~ # route del -net 192.168.3.0 netmask 255.255.255.0

刪除主機或 Default Gateway 的路由資訊:
suselinux:~ # route del -host 192.168.1.222
suselinux:~ # route del default gw 192.168.1.254



綜合範例

以下我們會以一台 Linux 主機做 Router,來連接 192.168.5.0/24 (以 192.168.5.5 主機做代表) 及 192.168.10.0/24 (以 192.168.10.10 主機做代表) 這兩個網路段,其架構圖如下:



接著就來介紹如何使兩個不同網段的主機能夠彼此通訊:

1. Router 的設定
正常來說,擔任 Router 的主機需有兩個介面 (兩個位址),但如果您 Linux 主機只有一片網卡,那只好使用 IP Alias 的方式來解決囉:
suselinux:~ # ifconfig eth0 192.168.5.254 netmask 255.255.255.0
suselinux:~ # ifconfig eth0:0 192.168.10.254 netmask 255.255.255.0

再來就是啟動路由功能:
suselinux:~ # echo "1" > /proc/sys/net/ipv4/ip_forward

另外一種啟動路由的方式是直接編輯設定檔:
suselinux:~ # vi /etc/sysconfig/sysctl
IP_FORWARD="yes" 
← 由 no 改成 yes 即可。

suselinux:~ # /etc/init.d/boot.ipconfig start

這樣就啟動路由功能了,且下次開機時也能自動啟動路由噢。
   
2. 設定 A 主機
suselinux:~ # ifconfig eth0 192.168.5.5 netmask 255.255.255.0
suselinux:~ # route add -net 192.168.10.0 netmask 255.255.255.0 \
> gw 192.168.5.254 dev eth0

新增一筆網路段 192.168.10.0/24 的路由資訊,也就是說封包從 eth0 介面要送往這個網路段內的主機時,會交由 192.168.5.254 的主機去處理。設定好後可以用 route 指令去看看您的 routing table 有沒有多增加這筆資料。
   
3. 設定 B 主機
suselinux:~ # ifconfig eth0 192.168.10.10 netmask 255.255.255.0
suselinux:~ # route add -net 192.168.5.0 netmask 255.255.255.0 \
> gw 192.168.10.254 dev eth0
   
完成後,兩台主機可以互 ping 看看會不會通,要是測試有問題的話,再去檢查一下您的 routing table 有哪裡不對勁。

11.3.3 遠端連線指令

telnetssh
 
這兩個指令可以讓您對遠端的主機進行遠端連線操控,好用的很。如果您是一個大公司的系統管理者,可能所管理的主機分散在各地,這時候如果要對這些主機進行控管及設定時,就可以使用這些連線軟體來幫您搞定。

以 telnet 及 ssh 來說,建議各位使用 ssh 來做遠端連線,因為它是以加密的方式來做資料的傳送。而 telnet 呢 ? 由於它是以明碼的方式來傳輸資料,當然會顯得較不安全啊。

範例說明
tina@client:~> ssh 192.168.1.111
The authenticity of host '192.168.1.111 (192.168.1.111)' can't be established.
RSA key fingerprint is 2b:dd:8e:3f:2b:4e:1e:ce:b8:20:3f:d0:c4:63:f9:fa.
Are you sure you want to continue connecting (yes/no)? yes  ← 請輸入 yes 來繼續。
Warning: Permanently added '192.168.1.111' (RSA) to the list of known hosts.
tina@192.168.1.111's password:  ← 請輸入 192.168.1.111 這台主機上 tina 的密碼。
tina@suselinux:~>

說明: 若 client 端的 tina 是第一次對 192.168.1.111 這台 ssh server 作遠端連線時,由於尚未取得 server 上的 RSA public key,所以會出現這個詢問的訊息。而當您輸入 yes 後,就等於是接受 server 所傳來的 RSA public key,這時候在 client 端 tina 的家目錄下就會自動幫您建立 .ssh 目錄,並且在這目錄下會有一個 known_hosts 檔案,檔案內容就是 server 上 /etc/ssh/ssh_host_rsa_key.pub 的這個 RSA public key 。
如果下次再對這台主機做連線時,就不會看到這類的詢問訊息,而是直接要求您輸入密碼。

client:~ # ssh -l barry 192.168.1.111
barry@192.168.1.111's password: ← 請輸入 192.168.1.111 這台主機上 barry 的密碼。

→ 加上 -l 參數去指定使用 barry 這個帳號來登入遠端主機。

client:~ # ssh barry@192.168.1.111

與上面的意思一樣,自己試試吧 ! 至於要退出 ssh 時,執行 " exit " 或按下 Ctrl - D 即可。

client:~ # telnet 192.168.1.111
Trying 192.168.1.111...
Connected to 192.168.1.111.
Escape character is ' ^ ] '. ← 當您看到 login 提示號後可按下 " Ctrl - ] " 來退出登入畫面,接著在 telnet 提示號下輸入 q 即可離開。
Welcome to SuSE Linux 9.3 (i586) - Kernel 2.6.11.4-21.9-default (2).

suselinux login: barry ← telnet 預設不能以 root 登入。
Password: ← 輸入遠端主機的 barry 密碼。
Last login: Thu Oct 20 11:25:38 on tty2
Have a lot of fun...
barry@suselinux:~>

client:~ # telnet 192.168.1.150 2211

若 telnet server 所提供連線的 port 為 2211 時,則 client 端需指定 2211 port 噢,如不指定的話,預設為 23 port。
另外將來在學習架設 mail server 時,也可使用 telnet 來測試 server 的 110 及 25 port。



ftp 與 ncftp
  當想要連上 FTP 站台去下載或上傳資料時,就可以使用這兩個指令。直接舉範例來說明:

使用 ncftp 連線:

suselinux:~ # ncftp ftp.isu.edu.tw ← 使用 ncftp 時,預設是匿名登入的。
NcFTP 3.1.8 (Jul 27, 2004) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to 140.127.177.17...
歡迎光臨義守大學檔案伺服器 本站提供以下軟體可供下載:
*******************************************************************************
/pub/BeOS/ BeOS 作業系統
/pub/CPAN/ Perl 程式語言 (Comprehensive Perl Archive Network)
/pub/CPatch/ 中文化軟體 (收集大量的 Windows 共享軟體與中文化程式)
/pub/Documents/ 各類文件收集
/pub/FreeBSD/ FreeBSD 作業系統
/pub/Game/ 免費遊戲軟體
/pub/Hardware/ 硬體驅動程式
/pub/Linux/ Linux 作業系統
/pub/MsDownload/ 微軟相關軟體更新 (例如 Service Pack 等)
/pub/RFC/ Request for Comments (RFC 文件)
/pub/Solaris/ Solaris 作業系統
/pub/Yesterday/ 昨日小築完整 mirror (收集大量 Windows 相關軟體)
*******************************************************************************

另外,歡迎使用者多多利用 HTTP 的方式登入,一來有較佳的
傳輸效能,介面功能也較為完善,您還可以利用檔案搜尋引擎
快速找到您所需求的檔案,網址如下:

http://ftp.isu.edu.tw

Logging in...
Login successful.
Logged in to ftp.isu.edu.tw.
ncftp / > ← 看到這個提示號 (包括那個 " / " ) 表示已經連線成功了。接著可輸入 " ? " 或 " help " 來看有哪些指令可使用。

ncftp / >
help  如要顯示所有指令,請輸入 " help showall "。
Commands may be abbreviated. 'help showall' shows hidden and unsupported
commands. 'help <command>' gives a brief description of <command>.

ascii close lchmod lrm passive quit
binary dir lls lrmdir pdir rename
cat get lmkdir ls pls rm
cd help lpwd mkdir put rmdir
chmod lcd lrename open pwd  

若不清楚這些指令的用法,可輸入 " ? command " 或 " help command " 來查看:

ncftp / > help lcd
lcd: changes local working directory.
Usage: lcd <directory>

針對這些指令稍微做個說明

1. cat、cd、chmod、ls、mkdir、rm、rmdir、pwd 等指令,與平常我們所操作的指令相同。另外 dir 則是以長格式來顯示目錄內容
2. lcd、lchmod、lls、lmkdir、lpwd、lrm、lrmdir 等指令,是針對本地端 (local) 主機在操作的,比如 " lcd /tmp " 表示切換本地端目錄為 /tmp," lpwd " 為顯示目前本地端的工作目錄位置。
3. get 是用來下載檔案,put 則是上傳檔案。這兩個指令若加上 " -R " 參數則可下載及上傳目錄。比如 " get file1 file2 " 表示下載這兩個檔案," get -R dir " 表示下載 dir 目錄至本地端。
4. close 是用來結束遠端連線,open 則是與遠端主機建立連線,比如
ncftp / > close
ncftp> open 192.168.1.122
5. passive 是用來開啟或關閉被動模式。
6. 當目錄內容太多時,可使用 pls pdir 來讓您翻頁瀏覽。
7. 輸入 " ! " 可切換至本地端,要再回到 ftp 站台則執行 " exit " 指令或者按下 Ctrl - D 的組合鍵即可。
8. ascii binary 是看您要採取哪一種模式來傳輸資料。
9.

退出 ftp 站台可執行 exitquitbyeby 等指令,或按下 Ctrl - D 的組合鍵。

另外在指令的操作過程,可以使用 Tab 鍵來補字,或者使用 " * "、" ? " 這一類的萬用字元噢。

最後如果您想透過認證的方式來進入 FTP 站台,可這麼執行:


suselinux:~ # ncftp -u barry -p mypasswd 192.168.1.122

使用 ftp 連線:

suselinux:~ # ftp ftp.kernel.org
Trying 204.152.191.5...
Connected to zeus-pub.kernel.org.
220 Welcome to ftp.kernel.org.
Name (ftp.kernel.org:root): ftp ← 採用匿名登入的話,可以輸入 ftp anonymous
331 Please specify the password.
Password:
  ← 這裡不需做任何的輸入,直接按下 [Enter] 鍵就行了。

ftp>

成功登入後一樣可以先輸入 " ? " 來尋求幫忙,不懂的指令就執行 " ? command " 來查閱吧 ! 這裡就自己練習囉 !



11.3.4 檢視網路指令

netstat
:Print network connections, routing tables, interface statistics…etc。
  這個指令非常的好用,可以用來檢查網路狀態、路由資訊、介面訊息等。

常用參數
-a 顯示所有網路狀態。
-n 將主機名稱及服務名稱用數字來顯示。
-r 顯示 routing table。
-i 顯示網路界面的相關訊息。
-l 只顯示目前有在做 listen 的 socket。
-p 顯示每一個 socket 所屬的程式名稱及 PID。
socket:一個 IP 位址加上一個 port 就構成一個 socket。
-t 只顯示 tcp 封包的相關訊息。
-u 只顯示 udp 封包的相關訊息。

範例說明
suselinux:~ # netstat -ntl

Active Internet connections (only servers)
Proto
Recv-Q
 
Send-Q
  Local Address Foreign Address State
tcp
0
 
0
  0.0.0.0:111 0.0.0.0:* LISTEN
tcp
0
 
0
  0.0.0.0:23 0.0.0.0:* LISTEN
tcp
0
 
0
  127.0.0.1:25 0.0.0.0:* LISTEN
tcp
0
 
0
  : : : 22 : : : * LISTEN
tcp
0
 
0
  : :1: 25 : : : * LISTEN

說明:
Proto:所使用的通訊協定。
Local Address:顯示的是本地端的主機位址及埠號 (port number)。
Foreign Address:遠端主機的位址及埠號。
State:顯示 socket 的狀態。常見的有:
  ESTABLISHED:已建立的連線。
TIME_WAIT:在對方結束連線後,socket 就處於等待狀態,隨時會斷開連線。
LISTEN:socket 目前處於監聽狀態。

suselinux:~ # netstat -tl

Proto
Recv-Q
 
Send-Q
  Local Address Foreign Address State
tcp
0
 
0
  *:sunrpc *:* LISTEN
tcp
0
 
0
  *:telnet *:* LISTEN
tcp
0
 
0
  localhost:smtp *:* LISTEN
tcp
0
 
0
  *:ssh *:* LISTEN
tcp
0
 
0
  localhost:smtp *:* LISTEN

這個範例未使用 " -n " 參數,因此會嘗試顯示主機名稱及服務名稱。如果在 /etc/services 檔案裡能找到 port number 所對應的服務名稱,那當然就會正確顯示此服務名稱出來,但萬一找不到,就只好顯示 port number 囉 !

suselinux:~ # netstat -anp | less ← 加上 " -p " 參數就可額外顯示程式名稱及 PID。

Proto
Recv-Q
 
Send-Q
  Local Address Foreign Address State PID/Program name
tcp
0
 
0
  0.0.0.0:111 0.0.0.0:* LISTEN 6741/portmap
tcp
0
 
0
  0.0.0.0:23 0.0.0.0:* LISTEN 9564/xinetd
tcp
0
 
0
  127.0.0.1:25 0.0.0.0:* LISTEN 7253/master
tcp
0
 
0
  :::22 :::* LISTEN 7088/sshd
tcp
0
 
0
  192.168.1.111:22 192.168.1.2:3137 ESTABLISHED 9440/2

11.4 認識服務 (services) 與 daemon

11.4.1 服務與 daemon 概述

一般在 Linux 上頭所提供的服務,依其功能來區分的話有兩種:

˙ 系統服務
針對主機本身所提供的服務,稱之為系統服務。比如之前所學過的排程服務及管理系統紀錄的服務等。
˙ 網路服務
提供給網路的使用者來存取的服務,稱之為網路服務。比如遠端連線服務、 名稱解析服務、郵件服務等。當然提供這些網路服務的主機,必須安裝相關的伺服器軟體並做好相關設定才行。往後我們所要學習架設的伺服器,如 DNS Server、Mail Server、Web Server 等,就是要提供相關的服務來給網路的 client 存取使用的。

而主機所提供的這些服務,必須有相對的服務程式來執行相關的工作才行,這個提供特定服務的程式就是所謂的 daemon。比如負責排程服務的 cron (crond)atd、負責管理系統紀錄的 syslogd、負責遠端連線服務的 sshd、負責名稱解析服務的 named、… 等等。您會注意到這些程式名稱的結尾幾乎都有個 " d ",那就是 daemon 的意思啦。

系統在開機過程就會有一些特定服務的 daemon 被載入,且這些 daemon 不佔用前景終端機,而都是在背景執行的,只要您不將它終止,就一直常駐在記憶體內。當然您也可以在開機作業完成後,以手動的方式來啟動額外的服務 (daemon)。

接下來所要談論的內容都是以網路服務為主。在主機上所提供不同的網路服務,都有其所代表的 port number,這個 port 就好比是郵局的窗口一樣,比如您要領包裹或者是要劃撥,就必須要到不同的窗口去接洽,那要跟誰接洽呢 ? 當然是窗口後方的服務人員啊。回到主題,既然主機提供不同的網路服務,那 client 端就可以向不同的 port 來存取相關的服務囉 ! 而這些 port 自然就必需要有負責的服務程式 (daemon) 在做監聽 (listen)。至於哪些服務會啟動哪些 port,可從 /etc/services 檔案窺知一二:

suselinux:~ # cat /etc/services
# service-name port/protocol Description
ftp-data 20/tcp # File Transfer [Default Data]
ftp-data 20/udp # File Transfer [Default Data]
ftp 21/tcp # File Transfer [Control]
fsp 21/udp # File Transfer [Control]
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp # Telnet
telnet 23/udp # Telnet
smtp 25/tcp mail # Simple Mail Transfer
smtp 25/udp mail # Simple Mail Transfer
domain 53/tcp # Domain Name Server
domain 53/udp # Domain Name Server
bootps 67/tcp # Bootstrap Protocol Server
bootps 67/udp # Bootstrap Protocol Server
http 80/tcp # World Wide Web HTTP
http 80/udp # World Wide Web HTTP
pop3 110/tcp # Post Office Protocol - Version 3
pop3 110/udp # Post Office Protocol - Version 3
sunrpc 111/tcp rpcbind # SUN Remote Procedure Call
sunrpc 111/udp rpcbind # SUN Remote Procedure Call
ntp 123/tcp # Network Time Protocol
ntp 123/udp # Network Time Protocol
netbios-ns 137/tcp # NETBIOS Name Service
netbios-ns 137/udp # NETBIOS Name Service
netbios-dgm 138/tcp # NETBIOS Datagram Service
netbios-dgm 138/udp # NETBIOS Datagram Service
netbios-ssn 139/tcp # NETBIOS Session Service
netbios-ssn 139/udp # NETBIOS Session Service
imap 143/tcp imap2 # Internet Message Access Protocol
imap 143/udp imap2 # Internet Message Access Protocol
ldap 389/tcp # Lightweight Directory Access Protocol
ldap 389/udp # Lightweight Directory Access Protocol

當 client 端在存取各種網路服務時,需執行相關的應用程式,因此會使用不同的通訊協定來與 Server 做聯繫,而這些通訊協定都有其固定要使用的 port,比如 smtp 所使用的 25 port,pop3 的 110 port,ssh 的 22 port,http 的 80 port 等等,這些 port number 就是所謂的 well-known port。在上面的 /etc/services 裡所列出的 port 就是 well-known port ( 範圍是從 0 ~ 1023 port )。當然這些 port 是可以被修改的,不過一旦您修改過後,internet 上的使用者可能就無法存取您主機所提供的該項服務,除非使用者知道修改過後的 port 為何。比如您將 telnet 的 port 改成 23000,則 client 端在連您的 telnet 主機時,就需指定這個 port :
suselinux:~ # telnet 61.221.37.231 23000

所以如果想讓 internet 的使用者都能正常存取您所開放的服務,那麼可千萬不要任意去修改 well-known port 啊。

一台主機上可以同時提供好幾個網路服務,比如 Server 本身有提供遠端連線服務及網站服務,則當 client 要瀏覽網站時,會使用 http 來連接 Server 的 80 port ; 做遠端連線時,則使用 ssh 來連接 Server 的 22 port。

11.4.2 Super daemon --- inetd ( Internet daemon)

系統提供網路服務時,是讓某個 daemon 常駐在記憶體內來監聽某個 port,一旦聆聽到有須求進來時才可馬上提供相關服務。現在思考個問題,若是每個提供網路服務的 daemon,都是這樣常駐系統的話,那鐵定會用掉很多系統資源,增加系統負載,因此在 Linux 中有一支叫做 inetd 的 Super daemon 就應運而生了 (因為 inetd 可以代管很多服務,所以稱其為 Super daemon)。inetd 也是一支 daemon,平常可代為監聽一些服務的需求,並將此需求再轉給真正的服務程式來執行,也就是說這些服務程式不用親自去監聽請求,那當然在平時無需求進來時就不會佔用系統資源囉 !

由以上說明不難發現,一般系統啟動網路服務的方式區分成兩種,也就是我們常聽到的 standaloneinetd,請繼續看以下的整理說明:

˙ standalone
以 standalone 方式來獨立啟動服務時,負責該服務的 daemon 就一直常駐在記憶體,並監聽著自己所負責的 port。使用這種方式的好處是當需求進來時可以在第一時間做回應,所以運作起來會比較有效率 ; 而其缺點是會一直佔用系統的資源。
standalone 比較適合於一些需求量較大的服務,如 Web Server、Smtp Server、DNS 等。
˙ inetd
inetd 是負責幫那些平常使用量不高的服務,代為監聽這些服務程式的相關 port。靠 inetd 來啟動的服務,在平時無需求進來時,這些服務程式並不會佔用系統資源,只在有服務要求時,才靠 inetd 適時的去呼叫它們,而當連線終止之後,該服務程式也隨之結束,並釋放出其原本所佔用的系統資源。所以使用 inetd 來啟動服務的好處是可節省系統資源,至於缺點則是沒有辦法如 standalone 般擁有那麼高的執行效能。
像 telnet、ftp、pop3 等服務是最常見到靠 inetd 來啟動的服務。

11.4.3 inetd 相關檔案

※ /etc/xinetd.conf

這是 xinetd 的主要設定檔。咦,奇怪,怎麼 inetd 的名稱前面多一個 x 字母,其實這是 extended Internet services daemon 的簡寫,也就是加強版的 inetd 啦,所以後面再看到這個名稱時,不要再懷疑噢 ! 接著來研究一下這個檔案的內容:

suselinux:~ # vi /etc/xinetd.conf

defaults
{
  log_type = FILE /var/log/xinetd.log
  log_on_success = HOST EXIT DURATION
  log_on_failure = HOST ATTEMPT
  instances = 30
  cps = 50 10
}

includedir /etc/xinetd.d

說明
首先看到的是 defaults,於其後的 { } 內是設定了一些全域參數,這表示所有靠 inetd 來啟動的服務,都可以套用這裡的預設值。每個服務本身都能擁有它們自己的設定參數,且是凌駕在 defaults 之上,那如果沒有設定到的,就會套用 defaults 裡邊的設定囉。再來說明 defaults 內的設定參數涵義:
log_type 用來決定服務所產生的紀錄訊息要紀錄在哪裡。一般該項設定有兩種格式:
SYSLOG: 根據所指定的紀錄類型 (facility),來讓 syslogd 將訊息記載到紀錄檔內。比如:
log_type = SYSLOG authpriv
FILE: 將訊息紀錄到 FILE 所指定的檔案內。如所指定的檔案不存在,會自動幫您建立起來。比如:
log_type = FILE /var/log/xinetd.log
log_on_success 設定 client 端連線成功後所要記載的訊息。常見的設定項目有:
HOST: 紀錄來源端主機位址。
EXIT: 紀錄退出狀態。