草庐IT

家庭局域网下一侧能ping通另一侧ping不通的原因

放晴的那天14 2023-10-13 原文

背景介绍

最近想用家里的台式机远程到笔记本上,但是发现并不成功,所以尝试ping了一下,发现只有笔记本ping台式机能成功,但台式机ping笔记本一直失败,本来以为只是防火墙的问题,然而发现事实并没有这么简单。
两台电脑的网络配置如下:

  • 笔记本:
  • 台式机:

检查防火墙设置

因为之前遇到过类似的问题,我第一个想法是检查防火墙的设置,因为防火墙可能会拦截ICMP报文,导致单侧能ping通的问题。需要将不能被ping通的设备的如下设置打开:
“Windows Defender防火墙” -> “高级设置” -> “入站规则” -> “文件和打印机共享(回显请求-ICMPv4-In)”
比如像我这种情况属于笔记本不能被ping通,就要检查笔记本的这个设置是否打开。

分析网络拓扑

检查之后发现该设置处于打开状态,因此可以排除是防火墙的原因。回头一看两个设备的ip和掩码,可以发现两台电脑并不在同一个网络。因为是租的房子网线是已经接好的,我只知道有个光猫和无线路由器,具体的连接方式没有梳理过(也不想梳理那一堆陈年老网线)。但是从两台电脑执行ipconfig得到的结果看,我猜测网络拓扑应该是这样的结构:

台式机和无线路由器的WAN口连接在光猫上。光猫工作在路由模式,提供整个局域网到公网的出口。笔记本和其他设备连接在无线路由器的WLAN上,相当于一个小的局域网,而从这个网络上发出的流量会在无线路由器上先做一次NAT转换,如果要发往公网,还会再在光猫做一次NAT转换。
为了证明这个猜想,可以用笔记本ping台式机,同时在台式机上用wireshark抓一下ICMP报文,结果如下:
通过网络抓包可以证实上面的猜想,因为ICMP报文的源地址是192.168.1.2,该地址应该是无线路由器的WAN口地址,从笔记本发出的流量在到达无线路由器后接受一次NAT转换,源地址被修改为192.168.1.2,然后到达台式机。
而对于台式机ping笔记本的请求,因为两台电脑不在同一网段,台式机首先查询自身的路由表,如果没有记录则发往默认网关,这里可以使用tracert追踪路由:

从tracert的结果看,台式机的路由表里应该没有对应的配置,发出的ping请求直接到了默认网关,然后默认网关继续往外发送,没有经过无线路由器。

修改路由表配置

在分析网络拓扑之后,对于这种要访问内网的情况一般需要端口映射之类的技术,但我看到网上一些文章说一部分路由器可以查路由表将WAN口收到的数据从LAN口发出去。而我登录无线路由器的管理页面后发现系统路由表有配置192.168.0.0网段的规则,因此想尝试在台式机路由表中增加配置的方式,让台式机的ping包发往无线路由器(这一步操作可能需要用管理员权限):
修改后台式机的路由表如下:

可以看到现在目的地址属于192.168.0.0网段的数据都会发往192.168.1.2,也就是前面抓包分析得到的路由器的WAN口地址。
添加完路由配置后,发现依然还是无法从台式机ping通,但是是路由器丢弃了报文还是其他原因导致的呢?再用tracert和wireshark分析一下:
这里可以从MAC地址判断,从截图下方可以看出ICMP报文发往了80:89:17:d8:f4:79,查询台式机的arp缓存表可以知道这个MAC地址对应的就是192.168.1.2:
可以再ping 192.168.1.2测试一下连通性,发现是可以连通的。由此可以判断ICMP报文到达了无线路由器的WAN口,但被无线路由器直接丢弃了,所以tracert没有信息显示。因为tracert显示的路由信息依赖于网络节点返回的ICMP告警报文。

设置虚拟服务器

后来查了我这款路由器的说明,发现它不支持对内网主机的直接访问,要想访问到内网主机需要先将端口映射出去。可以通过虚拟服务器或者设置DMZ两种方式进行。这里因为端口相对固定,因此选择通过设置虚拟服务器的方式。
以TP-LINK路由器为例,设置虚拟服务器在"转发规则"下,需要进行如下配置:

