網絡建設、運維所有知識總結篇

OSPF

OSPF的特點:

1.無環路:AS內防環機制是通過SPF算法計算路由,從算法本身保證了不會生成環路。AS間防環:通過區域劃分,非骨幹區域簡直的通訊只能靠骨幹區域通訊。
2.區域劃分:優點減小了內存的消耗和CPU的負擔。
3.支持等價路由。
4.路由等級:區域內、區域間、區域外(E1、E2)
 
自制系統(Autonomous System)
一組使用相同路由協議且處於同一技術掌控的連續的路由範圍。
 
一臺OSPF路由器對其他OSPF路由器的跟蹤需要每臺路由器都提供一個RID,路由器ID在OSPF區域內唯一標識一臺路由器,1.手工route-id配置;2.最大loopback地址;3.最大IP地址。
使用loopback地址的好處:1.穩定,一旦路由器啓動,這個環回接口就處於活動狀態。2.最重要的是具有更好的控制路由ID的能力。
 
OSPF建立在協議號89的基礎上,是傳輸層協議;EIGRP協議號88;RIP使用UDP520因此是應用層協議;BGP使用TCP179端口因此也是應用層協議;ARP/RARP是網絡層協議,但是其工作的內容確實鏈路層。
並且注意對於ARP請求和相應包來說有幀類型字段,對於ARP請求和應答的話這個字段是0x0806。其幀頭中具有協議字段,0x0800代表IP,因此工作在網絡層。
 
Hello協議:
1.發現鄰居;
2.在建立鄰居關係時利用Hello包協商幾個必要的參數;
3.確保雙向通信;
4.充當keepalive。
5.用於在MA網絡上進行DR/BDR的選舉。
 
OSPF建立鄰居的條件:(百度筆試考了)
1.Area ID必須一致;
2.Hello包中的HelloInterval和HelloDeadInterva的時間必須相同;
3.驗證類型及驗證密鑰必須相等;
4.所處的區域標記必須相同;
5.必須物理直連(OSPF包的TTL值爲1,虛鏈路除外);
6.同一區域內兩臺路由器的RID不能相同。
 
注意:路由器在發送Hello包時,會把包含所有鄰居的RID。
 
OSPF網絡類型:
1.點到點
T1鏈路:1.544Mbps,是鏈接單獨一對路由器的。在這種類型的鏈路上總是可以形成鄰居關係的。在這種網絡上的OSPF使用組播地址進行通訊。
2.廣播型網絡
比如以太網,DR與BDR使用AllSPFRouters(224.0.0.5)與非DR/BDR進行通信,而非DR/BDR使用AllDRothers(224.0.0.6)與DR/BDR進行通信。
3.NBMA網絡
比如幀中繼網絡,這樣多路訪問網絡沒有廣播能力,需要選舉DR和BDR,並且OSPF數據包是以單播進行通信的,必須要使用neighbor手工指定鄰居。
4.點到多點網絡
是NBMA網絡的特殊配置,可以看做是一羣點到點鏈路的集合。不需要選舉DR/BDR,OSPF數據包以單播進行傳輸。
5.虛鏈路
OSPF數據包以單播方式發送。
 
除了以上5中網絡類型,也可以將網絡歸納爲以下兩種網絡
傳送網絡:與兩臺及以上的路由器相連的網絡。
末梢網絡:僅僅和一臺路由器相連。
 
如果沒有DR/BDR的話,那麼網絡上將產生n²個:LSA通告,顯得太亂了,於是就選舉DR。
1.首先根據端口優先級(缺省爲1,ip ospf priority),越大越優先。0表示沒有資格選舉爲DR。
2.優先級相等,再根據RID,越大越優先。
注意DR/BDR具有穩定性,指的是:路由器的優先級可以影響一個選舉過程,但是一旦選舉完畢,即使更高的優先級加入後也不會替換DR/BDR。這點與RID類似。
 
DR是一個僞節點的概念,即任從僞節點到任何與之相連的路由器的代價都有0,通過這種方式,所有代價都不會受到僞節點的影響。並且DR是接口特性。
 
Process ID:這個是思科私有的,可以依賴這個屬性讓Cisco路由器運行多個OSPF進程。不同進程之間相當於不能類型的協議。
 
OSPF Hello Interval:在廣播型網絡上爲10s(點到點或者廣播),非廣播上爲30s(點到多點或NBMA)
OSPF RouterDeadInterval:廣播型網絡上爲40s,非廣播爲120s。(注意是4倍關係)
 
Wait Timer(等待計時器)在開始選舉DR和BDR之前,路由器等待鄰居路由器通告自己爲DR、BDR的時間,等待長度就是RouterDeadInterval的時間。
 
RxmtInterval(重傳時間):路由器發送OSPF數據包後沒得到回覆之前將要等待多長時間重傳。5s
 
Neighboring Router:只有建立起了鄰接關係的路由器之間,纔會在這個字段中顯示出鄰居路由器的RID。
 
以上信息可以通過:show ip ospf interface f0/0中查看到。
 
OSPF接口狀態機:
1.Down
2.點到點:這個狀態僅適用於點到點,點到多點,以及虛鏈路網絡中,接口處於這個狀態後,該接口就開始起作用了。此時每隔HelloInterval的時間發送一次Hello數據包,並嘗試和接口鏈路另一端相連的鄰居路由器建立鄰接關係。
3.Waiting:這個是MA網絡中會出現的,開始發送Hello包,並且試圖去選舉DR和BDR或者去發現網絡中的DR或BDR。
4.DR:這樣狀態就代表該路由是DR
5.Backup:該路由器是 BDR。
6.DRother:既不是DR也不是BDR的路由器。
7.Loopback:環回口。
 
鄰接關係的四個階段:
1.鄰居發現階段;
2.雙向通信階段;
3.數據庫同步階段;
4.Full完全鄰接階段;
 
鄰居狀態機,鄰居之間形成完全鄰接關係的過程:
1.失效狀態(Down):鄰居會話的初始狀態,指明在最近的RouterDeadInterval的時間內還沒有收到來自鄰居路由器的Hello數據包。除非在NMBA網絡中,否則Hello包是不會發給哪些失效的鄰居路由器的,並且在NBMA網絡中,是以每個隔PollInterval(120s)的時間發送一次。
2.嘗試狀態(Attempt):僅適合NMBA中,哪些具有DR選舉這個的路由器和其鄰居路由器的相連的接口開始變得有效(Active),這臺具有DR選舉資格的路由器將鄰居路由器的狀態設爲Attempt狀態,並使用HelloInterval時間代替PollInterval的時間來向鄰居發送Hello包。
3.初始狀態(Init):在最近的RouterDeadInterval的時間內,收到的鄰居的Hello包。
4.雙向通信階段(2-way):在來自鄰居路由器的Hello包中看到了自己的RID。(只有在這個狀態或者更高狀態時纔有資格被選作該網絡上的DR或BDR,如果在Init收到一個DBD數據包,也可以引起鄰居狀態直接轉換成2-way狀態)。
5.信息交換初始狀態(ExStart):開始建立主從關係和協商DBD的序列號。並且具有最高RID的路由器成爲”主“路由器。注意:主從關係的協商也是靠DBD包的,只是此時交換的DBD包中的I位(初始位)置1.
6.信息交換狀態(Exchange):在這個狀態先雙方開始交換DBD,並且根據DBD形成LSR,並向對方發送鏈路狀態請求數據包。
7.信息加載狀態(Loading):這個狀態下,收到鄰居發送的LSR,並且返回LSU進行交換鏈路狀態通告信息(LSA)。
8.完全鄰接狀態(Full):鄰居路由器之間具有相同的鏈路狀態數據庫,達到完全鄰接關係。
 
在交換LSA之後必須對其進行確認,LSA的確認有兩種:
1.顯示確認:直接返回含有LSA頭部的LSAck消息;以前已經收到過了。
2.隱式確認:返回收到LSA的相同實例的LSU;第一次收到。
 
注意OSPF對LSA的確認可以使用單個鏈路狀態確認多個LSA通告。這個鏈路狀態確認數據包不需要攜帶完整的LSA信息,而只是需要攜帶LSA的頭部就可以了。沒收到確認的LSA會被放進鏈路狀態重傳列表中,並且每個RxmtInterval(5s)時間就會重新傳輸一次,知道該LSA得到確認爲止。其中LSAck可以被延時發送,但是延時時間必須小於RxmtInterval時間。
 
OSPF採用直接確認的兩種情況:
1.從鄰居不斷的收到重複的LSA,可能表明鄰居還沒有收到這個LSA的一鏈路狀態數據庫裏已經沒有這個LSA的實例。
 
可靠泛洪:序列號,校驗和,老化時間
當路由器收到相同的LSA的多個實例,路由器如何確定哪個是最新的:
1.比較序列號,擁有最大的序列號的LSA就是最新的LSA;
2.假如相等,比較誰擁有最大的無符號校驗和。
3.校驗和也相等的話,就比較老化時間誰的大誰是最新的LSA。
4.如果這些LSA的老化時間之差多餘15min(MaxAgeDiff),那麼擁有較小的老化時間的LSA將是最新的LSA。
5.如果還比較不出來那麼就無法區分誰是最新的LSA,那麼這兩個LSA就被認爲是相同的。
 
OSPF定義了以下3種
域內通信(Intra-Area Traffic)
域間通信(Inter-Area Traffic )
外部通信(External Traffic)
被分割的區域(或稱爲分段區域,Partitioned Area):由於鏈路失效而使一個區域的一部分和其他部分隔離開來的情形。非骨幹區域變成分段區域,此時並不會中斷通信,他們之間的通信會被認爲是區域間的通信。但是如果骨幹區域分段了,那麼會把骨幹區域隔離成兩部分區域,並在兩部分區域上創建兩個單獨的OSPF域。
我們解決的辦法就是利用虛鏈路(Virtual Links)
1.通過非骨幹區域連接一個區域到骨幹區域。
2.通過 一個非骨幹區域連接一個分段的骨幹區域兩邊部分區域。
 
配置虛鏈路注意事項:虛鏈路不能是一個末梢區域,必須是傳送區域(即必須擁有全部的路由信息),並且必須配置在兩臺ABR之間。
 
OSPF採用 LSA組步調(group pacing)的機制:每一個LSA通告都有屬於自己的重新刷新計時器,但是當它們獨自使用的重刷新計時器超時(30min)的時候,會引入一個時延來延遲這些LSA通告的泛洪擴散。通過時延可以讓更多的LSA通告共同編成一組,從而可以讓跟新數據包攜帶大量的LSA通告,默認情況下足步調時間爲4min。
 
 
 
OSPF數據包類型:
1.Hello包:週期性發送,用來發現和維持OSPF鄰居關係的 。這個是依賴於計時器的,比如在 高速鏈路上Hello Interval:10s,死亡時間是40s;低速鏈路30s,死亡時間120s。(這個高速與低速是本很被評級而不是實際的帶寬。)
2.DBD包:描述本地LSDB中每條LSA的摘要信息,和DR與BDR的選舉(2-way狀態)包含一些字段:I初始爲、M後繼位、MS主從,發生在ExStart狀態、DC(用於按需鏈路上的do not age位)
3.LSR包:向鄰居請求特定的LSA。
4.LSU包:包含LSA。
5.LSAck:確認收到的LSA。(確認DBD和LSU兩種數據包。)
 
OSPF鄰接的條件:
1.區域ID
2.hello/dead time
3.認證類型
4.末節區域標記
5.物理直連(否則怎麼可能是鄰接的呢!!!)
 
OSPF數據庫同步
OSPF無論網絡類型都是使用組播地址發送更新的,只有在發送確認包的時候使用單播地址。(224.0.0.5allspfrouter,224.0.0.6alldrouter),不過有時候在非廣播網絡中我們使用neighber命令則使用的是單播,我們這裏講的是默認方式。
 
同步數據庫過程:
1.Down(失效狀態):鄰居會話的初始狀態,在一個RouterDeadInterval的時間內沒有收到來自鄰居的Hello包。
2.Init(初始狀態):當一臺路由器發送Hello包後其狀態變成Init狀態。注意這裏使用的是組播(224.0.0.5)發送Hello包,這是因爲在剛開始其鄰居表是空的,不可能以單播發送Hello包。當其鄰居路由器收到這個組播包後,就知道對方的IP地址了,然後以單播反饋hello包,然後就達到下一種過程w-way。
3.Two-Way(雙向通訊):收到鄰居發送的Hello包中看到自己的RID。(DR/BDR的選舉在這個階段,前提是需要選,在廣播 和NBMA網路中需要選。注意DR的概念是限於端口的,是一個多路訪問環境一個DR,DR是用過路由器的優先級選擇的(0~255,默認是1,0表示沒有資格被選舉爲DR,可在接口下通過:ip ospf priority修改,優先級相等再根據RID,都是越大越優先。))
4.ExStart(信息交換的初始狀態):路由器和其鄰居路由器建立主從關係(確定誰先發送DBD包)並確定DBD包的序列號。
5.Exchange(信息交換狀態):雙方交換DBD信息,並根據收到的DBD與本地鏈路狀態數據庫作比較然後形成LSR包。
6.Loading(信息加載狀態):向鄰居發送LSR請求最新的LSA鏈路狀態通告信息,此狀態雙方正在同步鏈路狀態數據庫。
7.Full(完全鄰接狀態):當鄰居路由器之間具有相同的LSDB時,就達到了完全鄰接狀態。
通過:debug ip ospf adj可以觀察到鄰接關係建立的過程。
 

鄰居是關係達到two-way的狀態,鄰接是關係達到full的狀態,鄰居關係只互發hello包,鄰接關係則發DBD,LSU,LSA這些

 
當路由器檢測到本地鏈路發生改變的時候的過程:
1.當R1檢測到鏈路發生變化的時候會發送LSU給DR,在MA網絡中洪泛任務交給DR來完成(BDR也記錄這些路由信息的變化,只是接下來不會再從自己的接口泛洪出去)。
2.然後同步完LSDB後再根據算法計算最短路徑樹形成路由。
以上R1與DR之間,DR與DRothers路由器之間是通過單播泛洪的。
 
OSPF常見的網絡類型:
1.point-to-point(點到點網絡):連接單獨的一對路由器到的。在點到點網絡上的有效鄰居總是可以形成鄰接關係,通過組播更新數據。
2.broadcast(廣播型網絡):比如在我們的以太網上,連接多臺路由器,選舉DR和BDR,通過兩種組播地址通信。
3.NBMA(非廣播多路訪問):比如幀中繼網絡中,可以連接多臺路由器,但是沒有廣播數據包的能力,一個NMBA網絡上路由器發送的數據包將不能被其他路由器收到,我們需要通過手工配置鄰居的方式解決。需要選舉DR和BDR。並且使用單播通信。
4.point-to-multipoint(點到多點):可以看做是一羣點到點鏈路的集合,不需要選舉DR和BDR,以單播方式通信。
5.virtual links(虛鏈路):通過單播傳送。
注意:點到點和廣播型網絡都被認爲是一種高速網絡(即通過組播更新的都是高速鏈路)。
 
