我不确定“荣誉”这个词是否合适,但这是我能想到的最好的。 我有一个场景,我有两台服务器在同一个networking上。 他们有主要和次要的IP,都在同一个子网上。 为了讨论,他们看起来像这样:
server1 eth0 172.16.45.3/24 server1-A eth0:11 172.16.45.21/27 server1-B eth0:12 172.16.45.22/27 server2 eth0 172.16.45.4/27
是的,server1设置为/ 24,是的这是一个错误。
我注意到这个问题,因为来自server1-> server2的连接的源IP为172.16.45.21,而不是172.16.45.3。 由于源自连接的应用程序没有指定源IP,所以我感到震惊的是它没有使用172.16.45.3。
那是当我注意到不正确的networking掩码。 由于目标IP位于已知较小的networking中,因此它使用来自相同/ 27的IP而不是它认为来自/ 24的IP。 哎呀。
所以,我通过运行以下命令来修复server1上的networking掩码:eth0。
ifconfig eth0 netmask 255.255.255.224
ifconfig现在看起来也很开心:
eth0 Link encap:Ethernet HWaddr 00:22:19:54:EF:11 inet addr:172.16.45.3 Bcast:172.16.45.31 Mask:255.255.255.224 inet6 addr: fe80::222:19ff:fe54:ef11/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1085587580 errors:0 dropped:1355 overruns:0 frame:0 TX packets:1208356392 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:365708046601 (340.5 GiB) TX bytes:667099868812 (621.2 GiB) Interrupt:169 Memory:f8000000-f8012100
此外,路由表清理自己。
之前:
server1 0 /home/jj33 ># route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.45.0 0.0.0.0 255.255.255.224 U 0 0 0 eth0 172.16.45.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 172.16.45.1 0.0.0.0 UG 0 0 0 eth0
后:
server1 0 /home/jj33 ># route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.45.0 0.0.0.0 255.255.255.224 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 172.16.45.1 0.0.0.0 UG 0 0 0 eth0
唯一的问题是,毕竟,操作系统似乎仍然select172.16.45.21作为出站连接到同一networking的源地址(SMTP不直接解决这个问题,只是一个方便的方式来显示源IP连接):
server1 0 /home/jj33 ># telnet server2 25 Trying 172.16.45.4... Connected to 172.16.45.4. Escape character is '^]'. 220 server2.example.com ESMTP mailer ready at Wed, 23 Dec 2009 12:18:28 -0600 ehlo foo 250-server2.qcommcorp.com Hello server1-A.example.com [172.16.45.21] 250 HELP
(如果情况不是很明显的话,我会希望邮件服务器在响应我的ehlo时说“Hello server1.example.com [172.16.45.3]”,如果一切正常)。
所以,现在我的问题。 我怎样才能让我的操作系统注意到eth0上的networking掩码已经改变了,这对我的本地/ 27出站连接是一个更好的select? 我假设重新启动服务器或重新启动networking服务将做到这一点,但我将不得不等待一个星期,直到我的下一个维护时间,这似乎是我可以做的事情,而不中断服务(这是一个生产系统,这个不正确的源IP是小,切线问题 – 核心应用程序运行良好)。
任何帮助不胜感激。 谢谢!
更新1/8/2010:
所以,这个问题引起了我所期待的更多的关注,最终我得到了许可,使应用程序无法进入备用孤岛,并在标准窗口之外的受影响服务器上重新启动networking服务,这意味着我无法testing任何理论下面。
总的来说,尽pipe我认为朱利亚诺的回答最详细。 我没有复制和粘贴,但用ip播放它似乎一般证实了他所定的。
此外,有足够的人关于使用IP优先于ifconfig,我花了一些时间玩它,并把我的帽子给你所有,我当然应该使用IP。 感谢指针。
首先,不要使用ifconfig和route 。 这些命令今天通常被认为是过时的; 当Linux有一个非常不同的networking堆栈时,它们被写得太早了,并且从那以后一直被修补。 接口别名(例如ethX:YY )为了拥有多个地址的想法今天已经过时,它们仍然主要是为了取悦ifconfig本身。 今天, ip命令应该可以满足你所有的需求。
现在,了解你的原始情况:你的eth0接口最初有两个活动范围:/ 24和/ 27。 172.16.45.3是/ 24范围的主要地址,而172.16.45.21是/ 27范围的主要地址(因为它是首先列出的)。 当您发出ifconfig命令来更改第一个地址的前缀时,它将其删除并重新插入到/ 27作用域中的辅助地址。 所以现在你应该有这样的东西:
inet 172.16.45.21/27 brd 172.16.45.31 primary eth0:11 inet 172.16.45.22/27 brd 172.16.45.31 secondary eth0:12 inet 172.16.45.3/27 brd 172.16.45.31 secondary eth0
不要紧,eth0应该是主要的,或者它看起来应该是主要的(不使用ifconfig的另一个原因)。 它被插入在/ 27范围内,所以它是一个辅助地址。 这也意味着出站数据包将被parsing为172.16.45.21,如果使用ifconfig将eth0:11closures,则所有的地址将一起被取下。 这是如何工作的。
解决这个问题的唯一方法是从接口中删除所有地址,并按照正确的顺序重新插入。 然后,添加的第一个地址(在/ 27范围内)将成为该范围内的主要地址,其他地址将全部为辅助地址。
处理已经从一开始就被打破了,在这种情况下你可以做的事情并不多。 您的最佳解决scheme是重新启动networking服务。
一种可能的解决方法是更改源路由地址。 这与改变主地址的效果几乎相同。 在你的情况下:
ip route change 172.16.45.0/27 dev eth0 src 172.16.45.3
在这种情况下,去往172.16.45.0/27的数据包的源地址将被设置为172.16.45.3。 如果您还想更改通过网关的数据包源,则需要另一个命令。
我有一个类似的问题(两个eth0和eth1在同一个以太网段的服务器),并不能找出如何强制在我的情况下来源。 但是,你可以尝试这种方法来强制在你的情况下的源IP:
ip route add dev eth0 src 172.16.45.3 172.16.45.4 metric 2
这又是关于度量的,但包括方程中的来源。 在我的家庭configuration,它允许我select一个不同的IP连接到我的服务器相比,内核将默认select。
你没有说你使用什么分配。 您应该更改configuration文件并使用某种initscript重新加载networking设置。 (如果您跳过这一步,您的设置将在重启后丢失。)
第二件事就是现在的ip工具比linux上的ifconfig更受欢迎。 使用ip ,你可以添加和删除IP地址。
您是否尝试过使用ifconfig设置度量标准?
metric n将接口的路由度metric n设置为n,默认值为0.路由度量值由路由协议使用。 较高的度量标准具有使路线不太有利的效果; 度量标准被视为目标networking或主机的附加跃点。
链接
基本上你想更喜欢使用一个网卡。 尝试设置链接A和B的度量标准为1。
不知道如果我明白,但也许你可以做一些像
route add -net 172.16.45.0/27 dev eth0
这强制所有到该子网的连接通过具有您提到的IP地址的eth0。