前言
网络位置类型
区别:防火墙的域、专用、公用的网络位置类型不同。
域:Windows可以验证对计算机所联接域的域控制器的访问。
公共:除域网络之外,其他所有网络最初都归为公共网络一类。直接连到Internet的网络或者位于公共场所(如机场和咖啡店)的网络应保留为公共网络。
专用:由用户或应用程序标识为专用的网络。只应将可信网络标识为专用网络。用户很可能希望将家庭网络或小型企业网络标识为专用网络。
操作系统使用防火墙配置文件按照连接性、连接数和类别来识别并记住与它们连接的每个网络。
在高级安全Windows防火墙中有三种网络位置类型:域、公共、专用。
出入站规则
Windows 系统默认的规则
默认阻止入站连接,默认允许出站连接。也就是说,凡是入站连接,任何程序和端口都要在防火墙上配置入站规则,否则都会被禁止。
入站规则
入站规则是用来限制远程主机访问本机的服务的,本机接收的请求中如果被请求的程序或具体端口是被限制的,则该请求会被拦截。
出站规则
出站规则是用来限制对外访问的,从本机发出的请求中,如果请求的对象是被禁止的,该请求会被拦截,表现方式就是断网。
两种方式
- 端口方式
- 程序方式(推荐)
注意
端口方式,开发过程和最终安装时都是一样的规则。推荐使用。
入站规则不生效
HttpListener启动的用户是由操作系统决定的。
如果您在Windows上使用HttpListener,则默认情况下,它将使用系统用户启动。
但是:
系统用户启动的服务,设置的防火墙入站规则
程序方式
不生效。只能使用端口方式
推荐方式
运行Bat方式添加端口规则
查看端口信息
1 | netstat -ano |
查看入站规则
键盘点击Ctrl+R
打开运行,输入Firewall.cpl
回车打开防火墙页面。
点击高级设置
=>入站规则
里面就可以看到添加的配置,就代表成功了。
代码添加
添加COM引用
在引用
=>添加引用
=>选择COM
页=> 找到NetFwTypeLib
, 确定即可
添加命名空间
1 | using NetFwTypeLib; |
程序方式添加
1 | using System; |
调用
1 | var processModule = Process.GetCurrentProcess().MainModule; |
名称不要用@
开头,会导致规则无法删除。
端口方式添加
1 | using NetFwTypeLib; |
调用
1 | // 添加防火墙入站规则 |
命令行添加(推荐)
添加程序规则
添加规则
1 | netsh advfirewall firewall add rule name="MyApp" dir=in action=allow program="C:\MyApp.exe" |
删除规则
1 | netsh advfirewall firewall delete rule name="MyApp" program="C:\MyApp.exe" |
使用批处理将当前目录下的*.exe
都加入到白名单中:
addfirewall.bat
1 | @echo off |
根据系统版本添加防火墙规则:
1 | @echo off |
添加端口规则
注意
添加这个文件的时候文件编码不能是UTF-8,会导致命令执行失败,要设置为ANSI编码。
addfirewall.bat
1 | @echo off |
运行Bat
1 | private void AddFirewallRule() |
系统版本判断
系统版本判断
1 | @echo off |
其中:
for /f "tokens=4,5 delims=. " %%a in ('ver')
:使用for
命令读取ver
命令的输出,并将版本信息按照.
和空格分隔,分别存储在变量%%a
和%%b
中。if %%a%%b geq 60 goto new
:判断版本号是否大于等于60(即Windows Vista及以上版本),如果是则跳转到标签new
执行相关操作。
整体解析:
- 使用ver命令获取Windows版本号,格式为
主版本号.次版本号
。例如10.0.17134
。 - 使用for语句解析版本号,提取主版本号到
%%a
,次版本号到%%b
。 - 判断如果主版本号
%%a
加次版本号%%b
大于等于60,则跳转到:new
标签。否则跳转到:old
标签。 :old
标签处打印"old"
,然后跳转到:end
结束。:new
标签处打印"new",
然后跳转到:end
结束。:end
处暂停等待用户输入。
总结起来,
这个bat脚本的作用是判断Windows版本号是否>= 6.0(也就是Windows Vista及以上版本),如果是则打印
"new"
,否则打印"old"
。
举个例子:
在Windows 10下运行这个bat,会输出:
1 | new |
在Windows XP下运行,会输出:
1 | old |