1. 程式人生 > >兩臺不同網段的PC直連是否可以相互ping通

兩臺不同網段的PC直連是否可以相互ping通

 

修訂:

關於rp_filter的作用,本文的內容會有些容易引起誤解的地方,如果你親自試過配置,就會發現即便不配置rp_filter,也不妨礙兩者互通,所以我加了一個配置說明來消除這個誤解,請留意。

 

本文描述的是一道擡槓題,但我希望不屑於配路由的程式設計師看了題目後先不要擡槓,先看看自己是不是能用不到5分鐘的時間解答這個問題,期間不許查閱資源。

問題我就不詳述了,請參見《 兩臺不同網段的PC直連是否可以ping通》,但是為了防止這篇文章的連結失效,我還是簡單表述:
主機一配置:
eth0:1.1.1.1/32
主機二配置:
eth0:2.2.2.2/32
主機一和主機二的eth0用一根網線直連,不必在意是交叉線還是直連線,它們是自協商的,這不是較真兒點。
問題是:
在兩臺主機都不新增任何新的IP地址的前提下,主機一和主機二可以相互ping通嗎?
-------------------
常規的答案肯定是,不能ping通,理由無非就是“兩個地址不在同一個網段”之類云云。但我的答案卻是,完全可以ping通,只要有路由即可!

-------------------

我以Linux為例來使其相互ping通,配置如下:

主機2.2.2.2上的配置:
ip route add 1.1.1.1/32 via 1.1.1.1 dev eth0 onlink
net.ipv4.conf.eth0.rp_filter設定為0:sysctl -w net.ipv4.conf.eth0.rp_filter=0
主機1.1.1.1的配置:
ip route add 2.2.2.2/32 via 2.2.2.2 dev eth0 onlink
net.ipv4.conf.eth0.rp_filter設定為0:sysctl -w net.ipv4.conf.eth0.rp_filter=0

至於Windows怎麼配置,王姐姐告訴我不需要任何配置,直接配了路由就可以通,我沒有親自試,所以不深入討論,以下的討論全部針對Linux。

配置說明:

其實net.ipv4.conf.eth0.rp_filter是不需要配置的,僅僅配置路由即可,我之所以列舉出net.ipv4.conf.eth0.rp_filter配置為1,是因為本文的問題其實包含兩個方面,首先是要想啟動傳輸,必須要有路由,且僅僅有路由即可,其次,要想完成傳輸,必須要進行下一跳解析,逐級向下解析下層的地址,本例中就是arp解析MAC地址,這兩個方面從下往上看是遞迴進行的,缺一不可,然而從下往上看,只要配置了路由,arp也會

自然而然完成,然而問題就出在這裡,很多人都覺得這是自然而然完成的一個過程,但其實如何分開講的話,你會學到更多的東西。以從1.1.1.1來ping 2.2.2.2為例,如果2.2.2.2上沒有配置到1.1.1.1的onlink路由,顯然是不通的,但是這並不意味著arp無法完成,事實上,arp是可以完成的,即便沒有路由也是可以完成的。詳見下面rp_filter的作用解析

-------------------

這就是答案,即便直連的兩臺機器配置的IP地址不屬於同一網段,也可以相互ping通,關鍵是要有路由!TCP/IP協議族雖然不像OSI/RM那麼和諧融洽,至少也是一套分層體系架構模型,層與層之間要做到儘可能互不牽涉,本題中可見一斑,三層互通,關直不直連鳥事啊?!直連不直連,那是鏈路的事情,與IP層無關。
-------------------
要成功秒解這個問題,需要的知識點並不多,但是卻很深入,包括:
1.onlink路由是幹什麼的?
onlink路由是可以直接arp目標地址的,而不是arp下一跳地址。意思就是說,目標地址是屬於跟本地直連的二層鏈路上,不跨三層。既然是不跨三層的鏈路,arp就可以暢行無阻,而標準中又沒有規定arp協議包的請求源和請求目標必須是同一個網段的地址(甚至都沒有掩碼約束),所以說,一個以下的arp請求是有效的:
源地址1.1.1.1請問,地址為2.2.2.2的網絡卡的MAC地址是多少?
好了,arp已經可以發出了,問題是當2.2.2.2網絡卡收到arp之後,該如何反應呢?

2.rp_filter如何起作用?

為了解釋rp_filter的作用,我先假設刪除主機2.2.2.2上到達1.1.1.1的路由,此時雖然2.2.2.2的eth0能收到來自1.1.1.1的arp請求,問題是它會迴應嗎?

        地址為2.2.2.2的網絡卡收到arp請求之後,會執行arp處理。由於arp是廣播發送,因此只要不跨三層的鏈路上所有的主機都能收到這個arp請求,所以每一個主機首先它會檢查這個arp是不是發給自己的,檢查的辦法很簡單,就是執行一次路由查詢!注意,就是路由查詢而已。

        路由查詢的目標IP就是arp的目標IP,如果路由查詢結果的路由項屬性是本地地址,那麼就說明請求的目標IP就是本機,這個arp請求就是發給自己的。到此為止,好像問題沒有了,收到的arp請求的是本機IP地址,照理說本機理應迴應一個arp repy了。是這樣嗎?
        如果使用的是Linux,在預設情況下,這次路由查詢將失敗!But why?

        因為預設Linux針對每個網絡卡啟用了rp_filter選項,這個選項是使能的是反向路由查詢,即針對收到資料包的源地址做路由查詢,如果查詢結果的出口網絡卡不是收到資料包的網絡卡的話,查詢將失敗。在本例中,主機2.2.2.2在eth0收到了來自1.1.1.1的arp請求,那麼針對1.1.1.1做路由查詢,非常抱歉,沒有找到路由,所以rp_filter驗證將失敗!因此arp reply將不會被髮出。

        在本例中,由於主機2.2.2.2已經配置了到達1.1.1.1的onlink路由,所以說查詢是成功的,問題是你要知道這是如何成功的。

        要想arp reply被髮出,禁用掉rp_filter,讓路由查詢通過,隨後arp reply就發出了。arp既然已打通,onlink路由也配置了,那麼自然路就通了。盡情ping吧!