傳送網絡:在傳送網絡中數據包僅僅是通過這個區域,,始發和目的網絡都不是這個區域。
末梢網絡:數據包的始發或目的地址屬於這個網絡。注意:loopback接口可以認爲是一種末梢網絡,並當做32位主機路由來通告。
 
OSPF RID:用於表示OSPF的路由器,通過show ip ospf來查看。
1.router-id手工配置。(不包含0.0.0.0和255.255.255.255)
2.最大的邏輯接口環回口IP。(如果在配置新的環回口之前已經起了OSPF進程,我們必須要clear ip ospf process,清一下進程,這個是爲了增加其穩定性,也就是DR是沒有搶佔模式的,即你在網絡中新增加一臺路由器,這臺路由器是不會搶佔DR的,我們知道DR,BDR的選舉發生在2-way狀態,不可能當加入一臺新的路由器的時候就重新再經過四個狀態,這樣即不穩定又消耗帶寬,沒必要。而在二層STP根橋是有搶佔模式的,因此我們配置了root-guard來防護跟被搶佔。)
OSPF的兩個穩定性:一個是RID不會搶佔,一個是DR選舉完之後不會搶佔。
3.最大的物理接口的IP地址。
注意:如果在不同區域內RID相同此時不影響鄰居關係的建立。
在同一區域內時,兩邊配置相同RID的路由器都能與中中間的路由器建立起鄰居關係,但相互之間建立不起來,並且相互學習不到對方的路由,並且中間的路由器不能同時存在兩邊路由器上的路由,會在兩者之間來回跳。
 
LSA Types
Type1-Router LSA:由每臺路由器產生,包含路由器的 直連鏈路的接口IP前綴和開銷,描述到達每臺路由的可達性,在其始發的區域內傳播。
Type2-Network LSA:由DR產生,描述 直連路由器RID和 直連網段的掩碼,表述到達DR或BDR的可達性,在其始發的區域內傳播。
Type3-Network Summary LSA:由ABR產生,用來通告本區域外的路由信息(包括前綴、掩碼、開銷),描述到達ABR的可達性,整個OSPF區域內。
Type4-ASBR Summary LSA:由ABR產生, 通告這臺ASBR的可達性(ASBR的RID),在整個OSPF區域內傳播。
Type5-AS External LSA:由ASBR產生,描述 到達自治系統外部的路由信息,在整個AS內泛洪(除了Stub,NSSA區域)。
Type7-NSSA External LSA:由NSSA區域內的ASBR產生,描述到達AS外部的路由,在NSSA區域內泛洪。
注意:NSSA External LSA其頭部有一個P-bit標誌,其置1的時候,會在NSSA區域的ABR路由器上將Type-7的LSA轉換爲Type-5的LSA然後擴散到其他區域。
而Stub區域內的路由器所發送的Hello包中會有一個E-bit,其置0,表示不接收外部任何置1的Hello包,也就無法與非Stub區域的路由器構成鄰接關係了。
瞭解的LSA:
Type6-MOSPF,用在組播OSPF中。
Type8-External Attribute LSA:外部屬性LSA,用在將BGP路由信息重發布到OSPF中攜帶AS-PATH屬性。
Type9-10-11-Opaque LSA:非透明LSA,用於OSPF擴展屬性的。
 
LSA的類型:
O, O IA, E1, E2;E2外部路由的Cost值都相同,E1會加上區域內的的COST。
我們一定要弄懂,COST值是以出接口計算的。無論RIP、EIGRP、OSPF都是這樣的。
 
OSPF鏈路狀態數據庫過載保護:在進程下設置:max-lsa 12000(允許接收lsa的最大條目)
如果超過最大數量則會報警: Maximum number of non self-generated LSA has been exceeded "ospf 1" - 2 LSAs,並且過一會兒會down掉鄰居關係。
 
OSPF的被動接口是:禁止發送或接收鏈路狀態更新。
有兩種方式:1.先passive-interface default所有端口,再反向開啓不被動的接口:no passive-interface s0/0
2.直接passive-interface掉所有要被動的接口。
這個passive接口的作用:比如路由器上的某個端口接的是交換機,我們爲了不讓OSPF向這個端口發送LSU的包,我們可以將其接口設置爲被動接口。有人說爲什麼之前不發佈這個接口不就好了。呵呵,如果我們不通告這個接口那麼OSPF的其他路由器就無法學習到這個網段,那麼根本就不會通了。注意我們不要再傳輸網上使用被動接口,否則OSPF的鄰居關係就會down掉,只能用在末節網絡。
 
OSPF防環機制:
AS內防環機制是通過SPF算法計算路由,從算法本身保證了不會生成環路。
AS間防環:通過區域劃分,非骨幹區域簡直的通訊只能靠骨幹區域通訊,區域之間的傳輸是矢量的,因此就會有區域間的水平分割。
 
虛鏈路:
如果非骨幹區域沒有與骨幹區域相連,或者區域0被隔開了或者不來連續,那麼就要用到虛鏈路把各區域的ABR連接起來。並且在虛鏈路上不會有hello包的產生,因爲其實一個虛擬隧道。
我們傾向使用RID建立虛鏈路,這樣更穩定:area n vitual-link router-id 
通過:show ip ospf vitual-links查看其狀態。看到:Adjacency State FULL(hello suppressed )
 
路由彙總:
1.隱藏網絡的不穩定性。
2.節約路由表體積,節約CPU資源,減少LSA在網絡上的洪泛。
區域間彙總:針對類型3LSA彙總(O IA);在ABR上彙總。
域間彙總:針對類型5LSA彙總(O E1、O E2);在ASBR上彙總。
執行了路由彙總的路由器會自動生成一條通往Null0接口的空路由,防止環路。這個 防環主要是在執行彙總路由的路由器上收到上游路由器發送給他的默認路由,那麼當某條明細路由down掉後就會匹配這條默認路由,至此就會形成路由環路。
區域間彙總:area n range 192.168.1.0 255.255.255.0 n指的明細路由所在的區域。
默認情況下使用area range命令施行路由彙總後,會自動產生一條指向空接口的null0路由,不過可以通過no discard-route不在它的路由表中加載這條路由。不過如果沒有自動創建,可以使用discard-route命令創建。
彙總路由會繼承所有明細路由中開銷最小值,如果最小開銷的路由down掉後,SPF算法會重新計算。OSPF在鏈路狀態變化(比如接口優先級、up/down、cost值)時會重新進行SPF計算。
環回口默認的開銷值爲1。
對於域外匯總其實在ASBR路由器上使用命令:summary-address 192.168.1.0 255.255.255.0
area range命令的缺省行爲是通告指定的範圍。它也可以用來抑制一個地址範圍的通告,使用關鍵字:not-advertise的命令area range將使指定範圍的前綴被抑制。
 
OSPF區域間路由過濾:
使用前綴列表挑選路由:
ip prefix-list LIST1 seq 10  deny 192.168.1.0/24
ip prefix-list LIST1 seq 20 permit 0.0.0.0/24 非允許即禁止。
router os 1
area n filter-list prefix LIST out|in 
 
 
OSPF的默認路由
對於OSPF域內去往AS外時,此時我們可以讓ASBR路由器向區域內宣告一條類型爲:O*E2的默認路由。當有多臺ASBR時,我們最好修改其通告默認路由的開銷,讓其他的條目做備份。
命令:default-information originate,不過前提是ASBR上必須有一條默認路由,如果沒有的話我們可以創建一條指向null0的默認路由:ip route 0.0.0.0 0.0.0.0 null0。不過我們可以通過命令 default-information originate always忽略這個規則。
 
OSPF特殊區域
Stub(末節)區域:拒絕接受類型5的LSA,同時也拒絕類似4的LSA,ABR路由器上會自動產生一條基於類型3的默認路由,用於引導Stub區域內的路由通往AS外部。
配置命令:區域內每臺路由器:area n stub,通過:area n default-cost 10用來改變所通告的默認路由的開銷值,默認爲1.這個當有多臺ABR路由器時,可以更改通告的默認路由cost值,其中一個主,另一個作爲備份ABR。
當末梢區域內存在多個ABR路由器時,但是因爲缺省路由的原因,區域內部路由器將不能確定那一臺路由器纔是到達ASBR最優網關。
 
Totally Stub(完全末節)區域:由於Stub區域傳輸類型5的LSA是通過ABR,而我們知道通往其他區域也是走ABR,那麼我們完全可以決絕類型3的區域間路由,此時會產生一條類型3的默認路由,這條默認路由引導區域內的路由訪問AS外部和area間。
配置命令:只需要在ABR上加上:area n stub no-summary(刪除類型3的LSA)
 
 
NSSA區域:假設一個區域內有ASBR,但是我們又想在區域內拒絕類型5的LSA,我們該如何做呢?此時引入類型7的LSA。即在NSSA區域內傳輸的是類型7的LSA(此時路由前綴標誌爲:O N2、1),並且類型7的LSA中有一個P-bit,當P-bit等於1的時候,在NSSA的ABR路由器上會將類型7的LSA轉換爲類型5的LSA,然後在AS內泛洪。注意:NSSA區域的ABR是不會向NSSA區域內的路由器產生默認路由的,不過在AS內只有一個ASBR的路由器時網絡是沒有問題的,當其他區域還有ASBR時,此時當類型5的LSA傳輸到NSSA區域的ABR時是無法將類型5的LSA轉換成類型7的。因此就造成了路由不可達的情況。此時我們需要在NSSA區域的ABR路由器上手動配置一條默認路由:area n nssa default-information-originate
配置命令所有路由器:area n nssa
Totally NSSA:拒絕類型3-4-5,引入類型7。
配置命令:只需要在NSSA的ABR上配置:area n nssa no-summary
 
路由條目(router entries)是到達ABR和ASBR路由器的路由。
可以通過:show ip ospf border-routers來查看。(注意觀察到的路由條目的目的地要麼是ABR、要麼是ASBR)
 
當一臺OSPF路由器檢查一個數據包的目的地址時,其最優選路的步驟:
1.選擇可以和目的地址最精確匹配的路由(擁有最長的地址掩碼的路由)。
2.然後根據區域內、區域間、E1、E2的有限順序進行選路。
3.默認條件思科路由器最多支持16條等價的路徑上實現負載均衡。可以通過maximum-paths來改變。
 
按需電路上的OSPF
我們知道OSPF每隔10s發送一次Hello數據包,並且每隔30min刷新一次LSA。這些功能用來維護鄰接關係,以確保鏈路狀態數據庫的精確。不過在按需鏈路上:LSA的可選字段發生了變化,沒有周期性的Hello數據包交換,並且設置了DoNotAge位,因此在所有的LSA中增加了一個新的標識Demand Circuit位(DC-bit),使用命令:ip ospf flood-reduction命令。
 
OSPF認證
0:不認證
1:明文認證
2.:MD5認證
基於鄰居認證都是在接口上進行的:ip ospf authentication-key ***** 然後在接口上啓用:ip ospf authentication。
基於md5的:ip ospf message-digest-key 1 md5 ***** 應用:ip ospf authentication message-digest。
基於區域明文:ip ospf authentication-key ***** 進程下應用:area n authentication。
基於區域md5:ip ospf message-digest-key 1 md5 **** 應用:area n authentication message-digest。
虛鏈路明文認證:area 1 virtual-link **** authentication-key uestc 應用:area 1 virtual-link **** authentication。
虛鏈路md5認證:area 1 virtual-link **** message-digest-key 1 md5 uestc 應用:area 1 virtual-link **** authentication message-digest。 
 
在OSPF認證中有一個加密序列號:這是一個不會減小的數字,用來防止重現攻擊(replay attacks)。
重放攻擊:是指攻擊者發送一個目的主機已接收過的包,來達到欺騙系統的目的,主要用於身份認證過程,破壞認證的正確性。這樣就不難理解爲什麼要有一個不斷變化的序列號,並且加密序列號,讓攻擊者無法準確查找到序列號增長的規律。
 
OSPF和輔助地址
在OSPF環境中,輔助地址的用法:
1.只有在主網絡或子網也運行OSPF協議的時候,OSPF纔會通告一個輔助的網絡或子網。
2.OSPF將把輔助地址看作是末梢網絡(這些網絡上沒有OSPF鄰居),從而不會再這些網絡上發送Hello數據包。在輔助地址上也就無法建立鄰接關係。
在TCP/IP路由技術卷一上,DNS服務器所配置的默認網關爲一臺配置了輔助地址的路由器上,而輔助地址與路由器與其他路由器無法建立鄰居關係,所有造成DNS回包失敗,我們的做法是:在這臺路由器上配置一條指向OSPF主網絡的默認路由。
 
輔助地址:也就是ip address *.*.*.* secondary
作用:在同一端口中可以設置兩個以上的不同網段的IP地址,這樣可以實現連接在同一局域網上的不同網段之間的通信。一般來說一個網段對於用戶來說不夠用,可以採取這種辦法。同時必須在端口下開啓ip redirect。因爲Cisco路由器不允許從同一端口進來的IP包又送回到源端口,ip redirect表示允許在同一端進入路由器的IP包再從源端口出去。
 
注意配置了輔助地址的OSPF路由器,與另一臺僅配輔助地址的路由器相連,此時這臺路由器不能稱爲ASBR,因爲其並沒有接收外部路由,我們在這臺路由器上運行其他協議,比如rip,然後再將rip重分佈到OSPF中,這樣就能夠接收外部路由成爲一臺ASBR路由器了。
總結:在概念上理解,不能只背,他媽的有什麼用。
 
tunnel接口是一個虛擬接口,提供點對點的傳輸模式,因此每一個單獨的線路都必須設置一個Tunnel口。
 

BGP

BGP分爲三張表

 

鄰居表:記錄BGP對等體信息。

BGP表:記錄到達目標網絡的所有路徑信息,以及到達目標的屬性。
路由表:到達目標網絡的最佳路由。
 
建立BGP對等體關係的步驟:
1.IDLE空閒狀態。
其中有個重試連接時間(ConnectRetry,初次爲60s,以後每多一次IDLE狀態就會翻倍,以指數增加。)
2.Connect
3.Active(激活狀態):進行TCP三次握手
4.Open Sent
5.Open Confirm3和4主要進行BGP連接。
6.ESTABLISHED完成BGP對等體建立過程。
 
BGP消息類型:
Open:簡歷BGP連接
Keepalive:鄰居關係的維持,主要是維持TCP的會話(60s發送一次,180s的死亡時間)
Update:包含路徑、屬性
Notification:BGP通知,即發生錯誤時會發送Notification,一旦發送Notification,BGP鄰居關係就會立即切斷。

