第十二章 TCP/IP Network
壹. UNIX 網路設定命令
◎ UNIX作業系統中網路設定與管理相關指令與功用程式包括:arp、rarp、ping、netstat、ifconfig、traceroute、route、…等。除traceroute外,其餘均為系統所附之工具,而這其中又以netstat與ifconfig在網路管理與設定中最常被使用;前者主要用於網路運作狀態監視,後者則用於網路界面的設定與管理 。
◎ 唯有超級使用者(superuser -root)可以使用網路相關設定指令(如route、ifconfig、arp等);但幾乎所有系統使用者均可被允許透過網路監視指令(如ping、netstat、traceroute等),了解網路目前組態與運作狀況。
一. IP位址設定
◎
命令:
netstat
設定IP位址前必須先了解系統網路卡名稱,此一”名稱”與網路卡廠牌無關,而是與UNIX的種類有關。在linux下第一張乙太網路卡名稱為eth0(Solaris
為be0,Ultrix為le0),loopback網路介面名稱則為lo。一般而言,此一介面無須設定(使用系統預設值即可)。
指令”netstat –in”告訴你系統目前存在(偵測到)網路介面的名稱。
Example:
cc000:~# netstat -in
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flags
Lo 3584 0 12 0 0 0 12 0 0 0 BLRU
eth0 1500 0 1104 0 0 0 93 0 0 0 BRU
cc000:~#
◎ 命令: ifconfig
UNIX中IP位址設定所使用的標準指令為 ifconfig ,其指令格式如下
ifconfig if_name inet x.x.x.x netmask a.b.c.d broadcast e.f.g.h
其中,inet、netmask、broadcast為keyword。
if_name : 網路介面名稱。(eth0 in linux)。
x.x.x.x : 指定給if_name的IP位址。
a.b.c.d : 指定給if_name的網路遮罩。
e.f.g.h : 指定給if_name的廣播位址。
Example, 下面的例子顯示網路卡設定與運作記錄值:
cc000:~# ifconfig eth0
eth0 Link encap:10Mbps Ethernet HWaddr 00:00:E8:22:97:A4
inet addr:140.120.153.1 Bcast:140.120.153.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1261 errors:0 dropped:0 overruns:0
TX packets:110 errors:0 dropped:0 overruns:0
Interrupt:5 Base address:0x300
Example, 更改網路卡IP位址為140.120.153.20的例子:
cc000:~#ifconfig eth0 inet 140.120.153.20 netmask 255.255.255.0 broadcast 140.120.153.255
Example, 再看看網路卡設定, 請留意變動之欄位:
cc000:~# ifconfig eth0
eth0 Link encap:10Mbps Ethernet HWaddr 00:00:E8:22:97:A4
inet addr:140.120.153.20 Bcast:140.120.153.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1261 errors:0 dropped:0 overruns:0
TX packets:110 errors:0 dropped:0 overruns:0
Interrupt:5 Base address:0x300
您可以看到界面的名稱( eth0 等)、界面類型( Ethernet 等)、界面實體位址、IP 位址、廣播位址、Net Mask、界面目前狀態、MTU(Maximum Transmission Unit)大小、路由 Metric 數目、接收(RX)封包狀態、發送(TX)封包狀態、網路碰撞、發送隊列、IRQ、IO地址等訊息。
◎ 啟動與關閉網路介面的命令
可以使用ifdown停用網路介面, 用ifup啟用網路界面。
例如﹕
ifdown /etc/sysconfig/network-scripts/ifcfg-eth0 ifup /etc/sysconfig/network-scripts/ifcfg-eth0 |
二. Routing Table設定
◎ Routing Table
UNIX作業系統透過TCP/IP網路對外連線時,routing table為選擇路徑的依據,正確的routing 設定方能確保機器能上網。
路由設定方式可分動態與靜態兩種,基本上這兩種方式可以同時並存。
1.動態路由(Dynamic Routing)設定
所謂動態路由乃是透過路由協定(一般為RIP or OSPF),與鄰近之路由器或同樣執行路由協定之設備(例如另一台linux),彼此交換路由訊息,並自動建立起路由表。
基本上動態路由均由一背景程式(daemon)負責更新路由表,無須人工手動設定 路由表,只要由超級使用者(root)執行這個背景程式(在linux這個程式叫做”routed”)即可。
2. 靜態路由(Static routing)設定)
靜態路由是由管理者本身,依所在網路環境,設定routing table之各欄位,告訴系統所有往外之去路。 Static routing 設定包括增加一個路由、刪除已存在之路由及清除routing table 所有路由。
◎ Routing Table的設定
1. 增加一個路由(add a route)
指令格式: route add–net target_net gw gateway
à 告訴系統,通往外部網路target_net必須由router “gateway”轉送。
Example1:
route add –net 140.120.2.0 gw 140.120.153.25
à告訴系統通往子網路140.120.2.0可經由gateway 140.120.153.25。
Example2:
route add –net default gw 140.120.153.254
à設定系統default gateway,若在routing table中找不到的相對應的子網路,就 往140.120.153.254轉送。
2. 刪除一個路由(delete a route)
指令格式: route delete–net target_net gw gateway
à 刪除通往外部網路target_net 的路徑“gateway”。
Example1:
route delete–net 140.120.2.0 gw 140.120.153.25
3. 清除routing table所有路由(flush routing table)
在某些情況下(例如系統routing 無法正常運作,或重新設定網路卡),管理者必須清除routing table中所有之欄位。
清除routing table中所有之欄位的指令格式:route –f
4. 查看系統目前使用的路由表格設定﹕輸入route這個命令且不帶任何參數Example1:
Kernel IP routing table Destination Gateway mask Flags Metric Ref Use Iface swtn184-1.adsl. * 255.255.255.255 UH 0 0 0 ppp0 10.0.1.128 * 255.255.255.224 U 0 0 0 eth2 10.0.1.0 * 255.255.255.224 U 0 0 0 eth1 192.168.100.0 * 255.255.255.0 U 0 0 0 eth0 127.0.0.0 * 255.0.0.0 U 0 0 0 lo default swtn184-1.adsl. 0.0.0.0 UG 0 0 0 ppp0
|
從上面的命令結果中﹐我們可以看到﹕
附註: 將 windows 的 default gw 設定為 192.168.100.23, 也同樣可以的﹕控制台 --> 網路 --> TCP/IP --> 內容 --> 通訊閘 ﹕
三. Domain Name Service 設定
◎ Domain Name Server 設定
如果你想使用Naming service,你必須正確的指定Domain Name Server。
Linux中指定Domain Name Server的步驟相當簡單,你只需編輯/etc/resolv.conf這個組態檔案即可,並將更改過的檔案內容存檔,所設定之內容即立刻生效,無須重新開機。
/etc/resolv.conf這個檔案內容只有root可以變更,其內容一般如下:
cc000:~# more /etc/resolv.conf
domain cyut.edu.tw
nameserver 163.17.1.1
nameserver 163.17.3.1
cc000:~#
如有必要你可以指定一個以上的Domain Name Server。以上的例子中,設定Domain Name 為cyut.edu.tw ,Domain Name Server則設定兩個:163.17.1.1與163.17.3.1,系統查詢的順序為:163.17.1.1, if fail à 163.17.3.1。
◎ Local Host Table - /etc/hosts: 另一種Domain Name與IP address對應的設定
/etc/hosts是另一個可自行設定IP Address與hostname對應的檔案,你可以在此定義local host 與一些重要電腦的名稱。
◎ Domain Name 查詢的順序
根據不同版本的不同需要修正 /etc/nsswitch.conf
或者是 /etc/host.conf
檔案.
1. 修正/etc/nsswitch.conf
這是一個很長的檔案,找出以 `hosts:
' 作為開頭的那一行,它應該是這樣:
hosts: files dns #先在/etc/hosts
檔案裡找尋,然後根據resolv.conf
詢問 DNS.
如果檔案裡沒有以 `hosts:
' 作為開頭的行那麼把上面這一行加上去.
2. 修正/etc/host.conf
範例如下:
1. vi /etc/host.conf
order hosts, bind # Lookup names via /etc/hosts first then fall back to DNS.
Þ查詢順序:/etc/hosts, if not found à Domain Name Server
2. vi /etc/host.conf
order bind, hosts # Lookup names via DNS first then fall back to /etc/hosts.
Þ查詢順序:Domain
Name Server, if not found
à
/etc/hosts
如果檔案不存在, You may create /etc/hosts and /etc/hosts.conf by yourself.
四. 簡易網路除錯
◎ ping – 測試網路上某台機器是否在線上,是否開機,或是否可以跟你的機器連線
.成功的例子
cc000:~# ping 140.120.2.110
PING 140.120.2.110 (140.120.2.110): 56 data bytes
64 bytes from 140.120.2.110: icmp_seq=0 ttl=127 time=1.3 ms
64 bytes from 140.120.2.110: icmp_seq=1 ttl=127 time=1.3 ms
64 bytes from 140.120.2.110: icmp_seq=2 ttl=127 time=1.3 ms
64 bytes from 140.120.2.110: icmp_seq=3 ttl=127 time=1.3 ms
64 bytes from 140.120.2.110: icmp_seq=4 ttl=127 time=1.3 ms
64 bytes from 140.120.2.110: icmp_seq=5 ttl=127 time=1.4 ms
[按下^c終止ping 指令執行]
--- 140.120.2.110 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 1.3/1.3/1.4 ms
在 Linux 使用 ping 命令﹐如果您不使用 -c N 參數來指定送出多少個封包的話﹐ping 命令會一直延續下去﹐直到您按 Ctrl + C 為止。從上面的命令結果我們可以確定連線是否成功之外﹐還可以根據它的 time 來判斷當前的連線速度﹐數值越低速度越快﹔在命令結束的兩行﹐還有一個總結﹐如果發現您的 packet loss 很嚴重的話﹐那就要檢察您的線路品質﹐或是上游的服務品質了﹔最後一行是 round-trip (來回)時間的最小值、平均值、最大值﹐它們的時間單位都是微秒 (ms)。
.失敗的例子
cc000:~# ping 140.120.2.113
PING 140.120.2.113 (140.120.2.113): 56 data bytes
[按下^c終止ping 指令執行]
--- 140.120.2.113 ping statistics ---
5 packets transmitted, 0 packets received, 100% packet loss
. 線路不良的例子
cc000:~# ping www.psu.edu
PING www.cac.psu.edu (146.186.157.6): 56 data bytes
64 bytes from 146.186.157.6: icmp_seq=0 ttl=238 time=329.5 ms
64 bytes from 146.186.157.6: icmp_seq=2 ttl=238 time=347.9 ms
64 bytes from 146.186.157.6: icmp_seq=4 ttl=238 time=335.2 ms
64 bytes from 146.186.157.6: icmp_seq=7 ttl=238 time=322.6 ms
64 bytes from 146.186.157.6: icmp_seq=9 ttl=238 time=343.5 ms
64 bytes from 146.186.157.6: icmp_seq=11 ttl=238 time=333.3 ms
[按下^c終止ping 指令執行]
--- www.cac.psu.edu ping statistics ---
13 packets transmitted, 6 packets received, 53% packet loss
round-trip min/avg/max = 322.6/335.3/347.9 ms
cc000:~#
如果線材接續不良, 或傳輸距離過遠,會導致封包遺失。本例中,送往www.psu.edu的封包有53%不知去向。
◎traceroute – 測試連線路徑
cc000:~# traceroute www.nctu.edu.tw
traceroute to www.nctu.edu.tw (140.113.250.5), 30 hops max, 40 byte packets
1 140.120.153.254 (140.120.153.254) 0.668 ms 0.568 ms 0.553 ms
2 140.120.2.254 (140.120.2.254) 2.394 ms 2.25 ms 2.106 ms
3 r7513.nchu.edu.tw (140.120.254.7) 2.546 ms 1.53 ms 1.444 ms
4 TANetBackbone-NCHC.edu.tw (192.83.196.110) 4.037 ms 3.46 ms 3.59 ms
5 NCHC-FDDI-NCTU.edu.tw (134.208.150.253) 3.944 ms 3.451 ms 3.764 ms
6 www.nctu.edu.tw (140.113.250.5) 3.316 ms * 3.516 ms
cc000:~#
traceroute的結果告訴我們,所在的機器到目的地(www.nctu.edu.w),總共經過了5個router的轉送,第6個為目的地,及每一個router的延遲。
cc000:~# traceroute www.psu.edu
traceroute to www.cac.psu.edu (146.186.157.6), 30 hops max, 40 byte packets
1 140.120.153.254 (140.120.153.254) 0.657 ms 0.558 ms 0.55 ms
2 140.120.2.254 (140.120.2.254) 3.132 ms 2.28 ms 2.535 ms
3 r7513.nchu.edu.tw (140.120.254.7) 2.495 ms 1.465 ms 1.469 ms
4 TANetBackbone-MOE.edu.tw (192.83.196.111) 6.695 ms 5.495 ms 5.996 ms
5 204.59.160.173 (204.59.160.173) 249.789 ms 304.131 ms 267.947 ms
6 gip-sl-stock-fddi-1.gip.net (204.59.128.198) 271.315 ms * *
7 core4-hssi1-0.SanFrancisco.mci.net (206.157.77.65) 265.475 ms 278.866 ms *
8 * * *
9 * * *
[按下^c終止traceroute指令執行]
cc000:~#
這個例子告訴我們,所在機器無法連線到目的地,連線中斷在router 206.157.77.65之後。
.從上面的 traceroute 結果﹐可以看到每一個節點都返回 3 個 round-trip 時間。這樣﹐就能夠判斷整個連線路由中﹐交通瓶頸所在的位置在哪裡。
.在實作中﹐未必所有路由設備都會送回 ICMP 封包。碰到這樣的情況﹐就會看到跳站的情形。假如 traceroute 最後的結果一直維持著 * 符號﹐那可能是因為 ICMP 封包被對方的防火牆攔下來的結果。這樣的話﹐可能就無法完成防火牆後的路由追蹤。
.從上面的例子來觀察﹐由第 5 個跳站開始明顯降慢下來﹐而根據名稱看來﹐應該就是 ISP 連出 backbond 的節點。
參數 | 代表意思 |
-a | 顯示所有 socket ﹐不管是否處於 listening 狀態。 |
-t | 僅顯示 TCP 協定相關的項目。 |
-u | 僅顯示 UDP 協定相關的項目。 |
-l | 僅顯示處於 listen 狀態的項目。 |
-w | 僅顯示 RAW 協定相關的項目。 |
-x | 僅顯示 UNIX 協定相關的項目。 |
-r | 顯示系統的路由表格。 |
-p | 顯示與 socket 相關的程式名稱及 PID 。 |
-n | 不進行名稱解析﹐直接以 IP 位址顯示。 |
Example1:
netstat -tna |
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:113 0.0.0.0:* LISTEN tcp 0 0 211.74.184.205:53 0.0.0.0:* LISTEN tcp 0 0 10.0.1.131:53 0.0.0.0:* LISTEN tcp 0 0 10.0.1.1:53 0.0.0.0:* LISTEN tcp 0 0 192.168.100.23:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN tcp 0 0 192.168.100.23:22 192.168.100.20:2610 ESTABLISHED tcp 0 0 192.168.100.23:139 192.168.100.20:2735 ESTABLISHED |
上面的命令是將系統所打開的所有 TCP socket 都顯示出來﹐其中很重要的一個資訊是 Send-Q ﹐假如這個數值大於 0 並且有增加的趨勢﹐那就證明您的網路流量非常繁忙﹐要不是發生問題的話﹐那就是到了升級的時候了。如果您還想知道每一個 socket 是哪一個程式打開的﹐再加上一個 p 參數就可以了。
Example2:
關於 netstat 命令﹐您還可以用 -i 參數來顯示界面狀態﹕
netstat -i |
Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 10320 0 0 0 9490 0 0 0 BRU eth1 1500 0 23623 0 0 0 353805 0 0 0 BRU eth2 1500 0 0 0 0 0 477 0 0 0 BRU lo 16436 0 585 0 0 0 585 0 0 0 LRU ppp0 1492 0 1022 1538 0 0 954 0 0 0 OPRU |
前面三項分別是﹕界面、最大傳送單位、路由成本(metric)。其後各欄位中的 RX 和 TX 分別代表接收和發送﹐其中 OK 是良好封包﹐ERR 是有問題的封包﹐DRP 是被丟棄的封包﹐OVR 則是來不及處理而溢出的封包。最後的 Flag 分別有如下這些旗標﹕
貳
. 網路的設定檔在 Linux 系統上﹐我們要做網路設定時, 也常常直接修改設定檔﹐若熟悉文字模式的操作, 直接在檔案中修改, 會比用圖形介面工具來修改, 要快的多。
關鍵點是找到設定檔案和 scripts 放在哪裡﹐以及各檔案的作用。在不同的 distribution 裡面﹐各檔的路徑和名稱或有不同﹐例如﹐有些套件﹐會將所有的網路設定寫在 /etc/rc.d/rc.inet1 和 /etc/rc.d/rc.inet2 這兩個檔案裡面。而 RedHat 的產品中設定多集中在 /etc/sysconfig 目錄中。
NETWORKING=yes # 開啟網路功能。 FORWARD_IPV4="yes" # 啟動封包轉送的功能。 HOSTNAME=test.cyut.edu.tw # 主機的名稱 # DOMAINNAME=cyut.edu.tw # 這是 nis domainname ﹐沒用 NIS 可以不設。 GATEWAY="163.17.9.254" # 這是預設 gateway 的位址 GATEWAYDEV="eth0" # 連接 gateway 的界面 |
DEVICE=eth0 # 指定網路設備名稱。 BOOTPROTO=static # 界面啟動使用的協定﹐可以是 dhcp 。 IPADDR=192.168.100.23 # IP 位址。 NETMASK=255.255.255.0 # netmask 設定值。 NETWORK=192.168.100.0 # 網路位址。 BROADCAST=192.168.100.255 # 廣播位址。 ONBOOT=yes # 是否在開機的時候啟動﹐請設定為 yes 。 |
其中的 BOOTPROTO﹐如果這個界面是透過別 DHCP 伺服器取得 IP 的話﹐請設定為 dhcp﹐ 其後的 IPADDR、NETMASK、NETWORK、BROADCAST 就無需設定。
Example:
/etc/sysconfig/network-scripts/route-eth0
GATEWAY0=10.10.0.1
NETMASK0=255.0.0.0
ADDRESS0=10.0.0.0
GATEWAY1=10.2.0.1
NETMASK1=255.255.0.0
ADDRESS1=192.168.0.0
service network stop service network start service network restart |
參. 好用的設定工具
Linux 除了用命令和設定檔﹐也有大量的 Linux 工具可搞定網路設定。
如果對設定檔不熟悉﹐而又不知道如何修改的話﹐可以先將檔案備份起來﹐然後使用工具去修改﹐在將設定內容前後對比﹐觀察檔案中改變的部份﹐多練習數遍就知道怎麼修改。
首先﹐我們可以用‘Host name and IP network devices’來設定基本的網路設定。事實上﹐這個工具就是幫您設定 /etc/sysconfig/network 和 /etc/sysconfig/network-scripts/ifcfg-eth* ﹐以及 /etc/modules.conf 這些檔案,
關於路由方面的設定﹐則可使用‘ Routing and gateways’。如果您不知道如何修改 /etc/sysconfig/network 和 /etc/sysconfig/static-routes 中的路由﹐那就用這個工具﹕
這個工具被認為是 Linux 未來的最完整的設定工具﹐開發者的目標就是提供一個統一的設定界面﹐讓 Linux 管理員簡化煩瑣的設定事項。前面介紹的 netconf 命令﹐事實上也是包含在 linuxconf 工具中的﹐如果您的系統還沒安裝 linuxconf﹐那就上網找來安裝 。