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

前端之家收集整理的这篇文章主要介绍了Linux中同一子网上有两个网络接口和两个IP地址前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近遇到了一种情况,我需要在分配给一个 Linux主机的同一子网上使用两个IP地址,以便我们可以运行两个SSL / TLS站点.我的第一种方法是使用IP别名,例如使用eth0:0,eth0:1等,但是我们的网络管理员有一些相当严格的设置,以确保安全性压扁了这个想法:

>他们使用DHCP侦听,通常不允许静态IP地址.静态寻址是通过使用静态DHCP条目完成的,因此相同的MAC地址始终获得相同的IP分配.如果你问这个功能并且你有理由可以禁用每个switchport这个功能(谢天谢地,我和网络人员有很好的关系,这并不难).
>在交换机端口上禁用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).

解决方法

是的,更好的方法是构建一个合适的业务案例,让他们放松交换机上的规则,以便在一个NIC上拥有多个IP.

猜你在找的Linux相关文章