Как я могу создать программу для динамического добавления / удаления IP, который может получить доступ к порту сторонней службы?

Я хотел бы иметь возможность использовать C# для создания белого списка (или удаления из списка) IP-адресов, которым разрешен доступ к определенному порту, диапазонам портов или любому другому порту для сторонней службы на сервере Windows 2012.

Есть ли способ, которым я могу программно контролировать доступ к другой службе?

2 ответа

Решение

В Windows можно получить доступ к сетевым командам, используя powershell и исполняемый файл netsh.

Таким образом, используя C#, можно изменить правила брандмауэра, используя класс System.Diagnostics.Process и передавая команды этому исполняемому файлу способами, описанными на этих двух страницах:

Как использовать класс Process для вызова netsh, уже дано ответ в следующем посте: Команда netsh с использованием C#

Вы можете заблокировать IP-адрес, добавив правило в брандмауэр Windows через командную строку, используя этот метод:

      void BanIP(string RuleName, string IPAddress, string Port, string Protocol)
{
    if (!string.IsNullOrEmpty(RuleName) && !string.IsNullOrEmpty(IPAddress) && !string.IsNullOrEmpty(Port) && !string.IsNullOrEmpty(Protocol) && new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator))
    {
        using (Process RunCmd = new Process())
        {
            RunCmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            RunCmd.StartInfo.FileName = "cmd.exe";
            RunCmd.StartInfo.Arguments = "/C netsh advfirewall firewall add rule name=\"" + RuleName + "\" dir=in action=block remoteip=" + IPAddress + " remoteport=" + Port + " protocol=" + Protocol;
            RunCmd.Start();
        }
    }
}

Использование:

      BanIP("Rule1", "151.21.1.1", "3389" "TCP") // Will ban the IP 151.21.1.1 (RDP).
BanIP("Rule2", "151.21.1.1", "Any" "TCP") // Will ban the IP 151.21.1.1 with any TCP ports.
BanIP("Rule3", "151.21.1.1", "3380-3390" "TCP") // Will ban the IP 151.21.1.1 with 3380-3390 TCP port range.

Обратите внимание, что эта команда будет работать, начиная с Windows Server 2012 R2, и что требуются права администратора. Также помните, что, будучи процессом, внешним по отношению к вашему коду C #, нет никакой гарантии, что это будет работать, вам нужно добавить проверки, чтобы убедиться, что все работает правильно.

Другие вопросы по тегам