2010-12-12 76 views
-1

路由器將使用上一跳的地址和目標MAC地址替換其接收的軟件包的源MAC地址和下一跳的地址。Linux內核路由器代碼替換MAC地址的位置

linux提供了一個作爲路由器工作的功能。我的問題是內核代碼在其包轉發過程中如何實現mac地址更新的功能?哪裏是代碼

這一部分,我試圖找到位於/ net/IPv4中的代碼,但沒有發現任何東西......

+2

我的理解是,在某些卡上,軟件不直接控制傳出數據包上的MAC。即你可以在ifconfig中設置它,但對於這樣的卡,它不是插入MAC的內核。因此,即使有這樣一個地方,它並不總是會被使用。 – asveikau 2010-12-12 20:48:48

+0

但我仍然認爲應該有一些內核代碼更改包的內容。一臺linux機器也可以作爲一個橋樑,在這種情況下,機器轉發/傳輸的MAC地址不會改變。在路由器的情況下,它被改變了,所以我認爲應該有內核可以選擇更新軟件包的地方 – 2010-12-12 21:09:55

回答

2

這不是實際發生的情況。

IP不依賴於以太網,所以會發生什麼取決於底層的底層協議。

如果它是本地發起的IP數據包,或者它已經被路由到另一個主機,則會發生同樣的情況。

Linux的IPv4堆棧並不依賴於以太網,實際上內核支持很多其他的鏈路層協議。 IP是WAN協議,您可以在不同的底層協議之間進行路由。一些例子是

  • PPP,SLIP(串行線)
  • PPTP,GRE(隧道,大多的VPN)
  • 的IP over ATM
  • 令牌環(主要是傳統的,我認爲)
  • 環回和虛設(用於本地通信只)
  • 無線上網的(雖然這實際上是大多相同的以太網)

那麼當將IP幀從一個以太網接口路由到另一個時,實際發生的情況是鏈路層完全被剝離,然後在路由後形成新的鏈路層。如果協議不是以太網,則會使用該協議的適當鏈路層數據包。

所以沒有人「改變MAC地址」,而是鏈路層數據包只是完全重建。

+0

好吧,那麼你介意告訴我在哪裏可以找到代碼,因爲linux內核重建了新的鏈路層幀/包頭?因爲我的目標是試圖找到一個方法來保持一個包的MAC地址在被一個linux路由器轉發時保持不變,唯一的辦法就是找到構建這個新鏈接層頭並修改其行爲的代碼.. – 2010-12-12 21:27:43

+1

我的印象是它是硬件特定的,因此每個設備驅動程序都有不同的表現。有些設備可能會在硬件中寫入一些頭文件。 – MarkR 2010-12-12 21:45:05