最近,我遇到了这样的情况:我需要在分配给一个Linux主机的同一子网上使用两个IP地址,以便我们可以运行两个SSL / TLS站点。我的第一种方法是使用IP别名,例如使用eth0:0,eth0:1等,但是我们的网络管理员对安全性设置了一些相当严格的设置,从而压制了这个想法:
- 他们使用DHCP监听,通常不允许使用静态IP地址。静态寻址是通过使用静态DHCP条目完成的,因此相同的MAC地址始终获得相同的IP分配。如果您有要求,可以在每个切换端口禁用此功能(原因是我与网络人员的关系很好,这并不难做到)。
- 在交换机端口上禁用DHCP侦听的情况下,他们必须在交换机上制定一条规则,即允许该MAC地址X具有IP地址Y。不幸的是,这样做的副作用还在于,仅允许MAC地址X具有IP地址Y。IP别名要求为MAC地址X分配两个IP地址,因此这不起作用。
在交换机配置上可能已经有解决这些问题的方法,但是为了保持与网络管理员的良好关系,我尝试寻找另一种方法。拥有两个网络接口似乎是下一步的逻辑。幸运的是,该Linux系统是一台虚拟机,因此我能够轻松添加第二个网络接口(无需重新启动,我可能会添加-非常酷)。几次击键后,我启动了两个网络接口并运行,并且两个接口都从DHCP提取了IP地址。
但是随后出现了问题:网络管理员可以看到(在交换机上)两个接口的ARP条目,但是只有我提出的第一个网络接口才能响应ping或任何类型的TCP或UDP流量。
经过大量的挖掘和戳戳后,这就是我的想法。它似乎可行,但是对于看起来应该很简单的某些事情,它似乎也需要大量工作。还有其他想法吗?
步骤1:在所有接口上启用ARP过滤:
# sysctl -w net.ipv4.conf.all.arp_filter=1
# echo "net.ipv4.conf.all.arp_filter = 1" >> /etc/sysctl.conf
从Linux内核文档中的文件networking / ip-sysctl.txt中:
arp_filter - BOOLEAN
1 - Allows you to have multiple network interfaces on the same
subnet, and have the ARPs for each interface be answered
based on whether or not the kernel would route a packet from
the ARP'd IP out that interface (therefore you must use source
based routing for this to work). In other words it allows control
of which cards (usually 1) will respond to an arp request.
0 - (default) The kernel can respond to arp requests with addresses
from other interfaces. This may seem wrong but it usually makes
sense, because it increases the chance of successful communication.
IP addresses are owned by the complete host on Linux, not by
particular interfaces. Only for more complex setups like load-
balancing, does this behaviour cause problems.
arp_filter for the interface will be enabled if at least one of
conf/{all,interface}/arp_filter is set to TRUE,
it will be disabled otherwise
步骤2:实施基于源的路由
我基本上只是按照http://lartc.org/howto/lartc.rpdb.multiple-links.html的指示进行操作,尽管编写该页面时的目标是不同的(与两个ISP交易)。
假设子网为10.0.0.0/24,网关为10.0.0.1,eth0的IP地址为10.0.0.100,eth1的IP地址为10.0.0.101。
在/ etc / iproute2 / rt_tables中定义两个名为eth0和eth1的新路由表:
... top of file omitted ...
1 eth0
2 eth1
定义这两个表的路由:
# ip route add default via 10.0.0.1 table eth0
# ip route add default via 10.0.0.1 table eth1
# ip route add 10.0.0.0/24 dev eth0 src 10.0.0.100 table eth0
# ip route add 10.0.0.0/24 dev eth1 src 10.0.0.101 table eth1
定义何时使用新路由表的规则:
# ip rule add from 10.0.0.100 table eth0
# ip rule add from 10.0.0.101 table eth1
DHCP已经处理了主路由表(在这种情况下甚至还不清楚它是否绝对必要),但是它基本上等同于此:
# ip route add default via 10.0.0.1 dev eth0
# ip route add 130.127.48.0/23 dev eth0 src 10.0.0.100
# ip route add 130.127.48.0/23 dev eth1 src 10.0.0.101
瞧!一切似乎都正常。将ping发送到两个IP地址都可以正常工作。将ping从该系统发送到其他系统,并强制ping使用特定的接口可以正常工作(ping -I eth0 10.0.0.1
,ping -I eth1 10.0.0.1
)。最重要的是,往返于任一IP地址的所有TCP和UDP通信都按预期方式工作。
同样,我的问题是:是否有更好的方法来做到这一点?对于一个看似简单的问题,这似乎需要大量工作。
更新: 上面的解决方案最终不完整。如果流量保持在同一子网中,则一切正常,但是使用第二个接口与其他子网的通信将无法正常进行。我没有去挖一个更大的坑,而是与网络管理员交谈,让他们为一个接口允许多个IP地址并使用IP别名(例如eth0和eth0:0)。
ip
from iproute2
将多个地址添加到同一接口。