2010-12-12 124 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