3.arp_ignore/arp_filter又如何?
稍微知道點Linux網路疑難雜症的可能會往arp_ignore,arp_filter的路子上走,其實這個思路是對的,只是本例沒有把事情搞的這麼複雜。我來換個例項。主機一配備兩塊網絡卡,分別為eth0和eth1,分別插有網線。主機一的eth1配置IP為1.1.1.1/32,而不再是eth0配置該地址,然而依然是eth0與主機二的eth0直連,主機二的eth0依然配置地址2.2.2.2/32。事情會怎樣?這個時候你就不得不考慮arp_ignore,arp_filter了...詳情如何,我想溫州老闆可以搞定。
-------------------
溫州皮鞋廠老闆看了這個問題,以為這種問題毫無意義,然而如果我要來面試的話,我絕對會問這種問題,當然,我會給出個5分鐘時間讓面試者思考,理清知識點,但也僅僅有5分鐘時間,且期間不許查閱資料。
        能把這個問題回答正確的人,肯定是對Linux協議棧的實現理解非常透徹的人,這個問題的完美回答(如果不是提前準備的話)並不僅僅意味著答題者是一個好的運維,好的技術支援,而是可以表明答題者可以秒殺80%以上的研發人員。很多人會把這種配路由的操作看作是十分低等的外圍操作,認為沒法跟那些精讀TCP協議實現的人比,其實真實情況恰恰反過來,聲稱自己精通Linux核心TCP實現的人並不一定真的懂網路,他可能只是能看懂程式碼而已,有很多寫過書的那些人,其實基本原理都不懂,恰恰那些配路由的人,常常被認為是運維,配網路,搬機器上架,扭螺絲的人懂得可能反而更多。
-------------------
程式設計師被慣壞了。作為一種職業,跟學生時代沒有任何區別,甚至連學生們的懷疑精神,動手能力都沒啦。往往書上怎麼講,就怎麼記,書上寫的就一定對嗎?寫書的人就一定懂嗎?
        如今太多的程式設計師非常浮躁,懂的名詞特別多,但實際上也就是懂一些名詞,成功搭建起一個環境就覺得了不得,就覺得精通了,其實還差的很遠。有一篇文章寫的比較好,我比較贊同,我就直接引用了,也省了我自己的筆墨《 “全棧”工程師 請不要隨意去做》。雖然這篇文章也有吐槽之嫌,但看得出是分分鐘的真情實感,跟我之前那些類似的文章一樣,踩的人比頂的人多,這說明什麼?這說明當今程式設計師被別人說不得不好,只能誇,不能損,自以為自己高大上,其實自己心裡明明有壓力就是不說,頂著壓力自己還不努力,然後還倔強,還擡槓,時不時抖機靈,如果魯迅活著,我就歇息了。
        我從2007年開始到現在,在地鐵上看了兩大書架的書,這裡一個書架是5X5的方格書架,宜家畢利的那種,書目包括但不限於世界歷史,網路技術,程式設計,網際網路行業,機械工程,社會評論等,我唯獨不看的三類書是時政,英語,小說。我看書有個習慣,一書未畢,不讀新書,完全序列的,而且為了便於批註,我只讀紙質的書(顯得非常老土)...我已經把路上的時間當成了我的讀書時間,同時我把長春,上海,深圳三座城市的主幹交通線當成了自己的圖書館,堅持了10年,我很自豪很有成就感,比那些在一線城市買了房子獨居一處的自豪多了(其實我在上海也買了房子,只是暫時在深圳工作而已)。在我這幾年的學習生涯裡,我偶爾會注視與我同行的人,不管在長春,上海,還是在深圳,我每天總是在地鐵上(家裡有車,但我沒有駕照,也永遠不會考那個,我家的車我老婆開,開那玩意兒太耽誤時間,沒有意義)遇到幾乎相同的人,也有看書的人,但是說實話,我沒有看到過一個能把一本書看完的,往往都是看完第一章前幾頁就換了:
2010年,上海2號線,有人看《演算法導論》,看了一週之後換了《設計模式》,此後細節不知...
2012年,上海2號線,有人看《Java程式設計思想》,看了有大概一週多,換成了手機...
以上兩者都是捲髮。
2013年,上海地鐵11號線,有個女的看《全球通史》,看了兩週,改成了手機...
2013年,上海地鐵11號線,有人看《羅馬人的故事》,第二天就改成了手機...
...期間加班,沒日沒夜,後來公司搬家了,通勤線經過的都是廠房,工地,也就沒有看書的了...
2016年,深圳蛇口線,有人看《設計模式》,不到一週換成了手機...
2017年,深圳羅寶線,幾乎沒有人看書,有同事說有人看《史記》被鄙視...
-------------------
如果喬布可以改變世界,那麼他為什麼不能改變自己,改變自己的基因?所有搞IT的人,至少目前無能為力。那麼,如果程式設計師得了癌症,他必須求助於醫生,而無法靠程式設計解決!
...................................................................

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://www.cnblogs.com/captainbed