因为笔记本的IP是通过DHCP获取的,所以可能会发生变化,因此在设置虚拟服务器的IP前需要先在DHCP中设置静态地址保留,避免重新连接后IP发生变化,TP-LINK可以在"DHCP服务器"下设置静态地址保留。

如果是台式机也可以通过本机的"网络和Internet设置"中选择使用指定的IP。但是因为笔记本涉及多个网络间的切换,如果在本机配置可能导致切换到其他网络中有问题

然后将笔记本的地址添加到虚拟服务器中,远程连接默认使用3389端口,为了测试我还顺便添加了一个8080端口。
现在,理论上访问无线路由器WAN口的上述端口就可以访问到笔记本的对应端口。因为此时引入了运输层的概念,而ICMP工作在网络层,所以无法再通过ping进行测试了。这里我用了一个python小程序来验证台式机是否能访问到笔记本的对应端口:

from socket import *

port = 8080
listenSocket = socket(AF_INET, SOCK_STREAM) #使用TCP连接
listenSocket.bind(("", port))
listenSocket.listen(1)
print("正在监听8080端口")
while True:
    connectionSocket = listenSocket.accept()[0]
    msg = connectionSocket.recv(1024).decode()
    print(msg)
    connectionSocket.close()

在台式机使用telnet连接192.168.1.2的8080端口,数据会转发到笔记本上:

telnet 192.168.1.2 8080
sen hello hello 听得到吗

笔记本上输出如下:

说明通过虚拟服务器的方式,可以实现对局域网下主机的访问。

