Windows 네트워크 이해_WFP
Categories:
- Windows 네트워크 이해_WFP
Windows 네트워크 이해
- Windows 네트워크 이해
WFP
명명 규칙 설명
https://learn.microsoft.com/en-us/windows/win32/fwp/object-model https://learn.microsoft.com/en-us/windows/win32/fwp/basic-operation https://learn.microsoft.com/en-us/windows-hardware/drivers/network
콜아웃: 콜아웃은 Windows 필터링 플랫폼의 기능을 확장하는 기능을 제공한다. 콜아웃은 콜아웃 함수 세트와 콜아웃을 고유하게 식별하는 GUID 키로 구성된다. 콜아웃 드라이버: 콜아웃 드라이버는 Windows 필터링 플랫폼에 콜아웃을 등록하는 드라이버이다. 콜아웃 드라이버는 필터 드라이버의 일종이다. 콜아웃 함수: 콜아웃 함수는 Windows 필터링 플랫폼에 의해 특정 작업을 수행하기 위해 호출되는 함수이다. 콜아웃 함수는 콜아웃과 연결된다. 필터: 필터는 Windows 필터링 플랫폼에 의해 필터링 작업을 수행하기 위해 호출되는 함수 세트이다. 필터는 필터 함수 세트와 필터를 고유하게 식별하는 GUID 키로 구성된다. 필터 엔진: 필터 엔진은 Windows 필터링 플랫폼의 구성 요소로, 필터링 작업을 수행한다. 필터 엔진은 Windows 필터링 플랫폼에 등록된 필터 함수를 호출하는 책임이 있다. 필터 레이어: 필터 레이어는 Windows 필터링 플랫폼에 의해 필터링 작업을 수행하기 위해 호출되는 함수 세트이다. 필터 레이어는 필터 레이어 함수 세트와 필터 레이어를 고유하게 식별하는 GUID 키로 구성된다.
Dispatcher 큐는 가능한 한 빨리 콜백을 트리거하는 형식으로, 큐가 가득 찰 때까지 기다릴 필요가 없다. 따라서 실시간성을 만족시킬 수 있다. 사용자 콜백이 느릴 때 차단된 패킷은 가능한 다음 큐로 삽입되며, 큐 상한은 256이다. 더 많은 차단된 패킷은 시스템 캐시에 의해 보관되며, 대략적인 테스트 결과 캐시 용량은 16500이며, 시스템 캐시 용량은 기계 성능 및 구성에 따라 차이가 있을 수 있다. 사용자 콜백이 패킷을 처리할 때 두 개의 패킷 엔티티가 존재한다: 커널 패킷은 콜백이 큐를 처리한 후 함께 해제된다. 따라서 콜백이 느릴 때 한 번의 콜백 실행이 최대 256개의 패킷 캐시 용량을 시스템에서 잠금한다. 콜백에서의 복사본은 개별 패킷을 처리한 후 즉시 해제된다.
FwppNetEvent1Callback에서 패킷을 복사하여 조립하며, 원본 패킷을 조작하지 않으므로 비즈니스에 영향을 주지 않는다.
구독 시 템플릿 필터를 사용하여 처리해야 하는 패킷 수를 줄일 수 있다:
filterCondition
고유한 필터 조건을 포함하는 FWPM_FILTER_CONDITION0 구조체 배열이다(중복된 필터 조건은 오류를 발생시킨다). 모든 조건이 충족되어야 액션이 수행된다. 즉, 조건들이 AND 연산으로 연결된다. 조건이 지정되지 않은 경우 액션이 항상 수행된다.
동일한 필터를 사용할 수 없다. 모든 필터 사이의 관계는 “AND"이며, 모두 만족해야 한다. MS 문서에 따르면 8가지 필터가 지원된다고 하지만 실제로는 더 많은 필터가 지원된다.
FWPM_CONDITION_IP_PROTOCOL
RFC 1700에서 지정한 IP 프로토콜 번호. FWPM_CONDITION_IP_LOCAL_ADDRESS
로컬 IP 주소. FWPM_CONDITION_IP_REMOTE_ADDRESS
원격 IP 주소. FWPM_CONDITION_IP_LOCAL_PORT
로컬 전송 프로토콜 포트 번호. ICMP의 경우 메시지 유형. FWPM_CONDITION_IP_REMOTE_PORT
원격 전송 프로토콜 포트 번호. ICMP의 경우 메시지 코드. FWPM_CONDITION_SCOPE_ID
인터페이스 IPv6 범위 식별자. 내부 사용을 위해 예약됨. FWPM_CONDITION_ALE_APP_ID
응용프로그램의 전체 경로. FWPM_CONDITION_ALE_USER_ID
로컬 사용자의 식별.
시스템에 등록된 구독을 열거한 결과 두 개의 구독이 이미 있음을 발견했으며, 해당 sessionKey GUID를 확인해도 누가 등록했는지 확인할 수 없었다. 분석 결과 두 구독은 각각 다음 기능을 구현했다:
모든 FWPM_NET_EVENT_TYPE_CLASSIFY_DROP 패킷을 구독하여 버려진 모든 패킷을 통계화했다. 모든 FWPM_NET_EVENT_TYPE_CLASSIFY_ALLOW 패킷을 구독하여 트래픽 통계를 작성할 수 있다. 이 두 구독이 사용한 condition filter는 FWPM_CONDITION_NET_EVENT_TYPE(206e9996-490e-40cf-b831-b38641eb6fcb)로, MS 문서에서 언급한 8가지 이외에도 더 많은 필터가 구현 가능함을 보여준다.
추가 조사 결과 사용자 모드 호출 인터페이스는 drop 이벤트만 캡처할 수 있으며, drop 이벤트가 아닌 것은 커널 모드에서 얻어야 한다는 것을 발견했다. 따라서 마이크로 격리에서는 FWPM_CONDITION_NET_EVENT_TYPE를 사용해 이벤트를 얻을 수 없다.