通过防火墙路由两个网卡之间的stream量

我试图使用一个Linux机箱testing一个networking设备(防火墙),有两个网卡,一个接口连接到WAN区域,另一个接口连接到LAN区域。

configuration与此类似

|ETH0| <-> | FW | <-> ETH1 

所以从这两个接口我都能够ping相应的防火墙接口。 但是我无法开火

  ping -I eth0 ip.from.eth1 

并得到任何答案。

这是可能的,或者我应该使用Linuxnetworking命名空间解决scheme或任何用户级别的TCP堆栈(虚拟机是没有问题的)

使用networking名称空间解决scheme。 当然。 这是要求的。

试图做其他任何事情都必然会失败,除非你有足够的知识来解决local表和策略路由,使其工作。 在接口上发送任意垃圾是一回事,让其他接口按照你想要的方式响应是真正的问题:内核会立即在local路由表中识别出自己的IP,这是默认查询的第一个表看ip rule )。 请注意,手册页说(或习惯说),该表不能修改,规则不能改变,但可以完成,但你的里程可能会有所不同。

所以为了使它在没有命名空间的情况下工作,你需要这些丑陋的黑客,它们不能保证工作(而我没有testing过):

  1. 将本地表移到更高的优先级。 请注意,手册页说这是不可能的。

     ip rule add prio 100 lookup local ip rule del prio 0 

    请注意,解决这个规则是快速打破所有networking连接的方法。 如果本地表不存在,内核将无法识别其IP地址,因此您甚至不能ping 127.0.0.1。

  2. 为两个接口创build两个路由表。 让我们来决定表10是eth0和11 eth1。 创build到另一端的路由。

     ip route add eth1's ip dev eth0 table 10 ip route add eth0's ip dev eth1 table 11 
  3. 现在添加这些表的规则。 我们发送的任何东西(例如,意思是“本地生成的”)意味着eth0的IP应该使用表10.确保优先级小于lookup local的优先级。

     ip rule add from eth0's_ip iif lo lookup 10 prio 10 ip rule add from eth1's_ip iif lo lookup 11 prio 11 

这应该足以做你想做的事情,至less在IP层面上。

只是为了了解发生了什么:

  • 当内核收到来自eth0接口的icmp echo数据包,从eth1的IP到eth0的IP,它将首先查找目的地址,以确定这个目的地IP是否是它自己的(或者,如果不是,数据包应该被转发的地方)。 所以它看起来符合我们的两条规则,看到它们不匹配(数据包没有被发送,它们被接收,所以iif lo失败),然后回退到local表,这是以前的首先。 那个local表告诉我们,eth0的IP实际上属于这个主机,所以它可以处理它。
  • 内核产生一个响应,然后继续路由这个响应。 响应是在本地生成的icmp echo reply数据包,eth0的IP作为源地址,eth1的IP作为目标地址。 因此,我们from eth0's_IP iif lo规则匹配,查询table 10 ,这表示通过eth0路由eth1的IP。 如果我们的规则不存在,内核就会查找local表,它说eth1的IP属于这个主机,所以这个数据包将会通过回送接口。

现实比这更复杂一点。 例如,内核通常被configuration为进行反向path过滤,因此,在接收到来自eth0的数据包时,如果我们反转源地址和目的地址并执行路由,则会检查所得到的数据包应该通过eth0路由,如果不是,则该地址被认为是伪造的,并且该数据包被丢弃。 如果你的路线是对称的,幸好在这种情况下,这不是问题。 内核也可以直接查询local表,而无需咨询策略路由数据库(ip规则)作为优化。 如果它在处理数据包的任何时候都这样做,那么你就被搞砸了。

编辑:如果你真的想这样做,你可能想要激活sysctl旋钮“accept_local”。 这是内核直接查询local表而不询问的一种情况。

所以真的,不要这样做。 使用networking名称空间解决scheme。 这是保证工作。 只需将其中一个接口移动到其他名称空间,并将每个名称空间configuration为像通过该防火墙交谈的两个单独的主机一样。

唯一能想到的方法就是设置静态路由,使其每个networking的度量值都比默认路由低,以便通过防火墙到达其他适配器。 例如(我在一个Windows框但是):

 ROUTE ADD <eth0 network> MASK <eth0 mask> <eth1 gateway> METRIC <low value> IF <eth1> ROUTE ADD <eth1 network> MASK <eth1 mask> <eth0 gateway> METRIC <low value> IF <eth0> 

不过,如果这样做,我会感到惊讶,因为它看起来像操作系统将在某种程度上知道更好地做这个或这只是打破了所有的路线…