我有一个服务器(Ubuntu / Debian)与两个ISP连接。 这两个WAN连接都有多个公共IP地址。
(big pipe)----eth0-->\ > server ---eth2--(internal) (cable pipe)--eth1-->/
在eth0上,我有4个IP分配给我,是更广泛/ 24子网的一部分。 24.xxx.xxx.xxx/24在eth1我有5个IP分配给我,但在这里我是唯一的一个/ 29(第六IP是我打的网关)71.xxx.xxx.xxx/29
我的目标是设置基于源/策略的路由,以便各个内部子网上的虚拟机/客户端(在eth2上有多个实际的VLAN)可以通过任何指定的WAN IP路由到互联网。
这是迄今为止我所做的。
首先,我在interfaces文件中configuration了eth0和eth1。
auto eth0 iface eth0 inet static address 24.xxx.xxx.66 netmask 255.255.255.0 network 24.xxx.xxx.0 broadcast 24.xxx.xxx.255 gateway 24.xxx.xxx.1 dns-nameservers 8.8.8.8 up /etc/network/rt_scripts/i_eth0 auto eth1 iface eth1 inet static address 71.xxx.xxx.107 netmask 255.255.255.248 network 71.xxx.xxx.105 broadcast 71.xxx.xxx.111 up /etc/network/rt_scripts/i_eth1
然后在BigPipe上的macvlan设备
#!/bin/sh #iface BigPipe67 ip link add mac0 link eth0 address xx:xx:xx:xx:xx:3c type macvlan ip link set mac0 up ip address add 24.xxx.xxx.67/24 dev mac0 #iface BigPipe135 ip link add mac1 link eth0 address xx:xx:xx:xx:xx:3d type macvlan ip link set mac1 up ip address add 24.xxx.xxx.135/24 dev mac1 #iface BigPipe136 ip link add mac2 link eth0 address xx:xx:xx:xx:xx:3e type macvlan ip link set mac2 up ip address add 24.xxx.xxx.136/24 dev mac2 /etc/network/rt_scripts/t_frontdesk /etc/network/rt_scripts/t_pubwifi /etc/network/rt_scripts/t_mail1 /etc/network/rt_scripts/t_scansrvc
CBL连接。 缺less的第五个IP(71.xxx.xxx.106)是一个不同的路由器坐在大楼里。
#!/bin/sh ip route add xxx.xxx.xxx.xxx/20 via 71.xxx.xxx.105 dev eth1 ip route add xxx.xxx.xxx.xxx/20 via 71.xxx.xxx.105 dev eth1 #iface CBL108 ip link add mac3 link eth1 address xx:xx:xx:xx:xx:c5 type macvlan ip link set mac3 up ip address add 71.xxx.xxx.108/29 dev mac3 #iface CBL109 ip link add mac4 link eth1 address xx:xx:xx:xx:xx:c6 type macvlan ip link set mac4 up ip address add 71.xxx.xxx.109/29 dev mac4 #iface CBL110 ip link add mac5 link eth1 address xx:xx:xx:xx:xx:c7 type macvlan ip link set mac5 up ip address add 71.xxx.xxx.110/29 dev mac5 /etc/network/rt_scripts/t_jenkins4 /etc/network/rt_scripts/t_skynet /etc/network/rt_scripts/t_lappy386
你会发现我在eth1上设置macvlan接口时,在主表上指定了几条路由。 我的主服务器上有同一个电缆服务提供商的其他路由器。 他们VPN到主服务器,而BigPipe用于其他任何东西(在主表)。
“t_”脚本用于为使用由macvlan接口设置的IP的各种服务/客户端设置单独的规则和表格。
简化,他们看起来有点像这样。
#!/bin/sh ip rule add from 172.23.1.6 table scansrvc ip route add default via 24.xxx.xxx.1 dev mac0 table scansrvc ip route add 24.xxx.xxx.0/24 dev mac0 table scansrvc ip route add 172.23.0.0/20 dev br1 table scansrvc
所以把这些放在一起,作为一个快速回顾,我已经得到了使用8个公共IP(BigPipe上的4个和CBL上的4个)的主服务器。 其中一个BigPipe IP和一个CBL IP被用于VPN服务,如果您愿意,可以有效地创build“贫民窟互联网交换”。 主表上存在该路由configuration。
然后剩余的6个IP被各种服务或客户使用,这些表是frontdesk,pubwifi,mail1,scansrvc,jenkins4,skynet和lappy386。
我伪装成所有公共IP到各个内部子网。
这是我刚才傻眼的地方…这一切都运作,直到它不。 这意味着,当我启动服务器时,所有设置都正确,我能够看到路由策略正在做他们应该做的事情。
因此,在scansrvc上,这是主服务器上的虚拟机,但具有内部IP(172.23.1.6/20)
waffle@scansrvc:~$ dig +short myip.opendns.com @resolver1.opendns.com 24.xxx.xxx.67
但是,一段时间后数据包停止返回到主服务器后面的虚拟机。 我可以看到在iptables防火墙统计,他们会离开我的networking,但不能让它回来。
当它工作,我从外面扫描,我可以看到服务端口,但在它死后,iptables甚至不会看到数据包进入。
另外,通过我的search,我开始阅读关于火星包。 所以我通过sysctl打开了那些日志logging。 哇。 我从BigPipelogin了大量的火星人,但是没有一个来自CBL,可能是因为BigPipe,我不是该子网中唯一的一个。
这是一个片段
Nov 22 08:59:03 srv3 kernel: [ 271.747016] net_ratelimit: 497 callbacks suppressed Nov 22 08:59:03 srv3 kernel: [ 271.747027] IPv4: martian source 24.xxx.xxx.43 from 24.xxx.xxx.1, on dev mac0 Nov 22 08:59:03 srv3 kernel: [ 271.747035] ll header: 00000000: ff ff ff ff ff ff cc 4e 24 9c 1d 00 08 06 .......N$..... Nov 22 08:59:03 srv3 kernel: [ 271.747046] IPv4: martian source 24.xxx.xxx.43 from 24.xxx.xxx.1, on dev mac2 Nov 22 08:59:03 srv3 kernel: [ 271.747052] ll header: 00000000: ff ff ff ff ff ff cc 4e 24 9c 1d 00 08 06 .......N$..... Nov 22 08:59:03 srv3 kernel: [ 271.747061] IPv4: martian source 24.xxx.xxx.43 from 24.xxx.xxx.1, on dev mac1 Nov 22 08:59:03 srv3 kernel: [ 271.747066] ll header: 00000000: ff ff ff ff ff ff cc 4e 24 9c 1d 00 08 06 .......N$..... Nov 22 08:59:03 srv3 kernel: [ 271.796429] IPv4: martian source 24.xxx.xxx.211 from 24.xxx.xxx.1, on dev mac0 Nov 22 08:59:03 srv3 kernel: [ 271.796440] ll header: 00000000: ff ff ff ff ff ff cc 4e 24 9c 1d 00 08 06 .......N$..... Nov 22 08:59:03 srv3 kernel: [ 271.796450] IPv4: martian source 24.xxx.xxx.211 from 24.xxx.xxx.1, on dev mac2
根据我对火星人的了解,我的假设是,在同一个子网上有多个接口可能导致数据包不能用于接口发送到那个接口…不知何故…(我想,因为他们已经得到不同的MAC地址将被缓解)
这会导致什么? 为什么当我刚刚启动系统,VMS将安装工作,直到所有的突然死亡后一段时间? (例如,如果我在scansrvc虚拟机上使ping运行到8.8.8.8,我会在死亡之前得到100-1000个响应)这可能是ARPcaching的问题吗? 这不像我正在重新分配任何IP到中途不同的MAC地址。
我卡住了。 我将开始学习一些tcpdump的技巧,试图澄清我可能丢失的东西。 如果任何熟悉networking设置的人都能指出我错过的任何东西,那将会是一个巨大的帮助! 🙂
错误消息是由数据包源validation引起的(请参阅内核代码 )。
我可以假设,在您的设置中,主路由表中直接连接的子网只有一条路由。 而当你通过其他接口(不是通过那个,主要路由表中的内容)从直接连接的子网接收到数据包时,这个数据包被识别为火星。
如何解决问题:
如何解决这个问题:
感谢安东的见解! 我真的很感激链接。
张贴logging:
我结束了所有接口(net.ipv4.conf.all.rp_filter)build议设置为松散模式的rp_filter,我发现即时客户端使用自己的路由表的行为如预期。 但是,使用主表的路由将不再在eth0上的24.xxx.xxx.0 / 24之外进行通信,即使设置了默认路由。 使用.default而不是.all以及在.default上启用arp_filter(我可以发誓我已经启用了它)取得了所需的结果,包括消除火星人。
.default和all都是我特有的,我必须仔细研究一下。 我很高兴它的工作!
我原来用macvlan,因为我觉得内核处理虚拟接口的方式。 通过在接口文件中声明eth0:0,我熟悉在单个接口上设置多个IP的方式。 引入一个完全独立的接口,使我能够更轻松地使用iproute2。 但是,也许有一个更清晰的方式,我有兴趣知道。
再次感谢您的帮助!