网络系统
當談及到網絡系統層面,幾乎任何東西都能由 Linux 來實現。Linux 被用來創建各式各樣的網絡系統和裝置, 包括防火墻,路由器,名稱服務器,網絡連接式存儲設備等等。
被用來配置和操作網絡系統的命令數目,就如網絡系統一樣巨大。我們僅僅會關注一些最經常 使用到的命令。我們要研究的命令包括那些被用來監測網絡和傳輸文件的命令。另外,我們 還會探討用來遠端登錄的 ssh 程序。這章會介紹:
- ping - 發送 ICMP ECHO_REQUEST 軟件包到網絡主機
- traceroute - 打印到一臺網絡主機的路由數據包
- netstat - 打印網絡連接,路由表,接口統計數據,偽裝連接,和多路廣播成員
- ftp - 因特網文件傳輸程序
- wget - 非交互式網絡下載器
- ssh - OpenSSH SSH 客戶端(遠程登錄程序)
我們假定你已經知道了一點網絡系統背景知識。在這個因特網時代,每個計算機用戶需要理解基本的網絡 系統概念。為了能夠充分利用這一章節的內容,我們應該熟悉以下術語:
-
IP (網絡協議)地址
-
主機和域名
-
URI(統一資源標識符)
請查看下面的“拓展閱讀”部分,有幾篇關于這些術語的有用文章。
注意:一些將要講到的命令可能(取決于系統發行版)需要從系統發行版的倉庫中安裝額外的軟件包, 并且一些命令可能需要超級用戶權限才能執行。
檢查和監測網絡
即使你不是一名系統管理員,檢查一個網絡的性能和運作情況也是經常有幫助的。
ping
最基本的網絡命令是 ping。這個 ping 命令發送一個特殊的網絡數據包,叫做 IMCP ECHO_REQUEST,到 一臺指定的主機。大多數接收這個包的網絡設備將會回復它,來允許網絡連接驗證。
注意:大多數網絡設備(包括 Linux 主機)都可以被配置為忽略這些數據包。通常,這樣做是出于網絡安全 原因,部分地遮蔽一臺主機免受一個潛在攻擊者地侵襲。配置防火墻來阻塞 IMCP 流量也很普遍。
例如,看看我們能否連接到網站?linuxcommand.org(我們最喜歡的網站之一), 我們可以這樣使用 ping 命令:
[me@linuxbox ~]$ ping linuxcommand.org一旦啟動,ping 命令會持續在特定的時間間隔內(默認是一秒)發送數據包,直到它被中斷:
[me@linuxbox ~]$ ping linuxcommand.org PING linuxcommand.org (66.35.250.210) 56(84) bytes of data. 64 bytes from vhost.sourceforge.net (66.35.250.210): icmp\_seq=1 ttl=43 time=107 ms 64 bytes from vhost.sourceforge.net (66.35.250.210): icmp\_seq=2 ttl=43 time=108 ms 64 bytes from vhost.sourceforge.net (66.35.250.210): icmp\_seq=3 ttl=43 time=106 ms 64 bytes from vhost.sourceforge.net (66.35.250.210): icmp\_seq=4 ttl=43 time=106 ms 64 bytes from vhost.sourceforge.net (66.35.250.210): icmp\_seq=5 ttl=43 time=105 ms ...按下組合鍵 Ctrl-c,中斷這個命令之后,ping 打印出運行統計信息。一個正常工作的網絡會報告 零個數據包丟失。一個成功執行的“ping”命令會意味著網絡的各個部件(網卡,電纜,路由,網關) 都處于正常的工作狀態。
traceroute
這個 traceroute 程序(一些系統使用相似的 tracepath 程序來代替)會顯示從本地到指定主機 要經過的所有“跳數”的網絡流量列表。例如,看一下到達?slashdot.org?網站,需要經過的路由 器,我們將這樣做:
[me@linuxbox ~]$ traceroute slashdot.org命令輸出看起來像這樣:
traceroute to slashdot.org (216.34.181.45), 30 hops max, 40 byte packets 1 ipcop.localdomain (192.168.1.1) 1.066 ms 1.366 ms 1.720 ms 2 * * * 3 ge-4-13-ur01.rockville.md.bad.comcast.net (68.87.130.9) 14.622 ms 14.885 ms 15.169 ms 4 po-30-ur02.rockville.md.bad.comcast.net (68.87.129.154) 17.634 ms 17.626 ms 17.899 ms 5 po-60-ur03.rockville.md.bad.comcast.net (68.87.129.158) 15.992 ms 15.983 ms 16.256 ms 6 po-30-ar01.howardcounty.md.bad.comcast.net (68.87.136.5) 22.835 ...從輸出結果中,我們可以看到連接測試系統到?slashdot.org?網站需要經由16個路由器。對于那些 提供標識信息的路由器,我們能看到它們的主機名,IP 地址和性能數據,這些數據包括三次從本地到 此路由器的往返時間樣本。對于那些沒有提供標識信息的路由器(由于路由器配置,網絡擁塞,防火墻等 方面的原因),我們會看到幾個星號,正如行中所示。
netstat
netstat 程序被用來檢查各種各樣的網絡設置和統計數據。通過此命令的許多選項,我們 可以看看網絡設置中的各種特性。使用“-ie”選項,我們能夠查看系統中的網絡接口:
[me@linuxbox ~]$ netstat -ie eth0 Link encap:Ethernet HWaddr 00:1d:09:9b:99:67inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0inet6 addr: fe80::21d:9ff:fe9b:9967/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:238488 errors:0 dropped:0 overruns:0 frame:0TX packets:403217 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:100 RX bytes:153098921 (146.0 MB) TXbytes:261035246 (248.9 MB) Memory:fdfc0000-fdfe0000lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0 ...在上述實例中,我們看到我們的測試系統有兩個網絡接口。第一個,叫做 eth0,是 因特網接口,和第二個,叫做 lo,是內部回環網絡接口,它是一個虛擬接口,系統用它來 “自言自語”。
當執行日常網絡診斷時,要查看的重要信息是每個網絡接口第四行開頭出現的單詞 “UP”,說明這個網絡接口已經生效,還要查看第二行中 inet addr 字段出現的有效 IP 地址。對于使用 DHCP(動態主機配置協議)的系統,在 這個字段中的一個有效 IP 地址則證明了 DHCP 工作正常。
使用這個“-r”選項會顯示內核的網絡路由表。這展示了系統是如何配置網絡之間發送數據包的。
[me@linuxbox ~]$ netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface192.168.1.0 * 255.255.255.0 U 0 0 0 eth0 default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0在這個簡單的例子里面,我們看到了,位于防火墻之內的局域網中,一臺客戶端計算機的典型路由表。 第一行顯示了目的地 192.168.1.0。IP 地址以零結尾是指網絡,而不是個人主機, 所以這個目的地意味著局域網中的任何一臺主機。下一個字段,Gateway, 是網關(路由器)的名字或 IP 地址,用它來連接當前的主機和目的地的網絡。 若這個字段顯示一個星號,則表明不需要網關。
最后一行包含目的地 default。指的是發往任何表上沒有列出的目的地網絡的流量。 在我們的實例中,我們看到網關被定義為地址 192.168.1.1 的路由器,它應該能 知道怎樣來處理目的地流量。
netstat 程序有許多選項,我們僅僅討論了幾個。查看 netstat 命令的手冊,可以 得到所有選項的完整列表。
網絡中傳輸文件
網絡有什么用處呢?除非我們知道了怎樣通過網絡來傳輸文件。有許多程序可以用來在網絡中 傳送數據。我們先討論兩個命令,隨后的章節里再介紹幾個命令。
ftp
ftp 命令屬于真正的“經典”程序之一,它的名字來源于其所使用的協議,就是文件傳輸協議。 FTP 被廣泛地用來從因特網上下載文件。大多數,并不是所有的,網絡瀏覽器都支持 FTP, 你經常可以看到它們的 URI 以協議?ftp://開頭。在出現網絡瀏覽器之前,ftp 程序已經存在了。 ftp 程序可用來與 FTP 服務器進行通信,FTP 服務器就是存儲文件的計算機,這些文件能夠通過 網絡下載和上傳。
FTP(它的原始形式)并不是安全的,因為它會以明碼形式發送帳號的姓名和密碼。這就意味著 這些數據沒有加密,任何嗅探網絡的人都能看到。由于此種原因,幾乎因特網中所有 FTP 服務器 都是匿名的。一個匿名服務器能允許任何人使用注冊名“anonymous”和無意義的密碼登錄系統。
在下面的例子中,我們將展示一個典型的會話,從匿名 FTP 服務器,其名字是 fileserver, 的/pub/_images/Ubuntu-8.04的目錄下,使用 ftp 程序下載一個 Ubuntu 系統映像文件。
[me@linuxbox ~]$ ftp fileserver Connected to fileserver.localdomain. 220 (vsFTPd 2.0.1) Name (fileserver:me): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd pub/cd\_images/Ubuntu-8.04 250 Directory successfully changed. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. -rw-rw-r-- 1 500 500 733079552 Apr 25 03:53 ubuntu-8.04- desktop-i386.iso 226 Directory send OK. ftp> lcd Desktop Local directory now /home/me/Desktop ftp> get ubuntu-8.04-desktop-i386.iso local: ubuntu-8.04-desktop-i386.iso remote: ubuntu-8.04-desktop- i386.iso 200 PORT command successful. Consider using PASV. 150 Opening BINARY mode data connection for ubuntu-8.04-desktop- i386.iso (733079552 bytes). 226 File send OK. 733079552 bytes received in 68.56 secs (10441.5 kB/s) ftp> bye這里是對會話期間所輸入命令的解釋說明:
表17-1:
| ftp fileserver | 喚醒 ftp 程序,讓它連接到 FTP 服務器,fileserver。 |
| anonymous | 登錄名。輸入登錄名后,將出現一個密碼提示。一些服務器將會接受空密碼, 其它一些則會要求一個郵件地址形式的密碼。如果是這種情況,試著輸入 “user@example.com”。 |
| cd pub/cd_images/Ubuntu-8.04 | 跳轉到遠端系統中,要下載文件所在的目錄下, 注意在大多數匿名的 FTP 服務器中,支持公共下載的文件都能在目錄 pub 下找到 |
| ls | 列出遠端系統中的目錄。 |
| lcd Desktop | 跳轉到本地系統中的 ~/Desktop 目錄下。在實例中,ftp 程序在工作目錄 ~ 下被喚醒。 這個命令把工作目錄改為 ~/Desktop |
| get ubuntu-8.04-desktop-i386.iso | 告訴遠端系統傳送文件到本地。因為本地系統的工作目錄 已經更改到了 ~/Desktop,所以文件會被下載到此目錄。 |
| bye | 退出遠端服務器,結束 ftp 程序會話。也可以使用命令 quit 和 exit。 |
在 “ftp>” 提示符下,輸入 “help”,會顯示所支持命令的列表。使用 ftp 登錄到一臺 授予了用戶足夠權限的服務器中,則可以執行很多普通的文件管理任務。雖然很笨拙, 但它真能工作。
lftp - 更好的 ftp
ftp 并不是唯一的命令行形式的 FTP 客戶端。實際上,還有很多。其中比較好(也更流行的)是 lftp 程序, 由 Alexander Lukyanov 編寫完成。雖然 lftp 工作起來與傳統的 ftp 程序很相似,但是它帶有額外的便捷特性,包括 多協議支持(包括 HTTP),若下載失敗會自動地重新下載,后臺處理,用 tab 按鍵來補全路徑名,還有很多。
wget
另一個流行的用來下載文件的命令行程序是 wget。若想從網絡和 FTP 網站兩者上都能下載數據,wget 是很有用處的。 不只能下載單個文件,多個文件,甚至整個網站都能下載。下載?linuxcommand.org?網站的首頁, 我們可以這樣做:
[me@linuxbox ~]$ wget http://linuxcommand.org/index.php --11:02:51-- http://linuxcommand.org/index.php=> `index.php' Resolving linuxcommand.org... 66.35.250.210 Connecting to linuxcommand.org|66.35.250.210|:80... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [text/html][ < => ] 3,120 --.--K/s11:02:51 (161.75 MB/s) - 'index.php' saved [3120]這個程序的許多選項允許 wget 遞歸地下載,在后臺下載文件(你退出后仍在下載),能完成未下載 全的文件。這些特性在命令手冊,better-than-average 一節中有詳盡地說明。
與遠程主機安全通信
通過網絡來遠程操控類 Unix 的操作系統已經有很多年了。早些年,在因特網普遍推廣之前,有 一些受歡迎的程序被用來登錄遠程主機。它們是 rlogin 和 telnet 程序。然而這些程序,擁有和 ftp 程序 一樣的致命缺點;它們以明碼形式來傳輸所有的交流信息(包括登錄命令和密碼)。這使它們完全不 適合使用在因特網時代。
ssh
為了解決這個問題,開發了一款新的協議,叫做 SSH(Secure Shell)。 SSH 解決了這兩個基本的和遠端主機安全交流的問題。首先,它要認證遠端主機是否為它 所知道的那臺主機(這樣就阻止了所謂的“中間人”的攻擊),其次,它加密了本地與遠程主機之間 所有的通訊信息。
SSH 由兩部分組成。SSH 服務器運行在遠端主機上運行,在端口號22上監聽將要到來的連接,而 SSH 客戶端用在本地系統中,用來和遠端服務器通信。
大多數 Linux 發行版自帶一個提供 SSH 功能的軟件包,叫做 OpenSSH,來自于 BSD 項目。一些發行版 默認包含客戶端和服務器端兩個軟件包(例如,Red Hat),而另一些(比方說 Ubuntu)則只是提供客戶端服務。為了能讓系統接受遠端的連接,它必須 安裝 OpenSSH-server 軟件包,配置,運行它,并且(如果系統正在運行,或者是在防火墻之后) 它必須允許在 TCP 端口號上接收網絡連接。
小貼示:如果你沒有遠端系統去連接,但還想試試這些實例,則確認安裝了 OpenSSH-server 軟件包 ,則可使用 localhost 作為遠端主機的名字。這種情況下,計算機會和它自己創建網絡連接。
用來與遠端 SSH 服務器相連接的 SSH 客戶端程序,順理成章,叫做 ssh。連接到遠端名為 remote-sys 的主機,我們可以這樣使用 ssh 客戶端程序:
[me@linuxbox ~]$ ssh remote-sys The authenticity of host 'remote-sys (192.168.1.4)' can't be established. RSA key fingerprint is 41:ed:7a:df:23:19:bf:3c:a5:17:bc:61:b3:7f:d9:bb. Are you sure you want to continue connecting (yes/no)?第一次嘗試連接,提示信息表明遠端主機的真實性不能確立。這是因為客戶端程序以前從沒有 看到過這個遠端主機。為了接受遠端主機的身份驗證憑據,輸入“yes”。一旦建立了連接,會提示 用戶輸入他或她的密碼:
Warning: Permanently added 'remote-sys,192.168.1.4' (RSA) to the list of known hosts. me@remote-sys's password:成功地輸入密碼之后,我們會接收到遠端系統的 shell 提示符:
Last login: Sat Aug 30 13:00:48 2008 [me@remote-sys ~]$遠端 shell 會話一直存在,直到用戶輸入 exit 命令后,則關閉了遠程連接。這時候,本地的 shell 會話 恢復,本地 shell 提示符重新出現。
也有可能使用不同的用戶名連接到遠程系統。例如,如果本地用戶“me”,在遠端系統中有一個帳號名 “bob”,則用戶 me 能夠用 bob 帳號登錄到遠端系統,如下所示:
[me@linuxbox ~]$ ssh bob@remote-sys bob@remote-sys's password: Last login: Sat Aug 30 13:03:21 2008 [bob@remote-sys ~]$正如之前所講到的,ssh 驗證遠端主機的真實性。如果遠端主機不能成功地通過驗證,則會提示以下信息:
[me@linuxbox ~]$ ssh remote-sys @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! ...有兩種可能的情形會提示這些信息。第一,某個攻擊者企圖制造“中間人”襲擊。這很少見, 因為每個人都知道 ssh 會針對這種狀況發出警告。最有可能的罪魁禍首是遠端系統已經改變了; 例如,它的操作系統或者是 SSH 服務器重新安裝了。然而,為了安全起見,第一個可能性不應該 被輕易否定。當這條消息出現時,總要與遠端系統的管理員查對一下。
當確定了這條消息歸結為一個良性的原因之后,那么在客戶端更正問題就很安全了。 使用文本編輯器(可能是 vim)從文件~/.ssh/known_hosts 中刪除廢棄的鑰匙, 就解決了問題。在上面的例子里,我們看到這樣一句話:
Offending key in /home/me/.ssh/known_hosts:1這意味著文件 known_hosts 里面某一行包含攻擊型的鑰匙。從文件中刪除這一行,則 ssh 程序 就能夠從遠端系統接受新的身份驗證憑據。
除了能夠在遠端系統中打開一個 shell 會話,ssh 程序也允許我們在遠端系統中執行單個命令。 例如,在名為 remote-sys 的遠端主機上,執行 free 命令,并把輸出結果顯示到本地系統 shell 會話中。
[me@linuxbox ~]$ ssh remote-sys free me@twin4's password:total used free shared buffers cachedMem: 775536 507184 268352 0 110068 154596-/+ buffers/cache: 242520 533016 Swap: 0 1572856 0 110068 154596[me@linuxbox ~]$有可能以更有趣的方式來利用這項技術,比方說下面的例子,我們在遠端系統中執行 ls 命令, 并把命令輸出重定向到本地系統中的一個文件里面。
[me@linuxbox ~]$ ssh remote-sys 'ls \*' > dirlist.txt me@twin4's password: [me@linuxbox ~]$注意,上面的例子中使用了單引號。這樣做是因為我們不想路徑名展開操作在本地執行 ;而希望 它在遠端系統中被執行。同樣地,如果我們想要把輸出結果重定向到遠端主機的文件中,我們可以 把重定向操作符和文件名都放到單引號里面。
[me@linuxbox ~]$ ssh remote-sys 'ls * > dirlist.txt'SSH 通道
當你通過 SSH 協議與遠端主機建立連接的時候,其中發生的事就是在本地與遠端系統之間 創建了一條加密通道。通常,這條通道被用來把在本地系統中輸入的命令安全地傳輸到遠端系統, 同樣地,再把執行結果安全地發送回來。除了這個基本功能之外,SSH 協議允許大多數 網絡流量類型通過這條加密通道來被傳送,在本地與遠端系統之間創建某種 VPN(虛擬專用網絡)。
可能這個特性的最普遍使用是允許傳遞 X 窗口系統流量。在運行著 X 服務器(也就是, 能顯示 GUI 的機器)的系統中,有可能在遠端啟動和運行一個 X 客戶端程序(一個圖形化應用程序), 而應用程序的顯示結果出現在本地。這很容易完成,這里有個例子:假設我們正坐在一臺裝有 Linux 系統, 叫做 linuxbox 的機器之前,且系統中運行著 X 服務器,現在我們想要在名為 remote-sys 的遠端系統中 運行 xload 程序,但是要在我們的本地系統中看到這個程序的圖形化輸出。我們可以這樣做:
[me@linuxbox ~]$ ssh -X remote-sys me@remote-sys's password: Last login: Mon Sep 08 13:23:11 2008 [me@remote-sys ~]$ xload這個 xload 命令在遠端執行之后,它的窗口就會出現在本地。在某些系統中,你可能需要 使用 “-Y” 選項,而不是 “-X” 選項來完成這個操作。
scp 和 sftp
這個 OpenSSH 軟件包也包含兩個程序,它們可以利用 SSH 加密通道在網絡間復制文件。 第一個,scp(安全復制)被用來復制文件,與熟悉的 cp 程序非常相似。最顯著的區別就是 源或者目標路徑名要以遠端主機的名字,后跟一個冒號字符開頭。例如,如果我們想要 從遠端系統,remote-sys,的家目錄下復制文檔 document.txt,到我們本地系統的當前工作目錄下, 可以這樣操作:
[me@linuxbox ~]$ scp remote-sys:document.txt . me@remote-sys's password: document.txt 100% 5581 5.5KB/s 00:00 [me@linuxbox ~]$和 ssh 命令一樣,如果你所期望的遠端主機帳戶與你本地系統中的不一致, 則可以把用戶名添加到遠端主機名的開頭。
[me@linuxbox ~]$ scp bob@remote-sys:document.txt .第二個 SSH 文件復制命令是 sftp,正如其名字所示,它是 ftp 程序的安全替代品。sftp 工作起來與我們 之前使用的 ftp 程序很相似;然而,它不用明碼形式來傳遞數據,它使用加密的 SSH 通道。sftp 有一個 重要特性強于傳統的 ftp 命令,就是 sftp 不需要遠端系統中運行 FTP 服務器。它僅僅要求 SSH 服務器。 這意味著任何一臺能用 SSH 客戶端連接的遠端機器,也可當作類似于 FTP 的服務器來使用。 這里是一個樣本會話:
[me@linuxbox ~]$ sftp remote-sys Connecting to remote-sys... me@remote-sys's password: sftp> ls ubuntu-8.04-desktop-i386.iso sftp> lcd Desktop sftp> get ubuntu-8.04-desktop-i386.iso Fetching /home/me/ubuntu-8.04-desktop-i386.iso to ubuntu-8.04- desktop-i386.iso /home/me/ubuntu-8.04-desktop-i386.iso 100% 699MB 7.4MB/s 01:35 sftp> bye小貼示:這個 SFTP 協議被許多 Linux 發行版中的圖形化文件管理器支持。使用 Nautilus (GNOME), 或者是 Konqueror (KDE),我們都能在位置欄中輸入以 sftp:// 開頭的 URI, 來操作存儲在運行著 SSH 服務器的遠端系統中的文件。
Windows 中的 SSH 客戶端
比方說你正坐在一臺 Windows 機器前面,但是你需要登錄到你的 Linux 服務器中,去完成 一些實際的工作,那該怎么辦呢?當然是得到一個 Windows 平臺下的 SSH 客戶端!有很多這樣 的工具。最流行的可能就是由 Simon Tatham 和他的團隊開發的 PuTTY 了。這個 PuTTY 程序 能夠顯示一個終端窗口,而且允許 Windows 用戶在遠端主機中打開一個 SSH(或者 telnet)會話。 這個程序也提供了 scp 和 sftp 程序的類似物。
PuTTY 可在鏈接?http://www.chiark.greenend.org.uk/~sgtatham/putty/?處得到。
拓展閱讀
-
Linux 文檔項目提供了 Linux 網絡管理指南,可以廣泛地(雖然過時了)了解網絡管理方面的知識。
http://tldp.org/LDP/nag2/index.html
-
Wikipedia 上包含了許多網絡方面的優秀文章。這里有一些基礎的:
http://en.wikipedia.org/wiki/Internet_protocol_address
http://en.wikipedia.org/wiki/Host_name
http://en.wikipedia.org/wiki/Uniform_Resource_Identifier
總結
- 上一篇: mysql安装后目录介绍,MySQL安装
- 下一篇: 几种常见的通信系统抗衰落技术