[C# .NET] Windows 방화벽 등록하기

2022. 3. 3. 23:16· Desktop App/C#.Net
SMALL

TCP 통신 기능이 있는 닷넷 프레임워크 앱들은 실행하면 아래와 같은 창이 뜨고,

허용 시 윈도우 방화벽에 자동으로 등록이 된다.

 

 

이 때 네트워크 프로필과 다른 옵션을 선택하거나 엑세스를 허용하지 않은 경우,

또는 무언가 알 수 없는 오류로 위 창조차 보이지 않고 방화벽에 등록이 되지 않는 경우가 생긴다.

 

해당 문제로 고객사측 앱 사용에 문제가 있어 방화벽에 앱을 자동으로 등록해줄 수 있도록 해주었다.

 

테스트하기 위해 간단한 프로젝트를 생성했다.

 

참조 우클릭 -> 참조 추가

 

COM 항목에서 NetFw라고 검색하면 위와 같이 NetFwTypeLib 라이브러리가 나온다.

체크하여 참조해준다.

 

테스트만 하고 끝낼 것이 아니라 배포용 앱에도 추가해야 하기 때문에 따로 클래스를 만들어 주었다.

using System;
using System.Linq;
using NetFwTypeLib;

namespace FirewallTest
{
    public static class Firewall
    {
        public enum Protocol
        {
            TCPUDP = 0x100,
            TCP = 6,
            UDP = 0x11
        }
        public enum Direction
        {
            INBOUND = 1,
            OUTBOUND = 2,
            MAX = 3
        }

        public enum Action
        {
            BLOCK = 0,
            ALLOW = 1,
            MAX = 2
        }

        private static INetFwPolicy2 policy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));

        public static bool Find(string name, string path)
        {
            return policy.Rules.Cast<INetFwRule>().Any(rule => rule.Name == name && rule.ApplicationName == path);
        }
        public static bool Find(string name, Protocol protocol)
        {
            return policy.Rules.Cast<INetFwRule>().Any(r => r.Name == name && r.Protocol == (int)protocol);
        }

        /// <summary>
        /// Add Firewall Rule
        /// </summary>
        /// <param name="name">Rule Name</param>
        /// <param name="path">Program Full Path</param>
        /// <param name="direction">Direction</param>
        /// <param name="action">Action</param>
        /// <returns>If added, will returns true. Elif Removed, will returns false.</returns>
        public static bool Add(string name, string path, Direction direction, Action action)
        {
            if (Find(name, path)) return true;

            INetFwRule rule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));

            rule.Name = name;
            rule.Protocol = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY;
            rule.Direction = (NET_FW_RULE_DIRECTION_)direction;
            rule.Enabled = true;
            rule.Action = (NET_FW_ACTION_)action;
            
            policy.Rules.Add(rule);

            return Find(name, path);
        }
        /// <summary>
        /// Add Firewall Rule
        /// </summary>
        /// <param name="name">Rule Name</param>
        /// <param name="protocol">Protocol Type</param>
        /// <param name="direction">Direction</param>
        /// <param name="action">Action</param>
        /// <returns>If added, will returns true. Elif Removed, will returns false.</returns>
        public static bool Add(string name, Protocol protocol, Direction direction, Action action)
        {
            if (Find(name, protocol)) return true;

            INetFwRule rule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));

            rule.Name = name;
            rule.Protocol = (int)protocol;
            rule.Direction = (NET_FW_RULE_DIRECTION_)direction;
            rule.Enabled = true;
            rule.Action = (NET_FW_ACTION_)action;

            policy.Rules.Add(rule);

            return Find(name, protocol);
        }

        /// <summary>
        /// Remove Firewall Rule
        /// </summary>
        /// <param name="name">Rule Name</param>
        /// <param name="protocol">Protocol Type</param>
        /// <returns>If Removed or Not exist, will returns true. Elif It didn't Removed, will returns false.</returns>
        public static bool Remove(string name, Protocol protocol)
        {
            if (!Find(name, protocol)) return true;

            INetFwRule rule = policy.Rules.Cast<INetFwRule>().FirstOrDefault(r => r.Name == name && r.Protocol == (int)protocol);

            if (rule != null) policy.Rules.Remove(name);

            return !Find(name, protocol);
        }
    }
}

 

 

테스트해보기 위해 아래 코드를 버튼에 넣고 시험해 보았다.

Firewall.Add(Application.ProductName, Application.ExecutablePath, Firewall.Direction.INBOUND, Firewall.Action.ALLOW);
Firewall.Add(Application.ProductName + "2", Firewall.Protocol.TCP, Firewall.Direction.INBOUND, Firewall.Action.ALLOW);

Firewall.Remove(Application.ProductName, Firewall.Protocol.TCPUDP);

 

 

적용 전

 

적용 후

 

 

삭제 후

 

 

특정 프로토콜만 허용

 

 

특정 포트만 허용하는 메서드도 넣으려고 했으나, 무슨 이유에서인지 ArgumentException이 뜨며 적용되지 않는다.

 

 

BIG
저작자표시 (새창열림)

'Desktop App > C#.Net' 카테고리의 다른 글

압축된 폰트파일 한번에 풀고 설치하기  (0) 2022.06.01
[C# .NET] static 함수에서 Control에 접근하기  (1) 2021.10.19
'Desktop App/C#.Net' 카테고리의 다른 글
  • 압축된 폰트파일 한번에 풀고 설치하기
  • [C# .NET] static 함수에서 Control에 접근하기
Jade Choe
Jade Choe
Jade's Hello, World!Jade Choe 님의 블로그입니다.
Jade Choe
Jade's Hello, World!
Jade Choe
전체
오늘
어제
  • Jade's Hello World (55)
    • Projects (3)
      • DJade MAX Respect V (3)
    • Desktop App (9)
      • Win API (2)
      • C#.Net (3)
      • C, C++ (1)
      • DirectX (0)
      • Java (2)
    • Mobile App (13)
      • Android (12)
      • iOS (1)
    • Web App (3)
      • PHP (1)
      • HTML&CSS (0)
      • Javascript (0)
      • Python - Django (2)
    • ETC (25)
      • Unity (7)
      • Ubuntu (3)
      • macOS (0)
      • Git (11)
      • Docker (1)
      • Synology (3)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 사용법
  • gitserver
  • 웹뷰 하얀화면
  • 웹뷰 로딩
  • Git
  • ㅖㅗㅖ
  • git 서버구축
  • 웹뷰
  • 안드로이드 상태바
  • ㄴ노
  • 깃 서버 구축
  • 노치대응
  • 깃
  • 입문
  • 안드로이드
  • git 구축
  • SU-PQR1603
  • 웹뷰 안뜸
  • epicgames
  • 깃 구축
  • 웹훅
  • Remote-SSH
  • 웹후크
  • 에픽런처
  • nosuchmethoderror
  • 컷아웃디스플레이
  • 펀치홀
  • github
  • 방화벽등록
  • 깃허브

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Jade Choe
[C# .NET] Windows 방화벽 등록하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.