歡迎您光臨本站 註冊首頁

在Linux下配置TCP/IP

←手機掃碼閱讀     火星人 @ 2014-03-29 , reply:0

在Linux下配置TCP/IP 本教程首先回顧 TCP/IP 的起源,然後闡述 TCP/IP 發展所依據的 模型,最後還討論 TCP/IP 是如何工作的 — 包括 IP 地址、子網以及路由。打好這些理論 基礎之後,我們將討論 Linux 所需要的各種網路配置文件以及如何初始化網路介面和如何。

關鍵文件和腳本

網路介面初始化的實際過程(有時也稱做「啟動介面」)是由一組配置文件和腳本控制的,這些文件和腳本大多數在/etc 目錄下。這些配置文件告訴 Linux 它的 IP 地址、主機名和域名;腳本則負責網路介面的初始化。
遺憾的是,不同分發版(distribution)中文件位置和命名約定至今還沒有統一的標準。為給本文提供具體的示例,將基於廣泛使用的 Red Hat 7.0 包做出描述。請記住,若您的分發版不是使用 Red Hat 或不是基於 Red Hat 約定(如 Mandrake 分發版),在此所引用的一些文件會位於別的目錄中或有其它的名稱。然而,網路效果和實際效果是一樣的 ? 將存儲在一系列配置文件中的網路信息傳遞給腳本,然後用腳本初始化介面和網路路由。
涉及初始化和配置網路介面的關鍵文件有:
/etc/hosts (將主機名映射到 IP 地址)
/etc/networks (將域名映射到網路地址)
/etc/sysconfig/network (打開或關閉聯網,設置主機名和網關)
/etc/resolv.conf (設置名稱伺服器或 DNS 伺服器的 IP 地址)
/etc/rc.d/rc3.d/S10network (在引導時激活已配置的乙太網介面,由運行級別目錄 /etc/rc.d/rcN.d/ 中的符號鏈接調用)
/etc/sysconfig/network-scripts 中一些文件的集合。這些文件包括用於網路連接的主要配置,以及提供介面狀態和控制功能的符號鏈接。

/etc/hosts

