Apple FilteringNetworkTraffic 예제를 이용하여 IP/Domain 기반으로 블랙리스트를 만들어 네트워크를 차단하는 방법을 공유해 보려 한다.

Network Extension란?

NetworkExtension 프레임워크는 시스템의 핵심 네트워킹 기능 확장할 수 있는 프레임워크로 VPN, FireWall 등을 개발할 수 있다.

FilteringNetworkTraffic with SimpleFirewall

Apple에서 제공하는 SimpleFirewall 코드를 활용하여 IP, Domain 기반으로 BlackList 기반 네트워크 차단 기능을 만들 수 있다.
다운로드 링크: https://developer.apple.com/documentation/networkextension/filtering-network-traffic

관련 영상: https://developer.apple.com/videos/play/wwdc2019/714

Sample Code 구조

  1. UI에서 Start버튼을 클릭하면 Extension을 활성화 한다.

  2. OSSystemExtensionRequest가 성공하면 NEFilterManagef를 활성화 한다.

  3. NetworkExtension은 활성화 되면서 Port 8888로 TCP/inbound 되는 모든 통신을 필터링하는 룰을 셋팅한다.

  4. 위에서 지정한 FilterRule에 해당되는 통신이 발생하면 handleNewFlow로 이벤트가 들어오게 되고 이를 IPC를 통해 UI Application으로 전달한다.

  5. 이벤트를 받은 UI Appilcation은 사용자에게 얼리트를 노출하여 해당 통신에 "허용", "거절" 여부를 받는다.

  6. 사용자에 대한 응답을 시스템에 전달한다.

IP/Domain BlackList 만들기

* sample: https://github.com/ponyo721/SimpleFirewall

  • 예제에서 localNetwork를 필터링 했듯이 remoteNetwork를 룰로 설정하면 외부와 통신을 필터링 할 수 있으며, direction을 통해 inbound/outbound 를 protocol 통해 TCP/UDP 를 설정할 수 있다.
    두 옵션 모두 "Any" 옵션도 지원하고 있다.

  • Definition에 나온것처럼 포트를 0으로 설정하면 모든 포트에 대한 필터가 가능하고 IP가 아닌 Domain 사용 방법도 제시되어 있다.

주의사항

  • 코드를 수정하고 테스트를 진행하면 내가 수정한 코드가 반영되지 않은것을 확인할 수 있다. 이는 내가 수정한 익스텐션이 아닌 기존에 설치된 익스텐션이 동작하고 있기 때문이다. 그렇기에 우린 기존에 익스텐션을 비활성화하고 새로운 익스텐션으로 업데이트 하는 코드가 추가되어야 한다.
  1. OSSystemExtensionRequest.deactivationRequest 요청을 하여 기존에 익스텐션을 비활성화 시킨다.

  2. deactivationRequest에 대한 응답이 오면 새로운 익스텐션을 활성화 한다.

마치며...

직접 테스트를 해보면 Safari, Firefox등 브라우저에서 내가 설정한 ip, domin이 잘 차단되는것을 확인할 수 있다. 그러나 Chrome경우 ip차단은 동작하나 domin차단은 동작하지 않는다.

이는 Chrome기능중 하나로 내장 DNS를 사용하여 Domain기반 필터가 불가능한 것으로 아래 cmd를 입력하면 해당 옵션을 비활성화 하여 Domain Filter가 가능해진다.

defaults write com.google.Chrome BuiltInDnsClientEnabled -bool false

공식문서: https://chromeenterprise.google/policies/#BuiltInDnsClientEnabled

profile
macOS Native Application Developer

0개의 댓글