C#如何禁止指定的IP连接本机指定的端口?例如不允许194.16.5.13连接3389端口,但允许他做其他访问IIS网站等操作
|
admin
2025年3月13日 16:31
本文热度 153
|
在C#中可以通过Windows防火墙规则实现该需求,以下是分步解决方案:
原理说明:
通过操作Windows防火墙的入站规则
针对特定IP和端口创建阻止规则
不影响其他端口(如IIS的80/443端口)
实现代码:
using System.Diagnostics;
public class FirewallHelper
{
public static void BlockIPPort(string ip, int port)
{
string ruleName = $"Block_{ip}_Port_{port}";
string command = $"advfirewall firewall add rule name=\"{ruleName}\" " +
$"dir=in action=block protocol=TCP " +
$"remoteip={ip} localport={port}";
ExecuteNetshCommand(command);
}
public static void RemoveBlockRule(string ip, int port)
{
string ruleName = $"Block_{ip}_Port_{port}";
string command = $"advfirewall firewall delete rule name=\"{ruleName}\"";
ExecuteNetshCommand(command);
}
private static void ExecuteNetshCommand(string command)
{
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = "netsh",
Arguments = command,
Verb = "runas",
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = true
};
try
{
Process.Start(psi)?.WaitForExit();
}
catch (Exception ex)
{
Console.WriteLine($"执行命令失败: {ex.Message}");
}
}
}
FirewallHelper.BlockIPPort("194.16.5.13", 3389);
使用说明:
需要以管理员权限运行程序
规则将永久生效直到手动删除
可通过Windows防火墙设置界面查看规则:
打开"高级安全Windows Defender防火墙"
在"入站规则"中查找规则名称(例如:Block_194.16.5.13_Port_3389)
验证方法:
# 查看所有防火墙规则
netsh advfirewall firewall show rule name=all
# 测试端口连通性(从被禁IP执行)
telnet 目标服务器IP 3389
注意事项:
确保程序以管理员身份运行(可在项目属性中设置)
规则名称需要唯一,避免重复创建
不会影响目标IP访问其他端口(如80端口)
实际部署时建议添加异常处理机制
替代方案:
如果希望仅在应用程序运行时生效,可以使用Socket层过滤(需要处理网络驱动开发),但推荐使用防火墙方案,因为:
此方案通过系统防火墙实现精准的IP+端口过滤,同时保持其他端口的正常访问权限,满足需求中的访问控制要求。
该文章在 2025/3/13 18:53:59 编辑过