有关家庭局域网下一侧能ping通另一侧ping不通的原因的更多相关文章

  1. ruby - Ping ruby 网站? - 2

    在Ruby中可以使用哪些替代方法来ping一个ip地址?标准库“ping”库的功能似乎非常有限。我对在这里滚动我自己的代码不感兴趣。有没有好的gem?我应该接受它并忍受它吗?(我在Linux上使用Ruby1.8.6编写代码) 最佳答案 net-ping值得一看。它允许TCPping(如标准ruby​​ping),但也允许UDP、HTTP和ICMPping。ICMPping需要root权限,但其他则不需要。 关于ruby-Pingruby网站?,我们在StackOverflow上找到一个类

  2. ruby - 通过 RVM 安装 Ruby 1.9.2 永远行不通! - 2

    当我执行>rvminstall1.9.2时一切顺利。然后我做>rvmuse1.9.2也很顺利。但是当涉及到ruby​​-v时..sam@sjones:~$rvminstall1.9.2/home/sam/.rvm/rubies/ruby-1.9.2-p136,thismaytakeawhiledependingonyourcpu(s)...ruby-1.9.2-p136-#fetchingruby-1.9.2-p136-#downloadingruby-1.9.2-p136,thismaytakeawhiledependingonyourconnection...%Total%Rece

  3. ruby-on-rails - 出于某种原因,我无法在控制台中生成重音字符 [é、ü 等] - 2

    在MacOS更新之前,它一直运行良好。我重新安装了RVM、rails、ruby等等。到目前为止没有任何效果。在我的Mac终端中,我可以生成一个é,但是在控制台中,我可以生成字符,使用alt+character,然后当我键入字符分配给的字母,它会删除该字符。在我的~/.rvmrc中:exportruby_configure_flags="--with-readline-dir=/usr/local/Cellar/readline/6.2.4"有什么想法吗?到目前为止,我已经明确地让它工作了,包括readline-rb。我猜我的全局要求不工作。gem'rb-readline','~>0.4

  4. 联通家庭宽带开启ipv6 - 2

    联通家庭宽带开启ipv6废话不多,直接开干首先登录联通光猫的后台,机身有写我的是http://192.168.1.1/CU.html广州家庭宽带账号密码CUAdmincuadmin00259e这里好像是默认设置,不大记得了。保存就好然后登陆路由器后台,我的是tp-link选桥模式这里的桥模式跟光猫的wan类型应该是互斥关系,光猫设置桥接,路由器就要设pppoe拨号,我没试过。然后在系统就可以查看了或者直接访问这个网址http://testipv6.com/注意1:如果你是便宜小米红米之类的路由器,他好像是默认不打开这个ipv6防火墙的,也就是你可能在系统上看到有ipv6地址,但实际上是不互通的

  5. ruby - 如何仅使用标准套接字库在 Ruby 中实现 ICMP ping? - 2

    应该可以使用Ruby套接字库发送和接收ICMP数据包,但我没有看到任何关于此的好文档。我不想使用net-ping、icmp、ping和所有这些其他库,它们要么因跨平台问题而失败,需要devkit和自定义构建,它们在构建过程中失败,被忽略并且有很长一段时间没有更新,和/或只是一般的错误。有没有人有关于如何完成这个的任何好的文档?我想发送ICMP回显回复,而不是TCP或UDP数据包。 最佳答案 阅读DanielBerger关于他的Net-ping项目的代码,我能够看到他是如何做到的。http://rubygems.org/gems/ne

  6. ipv6外网能ping通,但无法访问服务(自建网站,远程桌面等) - 2

    1.当前环境及情况说明宽带:电信、光猫桥接、路由器拨号ipv6地址:在各大网站都能ping通这个ipv6地址,本机也能访问ipv6的网站问题:其它外网电脑除了能ping通这个ipv6地址之外什么都访问不了2.可能出现问题的原因本机防火墙拦截了(关闭防火墙也是一样的)×光猫防火墙拦截了(试了不行,貌似桥接后跟光猫就没关系了)×路由器防火墙拦截了(用的是小米AX6000,IPV6配置的地方有个防火墙没有关闭)√运营商拦截了(根据最终效果测试,80端口、443端口被拦截无法使用,尽量用些不常用的端口)×3.路由器设置(关闭IPV6防火墙) 不同路由器可能设置不同,根据情况处理,我这里做为一个参考关闭

  7. ruby - 如何在 Node.js/RoR 中监控 20 个网站(Ping 或 HTTP)的正常运行时间 - 2

    每5分钟(例如)ping20个网站的列表以了解该网站是否响应HTTP202的最佳方法是什么?最简单的想法是将20个URLS保存在数据库中,然后运行数据库并对每个URL执行ping操作。但是,当一个人不回答时会发生什么?之后的人会怎样?此外,是否有更好但更简单的解决方案?恐怕该列表会增长到20000个网站,然后没有足够的时间在我需要ping的5分钟内全部ping通它们。基本上,我是在描述PingDom、UptimeRobot等的工作原理。我正在使用node.js和RubyonRails构建这个系统。我也倾向于使用MongoDB来保存所有ping和监控结果的历史记录。建议?非常感谢!

  8. ruby - 在 JRuby 中,如何确定导致 java.lang.ThreadDeath 的原因? - 2

    在为一些与JRuby中的临时文件交互的代码运行单元测试时,我有时会得到以下信息:Exception:java.lang.ThreadDeaththrownfromtheUncaughtExceptionHandlerinthread"Thread-6395"它似乎没有引起任何问题,但这是怎么回事,我如何确定它发生在哪里?我尝试打开-d,但这并没有给我异常的堆栈跟踪。 最佳答案 FWIW:这可能与http://jira.codehaus.org/browse/JRUBY-7074有关.我偶尔会在不使用反引号但调用系统的JRuby程序中

  9. ruby - 如何调试 gem 安装失败的原因? - 2

    我正在尝试安装geoutm使用geminstallgeoutm。Github存储库没有问题页面,所以我尝试自己解决问题然后提交拉取请求。这是问题:$geminstallgeoutmFetching:geoutm-1.0.1.gem(100%)Successfullyinstalledgeoutm-1.0.1ERROR:Whileexecutinggem...(TypeError)noimplicitconversionofArrayintoString它说“已成功安装”,但尝试要求gem失败。详细安装并没有多大用处:$geminstallgeoutm--verboseHEADhttps

  10. 开发人员使用Klocwork进行软件安全的五大原因 - 2

    Klocwork专为企业DevOps和DevSecOps而构建,是首选的静态分析和SAST工具,用于保持高开发速度,同时还强制实施安全性和质量的持续合规性。在这里,我们分享了开发人员选择Klocwork的五大原因。为什么安全性对软件开发至关重要?安全性对于软件开发至关重要,因为黑客和网络犯罪分子一直在寻找将漏洞转化为利益的方法。强大的软件安全防御的一个关键部分是使用安全编码标准,这些标准是用于防止安全漏洞的规则和准则。如果使用得当,安全编码标准可以检测、预防和消除可能危及安全性的漏洞。行业标准工具(特别是SAST工具)可以有效地实施标准,以帮助确保您的软件免受安全漏洞的侵害。开发人员使用Klo

随机推荐