我有一台 Linux 机器,它有两个不同的 NIC,连接到两个不同的网络,但它们共享相同的 IP 范围 (10.0.0.x)。我的第一个想法是使用虚拟化 (即 Xen),但我觉得这有点过头了,因为我想使用相同的程序,而不会因路由而发生冲突。
我想知道是否有办法将 NIC 限制在类似 shell 会话的东西中,以便从那里启动的所有程序都只使用该 NIC,就像启动只能看到 eth1 而看不到 eth0 的 bash 会话一样。
编辑:我想我正在寻找类似于 FreeBSD jails 的东西,但是适用于 Linux
答案1
如果两个独立网络的网络地址和子网掩码相同,则您的网络配置错误,从而违背了 IP 路由的基本目的。
我将对其中一个网络重新编号。
答案2
嗯,看来我的问题描述得不太好。 - @Darth Android 充其量,“配置错误”不足以描述这种情况:你说得对,这种情况会在路由表中产生冲突,但我正在尝试找到一种解决方案,即有两个路由孤立彼此隔离。另一种解决方案是使用代理 NAT,但在我看来,这比在 VM 中运行虚拟化的 Linux(如 Xen)要复杂得多。- @RedGrittyBrick 我不是想桥接两个独立的网络,而是想访问使用相同 IP 块的两个独立网络。
我找到了两个适用于 Linux 的 jails网络隔离,看来他们会耍花招:
Linux-虚拟服务器:http://linux-vserver.org/Welcome_to_Lin
答案3
你的问题听起来像是网络命名空间(url 是相关的,不是官方的)。截至撰写本文时,使用这项技术似乎相对较新,我发现很难找到简明的 HOWTO,这些 HOWTO 还可以解释每个命令的实际作用。谷歌搜索“ip netns”(带引号和不带引号)可能会找到最好的开始把各个部分拼凑在一起。
答案4
正如 Ikraav 所说,这是网络命名空间的工作。
我们将两个 NIC 所连接的接口称为eth-a
和eth-b
。
# Create the network namespaces
ip netns add net-a
ip netns add net-b
# Take interfaces up
ip netns exec net-a ip link set eth-a up
ip netns exec net-b ip link set eth-b up
# Assign the interfaces to the network namespaces
ip link set eth-a netns net-a
ip link set eth-b netns net-b
# Assign an address and network to the interfaces
# Assume IP is 10.0.0.1 for eth-a and 10.0.0.2 for eth-b
# The two can be set equal, if you want them to
ip netns exec net-a ip address add 10.0.0.1/8 dev eth-a
ip netns exec net-b ip address add 10.0.0.2/8 dev eth-b
# Packets to 10.0.0.3 going through eth-a, with a source of 10.0.0.1
ip netns exec net-a ping 10.0.0.3
# Or through eth-b, with a source of 10.0.0.2
ip netns exec net-b ping 10.0.0.3
如果您希望有一个接口作为不在网络命名空间内运行的程序的默认退出接口,只需将其分配给网络命名空间,并且不要在任何与其相关的命令前加上前缀ip netns exec net-*