isos系统工作笔记2

ISOS对数据包的处理流程

ISOS中,没有提供一个像linux中那样真正的loopback接口。

一个IP包,由底层驱动接收了以后,发送到ip进程,主要的流程如下:

 

 

硬件收到数据包,驱动程序发送信号MSG_N_CYAN_RECV

 

l2_cyan_proc.cmain()收到MSG_N_CYAN_RECV信号

 

l2_cyan_proc.c 中的p_if->upcall();根据不同的第二层协议号调用上层接收函数(例如,是以太网协议,就调用以太网接收函数)

 

l2_cyan_lib.c 中的l2cyan_rxEth()  Ethernet接收函数,它根据不同的第三层协议调用rx_entry->upcall,如协议号为800就调用ip接收函数IPIF_Receive

 

ipif.c 中的IPIF_Receive()   ip接口接收函数,对ip包进行初步的检查,然后调用挂在该接口上的钩子函数p_if->f_IPReceiveFilter,对进入该接口的ip包进行过滤

注意:防火墙及DNAT的所有操作都是由这个钩子函数开始的(防火墙的流程在最后描述)

(例如,设置了DMZ,则所有发往DUT WAN接口IP地址的数据包都会在此被DNAT,发往DMZ主机。    然而,挂在不同接口上防火墙和NAT规则是不同的,一般,内网接口(如192.168.1.1)不会对输入的ip包进行过滤)

在对ip包进行过滤之后,IPIF_Receive()调用ipif_Forwardip包进行转发

 

ipif.c 中的ipif_Forward   ip包接口转发函数 ,根据ip包的属性(单播,多播,广播),选择不同的转发函数 p_O->f_Forward()

 

ipforw.c中的IPFW_Forward(),单播ip包的转发程序,其中,判断ip包的目的地址是否是本DUT的地址,如果是,则调用本地ip接收程序ipfw_LocalReceive()

 

分两种情况:

1.     发往本DUT的数据包:ipfw_LocalReceive()调用sendmessage(m, MSG_N_IPSTACK_IP_RECEIVE, rawip->iplocal_qid); ,通知iplocal进程接收数据包,此ip包的接收转发流程就此结束。

 

2.       其他数据包:ipfw_LocalReceive()调用IPIF_Transmit(),对ip包进行发送

 

ipif.c中的IPIF_Transmit() ip包发送函数,判断ip包是否需要分成几个fragment来发送,然后根据网络接口的类型调用该接口的发送函数p_if->f_IntTx(),比如,是ethernet接口,则调用IPIF_TransmitEth()

 

ipif.c中的IPIF_TransmitEth(),以太网接口发送函数,如果在arp表中找得到目的ip,则调用p_if->f_Transmit,根据不同的接口,调用该接口的发送函数

如果找不到arp,则调用sendmessage(m, MSG_N_IPSTACK_ARP_RESOLVE_EXCEPT, p_O->iplocal_qid);,请求iplocal进程解析该ip地址

 

 

总的来说,因为发往DUT WANip的数据包(如bug描述中提到的)直接在ip转发流程中,被ipfw_LocalReceive()接收了,此ip包也不在继续转发。因此,没有实现真正意义上的LOOPBACK功能。

 

(注:其实在ip协议栈的创建的过程中,程序会为它创建一个loopback接口,地址为127.0.0.1,但是凡是发网该接口的ip包,同样会被一个IPIF_IP_Receive()函数接收,然后直接发往本机进程。并且,这个接口在ip包转发过程中没有被使用,而不是像linux那样先查路由表,然后把发往本地的数据包都发到loopback端口)

 

要实现类似linuxloopback功能,可以有两种修改方法(已实现第一种方法):

 

1.  ipforw.c中的IPFW_Forward(),如果判断数据包是发往DUT WANip地址,则根据ip包的目的地址,再调用一次IPIF_Receive(),对于路由器来说,这个数据包就好像是从WAN口接收过来的一样,wan接口的防火墙规则就会对其进行DNAT,然后由IPFW_Forward()发往DMZ主机

 

2.  IPFW_Forward()判断是发往DUT WANip地址的数据包,则把ip包发往loopback接口(127.0.0.1),然后loopback接口的处理程序跟上面一种方法一样。

 

 

经修改后,发往路由器WAN ip的数据包,已经可以被转发到DMZ主机,但是还有一个问题:由于转发的数据包只是做了DNAT,源地址不变,所以DMZ主机收到IP包后,按照源地址进行应答,直接把应答的IP包由内网发送到其他PC机。虽然应答的IP包可以到达内网PC,但是由于源地址不是PC机所期望的路由器WANip,因此,认为此ip包是无效的。

你可能感兴趣的:(工作,linux,网络,防火墙,路由器)