前言
有时候我们安装了一个 Windows10 的虚拟机,想和物理主机进行一些通信,却在测试网络连通的时候发现无法 ping 通这个虚拟机,但是用这个虚拟机却可以正常上网,如下图:
这其实是因为 Win10 的防火墙没有配置好,没有放行对应的报文。下面来看一看怎么样修改。
Firewall
Win10 对于 ICMP 报文的默认规则是,阻塞进站的 ICMP 请求报文,放行出站的 ICMP 请求报文。
这些其实都在 Win10 的防火墙配置中可以修改,下面来具体看一看。
点开左边的高级设置。
这就是配置防火墙的地方了,左边的入站规则记录了进站的防火墙过滤规则,出站规则记录了出站的防火墙过滤规则。打开这两个大类,就可以看到一条条具体的防火墙规则:
可以看到一条防火墙规则有非常多的属性。首先就是名称,其次的配置文件属性表示这条规则在何种网络类型下生效。网络类型有三种,分别为公用、专用、域。一般我们的网络类型不是公用就是专用,如果你有注意过的话其实在你新连接到一个网络上的时候 Win10 已经让你选过这个网络是什么类型了。具体这两个网络有什么差别可以看这个文章:https://www.howtogeek.com/245982/whats-the-difference-between-private-and-public-networks-in-windows/。 那么怎么查看我当前的网络是什么类型呢,其实只需要右键点击你的网络连接的图标即可:
在弹出的界面中就可以看到当前的网络类型:
下一个属性是“已启用”,顾名思义表示这条防火墙规则是否启用。
下一个“操作”属性,取值为“允许”或“阻止”,这是啥意思呢?其实每一条规则首先会定义一类数据包,例如端口号为 1688 的 TCP 报文,然后会定义这条防火墙规则要如何处理这类数据包,当然了,要么是放行要么是丢弃,也就是对应了这里的“允许”和“阻止”。
后面还有好多属性,这些属性就完整的组成了一条防火墙规则。
然后说到我们的 ICMP,其实系统已经提前帮我们创建好了有关 ICMP 的规则,在列表的后半部分:
这两条规则定义了 ICMP 回显请求报文的过滤行为,这两条是在入站规则中定义的,所以就是定义当系统收到 ICMP 回显请求报文时要怎么做。在出站规则里也有两条类似的规则,定义的是当系统尝试发送 ICMP 回显请求报文时要怎么做。
可以看到这两条规则对 IMCP 报文的行为是“允许”,但是启用状态为“否”。请注意,一个行为是“允许”的规则没有启用,不代表就是要“阻止”规则里定义的这一类数据包。而是表示对于这类数据包的行为“未定义”。假如一个数据包没有匹配上任何一条防火墙规则,即对这类数据包的行为是“未定义”,则 Windows 防火墙还有默认的规则,即丢弃所有入站的数据包,放行所有出站的数据包。这样就好理解了,Windows 默认并没有开启这两条有关 ICMP 的防火墙规则,所以就会导致所有入站的 ICMP 回显请求报文直接被丢弃,所以就表现为别人不能 ping 通自己。与之类似的,出站规则中同样有两条有关 ICMP 回显请求的规则:
同样这两条规则默认并没有启用,但是出站数据包的默认行为是放行,所以就导致可以 ping 通别人。
最后,想让别人可以 ping 通自己,只需要将入站规则中那两条条目启用即可,当然了,我们的网络类型一般不是专用就是公用,所以那条针对域的规则不开也行。这样就可以愉快的 ping 虚拟机啦。