Linux中同一子网上的两个网络接口和两个IP地址


22

最近,我遇到了这样的情况:我需要在分配给一个Linux主机的同一子网上使用两个IP地址,以便我们可以运行两个SSL / TLS站点。我的第一种方法是使用IP别名,例如使用eth0:0,eth0:1等,但是我们的网络管理员对安全性设置了一些相当严格的设置,从而压制了这个想法:

  1. 他们使用DHCP监听,通常不允许使用静态IP地址。静态寻址是通过使用静态DHCP条目完成的,因此相同的MAC地址始终获得相同的IP分配。如果您有要求,可以在每个切换端口禁用此功能(原因是我与网络人员的关系很好,这并不难做到)。
  2. 在交换机端口上禁用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.1ping -I eth1 10.0.0.1)。最重要的是,往返于任一IP地址的所有TCP和UDP通信都按预期方式工作。


同样,我的问题是:是否有更好的方法来做到这一点?对于一个看似简单的问题,这似乎需要大量工作。


更新: 上面的解决方案最终不完整。如果流量保持在同一子网中,则一切正常,但是使用第二个接口与其他子网的通信将无法正常进行。我没有去挖一个更大的坑,而是与网络管理员交谈,让他们为一个接口允许多个IP地址并使用IP别名(例如eth0和eth0:0)。


要记住的主要区别是IP不属于接口,它属于机器。因此,在此设置中为任何一个IP发送一个接口都是正确的,因此为什么这样做就需要一些技巧。
MikeyB

我认为在这种情况下不需要源路由,因为arp过滤仅应在交换机发送到接口/必须在其端口中找到它时才应用。我可能是错的,但是当机器向交换机发送数据时,不检查源字段(IP标头)中的IP,仅检查arp发送数据包。
AndreasM 2011年

MikeyB是正确的,源路由是唯一的方法。机器可以选择要发送流量的任何出站接口,只要它在同一子网中即可。IP是否确实位于该接口上并不重要。
Patrick

2
AndreasM:问题不是传入数据包,而是传出数据包。如果没有源路由,则所有传出数据包都将使用默认路由,该默认路由绑定到一个接口或另一个接口。即使传出的数据包将具有正确的源IP地址,但由于该IP地址不属于该接口的MAC地址,因此交换机上的筛选器将不允许它们出去。对于交换机而言,它看起来像一个客户端正试图欺骗另一个客户端的IP。(这些是智能第3层交换机)。
Scott Duckworth

IP别名已过时且容易破解,不能反映现实,更不用说取消主别名将删除所有别名。使用ipfrom iproute2将多个地址添加到同一接口。
pilona

Answers:


8

是的,更好的方法是建立适当的业务案例,并让他们放宽交换机上的规则,以便您可以在一个NIC上拥有多个IP。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.