Path Attributes
我們發現在BGP Update消息中的NLRI中,關於路由的信息只包含(前綴和長度),大部分都是路徑屬性。
Well-Known Mandatory
AS_PATH
描述路由所有經過的自制系統,倒序排列:以最近的AS開始,以發起者的AS結尾。BGP用AS-Sequence有序的AS_PATH序列進行選路,以AS_SET無序AS號進行自制系統間防環。
Next_Hop
如果宣告路由器與接受路由器在不同一AS內,那麼下一跳就是宣告路由器的接口IP。
如果宣告路由器與接收路由器在同一AS內,且NLRI指明的地址也在同一AS內,那麼下一跳就是宣告路由的鄰居的IP地址。
如果宣告路由器與接收路由器在同一AS內,但NLRI指明的地址不在同一AS內,那麼下一跳外部對等體的IP。
我們常常通過nei **** next-hop-self下一跳自身改變下一跳,來解決下一跳不可達的問題。
ORIGIN
知名路由更新消息的來源;IGP(從IGP中的Network命令學到0);EGP1;Incomplete3(路由來源的信息不完整,比如通過redistribute重發布進來的)
Well-Known Discretionary
Local_PREF
默認爲100,不會傳遞給其他AS,但會iBGP關係之間進行傳播,如果一臺運行iBGP的路由器收到到一個目的多條路徑,就會比較Local_PREF屬性,選擇Local_PREF值最高的。這個是影響離開AS的數據流量。
Atomic_Aggregate
用來警告下游路由器出現了路徑信息丟失。發生在聚合路由器上。
Optional Transitive
Aggregator
當設置Atomic_Aggregate屬性後,也可以附加Aggregator屬性,用來附加聚合路由之前的AS號。
Community
Internet默認
NO_EXPORT該路由不能傳遞到eBGP對等體,如果配置了聯盟,該路由不能再聯盟外公佈。
NO_ADVERTISE接受者不能公佈給任意的BGP對等體。
Local_AS不能傳遞到eBGP對等體,也不能傳遞給聯盟內的其他聯盟子AS。
Optional Nontransitive
MED
影響進入AS的流量,MED值被認爲是一種度量,越低越優先。
注意:默認只有兩條路徑來自與同一AS時,才進行MED比較(即有多條路徑時當第一個AS號相同採取比較MED值)。不過我們可以通過命令:bgp always-compire-med命令去比較多有路徑。
Originator_ID
路由產生者的RID,它是由第一個RR創建,是一種防環機制。
Cluster List
路由反射器的簇ID,由路由反射器產生,每一個RR將會有一個簇ID。這個有點類似於AS-PATH屬性,也是將新的Cluster ID加到Cluster List中。用於簇間防環。
 
Weight
思科特有的,用於本地路由器多出口選路,本地產生的默認爲32768,從對等體學習到的其他爲0。與本地優先級有點像。
 
BGP的防環機制
iBGP防環:通過iBGP對等體學到的BGP更新將不能傳輸給任意的iBGP鄰居,即iBGP更新只傳一條。
eBGP放緩:通過AS_PATH中的AS_SET屬性進行防環,即當運行BGP的路由器在接收到來自外部對等體的一條路由中發現自己的AS號,此時就會忽略該路由。
 
iBGP的全互聯
這個用於解決iBGP防環機制,也就是iBGP的水平分割的一種方法,一般採用邏輯的Full-Mesh。我們知道BGP是建立在TCP179端口上的,我們如何保證TCP正確建立呢,這裏只要雙方能夠ping通即可,這點我們可以運行IGP協議即可。尤其是在發生路由聚合後,會加入AS-SET以防止路由環路。但是這個問題是降低了路由的穩定性。
 
路由抑制
路由擺動(Route Flap)是Internet不穩定的主要因素,當一條有效路由被宣告爲無效,然後又被宣告爲有效,此時我們會給變化的路由一個懲罰值,即路由擺動得越多,其懲罰值累加,然後懲罰值會自動降低,我們在此設置一個半衰期,如果懲罰值超過抑制門限,那麼就不會對外宣告該路由,當懲罰值降低到重用門限後,纔會解除該路由的抑制,不過抑制時間會有一個上限,叫做最大抑制時間--60分鐘,這個時間一般設置爲半衰期的4倍。我們可以通過:bgp dampening來更改。
 
BGP選路原則
1.Weight
2.Local_PREF
3.本地產生的(下一跳爲0.0.0.0)
4.AS_PATH
5.ORIGIN
6.MED
7.AD(eBGP20優先於iBGP200)
8.iBGP的metric最小
9.以上原則都相等的話,如果開啓了maxmimu-path (2-16),就進行負載均衡。
10.eBGP計時器最大
11.鄰居RID最小
12.具有最短的Cluster_LIST
13.鄰居IP最小
 
BGP同步
從iBGP對等體學到的eBGP更新不會去用也不會去宣告給eBGP對等體,除非自己在IGP中也學到相同的路由。
這個主要是防止路由黑洞的問題。不過我們一般都要關閉這個同步規則。
什麼情況下BGP會把路由信息放入路由表中呢?那就是下一跳可達。這裏面試的時候可以畫一個拓撲解釋,此時就要用到充分發:將BGP充分發到IGP,不過這個牽涉到BGP路由條目過大,並且會丟失BGP相應的屬性,即使採用充分發也只是充分發直連路由。我們目前都將同步關掉,然後採用iBGP的邏輯Full-Mesh來解決這個問題。
 
上面張圖很重要,注意控制層面是以段建立的,其源目IP是不停變化的,而對於數據層面其數據包中的源目IP是不變化的,當到達沒有運行BGP的路由器D時,就無法找到目標到IP的路由。只能在運行兩個協議的B和E之間進行IGP域BGP的交換(在沒有進行重發布情況下)。我們做法是:
1.物理Full-Mesh(所有路由器都運行BGP)
2.邏輯Full-Mesh
3.重發布
 
管理大型BGP對等體關係
1.對等體組
用一個名字和一系列的路由策略來定義一個對等體組,同樣的屬性會設置在更新消息中傳給幾個對端。
把一些具有相同配置的路由器華爲一個組,這樣對這個組進行操作,就相當於對每個成員進行操作了。
命令:nei ccnp remots-as 20  ;  nei **** peer-group ccnp
 
2.社團
四個屬性:默認情況下定義的社團屬性不會傳遞,我們可以通過:nei *.*.*.* send-community向鄰居發送。
no_export:不會傳到ebgp對等體,但是如果配置了聯盟,那麼會傳輸給聯盟子AS。
no_advertise:配置了這個屬性的路由不會傳出任意的bgp對等體。
local_as:這個不會傳給ebgp對等體,如果配置了聯盟,也不會傳給聯盟內的子as。
internet:路由的默認屬性,此屬性表示此路由可以無限制的傳輸。
在描述BGP團體中,使用AA:NN的新格式,而思科默認使用久格式:NN:AA,我們可以在所有路由器上使用命令:ip bgp-community new-format來支持新格式,此時使用:set community 來打上社團名稱。
 
3.路由反射器
先找到要作爲路由反射器的路由器,然後在RR上分別對每個鄰居做:nei **** route-reflector-client,將鄰居路由器作爲路由反射器的客戶端。然後每個客戶端與RR建立BGP鄰居即可。
路由反射器的原則:除了非客戶端不能夠反射給客戶端外,其他形式任意兩種都可以互相傳遞。
路由反射器經對等體的數目從n(n-1)/2減少到n-1條,路由反射器和它的客戶合稱一個簇
注意路由反射器反射的原則:1.從非客戶端學到的iBGP對等體學習到的,只將它反射給客戶。2.從客戶學習到的可以傳輸給客戶和所有的非客戶。3.從ebgp對等體學到了,可以反射給所有的客戶和非客戶。
路由反射器內部的放緩靠的是,Originator_ID和Cluster_LIST
Originator_ID:這個是本AS內路由發起者的RID。路由反射器不會將一條路由公佈給路由的發起者,TT不會將一條路由公佈給路由的發起者。不過即使發起者收到一個帶它自己的RID的更新消息,它也不理睬該消息。
而一個AS內的沒一個簇必須用一個唯一的4字節簇ID來標識。如果簇內只有一個路由反射器,那麼簇ID就是路由反射器的RID,如果簇內包含多個路由反射器,必須給每個RR配置一個簇ID.
 
4.聯盟
可以將一個大AS劃分陳成會員自治系統
聯盟內的選路規則:到聯盟的外部eBGP路由優先到自制系統成員的eBGP,然後又優先於ibgp,而Next_Hop、MED、Local_PREF屬性也可以傳遞。
 
路由過濾
使用AS_PATH實現AS的過濾。
命令:ip as-path access-list n deny regexp
在進站或出站過濾:nei **** filter-list as-path-filter in|out
使用filter-list調用as-path acl,實現基於AS編號的過濾。
 
使用route-map實現流量的過濾
route-map name permit|deny sequence
match ip add ***
set ***
然後基於接口調用:nei **** route-map XX out|in
 
使用前綴列表代替acl來實現更爲精確的匹配:
ip prefix-list ** seq 5 permit|deny 192.168.1.0/24
 
我們使用aggregate-address 192.168.1.0 255.255.255.0去發佈聚合路由,然後使用關鍵字:suppress-map MAP 抑制發佈聚合路路由後中再去發佈該條明細路由條目。
這裏具體做法是:使用suppress-map調用route-map,然後在route-map下去match一個acl或者去match一個prefix-list,然後在acl中寫入要被抑制的明細路由。
 
而在默認情況下BGP發佈聚合路由的時候也同時也會發布明細路由,此時我們可以通過添加關鍵字summary-only僅發佈聚合路由。
 
還可以通過attribute-map來改變聚合路由的屬性,比如從ospf重發布進BGP,其屬性爲Incmplete,我們可以通過Attribute-map將其屬性更改爲igp。命令:aggregate-map **** attribute-map ORIGIN
route-map ORIGIN
match ip address *
set origin igp
 
我們可以通過在aggregate-map後面的as-set關鍵字給聚合路由加上無需的as號,這樣可以恢復聚合路由的環路檢測功能。
 
advertise-map抑制聚合路由繼承某條明細路由的屬性。
 
bgp小知識:
通過:bgp bestpath as-path ignore選路不考慮as-path長度,這樣是與其他廠商兼容。
通過:nei maximum-prefix來限制從鄰居收到前綴的數量:nei **** maximum-prefix 300 90 warning-only(超過最大300條目的90%時發佈警告信息,當超過300後則donw掉鄰居關係。)
通過:neighbor shutdown中斷對端連接,但是不刪掉配置。
timer bgp設置計時器,默認60s的keepalive和180s的保持時間。
 
BGP後門路由
 
我們可以讓AS50與AS75之間的某些關鍵業務走RIP這個後門鏈路,比如我們讓AS50中的172.17.0.0和AS75的172.18.0.0之間的通信走RIP鏈路,然後讓NAP鏈路充當備份鏈路。這裏問題是AD的限制,會優先選擇eBGP。可以通過network命令在BGP下宣告各自的學習到對方被設置爲後門路由的BGP路由,於是就將eBGP路由轉化爲iBGP路由,這樣RIP的AD就小於了iBGP,此時位於這兩個網段的通信就會走後門路由。不過這裏會有一個問題,AS75會eBGP發佈該路由,這樣的話在AS100和AS200的路由想要訪問172.17.0.0網段的時候也會先發布到AS75然後走後門路由,因爲在選路的時候會根據第5個ORIGIN屬性選路,從AS50發過來的爲Incomplete,從AS75發過來的爲IGP。我們如何解決這個問題呢?這裏我們引入了後門路由,分別在AS50和AS75內發佈從對方學習到的後門路由:network 172.18.0.0 backdoor。network backdoor的作用於network效果一樣,都是將eBGP路由看作iBGP,修改AD爲200,只是backdoor路由不會向eBGP宣告這條後門路由罷了。
 
BGP的過濾路由,我們使用neighbor *.*.*.* distribute-list 1 out 調用acl。
我們再去配置acl:access-list 1 deny 具體路由,然後access-list 1 permit any 允許所有沒deny的路由。
 
我們可以使用neighbor next-hop-self命令而不用考慮向一個iBGP對端公佈一條eBGP路由,該路由的下一跳地址不能改變的原則。
 
BGP檢測到故障的IBGP連接並且將它倒換到另一條鏈路上時間很可能超過180s,通過timer bgp來改變bgp的keepalive和保持時間。比如我們將keepalive時間設置爲3s,然後保持時間設置爲9s。就使用下列命令:
timer bgp 3 9
 
eBGP讀條問題,我們知道eBGP的TTL值爲1,我們建立eBGP鄰居關係時是指接口IP,如果我們想以RID建立eBGP關係時,我們的做法是修改eBGP通過路由的TTL,即:neighbor *.*.*.* update-source loopback 0
然後修改跳數:neighbor *.*.*.* ebgp-multihop 2
 
使用聚合路由的方法是:aggregate-address命令:注意aggregate-address名列後面的選項。
有:summary-only:這個選項是聚合路由器只宣告聚合後的路由。默認情況下bgp聚合路由器會宣告聚合後的路由和明細路由。
 
還有社團屬性我們是通過route-map(路由映射來完成的)
比如:
route-map COMMUNITY permit 10
match ip address perfix-list AGGREGATE
set community no-export | local-as | no-advertise
通過acl或者prefix-list去挑選出指定路由。
 
我們還可以抑制聚合路由的一個子網,我們可以通過suppress-map選項
比如:
aggresss-address *.*.*.* 255.255.255.0 suppress-map SUPPRESS調用route-map
route-map SUPPRESS permit 10
match ip address 1
acl或者是prefix-list
 
改變聚合的屬性:attribute-map選項:
例如:
aggregate-address *.*.*.* 255.255.255.0 attribute-map ORIGIN調用route-map
route-map ORIGIN permit 10
match ip address 2
set origin incomplete 將起源屬性改爲重發布的incomplete。
 
我們知道聚合的AS-PATH只包含發起該聚合路由的AS號。在聚合路由中設置ATOMIC-Aggregate和Aggregator則是用於通告丟失的具體信息。但是如果來自聚合路由AS內的一條明細路由失效,那麼就會去匹配這條聚合路由,然後傳輸先去,然後路由器在查找路由表,發現沒有該條路由,然後纔去丟失。到一個無效目的地的數據包在被丟失之前是,沒有必要經過兩個路由器轉發。我們除了公佈as-path屬性中的as-Sequence之外,還可以在aggregate-address命令中加入as-set關鍵字,來解決這個問題,其唯一的作用是:恢復被聚合路由丟失掉的環路檢測功能,AS-PATH的作用是:恢復被聚路由丟失掉的環路檢測功能。
 
aggregate-address最後一個選項是:advertise-map。advertise-map選項指向一個名爲ALLOW_Route的路由圖,該路由圖標識構成聚合路由基礎的更具體路由。
 
我們也可以讓BGP選路時忽略AS-PATH長度,命令爲:bgp bestpath as-path ignore來通知Cisco路由器在路由選路的中忽略AS-PATH的長度。
 
