标题: Debian本机IP变成神秘的172.16.15.5
创建: 2018-07-19 11:46 更新: 2018-09-26 13:59 链接: https://scz.617.cn/unix/201807191146.txt
有台Debian 8.5虚拟机。
Guest的网卡使用桥接模式,直接使用Host的网卡。假设Guest的IP是192.168.34.20, Host的IP是192.168.34.2。从Debian 4开始就这样配置,这么多年一路升级,一直没 出过大问题。小问题倒是有一个,有时Host的ARP表中Guest的条目是:
192.168.34.20 00-ba-db-ad-00-00 static
可我并未"arp -s"或"netsh interface ip add neighbors"增加这个静态Entry,它 是凭空冒出来的。手工"arp -d 192.168.34.20"之后恢复正常。要说ARP Spoofing, 那也得是动态Entry啊。这个小问题并不总是出现,不知根源何在,未深究。本文重 点不是这个小问题,仅供有心人参考。
为了用Python3,对Guest手工升级,编辑sources.list,用了sid。内核、头文件、 GLIBC、编译器、VMmware Tools之类的都升了,不多说。
升完之后,初用一切正常。用得次数多了,发现有时SSH登录Guest失败,与ARP无关, 此时操作VMware硬件配置,断开网卡、重新连接网卡,基本都能解决问题。这个现象 时有时无,由于有前述临时解决方案,起初并未深究。
某天SSH登录Guest成功,执行"aptitude install"发现不能访问Internet,开始排查。 Guest可以ping通网关192.168.34.254,无法ping通DNS 192.168.x.1,DNS不在34网 段,此时所有FQDN解析失败。前几天从Guest还能ping通192.168.x.1,因此第一反应 是最近信息管理部调整了ACL,对192.168.34.20做了限制,但信管部的同事说没做限 制。在Host上Wireshark抓包,发现由Guest发出的ICMP源IP是172.16.15.5。在Guest 中"ifconfig -a",看到eth0的IP是172.16.15.5,而我从未手工配过这个网段,见鬼。 更大的怪事出现了,SSH登录Guest时,使用的目标IP可是192.168.34.20,这个TCP连 接、SSH会话仍在使用中。"ifconfig -a"看到172.16.15.5的同一时刻在Host上 "ping 192.168.34.20",正常!用图形界面的nm-connection-editor查看此时的网络 配置,只有192.168.34.20,没有172.16.15.5,后者仿佛鬼魂一般存在。若是别人描 述这个现象给我听,我绝不相信,我会认定有什么低级错误存在其中。操作VMware硬 件配置,断开并重新连接网卡,多数时候会导致"ifconfig -a"恢复正常,eth0的IP 恢复成192.168.34.20,但这招并不总灵。事后发现,SSH登录Guest失败,起因相同, 只不过后果更恶化。
又一天,已经确保Guest源IP正常,也可以ping通192.168.x.1,但就是FQDN解析失败。 检查/etc/resolv.conf,意外发现其中写着172.16.15.1,手工改回192.168.x.1, FQDN解析成功。这个现象与前两个现象的起因应该同源。操作VMware硬件配置,断开 并重新连接网卡,有时只能恢复eth0的IP,并不自动恢复resolv.conf,有时又会恢 复后者,最惨的时候,二者都得不到恢复。
Google for "VMware Debian 172.16.15.1"未能得到有效信息。
将此事当成八卦说与bluerust,他提到DHCP干挠的可能性,可Guest从未配置过DHCP, 甚至与dhcpcd相关的包都没有装。他还建议动用audit子系统审计对resolv.conf的读 写访问,看看谁在修改它。
eth0出现172.16.15.5时,可以在主控台手工配置IP:
ifconfig eth0 192.168.34.20 netmask 255.255.255.0 broadcast 192.168.34.255 up route add default gw 192.168.34.254
这三种怪现象发作越发频繁,搞得很烦躁。摸索出一种固定恢复套路:
1) 主控台登录 2) 断开VMware的网卡 3) ping 192.168.x.1 (DNS) 4) 连上VMware的网卡 5) ping 192.168.x.1 6) 检查ifconfig、resolv.conf,确保都正常
第3步看似不必要,实测会影响恢复效果。此时怀疑BUG与VMware Tools、网卡驱动等 相关。
$ grep -r 192.168.34.20 /etc
找到这个文件
$ cat "/etc/NetworkManager/system-connections/Wired connection 1"
[connection] id=Wired connection 1 uuid=xxxxxxxx-0868-xxxx-xxxx-xxxxxxxxxxxx type=ethernet interface-name=eth0 permissions= timestamp=1531968922
[ethernet] mac-address=xx:xx:xx:xx:xx:xx mac-address-blacklist=
[ipv4] address1=192.168.34.20/24,192.168.34.254 dns=192.168.x.1; dns-search= ignore-auto-dns=true ignore-auto-routes=true method=manual
[ipv6] addr-gen-mode=stable-privacy dns-search= ip6-privacy=2 method=ignore
过去常用的/etc/network/interfaces里没有eth0的信息:
$ cat /etc/network/interfaces
auto lo iface lo inet loopback
与bluerust讨论后,怀疑是NetworkManager的BUG,决定升级几个相关包。
$ dpkg -S which nm-connection-editor
network-manager-gnome: /usr/bin/nm-connection-editor
$ dpkg -S which gnome-control-center
gnome-control-center: /usr/bin/gnome-control-center
$ dpkg -S /usr/lib/gvfs/gvfsd-network gvfs-backends: /usr/lib/gvfs/gvfsd-network
题外话,如果"dpkg -S"查不到包名,有可能目标只是一个符号链接,用ls确认后, 直接查原始文件,比如awk就是这种情形。
同时升级这几个包:
apt-get update -u aptitude install gnome-control-center gvfs-backends network-manager-gnome network-manager
升完级,重启Guest,BUG依旧。
有两种图形界面查看网络配置,一种是:
$ nm-connection-editor
另一种是控制面板:
$ env XDG_CURRENT_DESKTOP=GNOME gnome-control-center
题外话,我的桌面不是gnome,而是轻量级的icewm,这种情况下使用gnome的控制面 板,必须像上面那样指定环境变量启动,否则你看到的控制面板是空的。
在GUI中意外发现有两个网络接口,一个是预期中的"Wired connection 1",它的IP 是显式配置过的192.168.34.20,另一个是凭空出现的"eth0",它的IP是神秘的 172.16.15.5。升级NetworkManager相关包之前,GUI中只能看到第一个网络接口,升 级之后看到了两个。此时在GUI中删除捣乱的"eth0"即可恢复正常,包括resolv.conf; 相比操作VMware硬件配置,断开并重新连接网卡,前者恢复效果更可靠。
但我不想每次来GUI中删除捣乱的"eth0",我想直接SSH登录Guest,为此做了很多尝试。
某次尝试,在GUI中先删除捣乱的"eth0",再将"Wired connection 1"重命名成"eth0", 重启Guest,貌似BUG消失。当时很高兴,还备份了此刻的虚拟机。结果另一次重启后, BUG复现,用GUI一看,出现两个"eth0",分别对应172.16.15.5、192.168.34.20。多 次测试后确认,该BUG的触发存在竞争条件,时有时无。
既然BUG出现时总是伴随一个捣乱的"eth0",脑洞大开地换了组搜索关键字:
Google for "Debian "nm-connection-editor" two eth0"
找到
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755202 https://fitzcarraldoblog.wordpress.com/2015/02/15/networkmanager-creates-a-new-connection-eth0-that-does-not-work/ https://fitzcarraldoblog.wordpress.com/2015/03/17/more-on-networkmanager-creating-a-new-connection-eth0%E2%80%B2-that-does-not-work/
发现很多人遭遇该BUG,与使用虚拟机无关,物理机同样会碰上,与NetworkManager 强相关,不只是Debian有。BUG的触发存在竞争条件,使得路人甲的临时解决方案很 可能不适用于路人乙,更扯淡的是,reboot和冷启动都会有差别。该BUG目前没有终 极解决方案,只能自己测出适用于自身环境的临时解决方案。
放狗时看到一些相关命令,记录备忘:
grep -i NetworkManager /var/log/messages service network-manager stop NetworkManager --no-daemon --debug NetworkManager --no-daemon --log-level=DEBUG --debug /etc/init.d/network-manager restart
差点想用IDA逆向nm-connection-editor,以找出如何命令行删除捣乱的"eth0",旁 白,这不吃撑了吗,这是Linux,不是Windows,开源了解一下。后来发现nmcli是命 令行版的。
查看网络接口
nmcli connection show
nmcli c s
删除网络接口
nmcli connection delete eth0
nmcli c d eth0
在我这台虚拟机上反复测试后,采用如下临时解决方案解决BUG:
1)
确保"/etc/NetworkManager/system-connections/Wired connection 1"存在,不要 将"Wired connection 1"重命名成"eth0"
2)
$ vi /etc/NetworkManager/NetworkManager.conf
原来是
[main] plugins=ifupdown,keyfile
[ifupdown] managed=false
改成
[main] plugins=ifupdown,keyfile no-auto-default=eth0
[ifupdown] managed=true
3)
$ vi /etc/rc.local
在其中增加一条命令
nmcli c d eth0
上述第2步,在我这里是必要的,可以确保BUG消失。假设只做了第1、3步,仍有一定 机率出现神秘的172.16.15.5。
对于我来说,这个BUG就这样吧,说不定哪天升级发行版,就彻底消失了。
最初是个小BUG,临时解决方案虽然不完美但也能将就。某天觉得,即使是个不完美 的临时解决方案,还是写个文档备忘,以免时间久了不记得摸索过的细节部分。然后 当成八卦说给bluerust听,两人说着说着,有效信息渐渐多了一些,互相启发之下换 了测试方案,进而导致Google搜索关键字变化,找到一批有难同当的人。虽然没有找 到BUG的终极解决方案,但找到了适用于自身环境的相对完美的临时解决方案,学到 一批NetworkManager相关知识点。整个过程再次表明,有收获时记得写文档,利人更 利己。
小结一下:
1) 尽早使用Wireshark、ifconfig 2) 及时升级相关软件包 3) 积极调整Google搜索关键字 4) 与人讨论(八卦) 5) 写文档备忘
2018-09-26 13:59 scz
Debian的Network Manager实乃万恶之源,几千年都碰不上的幺蛾子,忍了这么久之 后终于还是决定把它干掉。
禁用Network Manager
systemctl stop NetworkManager.service systemctl disable NetworkManager.service
之后用"/etc/network/interfaces"配置网络。如果是从低版本Debian一路升级上来, 可能下面这些操作有助于减少干挠:
systemctl stop avahi-daemon systemctl disable avahi-daemon
aptitude install systemd aptitude install ifupdown