计算机网络散记 -- 关于局域网内两台设备互ping不了
背景
由于个人项目练习,所以固定两台设备的静态ip地址,window的ip地址为192.168.33.107,linux的ip地址为192.168.33.106。家里的wifi也有两个(其中一个为拓展器分发)【wifi名分别为 “家用wifi” 和 “家用wifi-加强版” 】。
本来两台设备之间的通信是没问题的,就算切换了wifi,只要是同个网段下,还是可以互ping。但是前几天,因为linux设备的老化,发出了“硬件报警声"(也就是嘟嘟嘟....,不知道怎么描述),关机重开后,问题随之而来。
问题描述:
"家用wifi"的环境下,两台设备无法互相通信,神奇的是,两台设备改连接“家用wifi-加强版”(也就是拓展器重新分发的网络),就可以互相ping成功了。
-
补充背景信息
- linux自定义的静态ip地址
network: ethernets: wlp2s0: addresses: [192.168.33.106/24] #配置的静态ip地址和掩码 dhcp4: false optional: true routes: - to: default via: 192.168.31.1 #默认网关地址 nameservers: addresses: [114.114.114.114,180.76.76.76,192.168.31.1] version: 2
- window自定义的静态ip地址
个人操作方案
试着分析原因:
在“家用wifi-加强版”的环境下可以互ping,可以锁定是网络层的问题。首先想到的就是查看arp协议、mac地址、路由表这些是否能正确找到对方。
-
linux下
route -n
/netstat -r
指令查看所有路由状态
Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.33.0 0.0.0.0 255.255.255.0 U 0 0 0 wlp2s0
正常情况有以上类似的显示:目标地址能辐射ip的前三段(即网段);直连网络不需要配置网关,所以gateway为0.0.0.0;子网掩码;flags为U为直连网络(默认网络为UG,局域网ping的设备为直连);ifce网卡接口
排除路由问题arp -v
查看mac地址
发现windowIP行的mac地址显示为(incomplete)
,无法识别到
有很多原因导致,推测是在汇聚交换机和核心交换机分别设置了不同的ip地址,但映射的mac地址都是相同的。导致“家用wifi-加强版”能ping通而“家用wifi”ping不通。简单解决办法就是关闭NetworkManager
或者给ip地址指定mac地址
-
window下
linux问题找到了,但查看window的终端,输入arp -v
发现也找不到192.168.33.106
的mac地址,之前明明一直有用,应该有缓存。目前方案也是直接添加arp
具体操作:
关于如何获知本机的mac地址有很多办法,我使用的主要两个。
① wifi的路由页面有显示机器的物理地址
② window可以在WIFI属性中查看;
linux可以使用ifconfig
指令查看。【其中,网卡名对应的那一部分,ether 或 HWaddr字段后面一串即是】
-
window下
- 通过管理员身份,在终端(cmd)通过指令
arp -s ip地址 mac地址
进行添加; - 如果显示“ARP 项添加失败: 拒绝访问” ,有两种方案解决:
- 方案① 切换到“Administrator”账户重复上述操作
- 方案② 通过Netsh脚本修改
netsh i i show in
查看网卡的idx值,
备注:如果不确定网卡名称,去“控制面板\所有控制面板项\网络连接”处可以查看当前的网络适配器,名称即为网卡名称
netsh -c "i i" add neighbors 网卡idx "目标ip地址" "目标mac地址"
指令完成添加操作
- 通过管理员身份,在终端(cmd)通过指令
-
linux下
(因为没有真正查明映射原因,当下只是权宜之策,等知识面起来再修正)- 切换到root用户,同样指令
arp -s ip地址 mac地址
进行添加 - 因为arp是缓存缘故,通过直接添加的方法在开机重启或者
netplan apply
网络,都会导致缓存失效(window相对就更人性化了,添加的静态arp记录并不会因为重启而清空)。当前我的方案是通过shell脚本,在每次开机启动或者远程访问的时候,自动进行arp添加mac地址操作。shell脚本方案参考:- 切换root用户
touch /etc/init.d/ip-mac.sh
创建shell文件【文件名,后缀这些都不重要,只要在init.d目录下创建,启动的时候都会自动读取】- 脚本内容:(通过管道符方式,注入root密码)
# !/bin/bash echo "密码" | sudo arp -s 192.168.33.107 mac地址 # cd到桌面启动shell文件,感觉多余,算保险 cd /home/Desktop/ ./ip-mac.s exit 0
- 修改文件权限
chmod +750 ip-mac.sh
- 更新启动项
update-rc.d ip-mac.sh defaults
- 拓展:脚本链接在/etc/rcN.d/,脚本文件在/etc/init.d,如果后续想删除这个服务,直接
update-rc.d ip-mac remove
即可。
- 切换到root用户,同样指令
补充:
linux开机自启动脚本方式多种多样。还有一种方式相对更简单,即在环境配置中直接添加。开机启动时,环境配置就会自动加载了。
上述shell脚本主要的部分,即echo "密码" | sudo arp -s 192.168.33.107 mac地址
这条指令放入到/etc/profile
文件的末尾即可【该文件本身也是接受bash解释器,所以完全可以用shell脚本的方式去设置】
- 旧版的linux是放入rc.local文件,目前ubuntu20是没有这个文件了
补充
- 防火墙问题
- 无论是window还是linux都会因为防火墙阻碍互ping。linux还好,无脑关闭也没事(家用不在乎,云上也有服务商自带的防火墙保护)。可是window是主力机,总不能因为练习一次项目就关闭一次防火墙吧
首先,win10之后的防火墙已经很人性化了,局域网的ping基本不会做太多阻碍。如果还有,- 修改“防火墙-高级设置-出入站规则”中的“文件和打印机共享(回显请求-icmpv4-out)”为启用
- 修改wifi的属性为专用
其次,ping成功有时候防火墙还是会阻碍应用的请求重定向,例如linux上的nginx重定向请求给window应用就常常给防火墙阻碍到 - 不成熟的方法:将防火墙还原设置,然后再次打开服务应用,无论是intellij idea应用还是jdk环境启动,都会弹出防火墙弹窗,选择应用通过防火墙。
- 无论是window还是linux都会因为防火墙阻碍互ping。linux还好,无脑关闭也没事(家用不在乎,云上也有服务商自带的防火墙保护)。可是window是主力机,总不能因为练习一次项目就关闭一次防火墙吧
- //TODO
由于本身计网方面存在很多盲区,通过添加的方式指定mac地址肯定会存在隐患,正确做法还是去交换机上修改配置。后续补充
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)