我們也可以限制從鄰居接收的最大前綴的數量:
neighbor *.*.*.* maximum-prefix 300 90 warning-only
這個作用是:當從鄰居收到最大前綴數據的90%時就會產生一個日誌消息。當超過最大限制300時就會在超時後down掉鄰居關係。
 
我們可以通過clear ip bgp +路由。然後通過clear ip bgp *(shell正則)清理所有的BGP連接。
還可以不down掉鄰居關係,直接觸發到該鄰居的更新信息:clear ip bgp * soft out(軟清)
當改變的策略影響到入業務量時,我們可以使用入站軟重新配置。:nei *.*.*.* soft-reconfiguration inbound命令,然後對業務量收到新策略影響的每一個鄰居使用clear ip bgp soft in命令。
 
通過AS_PATH過濾路由
做法是:ip as-path access-list 命令定義了訪問列表的一個變量,該變量用來定義AS號。
這裏as-path使用的是正則表達式(regular expressions)
如下常用到的過濾as-path語句:
只公佈到自己AS內部的路由:ip as-path access-list 1 permit ^$
拒絕任何在AS50包括AS50的更新消息:ip as-path access-list 1 deny _50_
結尾默認拒絕使用。允許所有:ip as-path access-list 1 permit .*
僅接收來來自AS50的路由:ip as-path access-list 1 permit ^50$
 
然後在bgp進程下去調用route-map:nei *.*.*.* route-map MAP out
然後寫route-map:
route-map MAP permit 10
match as-path 1 調用as-path列表。
 
本地的優先級:local_pref。默認所有公佈給ibgp對等體的路由都是100。可以通過ip default local-preference命令來更改缺省值。也可以通過set local-preference命令來改變獨獨立路由的Local_Pref
用法:
在路由進入方向打上這個屬性:
nei *.*.*.* route-map PREF in
route-map PREF permit 10
match as-path 2
set local-preference 200
ip as-path access-list _50$ 表示起源於AS50的路由
 
MED值,影響相鄰AS內的路由決定。這個是在路由出接口打上這個屬性。
MED值,作爲一種度量(metri),越低越優先。
同樣在route-map下調用acl或者prefix-list,然後打上相應的屬性:set metric 200
注意:默認情況下只比較到達同一AS內相同目的地的多條路徑,我們也可以通過命令:bgp always-compare-med來比較來自不同AS的多條路徑的MED值。
這裏還有另外一個命令:set metric-type internal,這個可以將MED值設置爲與到同一目的地的IGP路由相同的度量,這樣可以避免次優化路由的問題。
 
附件as-path:
可以使用set as-path prepend命令修改它公佈路由的as_path屬性。
例如:
nei *.*.*.* route-map PATH out
route-map PATH permit 10
match ip address 10
set as-path prepend 30 30
注意:我們一般打prepending多選的as號都是通告路由器所在as的as號,一般不要隨便寫,有可能與以後所用到的衝突,那樣的話衝突AS將不會接受該路由。
 
Cisco NAT
思科NAT有四種地址:
1.內部本地
2.內部全局
3.外部全局
4.外部本地
 
查看NAT映射表:show ip nat translations(翻譯超時時間爲86400s,1hour)
但是爲了能從外部訪問,比如:郵件、Web、FTP服務器,我們必須使用靜態映射了。
 
將一個大地址多路複用到一個小型地址池的問題,即允許多個地址映射位一個地址,Cisco把這個功能稱之爲端口地址翻譯(PAT),我們有時候也將其稱之爲端口重載。
 
NAT的問題:
1.經過NAT轉化後,IP包頭的校驗和要進行重新計算。
2.分段。我們知道IP數據包超過MTU會進行分片,而端口號等四層信息僅在IP的第一個分片,如果分片後的某個片段在第一個分片之前到達NAT,那麼NAT只有先暫時緩存這個片段然後等第一個分片到後才能處理後續分片。
3.加密,NAT能夠改變IP地址信息,但是當數據經過加密後NAT就無法查看到這部分數據了,因此如果要執行NAT那麼IP地址信息和任何基於IP地址信息(如TCP校驗和,因爲存在僞首部)獲得的信息都不能被加密。例如IPSec穿越NAT設備時,這個必須將NAT放在安全一側,而不能放在加密的路徑上。
4.安全,雖然採用NAT技術隱藏了對外隱藏了內部網絡的細節,但是NAT並不會採取任何措施去防範DOS攻擊。
 
FTP基礎
FTP服務主要用來傳輸文件,而與HTTP傳輸文件不同,FTP不具有多媒體瀏覽的功能。
FTP協議有兩種工作方式:PORT方式(主動式)和PASV方式(被動式)。
PORT(主動):客戶端(大於1024端口)向服務器的FTP控制端口(21)發送連接請求,服務器接收連接,建立一條命令鏈路。當需要傳送數據時,服務器從數據端口(20)向客戶端的空閒端口(大於1024端口)發送連接請求,建立一條數據鏈路來傳送數據。
PASV(被動):客戶端(大於1024的端口)向服務器的FTP端口(21)發送連接請求,服務器接收連接,建立一條數據鏈路。當需要傳送數據時,客戶端(大於1024端口)向服務器的空閒端口(大於1024端口)發送連接請求,建立一條數據鏈路來傳輸數據。
 
主動與被動優缺點:
主動FTP對FTP服務器的管理有利,但對客戶端的管理不利。因爲FTP服務器企圖與客戶端的高位隨機端口建立連接,而這個端口很有可能被客戶端的防火牆阻塞掉;被動FTP對FTP客戶端的管理有利,但對於服務器端的管理不利。因爲客戶端要與服務器端建立兩個連接,其中一個連接一個高位隨機端口,而這個端口很可能被服務器端的防火牆阻塞掉。
IE瀏覽器默認是主動(PORT)模式,爲了防火牆的兼容性(還有一個是爲了DSL調制解調器的兼容),我們可以在高級中選擇使用被動FTP模式。
 
SMTP,簡單郵件管理協議,一般包含域名,而不是IP地址。不過,它請求郵件傳送時,可以用IP地址而不用域名。因此Cisco NAT檢查SMTP消息中相應的參數,當發現IP地址時就進行翻譯。
SMTP協議用於上傳郵件和在服務器間傳送郵件,與之不同,郵局協議(POP)與Internet消息訪問協議(IMAP)僅用於從郵件服務器上下載郵件到客戶端。並且這兩個協議在消息實體中都只用主機名,而不用IP地址,因此這些協議經過NAT時不需要進行特別的檢查。
 
SNMP,簡單網絡管理協議,採用MIB(消息信息庫)來對各式各樣的網絡設備進行管理。除了標準的MIB外,還有個廠商的設備創建自己專有的MIB。
 

交換知識點

VLAN
MAC地址表存放的內容:MAC、PORT、端口所處的VLAN。
當交換機收到 目標MAC爲廣播、 未知的單播幀時都會在所有接口廣播該幀。
上面這個原因也是我們要劃分廣播的一個主要原因: 隔離廣播域,限制廣播、組播傳播的範圍;提高了安全性,一旦一臺PC中毒可以限制在一個VLAN中;便於管理
我們在劃分VLAN的時候最好每個VLAN都劃分到不同的子網當中。這個主要是方便跨VLAN訪問。
 
VLAN的實施
端到端VLAN: 指在不同的交換機上配置相同的VLAN,VLAN的劃分不依賴於物理位置。如果兩各用戶位於不同交換機上的相同VLAN,此時則需要打標記。這個主要是適合8/2的流量,即大部分流量都在內網,此時爲了提高效率,內網流量可以不同經過核心層的幫忙,直接由底層負責轉發。
本地VLAN:即指本臺交換機上的VLAN,本臺交換機上的VLAN之間的通訊不需要打標記,只需要三層交換或者單臂路由。
VLAN一種是基於端口的靜態VLAN、另一種是基於MAC的動態VLAN(VLAN與MAC綁定) 
配置vlan:int vlan 10 name sys
然後將相應的接口加入到VLAN中:switchport access vlan 10 ; switchport mode access
 
對於動態VLAN,則需要用到VMPS(VLAN Management Policy Server)管理策略服務器。這個是通過VLAN Query Protocol(VQP報文進行傳輸的)
 
查看MAC地址表或者CAM表:show mac-address aging-time
默認MAC地址表老化時間爲 5min,不過當我們把網線拔掉後該條目則立即被刪除。
可以通過命令修改:mac-address-table aging-time 100 (vlan n,也可針對VLAN該。)
VLAN總數爲4096個,默認都在VLAN1,我們可以手工分配的2-1001,1002-1005保留用,1006-4095擴展。創建擴展VLAN的要求:1.型號必須支持。2.vtp模式爲transparent。
 
對於access端口我們可以使用命令:switchport mode access將端口設置爲access,同時開啓PortFast特性,並且禁用EtherChannel特性。
 
Trunk
默認情況下交換機之間的鏈路僅能傳輸vlan1的信息,因此必須在交換機之間做trunk鏈路。
封裝和模式
封裝分爲兩種:1.802.1Q,2.ISL
我們知道在二層一臺網幀中是沒有標示VLAN信息的字段的,因此我們需要在以太網二層幀上做一些動作,ISL是封裝一個新的二層頭部,最多支持1024個VLAN;802.1Q是插入Tag,最多支持4096個VLAN
當採用這兩種形式封裝的話,接口MTU必須大於1500,我們稱之爲小巨幀。
 
Trunk模式
DTP幀:交換機的接口週期發送Dynamic Trunk Protocol,主要主動協商爲trunk。
access:忽略DTP幀。
trunk:發送和響應DTP
desirable:主動發送和響應DTP(默認)
auto:不發送但相應DTP。
nonegotiate:不發送DTP幀,也不接收。一般和trunk合用,比如在交換機之間我們必須要其trunk,我們可以不讓接口發送DTP消息以節省鏈路帶寬,一般都是將這兩個命令一起使用。
 
如果在沒有啓用802.1Q的設備或者access端口收到一個802.1Q幀,那麼標記的數據會被忽略,而數據包則會作爲以太網幀被交給二層。
 
一般我們在起trunk的交換機的接收上使用以下命令: 
switchport trunk encapsulation dot1q
switchport mode trunk
switchport nonegotatie
switchport trunk allowed vlan 1,5,11,100-1000
switchport trunk native vlan 1
 
Native VLAN(本徵vlan,802.1Q存在的,不打標籤,默認VLAN1)
一條鏈路兩邊trunk接口的vlan必須一致,否則會有CDP-4-NATIVE-MISMATCH報錯信息。
 
802.1Q Tunneling(雙重Tag)
比如對於運行商提供的是一個二層網絡,同一臺交換服務與兩個公司,但是這兩個公司所處的VLAN有重疊。
我們的做法就是在運行商的交換機上將不同公司劃分到不同的大VLAN中,這樣公司內的數據幀在經過運行商提供的交換機傳輸的時候就被打上了二層標籤。
外層tag與內存tag沒有關係。
命令:首先在接公司的交換機的接口上劃分大vlan:switchport access vlan 30
然後:switchport mode dot1q-tunnel即可。
 
VTP
Server
Clinet
Transparent
VTP的Server和Clinet同步vlan信息的時候都是根據Revision(修訂號)學習的,無論是Server還是Client,只要誰的修訂號大,就會學習對方的VLAN信息。注意Revision號指的是變動數,只要增加刪除修改一項,這個修訂號就會增加1。
 
VTP修剪技術會使用VLAN通告消息來判斷Trunk連接何時正在擴散不必要的流量。VTP修剪可以將泛洪的流量限制在恰好的範圍內,可以提高鏈路可用的帶寬。這個可以通過vtp pruning來啓用。
 
p-vlan(私用vlan):隔離同一VLAN中處於同一IP子網內終端設備間的通信,
 
EtherChannel
PAgp(端口聚集協議)和LACP(鏈路聚集協議)
PAgP模式:(端口之間發送PAgP數據包進行協商,這點類似於VLAN的DTP)
auto 我們建議使用on模式,來禁止發送PAgP的數據包,以此來減少鏈路上不必要的流量。
on
desirable
non-silent
 
LACP模式:
Passive
Active
on
 
EtherChannel負載分擔選項:
使用port-channel load-balance ?來進行選擇。
比如二層交換默認採用src-mac。而三層端口默認採用soc-dst-ip
 
VLAN間路由
能夠提供VLAN間路由選擇的功能:
1.三層交換;2.單臂路由;
單臂路由:
如果一臺交換機支持多個VLAN,但是沒有三層功能,那麼其必須靠一臺外部路由設備來實現這個功能。
某些交換機使用的是三層模塊,有的則是使用技能路由功能。
做法是:通過一條802.1Q Trunk鏈路與臺路由器相連,並且路由器接口被劃分爲多個邏輯子接口,每個子接口用於一個VLAN。
缺點:路由器存在單點故障;2.Trunk鏈路容易造成擁塞。3.過大的交換延遲(主要存在與路由器)
 
通過三層交換
在默認情況下,交換機會爲默認VLAN(VLAN1)創建一個SVI接口,以放行遠程交換機的管理連接。做法是:創建一個VLAN接口,爲每個VLAN的SVI接口分配一個IP地址,然後將其作爲VLAN內主機的默認網關,用來對這個VLAN的流量進行路由。
有點是速度遠遠快於單臂路由,並且不需要額外的路由器
我們給每個SVI接口都配置上IP地址,注意所有交換機上的VLAN配置必須相等,及時某臺交換機上沒有相應vlan也要配置SVI接口並配上IP地址,這個爲了實施動態協議,然後其他vlan內的主機能夠訪問。然後運行動態協議:rip、ospf都可以,然後在交換機之間的鏈路上起trunk,這樣不同vlan間的數據就會通過trunk鏈路達到另外一臺交換機上。
 
STP(生成樹)
STP提供二層冗餘鏈路,消除了由於單點故障所引起的網絡問題。
 
STP的種類:
CST(公共生成樹):所有VLAN公用一個802.1D的生成樹。
RSTP(快速生成樹,802.1w),思科交換機默認模式。
MST(多生成樹,802.1s)
PVST+(每VLAN一個生成樹)
PVRST+(每VLAN一個快速生成樹),思科交換機默認模式的增強版本。
 
STP計算步驟(越小越優先)
1.選舉根橋: 比較BID(網橋優先級(默認32768)和網橋基MAC組成),這個我們可以通過命令手工指定根橋:spanning-tree vlan 1 primary,其實這個是就是將交換機優先級改爲8192
2.選舉跟端口:非根橋上到達根橋最近的端口即cost值最小的端口。
目前計算的標準是:10M的是100;100M是19;1000M是4;10000M是2。
如果有多個端口路徑開銷相同:就會比較上級交換機的端口ID(端口優先級(128)和MAC地址)
3.選舉指定端口:根橋上的所有端口都是DP,一條鏈路有且只能有一個DP。
先根據所在網橋的跟端口到達根橋的cost值,越小越優先,然後再根據上級交換機的端口ID(優先級+MAC),上級指的是由該端口出發的上級交換機。
 
