c# netsh 명령어를 이용한 방화벽 예외 규칙 추가 샘플코드

  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기

c# 코드를 통해 netsh 명령어를 이용한 방화벽 예외 규칙을 자동으로 추가하는 방법에 대해 알아보려고 합니다. 윈도우 네트워크의 구성정보를 수정하는 명령이기 때문에 정확하게 동작을 수행합니다.

c# 방화벽 인바운드 규칙 추가 코드

우선 인바운드 규칙 추가를 위해 간단하게 함수를 하나 만들겁니다. 설명을 드리자면 윈도우 명령어인 netsh 를 c# 코드를 이용해서 실행시키는 방법입니다. netsh 명령어는 전달된 파라미터를 통해 방화벽에 새로운 룰을 추가하게 되며, 파라미터로 방화벽해제 룰 이름, 그리고 방화벽 해제할 포트를 전달받게 됩니다.

public static bool AddFirewallPort(string RuleName, int port)
{
    bool Result = false;


    Process process = new Process();
    process.StartInfo.FileName = "netsh";
    process.StartInfo.Arguments = $"advfirewall firewall add rule name=\"" + RuleName + "\" dir=in action=allow protocol=TCP localport=" + port.ToString();
    process.StartInfo.Verb = "runas"; 
    process.StartInfo.UseShellExecute = true;

    try
    {
        process.Start();
        process.WaitForExit();

        if (process.ExitCode == 0)
        {
            Console.WriteLine($"포트 {port}를 허용하는 방화벽 예외 규칙이 성공적으로 추가되었습니다.");
            Result = true;
        }
        else
        {
            Console.WriteLine("방화벽 예외 규칙을 추가하는 동안 오류가 발생했습니다.");
            Result = false;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("오류 발생: " + ex.Message);
    }

    return Result;
}

예제로 작성된 AddFirewallPort 함수를 이용해 테스트로 방화벽 인바운드 규칙을 등록해 보았습니다.

AddFirewallPort("Test_Firewall", 25878);


아래와 같이 정상적으로 등록되었네요.

C# netsh 명령어를 통한 방화벽 예외 규칙 추가
C# netsh 명령어를 통한 방화벽 예외 규칙 추가

방화벽 예외 규칙 추가시 주의사항

프로그램이 실행될때 마다 위 함수를 이용해서 방화벽 예외 규칙을 추가 했다면, 규칙 이름과 예외 포트가 동일해도 중복 등록됩니다. 즉, 방화벽예외규칙 추가 함수를 10번 실행하면 10개의 동일한 방화벽예외규칙이 추가가 되기 때문에 중복등록되지 않도록 막아야합니다.

방화벽 예외 규칙 추가를 막기 위해서는 이미 같은이름과 같은포트를 사용하는 규칙이 이미 등록되어 있는지 체크해볼 수 있습니다.

public static bool CheckFirewallRule(string RuleName)
{
    bool Result = false;

    Process process = new Process();
    process.StartInfo.FileName = "netsh";
    process.StartInfo.Arguments = "advfirewall firewall show rule name=all";
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;

    try
    {
        process.Start();
        string output = process.StandardOutput.ReadToEnd();
        process.WaitForExit();

        if (output.Contains(RuleName))
        {
            Result = true;
        }
        else
        {
            Result = false;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("오류 발생: " + ex.Message);
    }

    return Result;
}

댓글 남기기

error: 저작권 콘텐츠보호를 부탁드립니다.