概述: 在同时开启network
和NetworkManager
服务的系统中,使用ifconfig up/down
管理网络导致了网络的混乱问题,而是用ifup/ifdown
则没有出现如此问题。怀疑是ifconfig up/down与network
以及NetworkManager
同时使用产生了冲突。最后使用ifconfig interface up/down
的替代命令ip link set interface up/down
解决了问题。
文章记录了这个过程。
1. 场景描述
基本的使用场景是,在一台工作站上,存在有多个有线网卡口,同样也存在无线网卡。
有一个网口eth0
连接一个监控器,另一个网口eth1
连接另一个外接控制台,另外存在一个有线网口eth2
和一个无线网卡wlan0
连接外网。
网卡接口名称 | 用途 | 是否有线网 | 是否长久连接 |
---|---|---|---|
eth0 | 连接监视器 | 有线 | 长久连接 |
eth1 | 外接控制台 | 有线 | 长久连接 |
eth2 | 连接外网 | 有线 | 可能断开 |
wlan0 | 连接外网 | 无线 | 可能断开/切换 |
1.1 连接的场景
网络连接的基本逻辑:
- 监控器
eth0
和外接控制台eth1
的网络是通过有线网长久连接 - 与外网连接(
eth2
和wlan0
)随时可能断开 - 连接外网的无线网
wlan0
和有线网eth2
不会同时连接(有线网优先)- 无线网
wlan0
连接时,如果这是有线外部网eth2
络接入,则断开无线网wlan0
- 当外部有线网络
eth2
断开后,自动开启无线网wlan0
尝试连接
- 无线网
网络连接的限制:
- 为保证监视器
eth0
和外接控制台eth1
的正确连接,都设置与外接设备相同网段的静态IP地址 - 连接外网的有线
eth2
和无线网wlan0
的IP地址可以动态也可以静态分配,但是需要与监控器eth0
和外接控制台eth1
的网段不能相同 - 检测有线外网
eth2
的连接,如果有线外网eth2
连接上,则不能通过无线外网wlan0
连接;有线外网eth2
连接断开或者不连接的状态,尝试连接无线外部网wlan0
1.2 不同网卡的网络切换
由于连接固定设备的两个网卡需要有固定的IP地址,因此在/etc/sysconfig/network-scripts
下分别放置了相应的网卡配置文件ifcfg-eth0
和ifcfg-eth1
。
对于连接外网的有线网卡,希望在不启动对应程序的情况下不启动,所有会控制其启动机会,也设置了配置文件ifcfg-eth2
,而无线网不需要配置文件,因此没有放置配置文件。
因为连接外网的网卡需要随着应用程序或者链接状态启动和停止,对于网络的启停,存在两套常用的命令(命令中的interface
代表网卡的名称):
ifconfig interface up/down
ifup/ipdown interface
如果存在配置文件的话,常使用的是ifup
和ifdown
,这样会直接调用对应的配置文件。如果不存在配置文件的话,这样的调用会出错。
因此对于没有配置文件的网卡,调用ifconfig interface up
和ifconfig interface down
。
1.3 基本的尝试
通过ifplugd
服务检测有限外网的网线的接入,使用ifup eth2
和ifconfig wlan0 down
,关闭无线网并启动有线外部网络连接,并应用配置。
检测有限外网的网线的断开,使用ifdown eth2
和ifconfig wlan0 up
,关闭无线网并启动无线外部网络连接。
在启动应用程序的时候,会同样检测一下网络,并应用对应的配置。
2. 发现的问题
在启动应用程序的时,使用了如上命令启网络停命令后,在某些系列的产品上偶发了一个问题,监视器对应的网卡eth0
的IP地址,会在一两分钟以内消失,并且使用dhclient
也不能成功分配。
- 同一台计算机上,有的设备是偶发的,有的是必现的
- 使用另一系列的监控器的机器上,没有出现过这个问题
3. 具体情况分析
3.1 可能情况的分析与处理
因为无线网卡是后面添加的设备,因此想在开机时候禁止掉无线网卡使用,在/etc/rc.local
中添加如下命令:
ifconfig wlan0 down
rfkill block wifi
结果发现还是不可行,监控器eth0
还是会丢失IP地址,于是又在后面添加了一句:
dhclient eth0
这样操作后,监控器eth0
获取到的IP地址不会再丢失,但是如果这个时候eth2
如果正好连接着网线,eth2
也会意外的获取到IP地址。这种情况是不应该出现的,因为在ifcfg-eth2
中配置eth2
不会随着系统启动,只会在应用程序启动时,通过ifup
启动。
这个时候感觉dhclient
的执行已经乱掉了。
一个偶然的机会执行了service network status
,查看目前的网络情况,但是当时在/etc/sysconfig/network-scripts
文件夹下还存在网卡名称错误的ifcfg-*
的文件,也在这里面罗列出来了,最后就配置文件是与ifup/ifdown
相关的,有没有可能在network服务中检测到的是否与这个配置相关(在这些配置文件中,都声明了可以使用NM(NetworkManager
)服务管理)。
这时也在网上查看到NetworkManager和network这两个服务有时候会有冲突,很多人的解决方案是关闭其中一个。
而对于wlan0我使用了ifconfig
进行管理,我在想会不会是ifconfig up/down
与network服务管理(ifup/ifdown
)有冲突呢,于是我也生成了一个ifcfg-wlan0
放置到/etc/sysconfig/network-scripts
中,用于启停无线网络,果然问题解决了。
4. 解决的方法
在network服务开启时候,不再混用ifconfig up/down
启停网络解决了问题,感觉network服务是使用ifup和ifdown来启停网络的。
5. 其他相关问题
在另外一种设备上,使用另一个同厂家其他型号的监控器,并且没有外部控制器,使用同样的网络执行控制脚本,没有出现过监控器eth0
IP丢失的问题,但是也是在不合时宜的时候开启了有线外网的eth2
服务。
还是在这个设备上,为了某些目的想在NetworkManager服务中脱离对于wlan0
的控制,在/etc/NetworkManager/NetworkManager.conf
中排除对于wlan0
管理之后,对于eth0
来说也出现了上述网卡的问题,但是同时在也排除对于eth0
的管理则不会再出现这个问题。
这时我就更觉得是网上说的network
和NetworkManager
服务出现冲突的问题了。
至于为什么明知道他们会冲突还都启用,这个是因为有很多第三方的库和很多以前的老代码都会同时使用到这两方面服务。
在ifcfg-*
中是能配置是否通过NetworkManager管理的。
PS:
网上有人说,ifconfig up/down
会自动检测配置文件,如果存在则相当于ifup/ifdown
,但是现在看来不一定相同,后期如果有更多时间则详细分析与阅读下。
6. 查找官方文档
在查看了红帽7有关网络的官方文档之后,在上面描述了NetworkManager
和network
启动管理的相关顺序等问题,感觉他们的冲突可能不是问题点。
在文档中提到ifup/ifdown
是红帽7系列支持的方法。
7. 最后解决方法
后来了解到ifconfig
命令已经被当成过时的命令了,也在网上找到使用ip
的替代方案。使用如下的语句替代ifconfig interface up/down
,之后暂时没有出现上面提到的问题:
ip link set wlan0 up
ip link set wlan down