STP端口狀態:
1.Blocking(阻塞):20s 此狀態不會參數數據幀的轉發,不會發送BPDU,但會接收BPDU來判斷根橋的位置。如果在20s內沒有收到BPDU,那麼就會進入偵聽狀態。
2.Listening(偵聽):15s 已通過接收BPDU判斷出要參與數據幀轉發,於是開始發送BPDU,這個狀態是交換機啓動後的默認端口狀態,因爲此時他認爲網絡中只有自己一個交換機。如果處於偵聽狀態的交換機發現本端口在新的生成樹中不應該由此端口轉發,會再次回到阻塞狀態。
3.Learning(學習):15s 開始學習MAC地址表。
4.Forwarding(轉發):收發數據幀和BPDU。
5.Disabled(禁用):不會參與生成樹的計算。
交換機上一個原來被阻塞掉的端口由於在最大老化時間內沒有收到BPDU,從阻塞狀態轉變爲偵聽狀態,然後經過15s後變爲學習,再經過15s進入轉發狀態。
當二層拓撲發生變化,新的配置消息要經過一定時延才能傳播到整個網絡,這個時延被稱爲轉發延遲(Forward Delay),默認爲15s。
 
RSTP端口角色:
Discarding(丟棄)
Learning(學習)
Forwarding(轉發)
RSTP多了一下端口:
Alternate(替代端口):用來替代去往根橋的端口(跟端口),跟端口宕掉後將從替代端口到跟端口。
Backup(備份端口):用來對指定端口備份。這個是交換機的
 
注意:!!!
一個交換機開機狀態下端口角色是 從偵聽狀態開始的,即通過15s的偵聽和15s的學習, 總共30s狀態到轉發。前提是拋出開機自檢,從端口啓動過程開始計算。
 
STP拓撲變化泛洪過程:
1.拓撲發生變化的交換機向跟橋方向發生TC位置位的BPDU(TCN)。
2.上級交換機收到TCN後,返回TCA確認收到的TCN,直到根橋收到。
3.根橋產生新的BPDU向下傳播泛洪。
 
STP的優化
PortFast
當我們在端口啓用PortFast時,此時交換機會節約30s時間(15s偵聽和15s學習時間),用在接PC或服務器的接口,因爲接PC或者服務器這樣的數據端口,沒有必要參與到生成樹的計算,通過PortFast接口禁用了STP,這樣二層access端口會立即進入轉發狀態。這個主要是爲了防止DHCP超時,主機爲了獲取IP地址。
UplinkFast(倒三角)
主要用在接入和匯聚這件的冗餘鏈路,實現跟端口的備份,當一個交換機的跟端口down掉後,一般會經過30s時間實現跟端口的切換,實施uplinkfast後的端口可以快速實現這個過程。
BackboneFast(正三角)

主要用在匯聚層設備之間的鏈路,當跟端口down掉後,可以快速將之前block掉的端口轉化爲跟端口。這個會節約20s的blocking時間。
以上都是傳統STP需要的技術,目前思科交換機默認的是PVRST+,
 
PVRST+
對於802.1w和802.1s來說,其網橋優先級都加上了12bits長的擴展ID字段,這樣網橋優先級都是以4096爲基準往上增加的。
 
對於802.1w來說只有三種端口狀態:
1.discarding(丟棄): listening、blocking、disabled
2.learning
3.forwarding
 
快速生成樹的端口:
替代端口(AP):這個是相當於UplinkFast,對跟端口的替代端口。從別的交換機收到更好的BPDU,當交換機上行鏈路down掉後,這臺交換機重新發送BPDU宣告自己爲根橋,然後被的交換機收到後就會向跟發送查詢,看是否還在,此時收到回覆還在,於是就向這臺交換機發送消息稱跟還在,你從我這走吧。
備份端口(BP):對指定端口的備份。 從同一臺交換機收到更高的BPDU。這個交換機到根橋必須有一條冗餘鏈路的纔能有備份端口。
 
RSPT提議和認可機制
Proposal and Aggrement
RSTP是分段收斂。當我們增加C到根那條鏈路時,其收斂過程如下:
1.根橋發出Proposal置位的BPDU;
2. 下級交換機收到後,然後將除根端口意外的所有端口處於sync狀態(如果本身端口是阻塞的那就同步了,比如AP、BP、Edge Port。如果是轉發端口那就直接Block掉。),然後向跟迴應Aggrement消息之後本段鏈路收斂完成。
3.然後下級交換機也發送Proposal置位的BPDU,進行類似的收斂過程。收斂速度非常快,幾秒就搞定。
注意:RSTP中當交換機檢測到拓撲改變時是直接進行收斂的即都可以發BPDU ,而不是像STP一樣,只有根橋發送BPDU。 
 
RSTP定義的鏈路類型:
1.點到點(全雙工)
2.共享(半雙工,接了hub)
 
生成樹增強
BPDU Guard(BPDU防護)
如果在啓用了PortFast特性的端口上收到了BPDU的,那麼BPDU Guard就會使其進入“err-disabled”狀態。爲了避免橋接環路,BPDU Gurad會禁用此端口。
BPDU Filter(BPDU過濾)
防止啓用PortFast端口上發送BPDU,因爲與主機或服務器相連的端口通常不需要參與STP計算。
Root Guard(跟防護)
跟防護能夠強制讓端口成爲指定端口,進而防止新接入的交換機成爲根交換機。即跟防護提供了一種強制部署根網橋的方法。啓用根防護的端口上接收到更優的BPDU時,那麼端口就會進入 root-inconsistent(不一致根)的狀態(處於 監聽狀態),這樣的話原有的網路拓撲會得到保護,當交換機從該端口不再收到更優的BPDU時,該端口會最終過渡到轉發狀態。
Loop Guard(環路保護)
當網絡中的的阻塞端口錯誤的過渡到轉發狀態時,這就意味着網絡中產生了環路,此時啓用Loop Gurad的接口就會將該接口進入到 loop-inconsistent(不一致環路) 阻塞狀態,一旦正常後則自動恢復。另一種反之環路的方式是:單向鏈路檢測( UDLD)失敗。
 
對於DHCP服務器來說,由於VLAN會隔離廣播,這樣的話我們必須爲每個VLAN創建一個DHCP服務器,其實沒有必要,我們可以在交換機上使用:ip helper-address +DHCP服務器的IP地址即可。這就是DCHP中繼。注意:ip helper-address這條命令不過使三層設備傳輸DHCP UDP包,也會傳輸DNS,TFTP等數據包
 
CISCO交換技術
1.Process Switching(進程交換)
這個會嚴格按照每一步進行走,比如修改二層頭部,CRC校驗,查找路由表等。這是最佔用系統資源的。速度最慢。
2.快速交換(Fast Switching)
第一個包進行進程交換後,路由器會創建交換緩存,修改數據幀後直接送到出站接口。
3.思科快速轉發(CEF)
會實現根據路由表簡歷FIB(轉發信息庫),設備會利用FIB表執行基於硬件的轉發。
 
Catalyst交換機中實施冗餘的Supervisor引擎
HSA(High System Availability)
採用 完全冷啓動的方式。
 
RPR(Route Processor Redundancy,路由處理器冗餘性)
處於備份狀態的引擎會同步部分配置, 當活躍引擎失效時,備用引擎開始重啓所有板卡,加載配置。
RPR:2~4min;RPR+30s~60s
 
RPR+:這種模式下冗餘引擎中的配置已經與活躍引擎中的配置保持同步, 不用重啓板卡,減少了倒換時間。不過當活躍和備用引擎的鏡像版本不同時,只能使用RPR。
 
SSO(狀態化故障倒換,Stateful Switchover)
當發生引擎倒換時RPR和RPR+對於用戶是不透明的,SSO模式的可以減少二層流量的中斷時間。在SSO模式下,冗餘的Supervisor引擎啓動已經完全初始化,並且啓動配置和運行配置和活躍引擎已經同步( 同步的內容比RPR模式更多),在倒換前後除了處於活動鏈路以外其他鏈路並不會出現斷開。這種模式可以實現 0~3s即可轉發二層流量。
 
HSRP(熱備份冗餘協議)
將虛擬IP和虛擬MAC,主機把虛擬IP配置爲自己的默認網關,主機利用ARP來解析默認網關IP對應的MAC時,ARP返回虛擬MAC,主機發往虛擬MAC的數據會由虛擬路由器組中處於活躍的路由器承擔。這些對於主機來說是透明的。
HSRP中的角色:
1.虛擬路由器:就是那對IP和MAC
2.活躍路由器:在HSRP組中,承擔實際數據轉發的路由器。
3.備份路由器:時刻監聽活躍路由器發送的Hello(3s,10s監聽不到就認爲主down掉了)包,一旦活躍路由器down掉,備用路由器承擔轉發角色。
4.其他路由器:一個HSRP組中活躍路由器和備用路由器只有一個,其他路由器處於初始狀態,當它們都發生故障時,其他路由器就會精選活躍和備份路由器。
 
HSRP狀態:
1.初始(Inital)
2.監聽(Listen)
3.宣告(Speak)
4.備用(Stanby)
5.活躍(Active)
 
