使用两个独立的子网(每个子网位于不同的VLAN)设置具有两个NIC的服务器,

我正在使用Ubuntu 14.04(标准服务器安装+ OpenSSH,biosdevname = 0在安装过程中保持简单的networking名称)在一个环境中,我有两个不重叠的子网M和N在不同的VLAN上。

为了debugging其中一个子网上的问题,我想configuration我的服务器,使其可以从子网M上的IP接收eth0上的stream量,并从子网N上的IP上接收eth1。

我知道我只能有一个网关,所以我使用从子网M的网关。我设置了/ etc / network / interfaces,使得子网M完全由IP ABC42(正常工作)和从子网N指定select一个IP地址XYZ88,并为该子网提供适当的networking掩码(它根本不与子网M重叠)。

我可以通过sudo ip addr flush dev eth1; sudo ifdown eth1; sudo ifup eth1 sudo ip addr flush dev eth1; sudo ifdown eth1; sudo ifup eth1 sudo ip addr flush dev eth1; sudo ifdown eth1; sudo ifup eth1 …这似乎工作,我的路由表是:

 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 ABC1 0.0.0.0 UG 0 0 0 eth0 ABC0 0.0.0.0 255.255.255.192 U 0 0 0 eth0 XYZ64 0.0.0.0 255.255.255.224 U 0 0 0 eth1 

请注意,适配器是有效的,每sudo lshw -c network等工作。

此时, 假设子网N上没有阻塞 ,我应该能够通过子网N(使用IP XYZ88)ping或ssh到此服务器? (IP ABC42的子网M肯定有效。)如果没有,我缺less什么明显的步骤/testing?

(我在这里和其他地方看到过类似的问题,但到目前为止还没有发现有这样的configuration(例如完全独立的子网)。我真的试图确定子网N是否阻塞了stream量或者是否正在运行。 )

那么有一些事情可以testing。

首先,在你的主题你写关于vlans。 服务器是否连接到交换机? 如果是这样,端口是否正确configuration在正确的VLAN(访问端口?)等…

你的服务器是虚拟机吗? 虚拟网卡(ESX fe上的端口组)是否正确configuration了VLAN?

第二:你的服务器能够到达子网N IP范围内的其他设备吗?

第三:服务器上是否安装了防火墙? 如果是这样,它允许沟通来自或去子网N?

第四:对于SSH,SSH服务器是监听任何地址,还是configuration为只监听子网M的IP?

对于更多的debugging,你可以使用像tcpdump或tshark。 这将允许您检查stream量是否实际到达服务器。

事实上,答案并不像我想象的那么混乱,但并不明显。

很显然,天真地添加路由+第二个网关不起作用(也不应该工作 – 你不能有这样的多个网关):

 sudo ip route add XYZ64/27 via XYZ65 dev eth1 RTNETLINK answers: File exists 

一位朋友向我指出了一个描述如何处理类似情况的页面 。 底线:你需要创buildIP规则, 然后你可以添加第二个网关。

假设你有一个当前的操作系统和内核iproute2,并且策略路由应该被放入。考虑到这一点,我们可以简单地执行以下操作:

 sudo bash -c 'echo "1 admin" >> /etc/iproute2/rt_tables' sudo ip route add XYZ64/27 dev eth1 src XYZ88 table admin sudo ip route add default via XYZ65 dev eth1 table admin sudo ip rule add from XYZ88/32 table admin sudo ip rule add to XYZ88/32 table admin sudo ip route flush cache 

它只是工作。 我现在可以ping / ssh到任一接口!

注意:在之前的评论中,“RTNETLINK答案:networking无法访问”错误是由于configuration错误的交换机(我不断收到“RTNETLINK答案:没有这样的过程”,当我尝试上面的解决scheme显然是出于同样的原因)。 sudo tcpdump -i eth1 -n -vv -c 1 'ether[20:2] == 0x2000'命令对于识别这个问题是无价的。 一旦我意识到出了什么问题,我就可以使用该VLAN的正确IP范围来实现这个function。