概述
網絡管理涵蓋了很多方面的內容:一般來說包括收集網絡的統計數據和狀態信息,并且在需要時采取一定的措施來解決出現的故障。最原始的網絡監控技術是定期"ping"重要的主機。更復雜的網絡監控則需要監視網絡上的各個設備的狀態和統計信息,如:各種類型的數據包(datagram)統計及各種類型的錯誤的統計。
這一章主要是關于聯網設備,網絡相關配置文件、重要的網絡命令和TCP/IP安全等方面的內容。
在服務器上安裝多塊網卡
在使用Linux作為兩個以太網之間的網關的情況下,服務器至少需要配置兩塊網卡。為了減少啟動時可能出現的問題,Linux內核不會自動檢測多個網卡。若需要在服務器上安裝多塊網卡,對于已經將網卡的驅動編譯進內核中的系統,則需要在"/etc/lilo.conf"文件中指定各個網卡的參數信息;而對于沒有將網卡的驅動編譯到內核而是作為模塊動態載入的系統,應該在"conf.modules"文件中進行相應的配置。
若設備驅動被編譯為模塊(內核的模塊):對于PCI設備,模塊將自動檢測到所有已經安裝到系統上的設備;對于ISA卡,則需要向模塊提供IO地址,以使模塊知道在何處尋找該卡,這些信息在"/etc/conf.modules"中提供。
例如,我們有兩塊ISA總線的3c509卡,一個IO地址是0x300,另一個是0x320。編輯"conf.modules"文件如下:
aliaseth03c509
aliaseth13c509
options3c509io=0x300,0x320
這是說明3c509的驅動程序應當被eth0或eth1加載(aliaseth0,eth1),并且它們應該以參數io=0x300,0x320被裝載,這樣驅動程序知道到哪里去尋找網卡,其中0x是不可缺少的。
對于PCI卡,僅僅需要alias命令來使ethN和適當的驅動模塊名關聯,PCI卡的IO地址將會被自動的檢測到。對于PCI卡,編輯"conf.modules"文件如下:
aliaseth03c509
aliaseth13c509
若驅動已經被編譯進了內核:系統啟動時的PCI檢測程序將會自動找到所有相關的網卡。ISA卡一般也能夠被自動檢測到,但是在某些情況下,ISA卡仍然需要做下面的配置工作:
在"/etc/lilo.conf"中增加配置信息,其方法是通過LILO程序將啟動參數信息傳遞給內核。對于ISA卡,編輯"lilo.conf"文件,增加如下內容:
append="ether="0,0,eht1"
注意:先不要在"lilo.conf"中加入啟動參數,測試一下你的ISA卡,若失敗再使用啟動參數。
如果用傳遞啟動參數的方法,eth0和eth1將按照啟動時被發現的順序來設置。因為我們已經重新編譯了內核,所以必須使用第二種方法(在lilo.conf中加入啟動參數)在系統中安裝我們的第二塊網卡。這種方法只對ISA卡有必要,PCI卡會被自動查找到,所以沒有什么必要。
和網絡相關的一些配置文件
在Linux系統中,TCP/IP網絡是通過若干個文本文件進行配置的,也許你需要編輯這些文件來完成聯網工作。下面的部分介紹基本的TCP/IP配置文件:
"/etc/HOSTNAME"文件:
該文件包含了系統的主機名稱,包括完全的域名,如:
deep.openarch.com
"/etc/sysconfig/network-scripts/ifcfg-ethN"文件:
在RedHat6.1中,系統網絡設備的配置文件保存在"/etc/sysconfig/network-scripts"目錄下,ifcfg-eth0包含第一塊網卡的配置信息,ifcfg-eht1包含第二塊網卡的配置信息。
下面是"/etc/sysconfig/network-scripts/ifcfg-eth0"文件的示例:
DEVICE=eth0
IPADDR=208.164.186.1
NETMASK=255.255.255.0
NETWORK=208.164.186.0
BROADCAST=208.164.186.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
若希望手工修改網絡地址或在新的接口上增加新的網絡界面,可以通過修改對應的文件(ifcfg-ethN)或創建新的文件來實現。
DEVICE=namename表示物理設備的名字
IPADDR=addraddr表示賦給該卡的IP地址
NETMASK=maskmask表示網絡掩碼
NETWORK=addraddr表示網絡地址
BROADCAST=addraddr表示廣播地址
ONBOOT=yes/no啟動時是否激活該卡
BOOTPROTO=protoproto取值可以是:
none:無須啟動協議
bootp:使用bootp協議
dhcp:使用dhcp協議
USERCTL=yes/no是否允許非root用戶控制該設備
"/etc/resolv.conf"文件:
該文件是由解析器(resolver,一個根據主機名解析IP地址的庫)使用的配置文件,示例如下:
searchopenarch.com
nameserver208.164.186.1
nameserver208.164.186.2
"searchdomainname.com"表示當提供了一個不包括完全域名的主機名時,在該主機名后添加domainname.com的后綴;"nameserver"表示解析域名時使用該地址指定的主機為域名服務器。其中域名服務器是按照文件中出現的順序來查詢的。
"/etc/host.conf"文件:
該文件指定如何解析主機名。Linux通過解析器庫來獲得主機名對應的IP地址。下面是一個"/etc/host.conf"的示例:
orderbind,hosts
multion
ospoofon
"orderbind,hosts"指定主機名查詢順序,這里規定先使用DNS來解析域名,然后再查詢"/etc/hosts"文件。
"multion"指定是否"/etc/hosts"文件中指定的主機可以有多個地址,擁有多個IP地址的主機一般稱為具有多個網絡界面。
"nospoofon"指不允許對該服務器進行IP地址欺騙。IP欺騙是一種攻擊系統安全的手段,通過把IP地址偽裝成別的計算機,來取得其它計算機的信任。
"/etc/sysconfig/network"文件
該文件用來指定服務器上的網絡配置信息,下面是一個示例:
NETWORK=yes
RORWARD_IPV4=yes
HOSTNAME=deep.openarch.com
GAREWAY=0.0.0.0
GATEWAYDEV=
NETWORK=yes/no網絡是否被配置;
FORWARD_IPV4=yes/no是否開啟IP轉發功能
HOSTNAME=hostnamehostname表示服務器的主機名
GAREWAY=gw-ipgw-ip表示網絡網關的IP地址
GAREWAYDEV=gw-devgw-dw表示網關的設備名,如:etho等
注意:為了和老的軟件相兼容,"/etc/HOSTNAME"文件應該用和HOSTNAME=hostname相同的主機名。
"/etc/hosts"文件
當機器啟動時,在可以查詢DNS以前,機器需要查詢一些主機名到IP地址的匹配。這些匹配信息存放在/etc/hosts文件中。在沒有域名服務器情況下,系統上的所有網絡程序都通過查詢該文件來解析對應于某個主機名的IP地址。
下面是一個"/etc/hosts"文件的示例:
IPAddress
Hostname
Alias
127.0.0.1
Localhost
Gate.openarch.com
208.164.186.1
gate.openarch.com
Gate
208.164.186.2
forest.openarch.com
Forest
208.164.186.3
deep.openarch.com
Deep
最左邊一列是主機IP信息,中間一列是主機名。任何后面的列都是該主機的別名。一旦配置完機器的網絡配置文件,應該重新啟動網絡以使修改生效。使用下面的命令來重新啟動網絡:
/etc/rc.d/init.d/networkrestart
注意:tcpd程序是負責檢測如telnet、ftp等的服務請求。
一旦有服務請求到來,inetd進程將啟動tcpd進程,tcpd在日志文件中記錄該請求,并且完成一些其他的檢測工作。如果一切正常通過,tcpd將啟動相應的服務器進程,然后自己結束。tcpd要通過查詢DNS服務器,先對該客戶機的IP地址進行反向解析得到主機名,然后再解析得到該主機名對應的IP地址,接著,把得到IP地址和發出請求的客戶的機器的IP地址進行比較,通過這些步驟來實現對發送請求的客戶機的驗證。若兩者不匹配,則tcpd認為發出請求的機器在偽裝成其它的機器,則拒絕請求,這就是為什么有時候telnet到Linux機器要等待那么長時間的原因,可以通過在"/etc/hosts"加入客戶的機器的IP地址和主機名的匹配項,就可以減少登錄等待時間。
tcpd可以設置成禁止源路徑路由(source-routing)socket的連接請求。這個設置可以避免黑客用把自己的IP地址偽裝成別的計算機的IP地址的方法,攻擊服務器。請注意這個設置對UDP無效。當服務器試圖把請求服務的客戶機的IP地址反向解析成主機名的時候經常會出現超時(timeout)錯誤。其原因可能是DNS服務器沒有配置好,或者DNS根本沒有請求服務的客戶端計算機的任何信息。
用命令行手工配置TCP/IP網絡
ifconfig是用來設置和配置網卡的命令工行具,為了手工配置網絡你需要熟悉這個命令。用該命令的好處是無須重新啟動機器。
賦給eth0接口IP地址208.164.186.2,使用命令:
[root@deep]#ifconfigeth0208.164.186.2netmask255.255.255.0
列出所有的網絡接口,你可以使用命令:
[root@deep]#ifconfig
這個命令的輸出是這樣的:
eth0
Linkencap:EthernetHWaddr00:E0:18:90:1B:56
inetaddr:208.164.186.2Bcast:208.164.186.255Mask:255.255.255.0
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:1295errors:0dropped:0overruns:0frame:0
TXpackets:1163errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:100
Interrupt:11Baseaddress:0xa800
lo
Linkencap:LocalLoopback
inetaddr:127.0.0.1Mask:255.0.0.0
UPLOOPBACKRUNNINGMTU:3924Metric:1
RXpackets:139errors:0dropped:0overruns:0frame:0
TXpackets:139errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
若運行不帶任何參數的ifconfig命令,這個命令將顯示機器所有激活的接口的信息。帶有-a參數的該命令則顯示所有的接口的信息,包括沒有激活的接口,例如:
[root@deep]#ifconfig-a
這個命令的輸出是這樣的:
eth0
Linkencap:EthernetHWaddr00:E0:18:90:1B:56
inetaddr:208.164.186.2Bcast:208.164.186.255Mask:255.255.255.0
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:1295errors:0dropped:0overruns:0frame:0
TXpackets:1163errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:100
Interrupt:11Baseaddress:0xa800
eth1
Linkencap:EthernetHWaddr00:E0:18:90:1B:56
inetaddr:192.168.1.1Bcast:192.168.1.255Mask:255.255.255.0
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:1295errors:0dropped:0overruns:0frame:0
TXpackets:1163errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:100
Interrupt:5Baseaddress:0xa320
lo
Linkencap:LocalLoopback
inetaddr:127.0.0.1Mask:255.0.0.0
UPLOOPBACKRUNNINGMTU:3924Metric:1
RXpackets:139errors:0dropped:0overruns:0frame:0
TXpackets:139errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
注意:用ifconfig命令配置的網絡設備參數,在重新啟動以后,這些參數設置將會丟失。
給208.164.186.1配置缺省網關,使用命令:
[root@deep]#routeadddefaultgw208.164.186.1
在這個例子中,缺省網關設置為208.164.186.1。
然后,測試一下是否可以連通本網段的機器,從網絡上隨便選一臺主機測試一下,比如選擇208.164.186.1。
用下面的命令測試一下能否連通這臺計算機:
[root@deep]#ping208.164.186.1
輸出會是這樣的:
PING208.164.186.1(208.164.186.1)from208.164.186.2:56databytes
64bytesfrom208.164.186.2:icmp_seq=0ttl=128time=1.0ms
64bytesfrom208.164.186.2:icmp_seq=1ttl=128time=1.0ms
64bytesfrom208.164.186.2:icmp_seq=2ttl=128time=1.0ms
64bytesfrom208.164.186.2:icmp_seq=3ttl=128time=1.0ms
---208.164.186.1pingstatistics---
4packetstransmitted,4packetsreceived,0%packetloss
round-tripmin/avg/max=1.0/1.0/1.0ms
現在可以使用route命令輸出路由表信息來查看。
用下面的命令顯示路由信息:
[root@deep]#route-n
輸出是這樣的:
KernelIProutingtable
DestinationGatewayGenmaskFlagsMetricRefUseIface
208.164.186.20.0.0.0255.255.255.255UH000eth0
208.164.186.0208.164.186.2255.255.255.0UG000eth0
208.164.186.00.0.0.0255.255.255.0U000eth0
127.0.0.00.0.0.0255.0.0.0U000lo
為了快速檢查接口狀態信息,使用netstat-i命令:
[root@deep]#netstat-i
輸出是這樣的:
KernelInterfacetable
IfaceMTUMetRX-OKRX-ERRRX-DRPRX-OVRTX-OKTX-ERRTX-DRPTX-OVRFlg
eth01500042360003700000BRU
lo392401330000013300000LRU
ppp0150001410016000PRU
netstat命令的另外一個有用處的選項是-t,其將顯示所有的激活的TCP連接:
[root@deep]#netstat-t
輸出是這樣的:
ActiveInternetconnections(w/oservers)
ProtoRecv-QSend-QLocalAddressForeignAddressState
Tcp00deep.openar:netbios-ssngate.openarch.com:1045ESTABLISHED
Tcp00localhost:1032localhost:1033ESTABLISHED
Tcp00localhost:1033localhost:1032ESTABLISHED
Tcp00localhost:1030localhost:1034ESTABLISHED
Tcp00localhost:1031localhost:1030ESTABLISHED
Tcp00localhost:1028localhost:1029ESTABLISHED
Tcp00localhost:1029localhost:1028ESTABLISHED
Tcp00localhost:1026localhost:1027ESTABLISHED
Tcp00localhost:1027localhost:1026ESTABLISHED
Tcp00localhost:1024localhost:1025ESTABLISHED
Tcp00localhost:1025localhost:1024ESTABLISHED
顯示所有的活動的和被監聽的TCP連接,使用命令:
[root@deep]#netstat-vat
輸出是這樣的:
ActiveInternetconnections(serversandestablished)
ProtoRecv-QSend-QLocalAddressForeignAddressState
tcp00deep.openarch.co:domain*:*LISTEN
tcp00localhost:domain*:*LISTEN
tcp00deep.openarch.com:sshgate.openarch.com:1682ESTABLISHED
tcp00*:webcache*:*LISTEN
tcp00deep.openar:netbios-ssn*:*LISTEN
tcp00localhost:netbios-ssn*:*LISTEN
tcp00localhost:1032localhost:1033ESTABLISHED
tcp00localhost:1033localhost:1032ESTABLISHED
tcp00localhost:1030localhost:1031ESTABLISHED
tcp00localhost:1031localhost:1030ESTABLISHED
tcp00localhost:1028localhost:1029ESTABLISHED
tcp00localhost:1029localhost:1028ESTABLISHED
tcp00localhost:1026localhost:1027ESTABLISHED
tcp00localhost:1027localhost:1026ESTABLISHED
tcp00localhost:1024localhost:1025ESTABLISHED
tcp00localhost:1025localhost:1024ESTABLISHED
tcp00deep.openarch.com:www*:*LISTEN
tcp00deep.openarch.com:https*:*LISTEN
tcp00*:389*:*LISTEN
tcp00*:ssh*:*LISTEN
使系統中所有的網絡接口停止工作,用命令:
[root@deep]#/etc/rc.d/init.d/networkstop
啟動系統中所有的網絡接口,用命令:
[root@deep]#/etc/rc.d/init.d/networkstart
TCP/IP安全問題概述
下面的內容要求讀者知道TCP/IP協議的基本原理,例如:IP和TCP頭的各個字段的功能以及連接的建立過程。這里先簡單地介紹一下TCP/IP協議。
IP數據包(packet)
數據包這個術語指的是IP協議消息。消息分為消息頭和消息體,消息頭是IP協議使用的各種參數信息,如:源、目的地址等等。消息體是上層協議—TCP協議的數據內容。
IP機制
Linux支持三種IP消息類型:ICMP、UDP和TCP。一個ICMP數據報是網絡級的IP控制和狀態消息。ICMP消息控制兩臺端主機之間的與通信相關信息。UDP類型的IP包在網絡應用程序之間傳送數據,但是不保證傳送質量和數據包的傳送順序。UDP數據的傳送類似郵局的明信片發送方式。TCP類型的IP包同樣在網絡應用程序之間傳送數據,但是TCP數據包頭包含了更多的信息,從而保證了可靠有序的數據傳輸。傳送TCP數據類似通過電話系統交談的過程:數據可靠而且保證傳送順序。大多數Internet應用程序都使用TCP協議,用UDP的比較少。也就是說絕大多數的Internet服務都傾向于在客戶程序和服務器程序之間建立雙向的數據傳送通道(用TCP),而不是單向的數據傳送通道(用UDP)。
IP數據包頭
所有的IP數據包(ICMP、UDP或TCP)都要包含源、目的的IP地址和IP包的上層協議的類型,如:ICMP,UDP或TCP。根據不同的協議類型,IP數據包頭還包含其它不同的字段。ICMP類型的IP數據包包含一個標識是控制或狀態消息的類型字段,以及一個進一步指示是何種類型的控制或狀態消息類型的字段。對于UDP和TCP類型還包含兩個分別標識源和目的端口號的字段。TCP數據報頭還包含區分每個數據報的標識符及保證連接狀態的信息的字段。
TCP/IP安全問題
TCP/IP協議本身有不少的缺陷,允許攻擊者利用隱藏通道的方式在看上去正常的數據包中秘密地傳輸數據。下面我們就通過理論結合例子來對這些缺陷進行進一步說明:
一個隱藏通道指:任何被進程用來進行可能對系統安全策略造成威脅的數據傳輸的通道。TCP/IP的設計本身并不想有什么隱藏通道,但是設計上的缺陷導致了用來非法傳輸信息的隱藏通道的存在。
在TCP/IP環境下,有若干可以用來建立隱藏通道,在主機之間實現非法通信的方法,例如:
旁路包過濾器,網絡探測器(sniffer)和"不潔詞"(dirtyword)搜索引擎。
以在正常的信息包中封裝經過加密的或沒有經過加密的信息的方式,通過網絡秘密傳輸信息。
通過將封裝有非法信息的偽裝包在Internet上的某一個站點上"中轉"一次來隱藏被傳輸的數據的源發送位置。
眾所周知,TCP是面向連接的可靠的協議。簡單的說,TCP協議采取一定的措施保證到達遠端機器的數據沒有被篡改。實現這個特性依賴于TCP的三次握手建鏈機制:
第一步:發送一個帶有ISN(InitialSequenceNumber,序列號)的同步數據包-SYN。
主機A希望同主機B建立連接。主機A發送一個數據包,該數據包的SYN位被置位,表示希望建立一個新的連接,并且該數據包帶有一個ISN號,來識別主機之間發送的不同的數據包。
HostA------SYN(ISN)------>HostB
第二步:遠程機器響應一個確認包ACK。
主機B通過發送一個SYN位和ACK位被置位的數據包來響應該主機A的連接請求。這個響應包中不但包含了主機B的ISN,而且包含了主機A的ISN+1表示剛才的連接請求數據包被正確的接收,等待接收SN為ISN+1的數據包。
HostA<------SYN(ISN+1)/ACK------HostB
第三步:主機A通過再發送一個確認包ACK給主機B來完成連接的建立。
HostA------ACK------>HostB
整個連接過程在幾個毫秒內完成。握手協議確保在主機之間建立一個可靠的鏈接。這就是為什么TCP被看作是面向連接的協議。而UDP協議并沒有這樣的建立連接的協商過程,所以UDP被看作是不可靠的協議。
IP包頭:
0
4
8
12
1619
20
24
2831
32
VERS
HLEN
ServiceType
TotalLength
Identification
Flags
FragmentOffset
SourceIPAddress
DestinationIPAddress
IPOptions
Padding
Data
TCP包頭:
0
4
8
12
16
20
24
2831
SourcePort
DestinationPort
SequenceNumber
AcknowledgementNumber
HLEN
Reserved
CodeBits
Window
Checksum
UrgentPointer
Options
Padding
Data
在兩種數據包頭內,都有多個字段不是進行正常數據傳輸所必須的,這些選項字段是由發送者根據需要來決定是否使用的。通過對這些選項字段的分析可以發現有很多種可能來存儲和傳輸數據。利用這些字段的基礎是對取值0-255的ASCII字符進行編碼。使用這個方法,可以通過在主機之間傳送看似正常的數據包如:建立連接請求、正常的數據傳輸等,來秘密的傳輸數據。這些數據報包可以在上層協議數據字段中不包含任何數據或者包含一些無用的數據信息。這些數據包甚至可以包含偽裝的目的、源地址和端口號,來實現穿越包過濾防火墻。另外,偽裝的數據報還可以估計經過網絡上一個無關站點的中轉(bounce)來逃避追蹤。
安全問題的解決方案
下面的協議和系統通常被用來在計算機網絡中解決和提供不同程度的安全服務。
包過濾
網絡地址轉換(NAT)
IP安全體系結構(IPSec)
SOCKS
安全套接字層(SSL)
應用級代理
防火墻
Kerberos和其它認證系統
安全電子傳輸(SET)
下面這個圖解釋了這些安全解決方案的在TCP/IP層中的實現:
總結
通過學習和閱讀本章,應該掌握如下內容:
應該學會編輯如下的文件來配置Linux系統的網絡:"/etc/hosts"、"/etc/host.conf"、"/etc/resolv.conf"、"/etc/HOSTNAME"、"/etc/sysconfig/network"和在"/etc/sysconfig/network-scripts"目錄下面的腳本文件。