這個可以配置搶佔模式的(Preempt)
備用和活躍路由器是根據 優先級(0~255,默認0選舉的,優先級相同規則具有最高的IP地址的將成爲活躍路由器。
注意:HSRP全部配置都在VLAN接口下配置的。
 
HSRP的接口追蹤和路由追蹤
standby 1 track interface f0/0 10(接口f0/0down掉後,會將該路由器的優先級降低10)
 
我們也可以創建多個HSRP組,對於不同的IP子網配置不同的活躍路由和備份路由器
管理員可以同時將某個設備設置爲VLAN生成樹的根橋和HSRP活躍路由器,這樣可以保證二層轉發路徑直接到達三層的活躍路由器。需要爲每一個VLAN配置一個組,一個IP地址。
 
VRRP(虛擬路由冗餘協議)
IEEE標準,不同與HSRP是思科私有標準。
VRRP中有一臺主用(Master)路由器,和一臺或多臺備用(Backup)路由器。
VRRP默認計時器時間小於HSRP,因此切換時間要好於HSRP,其對比圖如下:
 
VRRP使用虛擬IP或者真實IP都可以,真實IP那麼使用該地址的路由器稱爲主用路由器,虛擬IP則是最高優先級稱爲主用。
VRRP默認優先級爲100,當優先級爲0表示該路由器不具備選舉爲佔用路由器的資格。這點同OSPF的DR與BDR的選舉。
vrrp 1 ip ****
 
GLBP(網關負載分擔協議)
GLBP是思科私有協議,客戶發往單一默認網關地址的數據幀會由多臺路由器共同承載。
AVG(Active Virtual Gateway):一個GLBP組中的成員會選舉出一個網關,稱爲該組的AVG。其他組成員作爲備份,ABG會爲GLBP組中的每個成員分配一個虛擬MAC地址。
AVF(Active Virtual Forwarder):AVG會爲網關分配虛擬MAC,每個網關負責轉發到自己虛擬MAC地址的數據包。
 
各交換機最大mac條目
交換機:
2960   8000條
3560   12000條
3750   4k
3840   32000條
4945   32768條
6509   64k
7606   路由器,企業或運行商或數據中心。
路由器:
1921
2811
3825
路由器CISCO開頭或者直接數字
交換機WS-C3560-48T
 

Linux基礎

網易研究院,杭州 
9月9號。2:25 

查看superblock:dumpe2fs -h /dev/sda1 
磁盤分區:fdisk 
磁盤格式化:mkfs -t ext3 /dev/sda1 
磁盤檢查:fsck -C -t ext3 /dev/sda1  這個命令呼叫的是e2fsck這個軟件。 
檢查磁盤壞軌:badblocks 
設置系統標頭:e2label 

掛載:mount -a -l  我們要掛載光盤:mount -t iso9660 /dev/cdrom /media/cdrom 
掛載的時候還可以使用-o指定掛載後的權限。 
卸載裝置:umount -f(強制)+裝置或者目錄 
Linux下所有的裝置都以檔案來替代,反過來檔案以major(主要裝置代碼)和minor(次要裝置代碼)的 
數值來代表裝置。 
如果我們想開機掛載的話需要修改:/etc/fstab。 
swap分區的功能是應付物理內存不足的情況。 
free來查看內存的使用量:free | grep -n "Mem:" | awk '{print $4}' 同時也可以查看交換分區的使用情況 
。 
關掉swap文件:swapoff /tmp/swap 
對硬盤的sda1的第一個分區進行備份:dd if=/dev/sda1 of=/uestc/mbr bs=512 count=1 
superblock大小爲1kb 
ls -l第一行的total爲該目錄消耗的總block大小,這個我們可以通過ll -s來詳細觀察目錄下每個文件及目錄 
的block節點的使用情況。 
查看目錄消耗的容量:du -sb /etc/ 以字節顯示;du -sm /dev/以兆顯示 

linux常見壓縮擴展名即命令: 
*.Z compress uncompress 注意壓縮源文件會被刪除,保留用-c 
例如:compress -c /etc/passwd > /uestc/passwd.backup.Z 
*.gz gzip 
目前gzip可以解壓compress,zip,gzip等軟件壓縮的檔案。 
gzip -#用於指定壓縮比,-9最大,-1壓縮最快,默認爲-6,注意壓縮的時候會刪除源文檔,想要保留: 
gzip -9 -c /etc/passwd > /etc/uestc/passwd.gz。這個可以利用-v選項查看壓縮文件的壓縮比。 
解壓縮用:gzip -d 。查看壓縮後文件的內容:zcat。 
*.bz2 bzip2 
這個使用情況同gzip,查看壓縮文檔的內容用:bzcat 
*.tar tar 
*.tar.gz tar -zcvf打包壓縮,解包解壓縮:tar -zxvf 
*.tar.bz2 tar-jcvf打包壓縮,解包解壓縮:tar -jxvf 
打包的時候,將特殊的檔案或目錄移除在打包之列:--exclude="file" 
比如:tar -jcvf /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc  
/root 
tarfile 僅僅打包。 
tarball 打包+壓縮 
dump備份,dump 0是完全備份,dump 1是僅對dump 0數據變化的部分進行備份,一次類推。 
dump -S /dev/sda1顯示出dump備份需要多少容量 
dump -W 顯示出被dump備份過的文檔。 
比如對/boot施行dump 0備份:dump -0u -f /uestc/boot.dump.0 /boot 
如果我們想對備份dump包施行壓縮的話:dump -0u -j -f /uestc/boot.dump.0 /boot 
對dump備份恢復:restore 
restore -t用於觀察備份文件的內容,類似於tar -t。例如:restore -t -f /uestc/boot.dump.0 
類似的還有mkisofs建立光盤鏡像,cdrecord:光盤刻錄工具。 

cpio可以備份任何東西,不過cpio不會主動去找檔案來備份,我們可以用find命令去尋找。 
備份:find /boot | cpio -ovcB > file(find默認 -print,即打印出找到的內容) 
還原:cpio -ivcdu < file 
查看:cpio -ivct < file 

vim常用 
aAoOiIrR 
跳到指定行:nG或者:n 
跳到第一行:gg 
跳到最後一行:G 
搜索關鍵字:/word 
光標上面搜索第一個關鍵字:?word 
繼續搜索下一個關鍵字:n 配合/word 
繼續搜索上一個關鍵字:N 配合?word 
搜索指定行替換所有:/1,ns/word1/word2/gc(c代表替換前需要確認) 
向後刪除n個字符:nx 
刪除或剪切光標所在行:dd 
刪除或剪切光標所在行向下n行:ndd 
刪除光標所在行到行末:dG 
刪除改行最前面的字符:d0 類似刪除改行最後一個字符:d$ 
複製光標所在行:yy 
複製光標所在行向下:n行 
類似的還有yG、Y0、Y$ 
在光標所在行下一行粘貼:p 
在光標所在行上一行粘貼:P 
撤銷:u 
重複上一個動作[Ctrl]+r或者使用“.”(沒錯是小數點) 
:wq、:q、:q!、:w、:w! 
將編輯的數據另存爲:w filename 
在編輯的數據中,讀入另一個檔案,並將內容加到光標所在行的後面:r filename 
暫時離開vim到指令模式執行命令::!commond 
設置行號:set nu 
取消行號:set nonu 
ab mymail  [email protected] AB替換 
利用映射定義快捷鍵:map T :q! 這樣按下T就是強制退出vim的意思。 

當系統宕機後,導致我們正在編輯的文本無法按正常流程關閉,此時我們需要重新編輯的時候系統提醒有 
人已經在編輯,我們可以通過刪除指定文本的.swp後綴文件,通過ls -al查看。 

vim的配置文件在:/etc/vimrc,這個不建議修改,不過你可以修改處在家目錄下的~/.vimrc 
我們使用cat -A發現win下的行末爲:^M$,而Linux行末爲:$。我們可以使用dos2unix和unix2dos互相 
轉換。-k保留修訂時間不變。 
wget+網址:直接下載網址內的程序。 

語系轉換:iconv -f big5 -t utf8 passwd -o passwd.1(-f from, -t to, -o 保留源文件) 

Shell,這個專門看一本書 

當你使用login接口登入系統時,系統做了一下處理: 
1.尋找/etc/passwd裏面有沒有你要輸入的賬號,有的話將對應的UID和GID(在/etc/group中)讀出來, 
並讀出家目錄與Shell設定。 
2.然後覈對密碼,Linux會進入/etc/shadow裏面對應的UID。 
3.一切ok的話,進入Shell接管系統。 

當root密碼忘記的時候:通過Live CD開機後掛載根目錄去修改/etc/shadow,將裏面root密碼字段清空。 
重啓後root將不用密碼即可登錄。 

有效羣組(當前用戶所處的羣組)和初始羣組(這個羣ID位於/etc/passwd中,而有效羣組位 
於/etc/group中羣組後面) 
觀察當前用戶所屬的有效組:groups 
切換用戶羣組:newgrp 
將用戶加入羣組中:root管理員:usermod;組管理員:gpasswd 
新增加用戶:useradd,相關配置文件,passwd,usermod,userdel 
useradd的默認參考文件:useradd -D(呼叫的源文件位於:/etc/default/useradd) 
而UID和GID密碼參數在:/etc/login.defs 
總結:useradd建立賬號時,會參考以下文件: 
/etc/default/useradd 
/etc/login.defs 
/etc/skel/*(家目錄參考的基準目錄) 

passwd +用戶 進行修改密碼 
使用標準輸入來修改密碼:echo "abc123456" | passwd --stdin root 
查看命令幫助文檔:man 1 passwd 查看配置文件幫助文檔:man 5 passwd 
讓某個用戶失效:passwd -l danbo,解鎖某個用戶:passwd -S danbo 
更加詳細的密碼設定:chage,比如:查看某個賬號的詳細密碼參數:chage -l root。這個主要是修 
改/etc/shadow文件。 
修改/etc/passwd文件的:usermod 
刪除用戶:userdel 
查看用戶相關信息:finger 
增加用戶賬戶的額外信息,比如姓名、辦公室、電話等:chfn(change finger) 
改變用戶shell:chsh 
無論是chfn和chsh都是修改/etc/passwd文件 
與用戶組相關的命令: 
增加組:groupadd 
改變組:groupmod 
刪除組:groupdel 
創建羣組管理員:gpasswd -A danbo groupname 這個是將danbo設爲羣組的管理員。 
gpasswd -M user1 groupname 這個是將user1加入到groupname組中。 

getfacl:取得某個檔案/目錄的ACL設定; 
setfacl:設定某個檔案/目錄的ACL規範。 

切換用戶su -(“-”一定要加,否則不會改變用戶環境變量) 
sudo -u danbo touch /uestc/haah 
以danbo用戶創建文件。 
用戶能否執行sudo主要看/etc/sudoers的設定,使用visudo進行編輯。 
sudo命令可以是非root用戶在以root的身份去執行命令。 

查看此時計算機的使用者:w who last lastlog(每個賬戶最近的登錄時間) 
使用者交談:write mesg wall  write+somebody(ctrl+d結束) 
發送郵件:mail danbo -s “nice to meet you” < filename(也可通過重定向導入事先寫好的文本) 
接收郵件同樣使用mail,然後進入郵件後輸入?查看更多命令。 
pwck:檢查/etc/passwd配置是否正確。 
pwconv: 

crontabl 計劃任務 
linux工作安排種類:at和cron 
at:處理僅執行一次就結束安排的指令,比如我們要指定某個任務在指定時間內運行一次,那麼就會把任 
務放到/var/spool/at目錄內,到指定時間就運行一次。(at time) 
比如我們要執行一個腳本: 
at 3:00 tomorrow 
at > /var/spool/at 
at > Ctrl+D 
at中的時間使用方法: 
at now + 5 minutes任務在5分鐘後運行 
at now + 1 hour  任務在1小時後運行 
at now + 3 days  任務在3天后運行 
at now + 2 weeks 任務在兩週後運行 
at midnight  任務在午夜運行 
at 10:30pm  任務在晚上10點30分 
之前一定要確保atd服務處於啓動狀態:service atd start|status 
編輯/var/spool/at目錄內 
另外還有一個batch命令,這個是在CPU工作負載小於0.8時進行指令的下達。 

crontab 
首先確認這個服務啓動狀態: 
service crond start|stop|restart|reload|status 
也可以在系統啓動的時候就啓動,編輯:/etc/rc.d/rc.local末尾加上:/sbin/service crond start 
必須記住以下幾個: 
crontab -u username #指定編輯某個用戶的crontab,只有root才能使用這個命令 
crontab -e #編輯crontab的工作內容 
crontab -r #移除所有的crontab內容 
crontab -l #查閱crontab的內容 
基本格式: 
*           *           *           *           *         command 
分鐘   小時(24)   天         月         星期      cmd       #週日可以是0或7 
輔助字符: 
*:代表任意時刻都 
,:代表分割時段 
-:代表一段時間範圍內 
/n:每隔n單位間隔。 
下面舉一些實例: 
注意後面的額command也可以包含多個指令(每個指令用;分割) 
例如:每天造成3點20執行用戶目錄下的兩個指令: 
20 3 * * * * (/bin/rm -rf /tmp;/bin/uptime) 
注意cron服務最低偵測間隔爲分鐘。 
當我們配置完crontab之後,我們必須重啓crond服務才能使其生效(針對unix,linux會自動執行): 
service crond restart 或者 /etc/init.d/crond restart 

cat /etc/crontab #這個是系統的crontab,注意與用戶的crontab不相同,這裏需要指定執行者。 
# .---------------- minute (0 - 59) 
# |  .------------- hour (0 - 23) 
# |  |  .---------- day of month (1 - 31) 
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ... 
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 
# |  |  |  |  | 
# *  *  *  *  * user-name command to be executed 
SHELL=/bin/bash #使用哪個shell 
PATH=/sbin:/bin:/usr/sbin:/usr/bin #執行文件搜索路徑 
MAILTO=root #執行例行工作發生錯誤將錯誤指令發給誰。我們也可以以郵件形式發給執行郵件: 
MAILTO= [email protected]
HOME=/ 
01 * * * * root run-parts /etc/cron.hourly: 
run-parts實際上是個腳本,後面接目錄,也就是說,如果你想讓系統每小時主動幫你執行某個指令,將 
該指令寫入腳本中,並將該腳本放入到/etc/corn.hourly/目錄下的意思。 
crontab優化:注意將不同計劃任務執行時間儘量隔開;並不需要輸出信息的結果導入到/dev/null中;周 
和日月不能同時使用; 
另外還有一個指令比較有用:anacron,當我們的機器沒有24*7運行時,比如週末機器會停機一天,可能 
在停機期間會有沒有執行的crontab任務,那麼利用anacron在機器開機後進行執行crontab,它會讀取時 
間記錄(timestamps)瞭解到系統什麼時候關機,然後分析現在與關機之前anacron之間的差異,就會發 
現沒有執行的crontab了,然後就會執行之前沒有執lrontab。 

操作系統總結: 
程序與進程的區別: 
程序只是一組指令的有序組合,是一個靜態的實體。 
進程是一個動態的實體,有自己的生命週期。 
Linux的進程狀態: 
可運行態(Running 0,R):只有該狀態才能在CPU上運行。 
可中斷的等待(Interruptible 1,S):處於這個狀態的進程因爲等待某個事件的發生而被掛起,通過ps命 
令絕大多數進程都處於Interruptible狀態。 
不可中斷的等待(Uninterruptible 2,D):與S態類似,只是此時的進程是不可中斷的,包括利用kill -9  
也無法殺死這個進程。 
暫停態或者跟蹤態(Stopped,Traced 4):工作在背景(暫停)或者處於排錯(Traced)狀態。 
僵死狀態(Zomble 3,Z):程序已經終止但卻無法從內存中移除,子進程終止,父進程卻不知道。 

子程序與父程序 
當我們登入系統後會取得一個Shell,然後我們利用這個Shell提供的接口去執行另外一個指令,另外執行 
的指令也有一個PID,那麼後來執行的那個指令的PID就是子程序了,而原本的Shell就是父程序了。 

將程序置於背景下執行:cp file1 file2 &,此時bash會給予這個指令的工作號碼(job number)+PID此 
時要注意導出的信息,我們最好加上> /dev/null 2>&1 
我們也可以將目前的工作目錄丟到後臺去執行:按下ctrl+z。注意:使用ctrl+z丟到背景都是暫停狀態 
觀察背景工作狀態:jobs -r(列出處於運行態的工作)-s(列出處於暫停的工作)-l(列出所有) 
將後臺工作拿到前臺:fg %n 
我們知道ctrl+z將目前工作丟到後臺中並暫停,那麼如果讓其工作呢?使用:bg %n 
關掉後臺工作:kill 
後臺指的是:避免在終端下按下ctrl+c中斷執行過程。 

而前面講到的at是將工作放到後臺執行,這個與終端無關,也可以使用nohop,這個可以讓你在脫機或注 
銷狀態下仍可以運行。 
nohup cmd (&)加上&帶包在後臺執行,如果你想讓在後臺的工作在你註銷後還能夠繼續執行,就使用 
nohup+&組合。 

程序 
觀察系統所有的程序:ps(靜態);top(動態);pstree(程序樹之間的關係) 
ps -l:只查看自己bash的程序; 
ps aux:查看所有系統運作的程序。 

當使用ps -l觀察到一下: 
F:程序的flag:4代表此程序的權限爲root;1代表此程序僅進行復制(fork),而沒有實際執行(exec) 
。 
PRI/NI:表示執行優先級,數字越小越優先。 
PID和PPID:進程號和父進程號。 

top -d 3 >/uestc/top.log 也可以將top輸出的信息導出到top.log文檔中 
查看自己bash的PID:echo $$,然後通過top觀察此PID:top -d 3 -p 13000 
tty是本機登錄。 
pts/0默認是從ssh網絡登錄 

使用pstree時,我們觀察到所有程序都依附於init這個程序下,使用pstree -p觀察到init的PID是1,因爲 
init是Linux內核啓動的第一個程序,而重啓init也就意味着重啓系統了(reboot)。 
終止某進程:killall -9 httpd,其中9表示sigkill:代表強制中斷一個程序的進行。 
而kill後面必須要跟PID或者job n服務區如:kill -9 %1)纔行,跟服務名稱就需要用到killall了。 
pgrep +服務區例如:pgrep ssh這樣就可以找到相應服務區的PID 


執行優先級: 
PRI(new)=PRI(old) 
nice可調整的範圍:-20~19,而一般用戶調節的範圍爲0~19(防止一般用戶搶佔資源) 
用法: 
nice -n +nice值 cmd:以新的nice值執行命令cmd(例如:nice -n -9 ps) 
renice n PID:調整一個已經存在的程序的優先級。 

free:觀察內存使用情況,包括物理內存和虛擬內存(Swap) 
cache與buffer的區別: 
cache:緩存區,是高速緩存,位於CPU與主內存之間的容量較小但是速度很快的存儲器,Cache主要保 
存CPU剛用過的數據,減少CPU等待時間。 
buffer:緩衝區,用於存儲速度不同步的設備或優先級不同的設備之間的數據傳輸,減少進程間通信的等 
待時間。 
查看系統內核相關信息:uname -a 
查看系統啓動時間與工作負載(即top的第一行):uptime 
查看網絡:netstat -tunlp(tcp,udp,以端口號顯示而不是服務名,處於偵聽,PID) 
分析核心產生的信息:dmesg |more,比如查看網卡的信息:dmesg | grep -i eth 
偵測系統資源變化:vmstat 

內存中的所有數據都是寫入到/proc這個目錄當中,並且是以PID進行分目錄存儲的 
fuser -k /dev/pts/0:強制清除掉某個用戶,可以通過w來查看 
或者使用:fuser -k /mnt/cdrom 或者使用umount 
fuser還可以找到那個程序在利用該檔案,比如當我們卸載的時候發現device is busy,我們可以通過fuser 
查看那個程序在利用該檔案,例如:找到使用/proc的程序:fuser -mvu /proc 
我們知道fuser是知道裝置或目錄找到使用其的程序,而知道程序如何知道其使用了哪些文件或裝置呢,這 
個就需要:lsof,例如:lsof -u root  

查看SELinux狀態:getenforce 
關閉SELinux:臨時:setenforce 0;永久:修改/etc/selinux/config,將SELINUX=enforcing改爲 
SELINUX=disabled,重啓即可。 
開啓SELinux:setenforce 1 

守護進程deamon與服務service 
系統爲了某功能必須要提供一些服務service;但是service的提供總需要程序來支持吧,我成稱這個程序 
爲daemon。 
daemon可以分爲兩類: 
1.stand alone:可以自行單獨啓動服務,個別窗口負責單一的服務。 
2.super daemon:同一窗口負責各種業務(xinetd) 
跟service相關的目錄和文件: 
/etc/rc.d/init.d包含所有service的控制腳本。 
/etc/rc.d/rc*.d包含所有service自啓動選項配置。 
/etc/sysconfg/*各服務的初始化配置文件。 
/etc/*各服務各自配置文件。 
/var/lib/*各服務數據庫。 
例如: 
重啓某服務:service crond restart或者/etc/init.d/crond restart這個是/etc/rc.d/init.d/的軟鏈接。 
觀察某服務:netstat 
Linux啓動過程: 
1. 打開電源,加載BIOS開機自檢。 
2. 透過BIOS找到啓動盤,讀取MBR的bootloader。(Linux主流的爲grub,包括兩個stage,stage1爲執 
行bootloader的主程序;stage2:主程序加載位於/boot底下的配置文件。menu.lst提供選單) 
3. 透過Bootloader取得內核並加載。 
4. 內核啓動init進程。 
5. init 程序開始執行系統初始化 (/etc/rc.d/rc.sysinit) 
6. 依據 init 的設定加載  (/etc/rc.d/rc[0-6].d/*) 
7. 加載本機設定 (/etc/rc.d/rc.local,用戶自定義開機啓動程序,只要將腳本放到/etc/rc.d/rc.local/目 
錄內開機就會執行。) 

管理系統服務開機啓動:chkconfig 
chkconfig --list +服務名 
chkconfig --level(0123456) 服務名 on|off 
比如關閉httpd自啓動:chkconfig --234 httpd off 
然後觀察狀態看是否關閉:/etc/init.d/httpd status或者service httpd status 
圖像話管理工具:ntsysv 

init加載主要流程如下: 
1.init處理系統初始化流程/etc/rc.d/rc.sysinit,主要目的是在開始加載系統各項服務前,做好整個系統環 
境,主要就是利用rc.sysinit這個腳本。 
2.系統根據/etc/inittab設定選擇啓動級別,啓動位於相應目錄內的啓動服務/etc/rc.d/rc*.d/與啓動配置 
文件/etc/sysconfig。 
3.然後啓動用戶自定義開機啓動程序/etc/rc.d/rc.local。 

第3步透過bootloader加載系統核心和核心模塊,核心位於:/boot/vmlinuz,而核心是壓縮的,解壓縮需 
要RAM Disk/boot/initrd,作用:在沒有掛載/之前,系統需要先掛載磁盤驅動,於是就把initrd加載到內 
存中,虛擬出“/”,然後完成vmlinuz核心模塊的加載。 
核心模塊:/lib/modules/$(uname -r)/kernel,通過lsmod查看加載了哪些模塊。 
利用modinfo可以查看模塊詳細信息。 
安裝模塊:insmod,移除模塊:rmmod 
修改模塊的額外參數設定:/etc/modprobe.conf 
當核心加載完成後那麼就會在內存中記錄:/proc/kernel 

grub 
安裝在mbr的grub主程序,最重要的任務就是從磁盤加載核心文件,以便讓核心能夠順利驅動整個硬件。 
grub識別硬盤的如:(hd0,0),第一個0表示搜索第一個硬盤,第二個0表示搜索硬盤的第一個分區。 

忘記root密碼: 
1.重啓 
2.進入grub(在選單界面按e,然後在要kernel那一行按e,在行尾輸入single,回車後進入單用戶模式) 
3.此時系統會以root的權限給你一個shell,然後直接passwd修改密碼即可,之後init 3進入字符模式。 

在Red Hat系列Linux中都提供了系統設定工具:setup。我們可以利用這個綜合管理系統。 

提供密碼驗證的服務器有NIS、LDAP 

網卡配置:1.透過setup。2.編輯/etc/sysconfig/network-script/ifcfg-eth0 
編輯DNS服務器:vim /etc/resolv.conf 
重啓網卡配置:/etc/init.d/network restart 
防火牆配置:1.透過setup。2.編輯/etc/sysconfig/iptables 

硬件信息的收集: 
/proc/cpuinfo;/proc/partitions;/proc/interrupts 
vmstat:分析系統(CPU、RAM、IO)目前的狀態,分析IO也可以用iostat 

軟件安裝 
Linux系統中可執行的文件都是二進制文件(binary program),而Shell Scripts其實也是利用shell這個程 
序(例如bash)來執行的呢。 

可執行問阿金的編寫過程: 
1.寫程序,也就是源代碼,其實就是純文本文件。 
2.編譯,就是將源代碼編譯成系統能看懂的二進制代碼咯,而此時需要專門的編譯程序(例如gcc,利用 
已存在的庫函數編譯C語言寫出的源代碼)來處理,經過編譯與連結之後,就是可執行的二進制程序了。 
事實上在編譯的過程中還產生了目標文件(Object file),然後在引用外部子程序或者加入函數庫,將程 
序代碼與函數庫連結(Link)之後才能執行。 

make過程: 
當執行make時,make首先會在當前目錄搜索Makefile這個文本文件,Makefile記錄而來源代碼該如何編 
譯的詳細信息,而Makefile則是利用configure偵測程序去檢測用戶具體的系統環境(比如系統版本,內核 
,是否安裝了相應的編譯器等)建立的。 

我們在安裝源碼包要看說明文檔:README或者INSTALL 

源碼包的安裝過程: 
1../configure 
2.make clean(可以沒有,作用:去除當前目錄中不是本次編譯過的額目標檔案。) 
3.make 
4.make install 

建議安裝在:/usr/local目錄下,而源碼包建議存儲在:/usr/local/src 
不過都安裝在/usr/local/目錄下的話以後不好刪除,建議單獨在/usr/local/目錄下建立一個以程序名命名 
的文件夾,這樣以後刪除直接刪除相應文件夾即可。不過這樣環境變量就沒有相應的記錄了,我們在執行 
時就必須要附加絕對路徑,因此我們可以將相應目錄加入到PATH裏面。 

軟件包校驗: 
md5sum/sh1sum 
用法:md5sum +安裝包,然後與官網提供給的md5值比較。 

Linux兩大主流:RPM和DPKG 
rpm使用指令rpm,在線安裝yum。 
dpkg使用指令dpkg,在先安裝apt-get 

rpm安裝命令: 
rpm -i 安裝;-v(verbose)顯示安裝詳細信息;-h(hash)以哈希顯示安全過程。 
rpm -ivh +安裝包 
rpm常用選項: 
--nodeps:忽略安裝包的依賴性強制安裝。 
--test:測試安裝,是否有依賴問題。 
--prefix:自定義目錄,而非默認目錄/bin,/etc等 
--force:暴力安裝,不管之前是否已經安裝過了。重複安裝(--replacepkgs),覆蓋安裝比如要安裝 
的軟件包比已安裝的舊(--replacefiles) 
rpm -Uvh 安裝包:升級安裝,如果沒有安裝則執行安裝過程。 
rpm -Fuh 安裝包:僅執行升級安裝,如果沒有安裝,則不安裝。 
rpm -e 安裝包:卸載rpm包。 

rpm -qa:查詢已安裝的軟件。 
rpm -qf:查詢已安裝的文件屬於哪個安裝包。 
rpm -qi:查詢已安裝軟件包的信息,比如作用,版本什麼的,未安裝加上-p 
rpm -ql:查詢已安裝軟件包安裝了哪些文件,未安裝加上-p 
rpm -V:校驗軟件包,如果正確沒提示,可以根據返回值來確認哪些改變了,5:md5;S:大小改變 
從rpm包中提取所需要的文件: 
首先將rpm包轉化爲cpio:rpm2cipo 
然後通過管道|提出文件: rpm2cipo bind.x86_64 | cpio -idv +指定文件到當前目錄 
還可以通過數字簽名的方式來驗證。 

yum:自動解決rpm包的依賴關係 
yum -y install 安裝 
yum -y update 升級 
yum list 查詢安裝包 
yum info 軟件包信息 
yum remove 卸載 
修改yum源,一般直接複製163yum源到/etc/yum.repos.d/CentOS-Base.repo 

Linux備份 
備份工具:tar、cpio、dd、dump 
推薦備份的目錄: 
/boot 
/etc 
/home 
/root 
/usr/local 
/var 

dd備份:dd讀取的是扇區,並且讀取速度慢。 
dd if=/dev/sda1 of=/dev/sda2 
cpio備份:find / -print | cpio -covB >/dev/sda2 
還原:cpio -iduv < /dev/sda2 
dump完整備份:dump -0u -f /backupdata/home.dump /home 
第一次增量備份:dump -1u -f /backupdata/home.dump.1 /home 
tar完整備份:tar --exclude /proc --exclude /mnt --exclude /tmp -jcvf  
/backupdata/system.tar.bz2 / 
cp -a也可以進行備份。 

增量備份(差異備份):tar 
tar -N '2015-09-04' -jcvf /backupdata/home.tar.bz2 /home只有比20150904更新的文檔才備份 
也可以透過rsync進行鏡像備份:rsync -av 來源目錄 目標目錄。 
第一次備份完畢後,在此進行備份時就是增量備份。 


Shell腳本學習 
/etc/profile:初始化系統全局Shell變量。 
/etc/bashrc:定義Shell函數和別名的系統全局定義。 
~/.bash_profile:用戶個人環境。 
~/.bashrc:用戶個人的別名及變量設置文件 
source或者. 將自定義變量導出到環境變量。 

fork系統調用: 
Linux系統通過fork系統調用創建進程。fork系統調用創建調用進程的副本即爲子進程。子進程與父進程共 
享一個CPU,並且子進程繼承父進程的環境變量。 

wait系統調用: 
子進程執行階段,父進程處於等待狀態,此時wait一直保持待機狀態,當1個子進程終止。執行wait終止 
子進程,返回子進程的PID。若在子進程終止前父進程掛了,那麼子進程就成了孤兒進程,所以wait進程 
不僅讓父進程處於等待狀態,也可以終止進程。 

exit系統調用: 
執行exit終止子進程,並且返回sigchild信號,0爲成功,非0失敗。使用echo $?查看。 

所有Shell都可以使用的變量稱爲全局變量或環境變量,使用env或者printenv查看。 
局部變量只能用於當前Shell,利用set查看系統所有變量(全局和局部) 

刪除變量 unset VAR 
顯示變量:echo $VAR或者echo ${VAR} 
局部變量轉化爲全局變量:exprot VAR="fuck"或者declare -x VAR="fuck" 
注意:當export在shell腳本內使用時,一旦shell腳本執行結束,變量也會消失。 

注意一下參數變量: 
$* 
$@ 
$? 
$# 
$!:最後運行後臺進程的PID,而連續兩個!!則是運行history最後執行的命令,等於!-1。 
或者是!+關鍵字第一個字母,這個是運行最近的第一個字母是前面輸入的那條命令。 
$_:最後運行命令的最後一個參數 
$0:shell腳本的全名,在腳本中echo $0等於basename $0 
$$:當前Shell的PID。例如ps aux | grep bash 顯示的PID等於此時echo $$的PID 

讀入變量read VAR1 VAR2,或者是read -p "Plead input an integer: " a 
shift將參數左移。 
替換命令``,例如:now=`date`;echo $now 
整數的計算:expr 10 + 110 注意,運算符號兩邊必須有空格,兩邊可以爲數字,也可以是變量。 

Shell條件語句 
if 命令 
then ** 
elif 
fi 

case i in 
模式1) 
語句 
;; 
模式2) 
語句 

;; 
esac 

循環語句 
for i in "@*" 
do 
echo $i 
done 

文件測試:test -f /etc/passwd ;或者[ -f /etc/passwd ],返回0爲真,返回1爲假。注意exit返回結果 
0爲真,非零爲假。 
-f:文件存在 
-d:目錄存在 
-s:文件存在且爲非空 
-e:文件存在即爲真 
-r:可讀 
-w:可寫 
-x:可執行 
-L:文件爲軟鏈接 

函數 
function() { 
echo "***" 
echo "***" 

調用函數直接在要調用的位置協商函數名即可。 

增加目錄到PATH中:PATH=$PATH:*** 
通過kill -l可以查看所有的信號變量,最常用的就是-9SIGKILL 

定義別名:alias mv='mv -i',刪除用:unalias命令 
如果我們想讓別名永久生效可以將其寫入到~/.bashrc文件當中,之後導出source ~/.bashrc 

[]檢索字符範圍,例如:file[1-3] 
{},當中使用,可以檢索多個,例如:file{ile?,oo} 

..上級目錄 
-上一個目錄 

declare命令 
-a:聲明變量爲數組 
-i:聲明整數變量 
-r:聲明只讀變量 
-x:聲明環境變量,declare -x等於export 

type用於顯示命令的類型:別名、內建等等 
file用於識別文件的類型:b、c、d等等 

變量擴展修飾: 
${var:-word}:若變量var爲空,則返回word。 
${var:=word}:若變量var爲空,則將變量設置爲word並返回word 
${var:?word}:若變量var爲空,則將顯示var:word 
${var:+word}:若變量var存在,則返回word,否則返回null,常用語測試變量是否存在。 
${var#pattern}:從前匹配最短刪除。 
${var##pattern}:從前匹配最長刪除。 
${var%pattern}:從後匹配最短刪除。 
${var%%pattern}:從後匹配最長刪除。 
${var:offset}:提取含有offset關鍵字的字符串。 
${var:offset:length}:從offset開始之後提取長度爲length的字符,例如:var="12345";echo  
${var:2:2};34 
${var/substring/newstring}:使用newstring代替var中的第一個substring。 
${var//substring/newstring}:使用newstring代替var中的所有substring。 
${#var}:返回變量var的長度。 
${var}:返回變量的內容,推薦這樣寫。$var這樣也可以。 
$1、$2、...$(n),返回第n個位置的參數。$1-$9返回第1-9個參數。$0:當前shell腳本的名稱。 

$():括號內爲命令組合。 
``:``內命令執行完畢後返回。 
'':單引號內命令原樣輸出。 

數值計算: 
$[]或者$(()) 
定義數組: 
declare -a numbers=(11 22 33 44 55) 
echo ${numbers[2]} 
22 
echo ${#numbers[@]} 


sort 
grep 
awk 
sed 
uniq 

grep詳解 
將匹配的行打印出來 
常用選項 
-c(count):值輸出匹配行的數目 
-i(ignore-case):不區分大小寫 
-n:輸出匹配行和行號 
-v:反選匹配文本的行 
-An:after:除了列出該行外,後續的n行也列出來。 
-Bn:before:除了列出改行外,前面n行業列出來。 
使用擴展正則表達式:grep -E或者egrep 
比如:去掉空行和註釋行: 
egrep -v '^$|^#' /etc/passwd 

cut詳解 
-d:指定分割符。 
-f:依據-d指定的分隔符分割的數段,利用-f去除第幾段,當截取多個段的時候,中間用,號隔開。 
-c:以字符單位去除固定字符區間。注意在linux中tab鍵默認是8個空格。   
截取多段,1,3,4。 
截取4-15段,cut -d ":" -f4-15,對於-c截取字符同樣適用。 

sort基礎 
-f(ignore-case):忽略大小寫 
-b(ignore-leading-blanks):忽略開頭的空格 
-n(numeric-sort):以純數字進行排序(默認以文本排序,數字的話以第一個數字爲準。) 
-r(reverse):反向排序。 
-u(uniq):相同的數據中,僅出現一行。 
-t(field-separator):指定分隔符,默認是以tab鍵來分割。 
-k(key):以哪個field進行排序。 

uniq基礎 
-i:忽略大小寫 
-c:進行計數 

wc基礎 
-w(word):字數 
-m(character):字符數 
-c(bytes):字節數 
-l(lines):行數 
wc默認輸出行數、字數、字符數 

tee基礎 
雙向重導向 
-a(append):以累加方式加入到數據file當中。 
例如:last | tee -a file.log | more 

tr基礎 
-d:刪除匹配的字符 
-s(squeeze-repeats):刪掉重複的字符。 
例如:小寫轉大寫:tr '[a-z]' '[A-Z]' 注意只能用管道字符,這個後面不能直接跟文件。 
刪除字符:cat /etc/passwd | tr ':' -d  
我們知道在dos下會在每行行尾加上"^M"這個斷行符 

col基礎 
-x:將tab鍵轉換成對等的空格鍵盤。 

sed基礎 
選項: 
-n(silent):使用安靜模式,僅輸出sed處理的行。 
-f(file):將sed動作寫在後面的文本內。 
-r(regexp-extended):支持擴展正則表達式。 
-i:直接修改讀取的文本,而不是輸出。 
範圍: 
n1,n2 
動作: 
a(apped):新增,a後面接字符串,這些字符串會出現在目前行的下一行。 
c(replace):取代,c後面接字符串,這些字符串可以取代n1,n2之間的行。 
d(delect):刪除 
i(incert):插入,i後面接字符串,這些字符串會出現在目前行的上一行。 
p(print):打印,通常與-n一起使用。 
s(replace):取代,例如:1,20s/old/new/g(g取代所有,p取代一次) 

nl /etc/passwd | sed '2,5d'刪除2-5行。 
nl /etc/passwd | sed '2a fuck'在第2行後面增加內容爲fuck的一行。 
nl /etc/passwd | sed '2i fuck'在第2行前面增加內容爲fuck的一行。 
nl /etc/passwd | sed '2,5c No-2-5 lines'用後面內容取代2-5行。 
nl /etc/passwd | sed -n -p '10-15p'打印20-15行。不加-n的話,2-5行會重複輸出。 
利用sed取出IP地址: 
ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/  Bcast.*//g' 

awk基礎 
以行爲單位處理,傾向於一行中分成若干個字段處理,默認字段分割符爲“tab”或“空格”。 
比如取last登入的用戶名和IP: 
last -n 5 | awk '{print $1 "\t" $3}' 
awk處理流程: 
1.讀入第一行,並將第一行的資料填入$0、$1、$2....等中。 
2.依據條件的限制,判斷是否進行後面的動作。 
awk以字段爲最小的處理單位。 
awk內建變量: 
NF:每一行($0)擁有的字段總數。 
NR:目前awk所處理的是第幾行數據。 
FS:目前的分隔符,默認是空格。 
注意:awk在print打印非變量數據時,要加上雙引號。 
比如: 
root@localhost]# last -n 3 | awk '{print $1 "\t lines:"NR "\t columes:" NF}' 
root  lines:1  columes:10 
root  lines:2  columes:10 
root  lines:3  columes:10 
awk的邏輯運算字符舉例: 
cat /etc/passwd | sort -n -t ":" -k3 | awk '{FS=":"} $3 > 50 {print $1 "\t" $3}' 
不過我們發現第一行並沒有經過awk處理就輸出了。我們可以使用BEGIN這個關鍵詞: 
cat /etc/passwd | awk 'BEGIN{FS=":"} $3 > 50{print $1 "\t" $3}' 
當大括號內使用printf時就必須按照C個數輸出了%10s、%10d。並且結尾使用\n進行分行。 
另外一個例子: 
cat a.log | awk 'NR >=2 {printf "%10s %10s %10s %10s\n",$1,$2,$3,$4,totoal}' 

