数据包不能进入FORWARD链

首先,这不是一个日常的路由问题。 设置相当复杂,所以让我先说明一下。

我有一个路由器,让它保持简单,3个接口。 eth0,eth1,eth2。 eth2用于pppoe。 eth0和eth1有客户。

好,到目前为止,所有的基本..现在来了棘手的事情:我在eth0和eth1上创build了一堆macvlan接口,名称模式是:

g1eth0 : g1 for gate1, eth0 indicates on what physical interface its laying on 

我为每个上行链路提供了3,1个pppoe和2个VPN。 然后这些合并成门后命名的桥梁。

到目前为止,我们有这些接口:

 <iface>:<description> eth0 : our 1st subnet is here eth1 : our 2nd subnet is here eth2 : our pppoe is hooked here ppp0 : our pppoe uplink tap0 : our vpn1 uplink tap1 : our vpn2 uplink g1eth0 : advertised gate over uplink1 on clients in eth0 g1eth1 : advertised gate over uplink1 on clients in eth1 g2eth0 : advertised gate over uplink2 on clients in eth0 g3eth1 : advertised gate over uplink3 on clients in eth1 gate1 : bridge containing g1eth0 and g1eth1 gate2 : bridge containing g2eth0 gate3 : bridge containing g3eth1 

正如我所说,一堆接口…请注意,上行链路可以通过几个物理接口进行广告,这就是为什么我们得到了桥梁。

好了,现在让我们看看路由规则:

 32763: from all fwmark 0x3 lookup 202 32764: from all fwmark 0x2 lookup 201 32765: from all fwmark 0x1 lookup 200 

好吧,这不是很壮观,显然,它只是检查一个包装的FWMARK,并将其推到相应的桌子上。

路由表:

200: default via 1.2.3.4 dev ppp0 src 4.3.2.1

201: default via 5.6.7.8 dev tap0 src 8.7.6.5

202: default via 9.10.11.12 dev tap1 src 12.11.10.9

好的IP只是为了填补空白,你应该熟悉的语法;)

现在我们得到了路由表,路由规则和接口 – 但是我们错过了pkg标记,所以这是在iptables中完成的:

 iptables -t mangle -A PREROUTING -i gate1 -s 10.0.0.0/16 -j MARK --set-xmark 0x1/0xffffffff iptables -t mangle -A PREROUTING -i gate2 -s 10.0.0.0/16 -j MARK --set-xmark 0x2/0xffffffff iptables -t mangle -A PREROUTING -i gate3 -s 10.0.0.0/16 -j MARK --set-xmark 0x3/0xffffffff 

好的解释,我们标记所有pkgs在路由规则的正确的价值在我们的桥梁。

现在我还必须在arp_announcearp_ignore进行一些调整,以便为g*eth*广告正确的MAC。 这个post越来越满,所以我会跳过这个描述,都设置为2

filter:FORWARD链现在是空的,它只logging它得到的pkgs。

现在NAT: iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -j MASQUERADE

所有iptables的默认策略都是ACCEPT

tcpdump显示,根据g*eth* ,包含的pkgs被引导到正确的MAC地址。

mangle:PREROUTING计数器的规则增量,因为他们应该。

ip_forwardvalidation为1

filter:FORWARD计数器不递增。

我在每个链条上都有了LOG规则,但是pkgs一旦通过了mangle:PREROUTING好像消失了mangle:PREROUTING

任何想法为什么?

除此之外,我在PREROUTING中提出了一条TRACE规则,讽刺的是,它并没有显示我的客户正在运行的任何ping命令。

另外二 :在玩过规则,跟踪,promisc之后…我注意到我看到数据进入ethX而不是gateX 。 似乎brigde接口只是放弃它,难怪内核不能把它推进。

为什么我的桥接接口这样做?

 bridge name bridge id STP enabled interfaces gate1 8000.dead000200b5 no g1eth0 g1eth1 

由于反向path过滤,它可能被阻塞。

尝试closures它: http : //tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.kernel.rpf.html