我有一个Centos路由器在类似这样的设置中做了一个惊人的工作:
我有ipv4转发启用允许intervlan路由,然后:
当任何一个eth0networking从互联网上寻找一些东西时,iptables做SNAT,使用从10.198.29.138到10.198.29.142的IP范围作为公共IP。 一切都很好。 问题是我需要VLAN接口192.168.200.1驻留在eth1中。 当我将它移动到ifcfg-eth1.200时,我可以看到在一个数据包捕获中,许多客户端试图通过询问哪个MAC地址属于192.168.200.1来填充它们的ARP表,但是eth1.200永远不会回复! 我看到其他eth0.XXX响应ARP广播,但不是200.它可能是一个iptables的东西,或其他?
我的iptables看起来像这样:
编辑/决议摘要 感谢DAVID HOUDE的评论
我可以在解决一个不同的问题的时候尝试一下自己,sysctl -w net.ipv4.conf.eth0 / 202.rp_filter = 0命令是干什么的:
SERVER <==eth0||eth1==> MAC FF:11 || MAC FF:22 IP 1.1.1.1 || IP 3.3.3.1
如果eth0收到3.3.3.1的ARP请求,SERVER默认不会回复它。 禁用反向pathfilter后,服务器回复ON eth0的ARP请求,说“嘿,IP 3.3.3.1在MAC FF:11上”,而实际上,它在eth1上。
然后下一个数据包到达eth0,目的地是MAC FF:11和IP 3.3.3.1,由于路由表,所有返回到3.3.3.x IP的数据都会从eth1出去,所以我的数据包在黑洞,但多数民众赞成在另一个故事。
就我而言,我有更多这样的东西:
SERVER <==eth0||eth1==> MAC FF:11 || MAC FF:22 <==eth0.200 || eth1.200==> IP 3.3.3.1 || IP 1.1.0.1 <==eth0.201 || eth1.201==> IP 1.1.1.1 || IP 3.3.3.9 <==eth0.202 || eth1.202==> IP 1.1.2.1 || IP 3.3.3.17 <==eth0.203 || eth1.203==> IP 1.1.3.1 || IP 3.3.3.25 <==eth0.204 || eth1.204==> IP 1.1.4.1 || IP 3.3.3.33
直到eth0.213。 问题是,正如你所看到的,1.1.0.0networking在eth1上,而3.3.3.0在eth0上,其余的networking都是反转的。
我希望从后来发现的sysctl命令中可以看出,如果RPF被禁用,SERVER将最终在eth1.200上回复请求1.1.0.1 MAC的ARP数据包,但不幸的是我无法确认。
我实际上可以确认此命令只能在受影响的子接口上运行,并且会立即应用这些更改。
Linux旨在响应任何接口上的ARP请求。 假设主机拥有IP地址,而不是特定的接口。 你所看到的叫做ARP Flux。
如果你的接口存在于同一个第二层广播域中,你会看到这个。 你提到你使用的VLAN应该不是这样,但这取决于VLAN被标记的位置(由操作系统或交换机等)。
您可以使用sysctl在Linux中更改此行为
arp_ignore – INTEGER
定义不同的发送回复的模式,以响应收到的parsing本地目标IP地址的ARP请求:
0 – ( 默认值 ):回复在任何接口上configuration的本地目标IP地址
1 – 仅在目标IP地址是入站接口上configuration的本地地址时才应答
2 – 仅当目标IP地址是入站接口上configuration的本地地址时才回复,并且发件人的IP地址都是来自此接口上相同子网的部分
3 – 不回复使用作用域主机configuration的本地地址,只回复全局和链接地址的分辨率
编辑:重新读你的问题后,这听起来像你可能需要禁用每个网卡的反向pathfilter。
sysctl -w net.ipv4.conf.eth0/102.rp_filter=0 sysctl -w net.ipv4.conf.eth0/103.rp_filter=0