diff檔案對比:以行爲單位對比 
-b:忽略一行中多個空白的差異。 
-i:忽略大小寫。 
-B:忽略空白行的差異。
 

LVS三種模式簡介

IP虛擬服務器軟件IPVS
IPVS軟件中的三種IP負載均衡技術。
1.Virtual Server via NAT
通過網絡地址轉換,調度器重寫請求報文的目的地址,根據預設的調度算法,將請求分派給後端的真實服務器;真實服務器的相應報文通過調度器時,報文的源地址被重寫,再返回給客戶,完成整個負載調度過程。
 
2.Virtual Server via IP Tunneling
採用NAT技術時,由於請求和響應報文都必須經過調度器地址重寫,當客戶請求越來越多時,調度器的處理能力將成爲瓶頸。爲了解決這個問題,調度器把請求報文通過IP隧道轉發至真實服務器,而真實服務器將相應直接返回給客戶,所以調度器只處理請求報文。由於一般網絡服務應答比請求報文大得多,採用VS/TUN技術後,集羣系統的最大吞吐量可以提高10倍。
 
3.Virtual Server via Direct Routing(VS/DR)
VS/DR通過改寫請求報文的MAC地址,將請求發送到真實服務器,而真實服務器將響應直接返回給客戶。這種方法沒有IP隧道的開銷,但是要求調度器與真實服務器處在同一物理網段上。
 
