linux 網絡

網絡參數設置命令 
所有時刻如果你想要做好自己的網絡參數設置,包括IP參數、路由參數和無線網絡等,就得要了解下面這些相關的命令才行。其中Route及ip這兩條命令是比較重要的。當然,比較早期的用法,我們都是使用ifconfig的。
? ifconfig:查詢、設置網卡和IP網段等相關參數。
? ifup、ifdown:這兩個文件是Script,通過更簡單的方式來啓動網絡接口。 
? Route:查詢、設置路由表(Route table)。
? ip:複合式的命令,能直接修改上述命令提到的功能。
ifconfig、ifup、ifdown
這 3個命令的用途都是啓動網絡接口,不過,ifup和ifdown僅就 /etc/sysconfig/network- scripts內的ifcfg-ethx(x爲數字)進行啓動或關閉的操作,並不能直接修改網絡參數,除非手動調整ifcfg-ethx文件才行。至於 ifconfig則能直接手動給予某個接口IP或調整其網絡參數。下面我們就分別來談一談。
1. ifconfig
ifconfig主要是能手動啓動、觀察和修改網絡接口的相關參數,能修改的參數非常多,包括IP參數及MTU等都能修改,他的語法如下: 
[root@linux ~]# ifconfig {interface} {up|down}  
一 般來說,直接輸入ifconfig就會列出目前已被啓動的卡,不論這個卡是否有設置IP,都會被顯示出來。而如果是輸入ifconfig eth0,則會顯示出這個接口的相關數據,而不管該接口是否啓動。所以,如果你想要知道某個網卡的Hardware Address,直接輸入“ifconfig"網絡接口代號"”即可。至於上述代碼中出現的各項數據是這樣的(數據排列由上而下、由左而右)。
? eth0:網卡的代號,也有lo這個loopback。 
? HWaddr:網卡的硬件地址,習慣稱爲MAC。 
? inet addr:IPv4的IP地址,後續的Bcase、Mask分別代表的是Broadcast和Netmask。 
? inet6 addr:是IPv6的版本的IP,我們沒有使用,所以略過。
? RX:那一行代表的是網絡由啓動到目前爲止的數據包接收情況,packets代表數據包數、errors代表數據包發生錯誤的數量、dropped代表數據包由於有問題而遭丟棄的數量等。
? TX:和RX相反,爲網絡由啓動到目前爲止的傳送情況。 
? collisions:代表數據包碰撞的情況,如果發生太多次,表示你的網絡狀況不太好。 
? txqueuelen:代表用來傳輸數據的緩衝區的儲存長度。 
? RX Bytes、TX Bytes:總傳送、接收的字節總量。 
? Interrupt、Memory:網卡硬件的數據,IRQ岔斷和內存地址。
通過觀察上述的資料,大致上能瞭解到你的網絡情況,尤其是RX、TX內的error數量,及是否發生嚴重的collision情況,都是需要注意的。 
範例二:暫時修改網絡接口
[root@linux ~]# ifconfig eth0 192.168.100.100
# 如果不加所有其他參數,則系統會依照該 IP 所在的 class 範圍,
# 自動地計算出 netmask 及 network, broadcast 等 IP 參數
[root@linux ~]# ifconfig eth0 192.168.100.100 netmask 255.255.255.128 \
> mtu 8000 
# 設置網絡接口,同時設置 MTU 的數值
[root@linux ~]# ifconfig eth0 MTU 9000
# 僅修改該接口的 MTU 數值,其他的保持不動
[root@linux ~]# ifconfig eth0:0 192.168.50.50
# 仔細看那個接口, eth0:0 。那就是在該網絡接口上,再仿真一個網絡接口,
# 亦即是在一個網卡上面設置多個 IP 的意思啦
[root@linux ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0F:EA:A3:06:A2
          inet addr:192.168.10.100 Bcast:192.168.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3669 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2892 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:667547 (651.9 KiB)  TX bytes:584799 (571.0 KiB)
          Interrupt:209 Memory:fb000000-0
eth0:0    Link encap:Ethernet  HWaddr 00:0F:EA:A3:06:A2
          inet addr:192.168.200.2 Bcast:192.168.200.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:209 Memory:fb000000-0
# 仔細看,是否和硬件有關的信息都相同。沒錯。因爲是同一個網卡。
[root@linux ~]# ifconfig eth0:0 down
# 關掉 eth0:0 這個接口。如果想要啓動 eth1 ,並且不設置所有網絡參數
# ifconfig eth1 up 就能實現
[root@linux ~]# /etc/init.d/network restart
# 剛剛設置的數據全部失效,會以 ifcfg-ethx 的設置爲主
使 用ifconfig能暫時用手動來設置或修改某個適配卡的相關功能,並且也能通過eth0:0這種虛擬的網絡接口來設置一張網卡上面的多個IP。手動的方 式是比較簡單。而且設置錯誤也沒有關係,因爲我們能利用 /etc/init.d/network restart來重新啓動整個網絡接口,那麼之前手動的設置數據會全部失效。另外,要啓動某個網絡接口,但又不讓他具有IP參數時,直接給他 ifconfig eth0 up即可。這個操作經常在無線網卡當中進行,因爲我們需要啓動無線網卡讓他去檢測AP存在和否。
2. ifup、ifdown
實時地手動修改一些網絡接口參數,能利用ifconfig來實現,如果是要直接以設置文件,亦即是在 /etc/sysconfig/network-scripts裏面的ifcfg-ethx等文件的設置參數來啓動的話,那就得要通過ifdown或ifup來實現了。 
[root@linux ~]# ifup   {interface}
[root@linux ~]# ifdown {interface}
[root@linux ~]# ifup eth0
ifup 和ifdown真是太簡單了。這兩個程式其實是script而已,他會直接到 /etc/ sysconfig/network-scripts目錄下搜索對應的設置文件,例如ifup eth0,他會找出ifcfg-eth0這個文件的內容,然後加以設置。關於ifcfg-eth0的設置請參考前一章連上Internet的說明。
不 過,由於這兩個程式主要是搜索設置文件(ifcfg-ethx)來進行啓動和關閉的,所以在使用前請確定ifcfg-ethx是否真的存在於正確的目錄 內,否則會啓動失敗。另外,如果以ifconfig eth0來設置或是修改了網絡接口後,就無法再以ifdown eth0的方式來關閉了。因爲ifdown會分析比較目前的網絡參數和ifcfg-eth0是否相符,不符的話,就會放棄這次操作。因此,使用 ifconfig修改完畢後,應該要以ifconfig eth0 down才能夠關閉該接口。
路由修改route
我們在網絡基礎的時候談過關於路由的問題,兩臺主機之間一定要有路由才能夠互通TCP/IP的協議,否則就無法進行聯機。一般來說,只要有網絡接口,該接口就會產生一個路由,例如,在鳥哥實驗室內部的主機有一個eth0及lo,所以: 

[root@linux ~]# route [-nee]
[root@linux ~]# route add [-net|-host] [網段或主機] netmask [mask] [gw|dev]
[root@linux ~]# route del [-net|-host] [網段或主機] netmask [mask] [gw|dev]
觀察的參數:
   -n,不要使用通信協議或主機名稱,直接使用 IP 或 Port Number;
   -ee,使用更周詳的信息來顯示;
增加 (add) 和刪除 (del) 路由的相關參數;
   -net,表示後面接的路由爲一個網段;
   -host,表示後面接的爲連接到單臺主機的路由;
   Netmask,和網段有關,能設置 netmask 決定網段的大小;
   Gw,gateway 的簡寫,後續接的是 IP 的數值,和 dev 不同;
   Dev,如果只是要指定由哪一塊網卡聯機出去,則使用這個設置,後面接 eth0 等。
範例一:單純的觀察路由狀態
[root@linux ~]# route -n
Kernel IP routing table
Destination    Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.10.0   0.0.0.0         255.255.255.0 U      0        0      0    eth0
169.254.0.0    0.0.0.0         255.255.0.0    U      0        0      0    eth0
0.0.0.0          192.168.10.30  0.0.0.0         UG     0        0      0    eth0
[root@linux ~]# route
Kernel IP routing table
Destination   Gateway           Genmask         Flags Metric Ref    Use Iface
192.168.10.0  *                  255.255.255.0  U      0       0      0    eth0
169.254.0.0   *                  255.255.0.0     U      0       0      0    eth0
default         Server.cluster   0.0.0.0         UG     0       0      0    eth0
在 上面的例子中仔細觀察route和route -n的輸出結果,你能發現有加-n參數的主要是顯示出IP,至於使用route,顯示的則是“主機名稱”。也就是說,在默認的情況下,route會去找出 該IP的主機名稱,如果未找到呢?就會顯示得遲鈍(有點慢),所以說,鳥哥通常都直接使用route-n了。由上面看起來,我們也知道default = 0.0.0.0/0.0.0.0,而上面的信息有哪些你需要知道的呢?
? Destination、Genmask:這兩個術語就分別是Network和Netmask了。所以這兩個東西就組合成爲一個完整的網段了。
? Gateway:該網段是通過哪個Gateway連接出去的?如果顯示0.0.0.0表示該路由是直接由本機傳送,亦即能通過局域網的MAC直接傳輸;如果有顯示IP的話,表示該路由需要經過路由器(網關)的幫忙才能夠傳送出去。 
? Flags:總共有多個標記,代表的意義如下。
Ø U(route is up):該路由是啓動的。
Ø H(target is a host):目標是一臺主機(IP)而非網段。
Ø G(use gateway):需要通過外部的主機來傳遞數據包。
Ø R(reinstate route for dynamic routing):使用動態路由時,恢復路由信息的標記。
Ø D(dynamically installed by daemon or redirect):已由服務器或轉port功能設置爲動態路由。
Ø M(modified from routing daemon or redirect):路由已被修改了。
Ø!(reject route):這個路由將不會被接受(用來阻止不安全的網段)。
? Iface:這個路由傳遞數據包的接口。
此 外,觀察一下上面的路由排列順序,依序是由小網段(192.168.10.0/24是Class C),逐漸到大網段(169.254.0.0/16 是Class B),最後則是默認路由(0.0.0.0/0.0.0.0)。然後當我們要判斷某個網絡數據包應該怎麼傳送的時候,該數據包會經由這個路由的過程來判斷。 例如,我上頭僅有三個路由,若我有一個傳往192.168.10.20的數據包要傳遞,那首先會找192.168.10.0/24這個網段的路由,找到 了,就直接由eth0傳送出去。
如果是傳送到Yahoo的主機呢?Yahoo的主機IP是202.43.195.52,我通過判斷不是 192.168.10.0/24,也不是169.254.0.0/16,結果到達0/0時,傳出去了,通過eth0將數據包傳給 192.168.10.30那臺Gateway主機。所以說,路由是有順序的。
因此當你重複設置多個同樣的路由時,例如,在你的主機上的兩張網卡設置爲相同網段的IP時,會出現什麼情況?會出現如下的情況:
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
也就是說,由於路由是依照順序來排列和傳送的,所以不論數據包是由哪個接口(eth0、eth1)所接收,都會由上述的eth0傳送出去,所以,在一臺主機上面設置兩個相同網段的IP本身沒有什麼意義。多此一舉。除非是類似虛擬主機(Xen、VMware等軟件)所架設的多主機,纔會有這個必要。 

範例二:路由的增加和刪除
[root@linux ~]# route del -net 169.254.0.0 netmask 255.255.0.0 dev eth0
# 上面這個操作能刪除掉 169.254.0.0/16 這個網段
# 請注意,在刪除的時候,需要將路由表上面出現的信息都寫入
# 包括netmask、dev 等參數
[root@linux ~]# route add -net 192.168.100.0 \
> netmask 255.255.255.0 dev eth0
# 通過 route add 來增加一個路由。請注意,這個路由必須能夠和你互通
# 例如,如果我下達下面的命令就會顯示錯誤:
# route add -net 192.168.200.0 netmask 255.255.255.0 gw 192.168.200.254
# 因爲我的環境內僅有 192.168.10.100 這個 IP ,所以不能和 192.168.200.254
# 這個網段直接使用 MAC 互通 
[root@linux ~]# route add default gw 192.168.10.30
# 增加默認路由的方法。請注意,只要有一個默認路由就夠了
# 在這個地方如果你隨便設置後,記得使用下面的命令重新設置你的網絡
# /etc/init.d/network restart
如 果是要進行路由的刪除和增加,那就能參考上面的例子了,其實,使用man route裏面的信息就非常豐富了。仔細查閱一下。你只要記得,當出現“SIOCADDRT: Network is unreachable”這個錯誤時,肯定是由於gw後面接的IP無法直接和你的網段溝通(Gateway並不在你的網段內),所以,趕緊檢查一下輸入的 信息是否正確。
ip
這裏的ip是個命令,不是那個TCP/IP的IP。這個ip命令的功能可多了。基 本上,他就是集合了ifconfig和route這兩個命令了,不過ip能實現的功能卻又多得多,真是個相當厲害的命令。如果你有興趣的話,請自行vi /sbin/ifup,就知道整個ifup就是利用ip這個命令來實現的。好了,怎麼使用呢?讓我們來看看。 
[root@linux ~]# ip [option] [操作] [命令]
參數:
Option,設置的參數,主要有:
    -s,顯示出該設備的統計數據(statistics),例如總接受數據包數等;
操作,亦即是能針對哪些網絡參數進行操作,包括有:
    Link,關於設備(device) 的相關設置,包括MTU、MAC 地址等等
    addr/address,關於額外的 IP 協議,例如多 IP 的實現等等;
    route,和路由有關的相關設置
由上面的語法我們能知道,ip除了能設置一些基本的網絡參數之外,還能夠進行額外的IP協議,包括多IP的實現,真是太完美了。下面我們就分3個部分(link、addr、route)來介紹這個ip命令吧。
1. 關於設備接口(device)的相關設置:ip link 
ip link能設置和設備(device)有關的相關設置,包括MTU及該網絡接口的MAC等,當然也能啓動(up)或關閉(down)某個網絡接口了。整個語法是這樣的: 
[root@linux ~]# ip [-s] link show   mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:50:fc:22:9a:cb brd ff:ff:ff:ff:ff:ff
3: sit0:  mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0
[root@linux ~]# ip -s link show eth0
2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:50:fc:22:9a:cb brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    484011792  2247372  0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    2914104290 2867753  0       0       0       0
使 用ip link show能顯示出整個設備接口的硬件相關信息,如上所示,包括網卡地址(MAC)、MTU等,比較有趣的應該是那個sit0的接口了,那個sit0的接口 是用在IPv4及IPv6的數據包轉換上的,對於我們僅使用IPv4的網絡是沒有作用的。lo及sit0都是主機內部所自行設置的。而如果加上 -s的參數後,則這個網卡的相關統計信息就會被列出來,包括接收(RX)及傳送(TX)的數據包數量等,周詳的內容和ifconfig輸出的結果是相同 的。
範例二:啓動、關閉和設置設備的相關信息
[root@linux ~]# ip link set eth0 up
# 啓動 eth0 這個設備接口。
[root@linux ~]# ip link set eth0 down
# 就關閉啊。簡單得要命
[root@linux ~]# ip link set eth0 mtu 1000
# 更改 MTU 的值,實現 1000 bytes,單位就是 bytes
使用ifconfig也能更新網卡的MTU,沒什麼不相同的地方,不過,如果是要更改網卡代號、MAC地址的信息的話,那可就得使用ip了。不過,設置前得要先關閉該網卡,否則會不成功。如下所示: 
範例三:修改網卡代號、MAC 等參數
[root@linux ~]# ip link set eth0 name vbird
SIOCSIFNAME: Device or resource busy
# 因爲該設備目前是啓動的,所以不能這樣設置。你應該這樣做:
[root@linux ~]# ip link set eth0 down        mtu 900 qdisc pfifo_fast qlen 1000
    link/ehter 00:40:d0:13:c3:46 brd ff:ff:ff:ff:ff:ff
# 怕了吧?連網卡代號都能改動。不過,玩玩後記得改回來
# 因爲我們的 ifcfg-eth0 還是使用原本的設備代號。避免有問題,要改回來
[root@linux ~]# ip link set vbird name eth0 
在這個設備的硬件相關信息設置上面,包括MTU、MAC及傳輸的模式等,都能在這裏設置。有趣的是那個address的項目後面接的可是硬件地址(MAC)而不是IP。非常容易搞錯。切記切記。更多的硬件參數能使用man ip查閱一下和ip link有關的設置。
2. 關於額外的IP相關設置:ip address 
如果說ip link是和OSI七層協議的第二層數據鏈路層有關的話,那麼IP address(IP addr)就是和第三層網絡層有關的參數了。主要是在設置和IP有關的各項參數,包括netmask、broadcast等。 
[root@linux ~]# ip address show    mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:50:fc:22:9a:cb brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
    inet6 fe80::250:fcff:fe22:9acb/64 scope link
       valid_lft forever preferred_lft forever
3: sit0:  mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0
看到上面那個特別的字體嗎?沒錯,那就是IP參數,也是ip address最主要的功能。下面我們進一步來新增虛擬的網絡接口看看:
範例二:新增一個接口,名稱假設爲 eth0:vbird 
[root@linux ~]# ip address add 192.168.50.50/24 broadcast + \
> dev eth0 label eth0:vbird
[root@linux ~]# ip address show eth0
2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:40:d0:13:c3:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
    inet 192.168.50.50/24 brd 192.168.50.255 scope global eth0:vbird
    inet6 fe80::240:d0ff:fe13:c346/64 scope link
       valid_lft forever preferred_lft forever
# 看到上面的特別字體了吧?多出了一行新的接口,且名稱是 eth0:vbird
# 至於那個 broadcast + 也能寫成 broadcast 192.168.50.255
[root@linux ~]# ifconfig
eth0:vbir Link encap:Ethernet  HWaddr 00:40:D0:13:C3:46
          inet addr:192.168.50.50  Bcast:192.168.50.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:5 Base address:0x3e00
# 如果使用 ifconfig 就能夠看到這個怪東西
範例三:將剛纔的接口刪除 
[root@linux ~]# ip address del 192.168.50.50/24 dev eth0
# 刪除就比較簡單 
3. 關於路由的相關設置:ip route
這個項目當然就是路由的觀察和設置了。事實上,ip route的功能幾乎和route命令差不多,不過,他還能進行額外的參數設計,例如MTU的規劃等,功能相當強大。
[root@linux ~]# ip route show  
如上述代碼所示,最簡單的功能就是顯示出目前的路由信息,其實跟route命令相同,只是需要注意幾個小細節:
? proto:此路由的路由協議,主要有Redirect、Kernel、Boot、Static、Ra等,其中Kernel指的是直接由核心判斷自動設置。
? scope:路由的範圍,主要是link,即是和本設備有關的直接聯機。
再來看一下怎麼進行路由的增加和刪除吧。 
範例二:增加路由,主要是本機直接可溝通的網段
[root@linux ~]# ip route add 192.168.5.0/24 dev eth0
# 針對本機直接溝通的網段設置好路由,不必通過外部的路由器
[root@linux ~]# ip route show
192.168.5.0/24 dev eth0  scope link
……以下省略……
範例三:增加能通往外部的路由,需通過 router
[root@linux ~]# ip route add 192.168.10.0/24 via 192.168.5.100 dev eth0
[root@linux ~]# ip route show
192.168.5.0/24 dev eth0  scope link
……其他省略……
192.168.10.0/24 via 192.168.5.100 dev eth0
# 仔細看,因爲我有 192.168.5.0/24 的路由存在 (我的網卡直接聯繫),
# 所以才能將 192.168.10.0/24 的路由丟給 192.168.5.100 
# 那臺主機來幫忙傳遞。和之前提到的 route 命令是相同的限制。
範例四:增加默認路由
[root@linux ~]# ip route add default via 192.168.1.2 dev eth0
# 那個 192.168.1.2 就是我的默認路由器 (gateway) 的意思
# 真的記得,只要一個默認路由就 OK 。
範例五:刪除路由
[root@linux ~]# ip route del 192.168.10.0/24
[root@linux ~]# ip route del 192.168.5.0/24
事 實上,這個ip的命令實在是太博大精深了。剛接觸Linux網絡的朋友,可能會有點暈,沒有關係。你先會使用ifconfig、ifup、ifdown和 route即可,等以後有了經驗之後,再繼續回來用ip吧。有興趣的話,也能自行參考ethtool命令(man ethtool)。
iwlist、iwconfig
這兩個命令需要你有無線網卡才能夠進行使用。其用法如下: 

? iwlist:利用無線網卡進行無線AP的檢測和取得相關的數據。
? iwconfig:設置無線網卡的相關參數。
5.1.5  dhClient
如 果你是使用DHCP協議在局域網內取得IP的話,那麼是否一定要去編輯ifcfg-eth0內的BOOTPROTO呢?有個更快速的做法,就是利用 dhClient這個命令。因爲這個命令纔是真正發送DHCP請求的。如果不考慮其他的參數,他的用法非常簡單,使用下面的方法即可: 
[root@linux ~]# dhClient eth0
非常簡單吧。這樣就能即時讓我們的網卡以DHCP協議去嘗試取得IP。不過在SuSE Distribution裏面,他僅有dhcpcd這個程式,他和dhClient是相同的東西。
ping
這 個ping是非常重要的命令,ping主要通過ICMP數據包來進行整個網絡的狀況報告,當然,最重要的就是ICMP type 0、8這兩個類型,分別是需求回報和主動回報網絡狀態是否存在的特性。要特別注意的是,ping需要通過IP數據包來傳送ICMP數據包,而IP數據包裏 有個相當重要的TTL(Time To Live)屬性,這是個非常重要的路由特性,周詳的IP和ICMP表頭數據請參考網絡基礎的周詳介紹。 
[root@linux ~]# ping [-bcstnM] IP
參數:
-b,後面接的是 broadcast 的 IP,用在你“需要對整個網段的主機進行 ping ”時;
-c,後面接的是執行 ping 的次數,例如 -c 5 ;
-n,不進行 IP 和主機名稱的反查,直接使用 IP ;
-s,發送出去的 ICMP 數據包大小,默認爲 56(bytes),再加 8 bytes 的 ICMP 表頭資料。
-t,TTL 的數值,默認是 255,每經過一個節點就會少
-M [do|dont] :主要在檢測網絡的 MTU 數值大小,兩個常見的項目是:
   do,代表傳送一個 DF (Don’t Fragment) 旗標,讓數據包不能重新拆包和打包;
   dont,代表不要傳送 DF 標記,表示數據包能在其他主機上拆包和打包。
範例一:檢測一下 168.95.1.1 這部 DNS 主機是否存在?
[root@linux ~]# ping -c 3 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=0 ttl=243 time=9.16 ms
64 bytes from 168.95.1.1: icmp_seq=1 ttl=243 time=8.98 ms
64 bytes from 168.95.1.1: icmp_seq=2 ttl=243 time=8.80 ms
--- 168.95.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 8.807/8.986/9.163/0.164 ms, pipe 2
ping最簡單的功能就是傳送ICMP數據包去需求對方主機響應是否存在於網絡環境中。上面的響應信息當中,幾個重要的項目如下。
? 64 Bytes:表示這次傳送的ICMP數據包大小爲64 Bytes,這是默認值。在某些特別場合中,例如,要搜索整個網絡內最大的MTU時,能使用-s 2000之類的數值來取代。
? icmp_seq=0:ICMP所檢測進行的次數,第一次編號爲0。
? ttl=243:TTL和IP數據包內的TTL是相同的,每經過一個帶有MAC的節點(node)時,例如router、bridge時,TTL就會減少1,默認的TTL爲255,你能通過 -t 150之類的方法來重新設置默認TTL數值。
? time=9.16 ms:響應時間,單位有ms(0.001秒)及µs(0.000001秒),一般來說,響應時間越小,表示兩臺主機之間的網絡聯機越良好。
如果你忘記加上 -c 3這樣的規定檢測次數,那就得要使用 [ctrl]-c將他結束掉了。 
範例二:針對整個網段進行 ping 的追查
[root@linux ~]# ping -c 3 -b 192.168.10.255
WARNING: pinging broadcast address          
如 果想要了解網內有多少臺主機存活着,那麼使用ping -b broadcast就能夠知道了。而不必一臺一臺主機來檢測。另外要特別注意一下,如果你的主機和待檢測主機並不在同一個網段內,那麼TTL默認使用 255,如果是同一個網段內,那麼TTL默認則使用64。看看上面的輸出即可明白。
我們在前幾章的網絡基礎裏面談到加大幀(frame)時,對於 網絡性能是有幫助的,因爲數據包打包的次數會減少,加上如果整個傳輸的媒介都能夠接受這個frame而不必重新進行數據包的拆解和重組的話,那麼性能當然 會更好,修改frame大小的參數就是MTU。好了,目前我們知道網卡的MTU能通過ifconfig或是ip等來實現,那麼追蹤整個網絡傳輸的最大 MTU時,又該怎麼查詢?最簡單的方法當然是通過ping傳送一個大數據包,並且不許中繼的路由器或Switch將該數據包重組,這就能夠處理了: 
範例三:找出最大的 MTU 數值
[root@linux ~]# ping -c 2 -s 1000 -M do 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 1000(1028) bytes of data.
1008 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.424 ms
# 如果有響應,那就是能接受這個數據包,如果無響應,那就表示這個 MTU 太大了
[root@linux ~]# ping -c 2 -s 8000 -M do 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 8000(8028) bytes of data.
ping: local error: Message too long, mtu=1500
# 這個錯誤信息是說,本地端的 MTU 纔到 1500 而已,你要檢測 8000 的 MTU
# 根本就是無法實現的。那怎麼是好?用前一小節介紹的 ip link 來進行 MTU 設置吧
不 過,你需要知道的是,由於IP數據包表頭(不含options)已佔用了20Bytes,再加上ICMP的表頭有8Bytes,所以當然你在使用 -s size的時候,那個數據包就得要先扣除 (20+8=28)的大小了。因此如果要使用MTU爲1500時,就得要下達“ping -s 1472 -M do xx.yy.zz.ip”才行。另外,由於本地端的網卡MTU也會影響到檢測,所以如果想要檢測整個傳輸媒介的MTU數值,那麼每個能調整的主機就得要先 使用ifcofig或ip將MTU調大,然後再去進行檢測,否則就會像上面提供的案例相同,可能會出現“Message too long,mtu=1500”之類的字樣。如果檢測完畢後,想要調整最佳化的MTU,那麼請參考前一章節的內容來調整。
不過不要隨便調整MTU,除非真的有問題。通常是在如下情況調整MTU。
? 因爲全部的主機羣都是在內部的網段,例如羣集架構(Cluster)的環境下,由於內部的網絡節點都是我們能控制的,因此能通過修改MTU來改進網絡性能。 
? 因爲操作系統默認的MTU和你的網段不符,導致某些網站能順利聯機,某些網站則無法聯機。以視窗系統操作系統作爲聯機分享的主機時,在Client端挺容易發生這個問題。
如果是要連上Internet的主機,注意不要隨便調整MTU,因爲我們無法知道Internet上面的每臺機器能夠支持的MTU到多大,因爲這些也不是我們能夠管得到的。
另外,其實每種聯機方式都有不同的MTU值,常見的各種接口的MTU值如表5-1所示。 
表5-1  常見的各種接口的MTU值
網絡接口
MTU
Ethernet
1500
PPPoE
1492
Dial-up(Modem)
576
網絡上也有免費幫忙查詢MTU和傳輸相關數據的網站,例如下面這個網站: 
http://forums.speedguide.net:8117/
連接上這個網站之前,請先取消你瀏覽器上的代理服務器(Proxy)的設置,才能顯示出正確的信息。如果在視窗系統的系統上想要修改MTU值的話,那就得要修改視窗系統的日誌文件,在視窗系統上面對於MTU的檢測和修改的周詳做法能參考微軟的官方網站: 
http://www.microsoft.com/taiwan/msclub/member/TIPS/Spring_2001
/tip1to3/tip1to3_2.htm
traceroute
我 們前面談到的命令大多數都是針對主機的網絡參數設置所需要的,而ping是兩臺主機之間的迴應和否的判斷,那麼有沒有命令能追蹤兩臺主機之間通過的各個節 點(Node)通信狀況的好壞呢?如果我們聯機到yahoo的速度比平常慢,你覺得是自己的網絡環境有問題,還是外部的Internet有問題?如果是前 者的話,我們當然需要檢查自己的網絡環境,看看究竟是誰中毒了?但如果是Internet的問題呢?那只有“等等等”了。判斷是這個問題就得要使用 traceroute這個命令。 

[root@linux ~]# traceroute [-nwig] IP
參數:
-n,能不必進行主機的名稱解析,只用 IP ,速度較快。
-w,若對方主機在幾秒鐘內沒有回聲就宣告不治...默認是 5 秒。
-i,用在比較複雜的環境,如果你的網絡接口非常多非常複雜時,纔會用到這個參數。
     例如,你有兩條 ADSL 能連接到外部,那你的主機會有兩個 ppp。
     你能使用 -i 來選擇是 ppp0 還是 ppp1 啦。
-g,和 -i 的參數相仿,只是 -g 後面接的是 gateway 的 IP 。
範例一:
[root@linux ~]# traceroute -n tw.yahoo.com
traceroute to tw.yahoo-ap1.akadns.net (203.84.202.164), 30 hops max, 
38 byte packets
1  61.59.121.1  42.174 ms  41.690 ms  41.058 ms
2  139.175.172.2  40.962 ms  41.978 ms  40.973 ms
3  192.72.122.130  40.983 ms  41.930 ms  41.003 ms
4  139.175.58.210  42.956 ms  41.997 ms  42.337 ms
5  139.175.58.153  47.591 ms  47.972 ms  48.748 ms
6  139.175.56.30  48.193 ms  47.970 ms  47.986 ms
7  139.175.57.94  47.959 ms  47.951 ms  47.985 ms
8  139.175.56.138  48.363 ms  47.586 ms  47.995 ms
9  139.175.58.42  49.256 ms  50.668 ms  47.490 ms
10  61.58.33.133  201.882 ms  201.565 ms  200.973 ms
11  61.58.33.50  199.910 ms  199.019 ms  198.961 ms
12  203.84.200.226  202.391 ms  202.567 ms  209.283 ms
這 個traceroute挺有意思的,這個命令會針對你想要連接的目的地的所有Router進行ICMP的超時等待,例如上面的例子當中,由鳥哥的主機連接 到Yahoo時,他會經過12個節點,traceroute會主動對這12個節點做ICMP的迴應等待,並檢測回覆的時間,每個節點會檢測三次。所以像上 面顯示的結果,發現每個節點其實回覆的時間大約在200 ms以內,算是Internet的環境還能了。而且由上面的信息來看,在61.58.33.133這個節點後的傳輸延遲較久,至於之前的9個節點則有不錯 的表現。通過這種分析,能讓你瞭解到這條聯線是哪個環節出了問題。
另外,如果在默認的5秒鐘之內traceroute聽不到節點的迴應,那麼屏幕 上就會出現一個“*”的符號,告知該節點無法有順利的響應。由於我們的traceroute用的是ICMP數據包,有些防火牆或主機可能會將ICMP數據 包扔掉,因此就會造成等不到迴應的狀況。另外,有些Gateway本來就不支持traceroute的功能,因此也會產生“*”的狀況,所以分析時要注意 一下。
nslookup
這條命令的用途和host基本上是相同的,就是用來作爲IP和主機名稱對應的檢查,同樣是使用 /etc/resolv.conf這個文件作爲DNS服務器的來源選擇。 

[root@linux ~]# nslookup [-query=[type]] [hostname|IP]
參數:
-query=type:查詢的類型,除了傳統的 IP 和主機名稱對應外,DNS 更有非常多信息
             所以我們能查詢非常多不同的信息,包括mx、cname 等
             例如: -query=mx 的查詢方法。
範例一:找出 www.google.com.tw 的 IP
[root@linux ~]# nslookup www.google.com.tw
Server:         168.95.1.1
Address:        168.95.1.1#53
Non-authoritative answer:
www.google.com.tw       canonical name = www.google.com.
www.google.com  canonical name = www.l.google.com.
Name:   www.l.google.com
Address: 64.233.189.104
範例二:找出 168.95.1.1 的主機名稱
[root@linux ~]# nslookup 168.95.1.1
Server:         168.95.1.1
Address:        168.95.1.1#53
1.1.95.168.in-addr.arpa name = dns.hinet.net.
怎麼,看起來和host差不多吧。不過,這個nslookup還能通過IP找出主機名稱。例如,那個範例二,他的主機名稱是:dns.hinet.net。目前大家都建議使用dig這個命令來取代nslookup
Telnet
Telnet 是早期個人計算機連接到服務器主機上工作時最重要的一個軟件了。他不僅能直接連接到服務器上,還能用來連接BBS呢。非常棒!不過,Telnet本身的數 據在傳送的時候是使用明文(原始的數據,沒有加密),所以數據在Internet上面跑的時候,會比較危險一點(就怕被別人監聽)。更周詳的內容我們會在 “遠程聯機服務器”章節裏做介紹的。 
[root@linux ~]# Telnet [host|IP] [port]
範例一:連接到成大夢之大地這個 BBS 站
[root@linux ~]# Telnet bbs.dorm.ncku.edu.tw
bbs.ccns.ncku.edu.tw ⊙
⊙ 140.116.250.3 [DreamBBS Ver.040223]
歡迎光臨。系統負載:0.16 0.16 0.16 [負載正常]
  ?─┼────┼─?        ??         ┌┤夢之大地├────────────┐
  ?──┬──┬──??───┴┴───┬?  │                             │
  ?──┴──┴──?               │    │ 夢之大地由                    │
  ?────────?           ?─?    │    【計算機網絡愛好社‧CCNS】     │
   ?───┬───?       ?──?        │                     維護管理  │
           │      │ ?─?             │                              │
   ?───┴───? ?┴───────?   └───────────┤By BenHe├┘
  ┌┤本站站長羣├────────┐          ?            ?    ?   ?
  │站長: billcho             │  ?────┼────??─┼─?┼──┼?
  │系統: cat                 │          │           │    │   ││
  │站務: muwell  ianwolf     │        ???          │    │   ││
  │      renn999 GG         │      ??  ??         │    │   │?
  │                         │    ??      ??       │?  │
  └───────────────┘  ??          ?─??─┴?  ?───?
參觀用賬號:guest,申請新賬號:new。目前在線人數 [2183/5000] 人。
請輸入代號:           
如 上所示,我們能通過Telnet輕易地連接到BBS上面,而如果你的主機有開啓Telnet服務的話,同樣地利用Telnet  IP並且輸入賬號和密碼 之後,就能夠登錄主機了。另外,在Linux上的Telnet軟件還提供了Kerberos的認證方式,有興趣的話請自行參閱man Telnet的說明。
除了連接到服務器及連接到BBS站之外,Telnet還能用來連接到某個port(服務)上。例如,我們能用Telnet連接到port 110,看看這個port是否正確啓動了。
範例二:檢測本機端的port 110 是否正確啓動?
[root@linux ~]# Telnet localhost 110
Trying 127.0.0.1...
Telnet: connect to address 127.0.0.1: Connection refused
# 如果出現這樣的信息,代表這個 port 沒有啓動或是這個聯機有問題
# 因爲你看到那個 refused
[root@linux ~]# Telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is ’_]’.
220 vbird.vbird.idv.tw ESMTP Postfix
ehlo localhost
250-linux.dm.tsai
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.
根 據輸出的結果,我們就能夠知道這個通信協議(Port Number提供的通信協議功能)是否已成功地啓動了。而每個port所監聽的服務都有其特別的命令,例如,上述的port 25就是本機接口提供的電子郵件服務,那個服務所支持的命令就如同上面使用的數據相同,不過其他的port就不見得支持這個ehlo命令,因爲不同的 port有不同的程式嘛,當然支持的命令就不同了
FTP 
常常會聽到FTP這個服務。如果你想要下載Linux的光盤燒錄映象文件時,能到FTP網站,他們都是FTP提供者啊。那我們要怎麼去下載呢?當然就是通過FTP的客戶端軟件了。在Linux下面,我們能通過FTP這個軟件,也能通過下一小節會提到的LFTP軟件。 
[root@linux ~]# FTP [-p] [host|IP] [port]
參數:
-p :啓動被動式模式 (passive、PASV);
範例一:聯機看看
[root@linux ~]# FTP FTP.isu.edu.tw
Connected to FTP.isu.edu.tw (140.127.177.17).
220-歡迎光臨義守大學文件服務器
220-
220-本站提供以下軟件可供下載:
220-********************************************************************
220-/pub/BeOS/       BeOS 操作系統
220-/pub/Linux/      Linux 操作系統
....(其他省略)....
220-********************************************************************
Name (FTP.isu.edu.tw:dmtsai): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
FTP>
FTP> help          cd /pub       dir           get file      mget file     put file      delete file   mkdir dir     lcd /home     passive       binary       
FTP其實是個非常麻煩的協議,因爲他使用兩個port分別進行命令和數據的通信,周詳的內容我們會在後續的FTP 服務器內詳談,這裏我們先簡單介紹一下怎麼使用FTP這個軟件。首先當然需要登錄了,所以在上面的代碼中填入賬號和密碼。由於提供匿名登錄,而匿名登錄者 的賬號就是anonymous,所以直接填寫那個賬號即可。如果是私人的FTP,可能需要提供一組完整的賬號和密碼。
登錄FTP主機後,就能夠使 用FTP軟件的功能進行上傳和下載的操作,幾個常用的FTP內命令如上述代碼所示,不過,鳥哥建議你能連到大學的FTP網站後,使用help(或問號 ?)來查詢可用的命令,然後嘗試下載以測試使用一下這個命令吧。這樣以後沒有瀏覽器的時候,你也能直接連接下載FTP了。
另外,如果由於某些原因,讓你的FTP主機的port開在非正規的端口,那你就能利用下面的方式來連接到該臺主機。 
[root@linux ~]# FTP hostname 318
# 假設對方主機的 FTP 服務開啓在 318 這個 port 。
LFTP
早期當我們要登錄提供匿名登錄的主機時,非常多時候都是使用ncFTP這個軟件,不過,目前有更棒的選擇,那就是LFTP。這個軟件甚至能在FTP裏面使用類似Bash的指令功能,實在是非常的完美。而且整個使用的方法和上面提到的FTP又非常類似。 
[root@linux ~]# LFTP [-p port] [-u user[,pass]] [host|IP]
參數:
-p,後面能直接接上遠程 FTP 主機提供的 port
-u,後面則是接上 賬號和密碼 ,就能夠連接上遠程主機了
      如果沒有加賬號密碼, lFTP 默認會使用 anonymous 嘗試匿名登錄
範例一:利用 LFTP 登錄義守大學
[root@linux ~]# LFTP FTP.isu.edu.tw
lFTP FTP.isu.edu.tw:~>
# 瞧。一下子就登錄了
至 於登錄FTP主機後,相同能使用help來顯示出能執行的命令,和FTP非常類似。不過多了書籤的功能,而且也非常的類似於bash,這個功能非常不錯。 除了這個好用的文本界面的FTP軟件之外,事實上更有非常多圖像界面的好用軟件呢。最常見的就是gFTP了。不僅是圖像界面,而且和cute FTP非常像,非常容易上手。Cent OS本身就有提供gFTP了,你能拿出原版的光盤來安裝,然後進入X Window後,啓動一個Shell,輸入gFTP就能夠發現他的好用了。下面我們再來介紹一下實時通信吧。
Gaim
我 想,目前大家應該都知道什麼是MSN、雅虎實時通及其他的通信軟件吧。那麼要連上這些服務器時,該怎麼處理哪?非常簡單,在X Window下面使用Gaim就行了,太方便了。請先進入X Window系統,然後開啓一個終端機窗口,接着直接輸入Gaim(請注意你必須已安裝了Gaim了),然後就會出現如圖5-1所示的窗口。 

圖5-1 Gaim使用範例圖 
輸入你的賬號和密碼,並選擇相對應的實時通信服務器(如MSN或Yahoo實時通),就能進入到如圖5-2所示的界面 

圖5-2 Gaim使用範例圖
當一切都沒有問題後,按下“登錄”按鈕,這樣就能在Linux上使用實時通信軟件了,方便得非常。
文本網頁瀏覽
什麼?文本界面竟然有瀏覽器!別逗了好不好?呵呵!誰有那個時間在逗你。真的有這個東西,是在文本界面下上網瀏覽的好工具,他們分別是lynx及wget這兩個寶貝,不過,你必須確定你已安裝了這兩個軟件才行。下面就讓我們來聊一聊這兩個好用的傢伙吧。
5.4.1  lynx
這 個命令最大的作用就是讓我們在文本模式下使用這個瀏覽器來瀏覽網頁。但鳥哥認爲,這個文件最大的功能是查閱Linux本機上面以HTML語法寫成的文件信 息(Document),怎麼說呢?如果你原來在Linux本機下面的 /usr/share/doc這個目錄看過文件信息的話,就會常常發現一些網頁文件,使用vi去查閱時,總是看到一堆HTML的語法,妨礙閱讀啊。這時候 使用lynx就是個好方法了,內容能看得清清晰楚。 
[root@linux ~]# lynx [options] [website]
參數:
options 指的是一些慣用的參數,能使用 man lynx 查閱,常見的有:
-anonymous :默認使用匿名登錄。
-assume_charset=big5 :設置默認的語系數據爲 big5 ,用在中文網頁非常方便。
範例一:瀏覽 Linux kernel 網站
[root@linux ~]# LANG=zh_TW.big5
[root@linux ~]# lynx http://www.kernel.org
輸入LANG=zh_TW.big5是當你想要瀏覽中文網站時,那麼終端機就得要有相對應的顯示編碼才行,否則會有一堆亂碼產生。當我直接輸入lynx網站的網址後,就會出現如圖5-3所示界面。 

圖5-3 lynx使用範例圖
在圖5-3中,特別字體的部分是我們能使用Tab按鍵來進行終極鏈接的轉換。而上圖最下面一行則顯示出一些熱鍵,能按上述的熱鍵來參考一些常見的命令功能。不過有些地方你還是要知道一下:
? 進入界面之後,由於是文本模式,所以編排可能會有點位移。不過不要緊,不會影響我們查看信息。 
? 這個時候能使用“上下鍵”讓光標停在上面的選項當中(如信箱、書籤等),再按下Enter就進入該頁面。
? 能使用左右鍵來移動“上一頁”或“下一頁”。
? 能通過修改 /etc/lynx.cfg來設置顯示的字符編碼(中國臺灣地區能選擇Big5編碼)。
? 其他的設置能使用上面的範例中最下面那一行的說明。 
一些常見功能如下:
? h:Help,求助功能,在線說明書。
? g:Goto URL,按g後輸入網頁地址(URL)如
http://www.abc.edu/
等。
? d:download,下載文件。
? q:Quit,退出lynx 。
? Ctrl+C:強迫中止lynx的執行。
? 方向鍵如下:
Ø 上:移動光標至本頁中“上一個可鏈接點”。
Ø 下:移動光標至本頁中“下一個可鏈接點”。
Ø 左:back,跳回上一頁。
Ø 右:進入反白光標所鏈接的網頁。
Ø Enter:等同“右”鍵。
至於如果是瀏覽Linux本機上面的網頁文件,那就能使用如下的方式: 
[root@linux ~]# cd /usr/share/doc/samba-3.0.10/htmldocs
[root@linux htmldocs]# lynx index.html
在鳥哥的Cent OS 4.3當中,有這麼一個文件,我就能利用lynx來取得查看。顯示的結果如圖5-4所示。 

圖5-4 lynx使用範例圖
當然,因爲你的環境可能是在Linux本機的tty1~tty6,所以無法顯示出中文,這個時候你就得要進行LANG=en_US之類的語言設置才行。而如果你常常需要瀏覽中文語系的網頁,那就能直接修改設置文件,例如 /etc/lynx.cfg這個文件內容:
[root@linux ~]# vi /etc/lynx.cfg
CHARACTER_SET:utf-8            
另外,如果有時候你必須上網點選某個網站來自動取得更新時。例如,早期的自動在線更新主機名稱系統,僅支持網頁更新,那你怎麼進行更新呢?能使用lynx!利用 -dump這個參數先處理: 
[root@linux ~]# lynx -dump \
> http://some.site.name/web.php?name=user&password=pw > testfile
上 面的網站後面有加個問號(?)對吧?後面接的則是利用網頁的GET功能取得的各項變量數據,利用這個功能,我們就能直接登錄到該網站上了。非常方便吧。而 且會將執行的結果輸出到testfile文件中,不過如果網站提供的數據是以POST爲主的話,那鳥哥就不知道怎麼搞定了。
tcpdump
說 實在的,對於tcpdump這個軟件來說,你甚至能說這個軟件其實就是個***軟件,因爲他不僅能分析數據包的流向,連數據包的內容也能進行監聽,如果你使 用的傳輸數據是明文的話,在Router上就可能被人家監聽走了。非常可怕。所以,我們也要來了解一下這個軟件(注:這個tcpdump必須使用root 的身份執行)。 

[root@linux ~]# tcpdump [-nn] [-i 接口] [-w 儲存檔名] [-c 次數] [-Ae]
                        [-qX] [-r 文件] [所欲捕捉的數據內容]
參數:
-nn,直接以 IP 及 Port Number 顯示,而非主機名和服務名稱。
-i,後面接要「監聽」的網絡接口,例如 eth0, lo, ppp0 等等的接口。
-w,如果你要將監聽所得的數據包數據儲存下來,用這個參數就對了。後面接文件名。
-c,監聽的數據包數,如果沒有這個參數, tcpdump 會持續不斷的監聽,
     直到用戶輸入 [ctrl]-c 爲止。
-A,數據包的內容以 ASCII 顯示,通常用來捉取 WWW 的網頁數據包資料。
-e,使用資料連接層 (OSI 第二層) 的 MAC 數據包數據來顯示。
-q,僅列出較爲簡短的數據包信息,每一行的內容比較精簡。
-X,能列出十六進制 (hex) 及 ASCII 的數據包內容,對於監聽數據包內容非常有用。
-r,從後面接的文件將數據包數據讀出來。那個「文件」是已存在的文件,
     並且這個「文件」是由 -w 所製作出來的。
所欲捕捉的數據內容:我們能專門針對某些通信協議或是 IP 來源進行數據包捕捉。
     那就能簡化輸出的結果,並取得最有用的信息。常見的表示方法有。
     ’host foo’, ’host 127.0.0.1’ :針對單臺主機來進行數據包捕捉。
     ’net 192.168’ :針對某個網段來進行數據包的捕捉。
     ’src host 127.0.0.1’ ’dst net 192.168’:同時加上來源(src)或目標(dst)限制。
     ’tcp port 21’:還能針對通信協議檢測,如tcp、udp、arp、ether 等。
     還能利用 and 和 or 來進行數據包數據的整合顯示呢。
範例一:以 IP 和 Port Number 捉下 eth0 這個網卡上的數據包,持續 3 秒
[root@linux ~]# tcpdump -i eth0 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 
9648
01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 
9648
如 果你是第一次看tcpdump的man page時,肯定會暈菜的,因爲tcpdump幾乎都是分析數據包的表頭數據,用戶如果沒有簡單的網絡數據包基礎知識,要看懂非常困難。所以,至少你得要 回到第2章“網絡基礎”裏面去好好理解一下TCP數據包的表頭信息纔好。至於那個在範例一所產生的輸出中,我們能大概區分爲幾個字段,現以範例一當中那行 特別字體行來說明一下:
? 01:33:40.41:這個是此數據包被捕捉的時間,“時:分:秒”的單位。 
? IP:通過的通信協議是IP。
? 192.168.1.100.22>:傳送端是192.168.1.100這個IP,而傳送的Port Number爲22,那個大於(>)的符號指的是數據包的傳輸方向。 
? 192.168.1.11.1190:接收端的IP是192.168.1.11,且該主機開啓port 1190來接收。 
? P 116:232(116):這個數據包帶有PUSH的數據傳輸標誌,且傳輸的數據爲整體數據的116~232 Byte,所以這個數據包帶有116 Bytes的數據量。
? ack 1 win 9648:ACK和Window size的相關資料。
最 簡單的說法,就是該數據包是由192.168.1.100傳到192.168.1.11,通過的port是由22到1190,且帶有116 Bytes的數據量,使用的是PUSH的標記,而不是SYN之類的主動聯機標誌。不容易看得懂吧。所以,我纔會講請務必到“TCP表頭數據”的章節去看一 看。
接下來,在一個網絡狀態非常忙的主機上面,你想要取得某臺主機對你聯機的數據包數據時,使用tcpdump配合管線命令和正則表達式也能,不 過,畢竟不好捕捉。我們能通過tcpdump的表達式功能,就能夠輕易地將所需要的數據獨立的取出來。在上面的範例一當中,我們僅針對eth0做監聽,所 以整個eth0接口上面的數據都會被顯示到屏幕上,但這樣不好分析,能簡化嗎?例如,只取出port 21的聯機數據包,能這樣做: 
[root@linux ~]# tcpdump -i eth0 -nn port 21
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 1 win 65535
01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240:P 1:21(20) ack 1 win 5840
01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 21 win 65515
01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21:P 1:17(16) ack 21 win 65515
01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840
01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840
看!這樣就僅取出port 21的信息,如果仔細看的話,你會發現數據包的傳遞都是雙向的,Client端發出請求而Server端則予以響應,所以,當然是有去有回了。而我們也就能經過這個數據包的流向來瞭解到數據包運動的過程了。例如: 
? 我們先在一個終端機窗口輸入“tcpdump-i lo-nn”的監聽。
? 再另開一個終端機窗口來對本機(127.0.0.1)登錄“ssh localhost”,那麼輸出的結果會是怎麼? 
[root@linux ~]# tcpdump -i lo -nn
1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes
3 11:02:54.253777 IP 127.0.0.1.32936 > 
127.0.0.1.22: S 933696132:933696132(0) 
   win 32767 
4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: 
S 920046702:920046702(0) 
   ack 933696133 win 32767 
5 11:02:54.253871 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192 
6 11:02:54.272124 IP 127.0.0.1.22 > 127.0.0.1.32936: 
P 1:23(22) ack 1 win 8192 
   
7 11:02:54.272375 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192 
代碼顯示的頭兩行是tcpdump的基本說明,然後: 
 第3行顯示的是來自Client端帶有SYN主動聯機的數據包。 
 第4行顯示的是來自Server端,除了響應Client端之外(ACK),還帶有SYN主動聯機的標誌。 
 第5行則顯示Client端響應Server確定聯機建立(ACK)。
 第6行以後則開始進入數據傳輸的步驟。
從 第3~5行的流程來看,熟不熟悉啊?沒錯。那就是3次握手的基礎流程,有趣吧。不過tcpdump之所以被稱爲***軟件之一遠不止上面介紹的功能。上面介 紹的功能能用來作爲我們主機的數據包聯機和傳輸的流程分析,這將有助於我們瞭解到數據包的運作,同時瞭解到主機的防火牆設置規則是否有需要修訂的地方。
更 有更神奇的用法。當我們使用tcpdump在Router上面監聽明文的傳輸數據時,例如FTP傳輸協議,你覺得會發生什麼問題呢?我們先在主機端執行 “tcpdump -i lo port 21 -nn ?X”,然後再以FTP登錄本機,並輸入賬號和密碼,結果你就能發現如下的狀況: 
[root@linux ~]# tcpdump -i lo -nn -X ’port 21’
    0x0000:  4500 0048 2a28 4000 4006 1286 7f00 0001  E..H*(@.@.......
    0x0010:  7f00 0001 0015 80ab 8355 2149 835c d825  .........U!I.\.%
    0x0020:  8018 2000 fe3c 0000 0101 080a 0e2e 0b67  .............2’
    0x0030:  0e2e 1b38 5041 5353 206d 7970 6173 7377  ...8PASS.mypassw
    0x0040:  6f72 6469 7379 6f75 0d0a                 ordisyou..
上 面的輸出結果已被簡化過了,你需要自行在你的輸出結果中搜索相關的字符串才行。從上面輸出結果的特別字體中,我們能發現該FTP軟件使用的是 vsFTPd,並且用戶輸入dmtsai這個賬號名稱,且密碼是mypasswordisyou。你說可不可怕啊。如果使用的是明文方式來傳輸你的網絡數 據呢?所以我們才常常在講啊,網絡是非常不安全的。
另外你得了解,爲了讓網絡接口能讓tcpdump監聽,所以執行tcpdump時網絡接口會啓 動在“混雜模式(promiscuous)”,所以你會在 /var/log/messages裏面看到非常多的警告信息,通知你說你的網卡被設置成爲混雜模式。別擔心,那是正常的。至於更多的應用,請參考man tcpdump了。
例題:怎麼使用tcpdump監聽來自eth0適配卡且通信協議爲port 22,目標來源爲192.168.1.100的數據包資料?
答:tcpdump -i eth0 -nn ’port 22 and src host 192.168.1.100’。
ethereal
除 了tcpdump這個軟件之外,其實你還能使用ethereal這個好用的網絡流量分析軟件。ethereal分爲文本界面和圖像界面,文本界面的用法和 tcpdump類似,不過他的命令名稱爲tethereal就是了。因爲用法差不多,所以建議你直接使用man tethereal查閱。在Cent OS上原本就有ethereal,所以請拿出光盤來安裝即可,需要同時安裝ethereal和ethereal-gnome才行。
啓動的方法非常簡單,你需要在X Window下面,先啓動一個終端機,然後直接輸入ethereal後,就會出現如圖5-5所示的畫面 

圖5-5 ethereal使用範例圖
簡單的做法,你能單擊如圖5-5顯示的那個按鈕,會出現挑選監聽的接口窗口,如圖5-6所示。 

圖5-6 ethereal使用範例圖
你應該選擇要監聽的接口,在這裏因爲是測試用的,所以鳥哥使用的是lo這個內部接口,你當然應該要選擇你自己的網絡接口才是。然後單擊Start後,就會出現開始檢測的界面了,如圖5-7所示。 

圖5-7 ethereal使用範例圖
在這個界面當中你能看到非常多類型的數據包協議,在等你處理完畢後,就能單擊Stop結束監聽,而開始進入如圖5-8所示的數據包分析界面。 

圖5-8 ethereal使用範例圖
數 據包分析界面共分爲3大區塊,如圖5-8所示,第一區塊主要顯示的是數據包的標頭資料,內容有點類似tcpdump的顯示結果;第二區塊則是周詳的表頭數 據,包括通信協議的內容及Socket Pair等信息。第三區塊則是16進制和ASCII碼的顯示結果。通過這個ethereal,你就能一口氣得到所需要的所有數據包內容。而且還是圖像界面 的,非常方便吧。通過在第一區塊選擇不同的數據包,就能夠查閱每個數據包的數據內容了。
nc、netcat
這 個nc能用來作爲某些服務的檢測,因爲他能連接到某個port來進行通信,此外,還能自行啓動一個port來傾聽其他用戶的聯機,非常好用。如果在編譯的 時候設置GAPING_SECURITY_HOLE參數的話,這個軟件還能用來取得客戶端的bash。可怕吧。我們的CentOS比較人性化,並沒有設置 上面的參數,所以我們不能夠用來作爲***軟件。不過用來取代Telnet功能已夠用了(有的系統將執行文件改名爲netcat了)。 
[root@linux ~]# nc [IP|host] [port]
[root@linux ~]# nc -l -p [port]
參數:
-l,作爲監聽之用,亦即開啓一個 port 來監聽用戶的聯機。
-p,開啓的這個 Port Number。
範例一:連接本地端的 port 25 查閱相關信息
[root@linux ~]# nc localhost 25
localhost.localdomain [127.0.0.1] 25 (smtp) open
220 pc.dm.tsai ESMTP Postfix
ehlo localhost
250-pc.dm.tsai
250-PIPELINING
250-SIZE 40000000
250-ETRN
quit
221 Bye
這個最簡單的功能和Telnet幾乎相同吧,他能檢查某個服務。不過,更神奇的在後面,我們能建立兩個聯機來通信。舉個例子來說,我們先在Client端的地方啓動一個port來進行傾聽: 
範例二:激活一個 port 來監聽用戶的聯機需求
[root@linux ~]# nc -l -p 20000
# 啓動一個 port 20000  在主機上,如果此時使用 netstat ?tlnp。 
# 就能看到系統上多出來一個 port 20000 在傾聽用戶的聯機。
然後在主機端的地方,也利用nc來聯機到客戶端,並且輸入一些命令看看。 
[root@linux ~]# nc localhost 20000
   
此 時,在主機端我們能打入一些字,你會發目前Client端會同時出現你輸入的文字。如果你同時設置一些額外的參數,例如利用標準輸入和輸出(stdout 和stdin)的話,那麼就能通過這個聯機來做非常多事情了。當然nc的功能不僅如此,你還能發現非常多的用途。請自行到你主機內的 /usr/share/doc/nc-1.10/scripts目錄下看看這些script,有幫助的。不過,如果你需要額外地編譯出含有GAPING_ SECURITY_HOLE功能,以使兩端聯機能進行額外命令的執行時,就需要自己下載原始碼來編譯了。
重 點 回 顧
? 修改網絡接口的硬件相關參數,能使用ifconfig這個命令,包括MTU等。
? ifup和ifdown其實只是script,在使用時,會主動去 /etc/sysconfig/network- scripts裏找到相對應的設備設置文件,才能夠正確地啓動和關閉。
? 路由的修改和查閱能使用route來查詢,此外,route亦可進行新增、刪除路由的工作。
? ip命令能用來作爲整個網絡環境的設置,利用ip link能修改網絡設備的硬件相關功能,包括MTU和MAC等,能使用ip address修改TCP/IP方面的參數,包括IP及網段參數等,ip route則能修改路由。
? ping主要是通過ICMP數據包來進行網絡環境的檢測工作,並且能使用ping來查詢整體網段可接受的最大MTU值。
? 監測每個節點的連接狀況,能使用traceroute這個命令來追蹤。
? netstat除了能觀察本機的啓動接口外,還能觀察Unix socket的傳統接口數據。
? host和nslookup默認都是通過/etc/resolv.conf內設置的DNS主機來進行主機名稱和IP的查詢。
? LFTP能用來匿名登錄遠程的FTP主機。
? Telnet不僅用來進行BBS的登錄,也能用來作爲某些端口服務的測試。
? lynx主要的功能是瀏覽,包括本機上HTML語法的文件,wget則主要用來下載WWW的資料。
? 捕捉數據包以分析數據包的流向,可使用tcpdump,至於圖像界面的ethereal則能進行更爲周詳的解析。
? 通過tcpdump分析3次握手,及分析明文傳輸的數據,可發現網絡加密的重要性。
? nc可用來取代Telnet進行某些服務端口的檢測工作,同時若自行編譯nc,可額外地執行-e參數。

作者:Leo Chin


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章