Windows 防火墙也支持命令行管理,对于需要批量添加防火墙规则的场景,命令行会非常有用。
先说一下 Windows 防火墙的工作原理,在 Windows 下网络是分类型的。在网络属性中可以查看当前网络是公开的,还是专用的。

打开当前连接的网络,可以查看到当前网络类型为 “公开”

实际上在命令行中,英文原文就是指
private
public
查看防火墙配置文件属性
netsh advfirewall show ?

两种网络,对应了两种配置,即专用配置和公用配置。除了这两种配置文件,还有一种在个人电脑中很少用到的 domainprofile,即域配置。
我们在防火墙配置中,可以对每种配置进行默认行为定义。在防护墙属性中,我们可以查看具体内容:

点开防火墙属性,可以看到有三种配置

如果当前网络类型为"公用" , 此时就是公用配置起作用,而专用配置不生效。
防火墙配置文件的作用是定义默认规则,有点类似 iptables 的默认表的规则,规定的默认是阻止还是放行。
比如当前公用配置文件规定了出站全允许,入站全阻止
netsh advfirewall show publicprofile

配置文件的相关命令为
开启公用配置的防火墙netsh advfirewall set publicprofile state on默认策略,出站全允许,入站全阻止netsh advfirewall set publicprofile \firewallpolicy blockinbound,allowoutbound记录被阻止的会话记录netsh advfirewall set publicprofile \logging droppedconnections enable指定日志文件netsh advfirewall set publicprofile \logging filename d:\public.log
具体命令和字段可以在子命令中使用 ?查询

这里的命令行对应到图形界面下的具体参数

比如看入站默认规则时,阻止与阻止所有连接,看这个下拉菜单是看不懂的,但命令行中就解释的比较清楚。
入站行为:
blockinbound - 阻止与入站规则不匹配的入站连接。
blockinboundalways - 阻止所有入站连接,即使连接与规则匹配。
allowinbound - 允许与规则不匹配的入站连接。
notconfigured - 将值返回到未配置状态。
出站行为:
allowoutbound - 允许与规则不匹配的出站连接。
blockoutbound - 阻止与规则不匹配的出站连接。
notconfigured - 将值返回到未配置状态。
此时不能选阻上所有,还然就算在防火墙规则中放行了一样会被阻止。我就在测试入站默认规则时试了一下第二个选项,远程桌面直接被断掉了,所有入站包都进不去,只能去服务器显示器上去重新配置防火墙策略,当然后业务也会受影响,直接造成业务中断。
配置默认策略的命令
适用于终端netsh advfirewall set publicprofile \firewallpolicy blockinbound,allowoutbound适用于服务器netsh advfirewall set publicprofile \firewallpolicy blockinbound,blockoutbound
这里要解释一下,终端也就是我们个人使用的电脑,默认策略应该是入站全阻止,出站全允许。因为作为终端,应该是没有人主动访问你才对,如果有人访问,那很有可能是黑客。所以作为终端要阻止别人访问我们的电脑,也就是入站阻止。出站就是我们要上网,要访问服务器,这些都是出站方向。
对于服务器的默认规则建议入站、出站全部阻止。首先如果没有外联要求,或与其它业务交互的需要,比如它就是一台单服务器,只有别人访问它,它不需要访问别人。此时出站方向要禁掉,服务器不会主动访问别人,这个与普通电脑是有区别的。入站为什么也要禁掉,因为服务器放行是按端口来放行的,默认策略如果全放行了要写很多阻止策略,而且有被入侵的风险,所以建议入站规则也要默认改为阻止,后面再逐个放行。
后面就到了详细写明细规则的时候了,我建议把入出站规则中的规则全部清空,即全都删掉。

里面大量内容是出厂设置,在删之前可以试试它的导入导出功能。

就算删掉了,还有一个选项 - “还原默认策略”,所以不用担心把系统搞坏了。这三个功能,在命令行都支持。
导出防火墙配置netsh advfirewall export d:\firewall.conf导入防火墙配置netsh advfirewall import d:\firewall.conf恢复防火墙出厂设置netsh advfirewall reset
命令行查看所有防火墙规则
查看所有规则netsh advfirewall firewall \show rule name=all verbose查看所有入站规则netsh advfirewall firewall \show rule name=all dir=in verbose查看所有出站规则netsh advfirewall firewall \show rule name=all dir=out verbose

命令行创建规则例子
加 80 端口的入站允许规则
加了换行,方便阅读,无法执行需要去掉换行netsh advfirewall firewall add rule \name= "Open Port 80" \dir=in \action=allow \protocol=TCP \localport=80可执行版:netsh advfirewall firewall add rule name= "Open Port 80" dir=in action=allow protocol=TCP localport=80
删除规则
netsh advfirewall firewall \delete rule \name= "Open Port 80"可执行版:netsh advfirewall firewall delete rule name= "Open Port 80"
禁 ping
加了换行,方便阅读,无法执行需要去掉换行netsh advfirewall firewall \add rule \name= "disable ping" \protocol=icmpv4 \dir=in \action=block可执行版:netsh advfirewall firewall add rule name= "disable ping" protocol=icmpv4 dir=in action=block
允许 ping
netsh advfirewall firewall \add rule name= "All ICMP V4" \protocol=icmpv4:any,any \dir=in \action=allow可执行版:netsh advfirewall firewall add rule name= "All ICMP V4" protocol=icmpv4:any,any dir=in action=allow
为指定程序启用放行策略
netsh advfirewall firewall add rule name="My Application" dir=in action=allow program="C:\MyApp\MyApp.exe" enable=yesnetsh advfirewall firewall add rule name="My Application" dir=in action=allow program= "C:\MyApp\MyApp.exe" enable=yes remoteip=157.60.0.1,172.16.0.0/16,LocalSubnet profile=public
放行IP
netsh advfirewall firewall \add rule \name="allow IP" \dir=in \action=allow \localip=any \remoteip=192.168.1.1可执行版:netsh advfirewall firewall add rule name="allow IP" dir=in action=allow localip=any remoteip=192.168.1.1
具体参数说明
C:\Users\Administrator>netsh advfirewall firewall add rule ?用法: add rule name=<string>dir=in|outaction=allow|block|bypass[program=<program path>][enable=yes|no (default=yes)][profile=public|private|domain|any[,...]][localip=any|<IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>][remoteip=any|localsubnet|dns|dhcp|wins|defaultgateway|<IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>][localport=0-65535|<port range>[,...]|RPC|RPC-EPMap|IPHTTPS|any (default=any)][remoteport=0-65535|<port range>[,...]|any (default=any)][protocol=0-255|icmpv4|icmpv6|icmpv4:type,code|icmpv6:type,code|tcp|udp|any (default=any)]
添加规则时主要定义
源端口、目的端口
本地IP、远程IP
动作:allow|block
入出站:in|out
参考:
https://docs.microsoft.com/zh-cn/troubleshoot/windows-server/networking/netsh-advfirewall-firewall-control-firewall-behavior
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc771920(v=ws.10)?redirectedfrom=MSDN