LVS算法
1.輪叫(Round Robin)
調度器通過“輪叫”調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。
 
2.加權輪叫(Weighted Round Robin)
調度器通過“加權輪叫”調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更過的訪問流量。調度器可以自動問詢真實服務器的負載請求,並動態調整其權值。
 
3.最少鏈接(Least Connections)
調度器通過“最少連接”調度算法動態地將網絡請求調度到已建立連接數最少的服務器上。如果集羣系統的真實服務器具有相似的系統性能,採用最小連接算法可以較好地均衡負載。系統默認。
 
4.加權最少鏈接(Weighted Least Connections)
在集羣系統中的服務器性能差異較大的情況下,調度器採用“加權最少鏈接”調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動詢問負載情況,並動態地調整其權值。
 
5.基於局部性的最少連接(Locality-Based Least Connections)
“基於局部性的最少鏈接”調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載,則用“最少鏈接”方式
 
6.
 
7.目標地址散列(Destination Hashing)
根據請求的目標IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。
 
8.源地址散列(Source Hashing)
根據請求的源IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表中找出對應的服務器,若該服務器是可用的且爲超載,將請求發送到該服務器,否則返回空。
 
LVS集羣體系結構
 
負載調度器(Load Balancer),它是整個集羣對外的前端機,負責將客戶的請求發送到一組服務器上執行,而客戶認爲服務器是來自一個IP地址(虛擬IP)上的。
服務器池(Server Pool),是一組真正執行客戶請求的服務器,執行的服務器有WEB、MAIL、FTP、DNS
共享存儲(Shared Storage),它爲服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。
 
 
負載均衡有兩方面的含義:首先,大量的併發訪問或數據流量分擔到多臺節點設備上分別處理,減少用戶等待響應的時間;其次,單個重負載的運算分擔到多臺節點設備上做並行處理,每個節點設備處理結束後,將結果彙總,返回給用戶,系統處理能力得到大幅度提高。
 
常見的硬件負載均衡廠商:F5的BIGIP、Radware的AppDirector。國內的有深信服的AD
 

DNS基礎精簡版

DNS中記錄類型有哪些:(網易互聯網二面問了這一題
1.A記錄:就是主機名對應的IP地址的記錄。
2.NS記錄:指定本域的ns地址。
3.MX記錄:Mail eXchanger,郵件交換器,用於記錄郵件服務器對應的域名地址,並且這個記錄是有優先級的(0-99,並且數字越小越優先)
4.CNAME記錄:別名記錄,記錄類型爲:x cname y
5.PTR記錄:指針記錄,將IP地址轉化爲域名
6.SOA記錄:Start of Authority(起始授權記錄),用於授權這個區域的主DNS服務器和管理郵件地址等。
 
區域(Zone)和域(Domain)
域是一個邏輯概念,區域是一個物理概念。
比如baidu.com我們可以理解爲一個域(Domain);而其對應的NS服務器:ns.baidu.com上有兩個區域,正向區域和反向區域,並且正向區域和反向區域對應着不同的數據文件,區域是人爲定義一個域的子域,而子域是靠某個數據文件進行管理的。因此區域和域並沒有誰包含誰的關係。
 
子域授權(Delegation):比如將baidu.com這個域劃分成tech.baidu.com和mark.baidu.com這兩個子域,並且每個子域都可以授權給其相應的組織去管理,甚至也可以將子域進一步劃分子域,而父域保留了子域數據來源的指針。
 
主輔DNS,輔助DNS的RR(資源記錄)僅能從主DNS服務區同步,他們之間靠TCP進行區域傳送,區域傳送分爲:完全區域傳送(all zone transfer,axfr)和增量傳送(incremental zone tranfer)。
 
DNS的主配置文件:/etc/named.conf
首先是Options{
}
這個用來定義一些影響DNS全局的環境,比如區域數據庫存放的目錄或者端口號等,注意每行以";"結尾。
zone "." IN{
type hint; #注意type總共有三種:master(主NS)、slave(輔NS)、hint(根NS)
file "name.ca;" #用於指定在/var/named/目錄下的文件名。
};
zone "baidu.com" IN{ #定義一個域名爲baidu.com的正向區域
type master;
file "baidu.com.zone"
allow-update { none; }; #這個用在輔助DNS上,用於指定Master的地址。
};
zone "0.0.140.in-addr.arpa" IN{ #定義一個IP爲127.0.0.*的反向區域,注意要把區域網段的地址反寫
type master;
file "named.local";
}
 
對於DNS來說”根“,也就是位於文件/var/named/named.ca裏面默認已經配置好了,如果沒有配置好,我們直接使用命令導入即可:dig -t NS . >> /var/named/named.ca
對於所有子域的數據文件必須以SOA開頭:
$TTL 600   #用於全局定義本數據文件記記錄的超時時間。
$ORIGIN baidu.com.   #用於全局定義域名,下面只需要使用@就可以引用這個域名了。
@    IN    SOA    ns.baidu.com.   admin.baidu.com. {
                2015091301   #定義序列號
                24h   #定義主從NS之間數據庫更新的週期,refresh
                1h    #重試時間,主從之間更新失敗,多久重試,retry
                1w    #超時時間,中從服務器連續更新失敗,多久超時,並刪除相應記錄,expiry
                1h    #否定緩存。本地數據庫沒有,告訴對方多長時間不要再次請求了,negative caching
}
baidu.com.    IN    NS    ns.baidu.com.   #NS記錄,定義域所在的ns服務器地址。
ns.baidu.com.    IN    A    180.76.76.76    #A記錄,NS後面必須跟着一個A記錄,定義ns的地址。
baidu.com.    IN    MX    10    mail.baidu.com.   #MX記錄,用於知名郵件服務器的地址,並且有優先級的
www    IN    CNAME    web   #別名記錄,用於定義web主機的別名,即web.baidu.com=www.baidu.com
88    IN    PTR    baidu.com.    #反向記錄。
注意A記錄可以有多個,DNS在相應查詢的時候會進行負載均衡。
 
DNS查找過程:首先是主機到Local DNS的查找,這段是遞歸查找
Client -> 緩存 -> /etc/hosts -> /etc/resolv.conf -> DNS Server
然後是Local DNS到域名所在NS之間的迭代查找
1.如果是Local DNS所負責的區域的話,那麼首先查找數據文件,其次纔是緩存(這樣做是爲了體現權威性)
2.如果數據庫文件和緩存都找不到的話,那麼就去查找根。此時是根據named.ca(也就是dig -t NS . 返回的結果,其實這個步驟在安裝bind的時候系統默認就已經執行完畢了)中的A記錄查詢第一個FQDN返回的IP。這樣查找到com.這個記錄對應的IP,然後返回爲Local DNS這個IP地址。
3.Local DNS向返回的這個地址查詢baidu.com.這個域名,進行同樣的查詢知道返回www.baidu.com.這個域名對應的IP,然後返回給主機。
 
區域類型:
除了hint、master、slave還有forward。
這個叫做轉發服務器,即當DNS服務器收到一個請求後,本地數據庫和緩存都找不到,那麼默認情況下會向根查找,不過這樣效率有點低了,比如像ns.tech.baidu.com查找mark.baidu.com那麼其完全可以在主配置文件中定義一個傳送區域:
zone "baidu.com." IN {
type forward;
forwarder { 180.76.76.76 };
};
轉發類型有兩種:
first:即先進行轉發,如果轉發目標NS查不到的話再向根查找。
only:僅進行轉發,如果轉發目標NS查不到的話就返回空。
允許遞歸就以爲着允許緩存,而允許緩存就會面臨緩存毒化的威脅。
緩存度化:修改DNS的A記錄,指向一個釣魚網站。
默認情況下安裝bind的時候也會安裝caching-nameserver這個包,就相當於與配置了一臺緩存服務器。
 
bind的管理工具:rndc(Remote Name Daemon Controller)
bind stop|status|state|reload(重新載入所有配置文件和區域數據文件)|freeze(凍結某個區域,不讓其更新)|reconfig(重新載入主配置文件)|retransfer zone(讓某個區域數據庫重新傳輸)
這是一個很強大的DNS遠程控制工具。其配置腳本爲:/etc/rndc.conf,rndc監聽的端口是953。
這個工具在安裝bind時已經安裝了,不過默認我們不能直接使用這個命令,我們必須經過一下處理纔行:
1.使用rndc-confgen生成rndc的主配置文件。
rndc=confgen | tee /etc/rndc.conf
此時發現還是不行,出現:rndc: connect failed: 127.0.0.1#953: connection refused,出現953端口拒絕連接,這個是SELinux搞的鬼,我們在此乾脆關閉SELinux得了,不過生產環境不可以。
2.關閉SELinux:setenforce 0;永久關閉/etc/selinux/config中將SELINUX=enforcing改爲disabled
然後我們可以觀察其主配置文件:cat /etc/rndc.conf | egrep -v '^$|^#'
key "rndc-key" {
 algorithm hmac-md5;
 secret "GpZvEHkq/gnzsPg/GpWkkA==";
};
options {
 default-key "rndc-key";
 default-server 127.0.0.1;
 default-port 953;
};
3.然後將/etc/rndc.conf配置文件中指定密鑰複製到/etc/named.conf文件中即可。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章