/etc/hosts 是將 IP 地址和主機名聯繫起來的簡單文本文件。 TCP/IP 網路中的每台計算機都必須有唯一的 IP 地址。hosts 文件只允許用戶將主機名與 IP 地址聯繫起來,以便當訪問計算機時使用該名稱,而不用輸入一長串數字。/etc/hosts 中的每一項都依次包含一個 IP 地址、空白和主機名和/或別名。井號(#)表示註釋開始。例如:
# /etc/hosts
# last updated 12/3/2000

127.0.0.1 loopback localhost # loopback (lo0) name/address

192.168.1.5 janus.syroidmanor.com janus
192.168.1.6 thumper.syroidmanor.com thumper
192.168.1.7 donovan.syroidmanor.com donovan
192.168.1.8 raidserver

192.168.1.20 phoenix.syroidmanor.com phoenix
192.168.1.15 hydras.syroidmanor.com hydras
在上面顯示的 Hosts 文件中,IP 地址 192.168.1.5 映射到主機 janus.syroidmanor.com ,並且分配給它一個備用主機名(或別名)janus。儘管 DNS 已經取代了這個主機文件,但出於以下原因仍然使用它:
大多數系統都有一個包含本地網路上的關鍵主機的名稱和地址信息的小主機表。當 DNS 未運行時,例如,在最初系統啟動期間,則使用該表。即便本地 DNS 伺服器正在運行,在每個系統上也應該有一個小 hosts 文件,該文件包含一個主機本身項、一個 localhost 項以及區域網上任何主要的網關和伺服器項。
未連接到網際網路或其他網路的小網路不需要 DNS 服務。然而,這些網路上的主機也需要知道如何定位同一網路上的其它主機。

/etc/networks

就如主機有名稱和地址一樣,為方便起見,也可以為網路和子網命名。 /etc/networks 文件在布局上與 /etc/hosts 很相似,只不過名稱和地址互換了一下。
# /etc/networks for syroidmanor.com

localnet 127.0.0.0 #loopback
syroid-C1 192.168.1 #development, class C
syroid-C2 192.168.2 #support, class C
在上面的示例中,可將網路名稱 syroid-C1 用於腳本或任何命令行實用程序中來引用 192.168.1 這個 C 類網。

/etc/sysconfig/network

將 /etc/sysconfig/network(注意與 /etc/networks 文件不同,這個 network 是單數而不是複數)用於指定所期望的網路配置信息;在引導時,有幾個腳本要使用它。該文件可以包含下列所示的一個或多個關鍵字/值對:
NETWORKING=YES|NO -- YES 表示需要配置網路;NO 表示不需要配置網路。
HOSTNAME=hostname ? 主機的全限定域名;為與較老的程序兼容,這應該與在 /etc/hosts 中的主機項相匹配。
GATEWAY=gw-ip ? 網路網關的 IP 地址。
GATEWAYDEV=gw-dev ? 網關設備的名稱(例如 eth0)。
NISDOMAIN=dom-name ? 表示 NIS 域,如果有的話。
下面是 /etc/sysconfig/network 最小配置的示例:
NETWORKING=yes
HOSTNAME=phoenix.syroidmanor.com
GATEWAY=192.168.1.1

/etc/resolv.conf 和 /etc/rc.d/rc3.d/S10network

/etc/resolv.conf 是網路用來確定主機解析的關鍵文件之一。在此可以標識最多三個名稱伺服器;如果列在第一位的伺服器未對查詢做出響應,則後面兩個起到備用的作用。domain 項定義預設域名。解析器(順便提一下,該解析器不是一個單獨的進程,而是由網路進程調用的常式庫)將這裡所列出的域名附加在任何不包含句點的主機查詢上。
# /etc/resolv.conf
# domain name resolver config file
domain syroidmanor.com

nameserver 192.168.1.7
nameserver 192.168.1.10
nameserver 165.142.268.19
在上面所顯示的示例中,如果提交給解析器的查詢是想要查詢找主機 phoenix(注意,沒有點),則將該域附加到這個請求之後,這會將該查詢擴展為 phoenix.syroidmanor.com。若需要了解更多詳細信息和可以使用的選項,請輸入 man resolv.conf 。
/etc/rc.d/rc3.d/S10network 是指向 /etc/rc.d/init.d/network 腳本的符號鏈接。當系統達到運行級別 3 時,它負責初始化所有已配置的網路介面。在這裡我們不想花時間來詳細討論該文件後面的邏輯,因為該文件主要是調用本節中所提到的其它腳本和程序。但是,如果您對 S10network 中初始化各種網路組件和服務的順序感興趣的話,則可以使用 less /etc/rc.d/rc3.d/S10network 命令來仔細研讀它。

/etc/sysconfig/network-scripts/

最後,通常可在 /etc/sysconfig/network-scripts/ 目錄中查找到下列文件:
/etc/sysconfig/network-scripts/ifup
/etc/sysconfig/network-scripts/ifdown
/etc/sysconfig/network-scripts/network-functions
/etc/sysconfig/network-scripts/ifcfg-interface-name
/etc/sysconfig/network-scripts/ifcfg-interface-name:clone-name
/etc/sysconfig/network-scripts/chat-interface-name
/etc/sysconfig/network-scripts/dip-interface-name
/etc/sysconfig/network-scripts/ifup-post

……/network-scripts/,第一部分
/etc/sysconfig/network-scripts 中的 ifup 和 ifdown 項實際是分別指向 /sbin/ifup 和 /sbin/ifdown 的符號鏈接。這兩個腳本是在該目錄下唯一應該直接調用的腳本,並且它們按需要調用所有其它腳本。
ifup 和 ifdown 通常只帶一個參數:設備名(例如 eth0)。系統在引導過程期間用參數「boot」調用它們,以便於不激活沒有被配置成在系統啟動時初始化的設備(請參閱下面關於 interface-name 描述中的 ONBOOT=no)。
network-function 不是公共文件。它包含這個目錄中的幾個腳本所需的函數。具體地說,它包含了用於處理替代介面配置的大多數代碼。

……/network-scripts/,第二部分

配置文件 ifcfg-interface-name 和 ifcfg-interface-name:clone-name 包含了初始化介面所需的大部分詳細信息。第一個文件定義介面,而第二個文件僅包含與「別名」(或替代)介面相關的部分定義。例如,網路地址或許不同,但其它可能會一樣。
在 ifcfg 文件中定義的各項目取決於介面類型;下列值很常見:

DEVICE=name ,其中 name 是物理設備名
IPADDR=addr ,其中 addr 是 IP 地址
NETMASK=mask ,其中 mask 是網路掩碼值
NETWORK=addr ,其中 addr 是網路地址
BROADCAST=addr ,其中 addr 是廣播地址
GATEWAY=addr ,其中 addr 是網關地址
ONBOOT=answer ,其中 answer 是「yes」(引導時激活設備)或「no」
USERCTL=answer ,其中 answer 是「yes」(非 root 用戶可以控制該設備)或「no」
BOOTPROTO=proto ,其中 proto 取下列值之一:「none」(引導時不使用協議)「bootp」(使用 BOOTP 協議)或「dhcp」(使用 DHCP 協議)

此外,下列值對所有的 SLIP(串列線 IP)文件是公共的:

PERSIST=answer ,其中 answer 是「yes」(即使數據機已經掛斷連接,也保持設備處於激活狀態)或「no」(不保持激活狀態)
MODEMPORT=port ,其中 port 是數據機埠的設備名(例如,/dev/modem)
LINESPEED=baud ,其中 baud 是數據機的線路速度
DEFABORT=answer ,其中 answer 是「yes」(當創建/編輯該介面的腳本時,插入預設的異常終止字元串)或「no」(不插入預設的異常終止字元串)


……/network-scripts/,第三部分

chat-interface-name 文件是用於 SLIP 連接的交談腳本(chat script)。它的功能是啟動 SLIP 連接。對於 SLIP 設備,DIP 腳本是根據這個交談腳本編寫的。
chat-interface-name 是只寫腳本,它由程序 netcfg 根據交談腳本創建的。不要修改該文件。
當初始化任何網路設備(除了 SLIP 設備)時,調用 /etc/sysconfig/network-scripts/ifup-post。它調用 /etc/sysconfig/network-scripts/ifup-routes 以啟動依賴於該設備的靜態路由,它還啟動為該設備配置的任何別名,並且,如果還沒有設置主機名,則設置主機名 ? 這樣找到與該設備 IP 地址匹配的主機名。最後,ifup-post 給請求通知網路事件的任何程序發送信號(SIGIO)。

配置網路介面和路由

ifconfig 程序
ifconfig 命令設置、檢查或監控網路介面的配置值。它還可以用於設置介面的「狀態」? 即「up」(啟動)或「down」(關閉)。一個對 ifconfig 簡單的調用是:
ifconfig interface-name ip-address up|down
這會激活指定的介面並將所提供的 IP 地址分配給它。
ifconfig 有許多個可用的選項(metric、mtu 以及 pointtopoint 等等;有關詳細信息,請參閱幫助頁)用於顯式地設置唯一的介面參數,但一般來說,提供介面名稱(例如, eth0)、IP 地址和網路掩碼就足夠了。例如:
ifconfig eth0 192.168.1.5 netmask 255.255.255.0 up
分配給介面 eth0 的 IP 為 192.168.1.5,網路掩碼為 255.255.255.0 並「啟動該介面」或將其初始化。類似的,若將介面「關閉」,則輸入 ifconfig eth0 down ;不需要指定 IP 和網路掩碼。

使用 ifconfig 檢查介面

運行不帶參數的 ifconfig 會使該程序顯示所有網路介面的狀態。若要檢查特定介面的狀態,則在 ifconfig 后附加這個介面的名稱。例如:
[tom@phoenix tom]$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:10:5A:00:87:22
inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:9625272 errors:0 dropped:0 overruns:0 frame:0
TX packets:6997276 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:19 Base address:0xc800
以上輸出顯示 MAC 地址(Hwaddr)、所分配的 IP 地址(inet addr)、廣播地址(Bcast)和網路掩碼(Mask)。另外可以看出該介面處於 UP 狀態,其 MTU 為 1500 並且 Metric 為 1。接下來的兩行給出有關接收到(RX)和已發送的(TX)信息包數,以及錯誤、丟棄和溢出信息包數的統計。最後兩行顯示衝突信息包的數目、發送隊列大小(txqueuelen)和 IRQ 以及這塊卡的基址。

配置路由

讓我們通過查看尚未配置網關的網路介面來看一下如何配置路由。正如您所見,使用不帶參數的 route 命令將顯示內核路由表。
[root@phoenix tom]# /sbin/route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
127.0.0.0 127.0.0.1 255.0.0.0 U 0 0 0 lo
192.168.1.0 192.168.1.5 255.255.255.0 U 0 0 0 eth0

第一項是到 localhost 的回送路由,它是在配置 lo 時自動創建的。第二項是通過介面 eth0 到網路 192.168.1.0 的路由。地址 192.168.1.5 不是遠程網關地址。它是分配給 phoenix eth0 的地址。
注意每項的標誌。它們都設置了 U(啟動)標誌,這表示準備使用它們,但它們都未設置 G(網關)標誌。不設置 G 標誌是因為這兩個路由都是通過本地介面,而不是通過外部網關的直接路由。
上述示例僅包含一個網路路由 192.168.1.0。因而 phoenix 僅可以與位於 192.168.1.0 網路中的主機進行通信。

添加靜態路由

最小的路由表僅允許在同一網路中的主機互相通信。要與遠程主機通信,必須將通過外部網關的路由添加到路由表中。達到該目的的一種方法是通過使用 /sbin/route 命令。拿上頁中的例子來說,我們現在就將路由 192.168.1.1 添加到網路配置中。
[root@phoenix tom]# /sbin/route add default 192.168.1.1 1
在上面這個示例中,route 命令后的第一個參數是關鍵字 add 。在 route 命令上的第一個關鍵字要麼是 add 要麼是 del (刪除路由)。下一個值是目的地地址,它是通過該路由到達的地址。如果關鍵字 default 用於目的地地址,則創建預設路由。只要沒有到目的地的特定路由時,就使用預設路由;通常,這就是您在路由表中唯一需要的項。如果網路中只有一個網關,則使用預設路由引導所有要到遠程網路的數據流量通過那個網關。
這個命令行的下一個參數是網關地址。該地址必須是直接連接本機所在網路的網關地址。在到遠程目的地的網路路徑中,TCP/IP 路由要指定下一跳(next-hop)。這個下一中繼必須是本機可直接訪問的;因而,它必須是在直接連接在本機所在的網路中。
註:因為大多數的路由都是在系統啟動過程早期時添加的,所以建議用數字的 IP 地址替代主機名。這樣做就可以確保路由配置不依賴於名稱伺服器的狀態。而且要確保總是使用完整的數字地址(共 4 個位元組);如果不用完整的 IP 地址,則路由只能猜想部分 IP 地址,這樣可能會導致不正確的配置。
route 命令中,最後一個參數是數字 1,稱之為路由度量(routing metric)。當刪除路由時是不需要此 metric 參數的,但是在添加路由時許多系統都需要它。儘管需要度量,route 僅使用它來確定路由是通過直接連接的介面還是通過外部的網關。如果 metric 是 0,建立的這條路由是通過本機介面且不設置 G 標誌;如果 metric 值比 0 大,則建立的這條路由帶 G 標誌且網關地址被認為是外部的。靜態路由不使用其它 metric 值。需要真正用到多個 metric 值的是動態路由。
要顯示新的路由表,輸入 /sbin/route 或使用 netstat -rn 命令(我們將再下一節討論該命令):
[root@phoenix tom]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt 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.1 0.0.0.0 UG 0 0 0 eth0
最後做一個測試來證明一切都如同我們講到的那樣運行,ping 另一個網路上的主機;應該可以接收到響應。如果沒有接收到響應,則重新檢查您的配置。
要熟悉 route 其它的選項和參數,請輸入 man route 。

netstat 程序

如果管理任意規模的 TCP/IP 網路,則 netstat 程序是一個相當有價值的工具。它可以顯示內核路由表,活動網路連接的狀態和每個已安裝網路介面的一些有用的統計信息。
象大多數 Linux 管理命令行程序一樣,netstat 可以通過其後面的附加選項或標誌來選擇所顯示信息的細節數量和/或信息的範圍。一些常用選項有:
-a ? 顯示所有連接的信息,包括那些正在偵聽的
-i ? 顯示所有已配置網路設備的統計信息
-c ? 持續更新網路狀態(每秒一次)直至被人為中止(^C)
-r ? 顯示內核路由表
-n ? 以數字(原始)格式而不是已解析的名稱顯示遠程和本地地址
-t ? 僅顯示 TCP 套接字信息(不包括任何 UCP 套接字信息)
-v ? 顯示 netstat 的版本信息
輸入 man netstat 可獲得所有可用標誌的完整列表和詳細說明每個標誌的用途。請注意還可以組合這些標誌,所以輸入 netstat -rn 將以原始的 IP 地址格式顯示關於本地和遠程主機(n)的系統路由表(r)。

顯示活動的網路連接

netstat 支持一組顯示活動或非活動的套接字的選項:-t、-u、-w 和 -x 分別顯示活動的 TCP、UDP、RAW 或 UNIX 套接字連接。如果加上 -a 標誌,還會顯示等待連接的(換句話說,就是偵聽)套接字。這將為您顯示現在正在系統上運行的所有伺服器。
例如:在主機 phoenix 上輸入 netstat -ta 會顯示下列內容:
[tom@phoenix tom]$ netstat -ta
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 40 phoenix.syroidmanor:ssh 192.168.1.5:1132 ESTABLISHED
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 phoenix.syroidmano:1028 hydras.syro:netbios-ssn ESTABLISHED
tcp 0 0 phoenix.syroidmano:1027 raidserver:netbios-ssn ESTABLISHED
tcp 0 0 *:printer *:* LISTEN
tcp 0 0 *:auth *:* LISTEN
tcp 0 0 *:1024 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
上述輸出顯示大多數的伺服器僅僅在等待到來的連接(LISTEN)。但是,第一行顯示主機 phoenix 和 IP 地址為 192.168.1.5 之間的連接;第三和第四行顯示兩個 netbios 連接(Samba SMB 共享)。

用 netstat 查看路由表

當使用 -r 標誌時,netstat 顯示內核中的路由表,這類似於輸入 /sbin/route :
[tom@phoenix tom]$ netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt 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.1 0.0.0.0 UG 0 0 0 eth0

-n 選項強制 netstat 以點分四組 IP 數字的形式,而不是主機和網路名稱的形式輸出地址。當您不想通過網路(例如,用 DNS 或 NIS 伺服器)進行地址查詢時,這個選項特別有用。
第二列顯示路由項中所指向的網關。如果沒有使用網關,就會顯示星號。第三列是路由的網路掩碼。內核在將信息包的 IP 地址與路由的目的地 IP 地址進行比較之前,將 Genmask 值與信息包的 IP 地址逐位進行「與」操作,從而使路由「通用化」。
第四列顯示路由的標誌:U 表示處於活動狀態,H 表示主機,G 表示網關,D 表示動態路由,而 M 表示已經修改過。

[tom@phoenix tom]$ netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt 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.1 0.0.0.0 UG 0 0 0 eth0
接下來的三列顯示 MSS、Window 和 irtt,它們將被應用於通過該路由建立的 TCP 連接。MSS(Maximum Segment Size)表示「最大分段尺寸」,也是內核所構建以通過該路由發送的數據報的最大尺寸。Window 表示系統一次從遠程主機接收突發的最大量數據。
首字母縮寫詞 irtt 代表「初始往返時間(initial round trip tim)」。TCP 協議確保主機間可靠地發送數據,如果數據已經丟失,則重新發送。TCP 協議一直對發送給遠程端點的數據報和接收到的確認所花費的時間進行記數,以便知道假定要重發數據報前需要等待的時間;這個過程稱為往返時間。TCP 協議將使用第一次建立連接時所用時間作為初始往返時間的值。對於大多數類型的網路,用預設值就夠了,但對某些速度較慢的網路(特別是某些業餘的分組無線網路),這個時間太短了,會造成不必要的重發。可以使用 route 命令設置 irtt 值。在上面這個路由表中,這些欄位均為零值,這表明正在使用預設值。
最後,最後這個欄位表示的是所顯示的路由使用的網路介面。

用 netstat 顯示一些網路介面使用的統計信息

用 -i 選項調用 netstat 可以顯示所有已配置介面的一些有用的統計信息 ? 這是一個用於排除網路故障的非常有用的工具。有了該命令,很容易檢查連接的狀態以及連接是否「正常」。
[tom@phoenix tom]$ netstat -i
Kernel Interface table
eth0 Link encap:Ethernet HWaddr 00:10:5A:00:87:22
inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:10554374 errors:0 dropped:0 overruns:0 frame:0
TX packets:8528339 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:19 Base address:0xc800

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:3924 Metric:1
RX packets:5612 errors:0 dropped:0 overruns:0 frame:0
TX packets:5612 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0

RX packets 和 TX packets 行分別顯示了已經接收到的信息包或已經發送了的信息包數目以及出錯的信息包、丟失的信息包以及溢出的 RX/TX 統計信息。最常見的介面錯誤都是源於不正確的配置,所以,如果遇到了某些困難,最好再三檢查所有的設置來進行診斷。
假使介面已經啟動,則應該沒有信息包排隊等候發送(txqueuelen)? 如果有,則可能是由於網路電纜或網卡有問題。首先換一根備用電纜,然後重新檢查連接。RX/TX 錯誤應該近乎為零。如果 TX 錯誤過多,則表示網路已經飽和或物理連接有問題;如果 RX 錯誤過多,則表示網路已經飽和、物理連接有問題或主機過載。如果遇到過高的衝突率(衝突率是輸出信息包(output packet)的百分比,而不是從發送/接收信息包的總數中計算得出),它可能也表示網路已經飽和;通過從同一子網上的另一台主機執行 netstat -i 命令並比較結果來證實這一點。
要解決網路中錯誤,一定要仔細地以及系統地分析介面的所有方面(硬體和軟體),這是必要的。不要匆忙行事,……啊……我們提到了總是要先檢查網路電纜。在這一點,相信我。

[火星人 ] 在Linux下配置TCP/IP已經有732次圍觀

http://coctec.com/docs/linux/show-post-203684.html