Wifi路由器下pc和wifi路由器同网段pc互访的实现过程
首先,部分家用路由器允许从wan口直接访问lan网段的ip地址。但大部分路由器不支持,本例就是一款支持这个条件的wifi路由器。
问题:同事笔记本(使用wifi路由器连接)和交换机下面的pc实现互访,使用mstsc和飞秋内网传数据。发现,从wifi路由器下笔记本可以ping通交换机下pc,但pc无法ping通wifi路由器下pc。
组网:
分析过程:
笔记本的网络配置:
台式机的配置:
Wifi路由器的配置
笔记本能192.168.13.75ping通台式机192.168.207.53,台式机抓包发现,如下图:
笔记本的ping显示:
因为,笔记本ping消息发出后,经过wifi路由器路由器,根据路由器的处理方式,先进行查询路由表,由wan口缺省路由器出去的,要进行nat转换,转换源ip为路由器wan口的ip地址,所以台式机上收到的是wan口192.168.207.44的ping请求,ttl为64-1=63。台式机对wan口ip发出ttl为128的reply消息,到达wifi路由器路由器的wan口后,按照先查nat表,再查路由表的次序,因为是自内到外的访问,所以nat表里有内外的ip对应关系的记录,转换目的ip为内网192.168.13.75,路由器的lan口有192.168.13.0的直连路由表,确定由lan口直接发出到192.168.13.75。经一级路由器,所以笔记本收到的ttl为128-1=127。
而台式机192.168.205.53ping笔记本ip192.168.13.75,因为192.168.13.75不是pc的直连路由192.168.207.0/24网段,所以走默认路由器表项0.0.0.0/0.0.0.0。
从接入交换机的上级路由器发出,没有发到wifi路由器路由器上,所以ping不通,会显示time out。
应该在pc上添加192.168.13.0/24的路由指向wifi路由器路由器的wan口地址192.168.207.44上,这样对于自外(路由器之外)的访问,查询nat表,没有映射关系,直接查询直连路由表项,就会由路由器lan口发出到笔记本。
结论:在pc上添加一条静态路由192.168.13.0/24指向192.168.207.44。
操作过程:
如上图:路由添加成功
执行ping命令,结果却不通
奇怪,抓包看笔记本是否收到包?
抓包和mac地址显示是从路由器的lan口发出消息,
为什么没有回包?
检查笔记本的路由表
路由正常,有获取的默认网关。看一下有没有查询路由表后,获取网关mac地址的过程?
清除掉笔记本的mac缓冲表,台式机再次ping,笔记本抓包里过滤arp过滤icmp||arp contains 0d01(查看是否有笔记本查询网关mac的消息)?
Arp缓冲表查询正常
这个过程说明,收到ping包后,笔记本查询路由表,确定了出口为自身192.168.207.75,指向192.168.13.1,因为清除了arp缓冲,所以要查询网关的mac地址。获取到mac地址后,没有发包,说明网络层是没有问题的,考虑网络层以上是否有其他限制?
检查防火墙的设置,发现防火墙开启,关闭防火墙后,可以实现外部ping通。
应该是防火墙拦截icmp的request消息,导致应用层没有收到,所以没有回reply消息。
感悟:
- 排除网络问题要理清拓扑关系,分析包的转发过程。
- 要利用好抓包工具,判断包走到哪一步了?
知识点:
有的路由器支持wan口收到没有nat映射关系的包时,会查询路由表,符合内网路由表的,会转发消息。但有的路由器,没有nat映射关系,就丢弃数据包。
- 我们公司这台wifi路由器的转发过程,由内部发起的,到达lan口后,先查路由表,确定是走缺省路由的,走wan口发出的,执行nat转换,转换源ip为wan口ip地址。外部来的访问,首先检查nat映射表里是否有对应关系,有的话,先执行nat转换,转换目的ip为nat记录中的内部ip,再查路由表,是lan口网络地址的,走lan口转发,和lan口网段不一致的,再由wan口发出。Nat表里没有的,不进行目的ip转换,查路由表,符合lan口网段的,送到lan口转发。不符合lan口网段的,由wan口再次发出。
- Ip包的访问过程,首先查询路由表,直连路由级别最高,最先查询,通过目的ip地址和自身掩码相与得到一个网络号,和路由表里自身网络号比较,相同就是同一网段,不同就去查询其他静态路由,同样的过程,没有找到话,使用缺省路由,由网关发出。网关一定是和自身ip在同一网段的ip地址。
确定出口后,检查mac缓冲表,没有下一跳mac地址的话,发起arp查询,得到回复后,使用这个mac地址组包,发出ip包。
3.防火墙工作于三层之上,网络层应该是工作的,防火墙拦截会导致ping的request对应的应用层收不到。
的contains可以用于查询16进制串和字符串。