Skip to main content

PyWFP

Tests codecov PyPI version

PyWFP is a Python interface for working with Windows Filtering Platform (WFP), allowing creation of network traffic filters using a similar Windivert-style syntax.

Note: PyWFP requires administrator privileges to run. Running without admin rights will result in a WFPError with code 0x00000005 (Access Denied).

Installation

pip install pywfp

Usage

from pywfp import PyWFP
from pprint import pprint


def main():
    # Create PyWFP instance
    pywfp = PyWFP()

    # Example filter string
    filter_string = (
        "outbound and tcp and remoteaddr == 192.168.1.3-192.168.1.4 " "and tcp.dstport == 8123 and action == block"
    )

    try:
        # Use context manager to handle WFP engine session
        with pywfp.session():
            # Add the filter
            filter_name = "PyWFP Block Filter"
            pywfp.add_filter(filter_string, filter_name=filter_name, weight=1000)

            # List existing filters
            filters = pywfp.list_filters()
            print(f"Found {len(filters)} WFP filters")

            # Find our specific filter
            if filter := pywfp.get_filter(filter_name):
                print(f"Found filter: {filter}")
                pprint(filter)

            # Keep the filter active until interrupted
            print("Press Ctrl+C to exit and remove the filter")
            try:
                while True:
                    input()
            except KeyboardInterrupt:
                print("Received Ctrl+C, cleaning up")

    except Exception as e:
        print(f"Error: {e}")


if __name__ == "__main__":
    main()

Supported Filters

PyWFP supports a variety of filter conditions that can be combined using logical AND operations. Here are the supported filter types:

Basic Filter Syntax

"outbound and tcp and remoteaddr == 192.168.1.3-192.168.1.4 and tcp.dstport == 8123 and action == allow"

Supported Conditions

Field Description Example Values
inbound/outbound Direction of traffic inbound, outbound
tcp/udp/icmp Protocol type tcp, udp, icmp
remoteaddr Remote IP address (supports ranges) 192.168.1.1, 10.0.0.1-10.0.0.255
localaddr Local IP address (supports ranges) 127.0.0.1, 192.168.1.1-192.168.1.255
tcp.dstport TCP destination port 80, 443
tcp.srcport TCP source port 5000, 8080
udp.dstport UDP destination port 53, 123
udp.srcport UDP source port 5000, 8080
action Filter action (allow/block) allow, block

IP Address Ranges

You can specify IP ranges using hyphen notation:

"remoteaddr == 192.168.1.1-192.168.1.255"

Multiple Conditions

Combine conditions using AND:

"outbound and tcp and remoteaddr == 192.168.1.1 and tcp.dstport == 80"

Filter Management

# You can set the weight of the filter to determine its priority. If weight is not specified, the highest priority will be given.
pywfp.add_filter("inbound and udp", filter_name="Block UDP", weight=500)

# List all filters
for filter in pywfp.list_filters():
    print(filter["name"])
)
# Maybe more to be added here

Testing

Unit Tests

Run unit tests with:

pytest -m "not integration"

Integration Tests

Integration tests require:

  • Windows OS
  • Administrator privileges
  • Local network access

To run integration tests locally:

# Open an administrator command prompt
pytest -m integration

Metadata

Release files for pywfp 0.1.42

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pywfp 0.1.42
File Size Uploaded
pywfp-0.1.42.tar.gz 18.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pywfp 0.1.42
File Interpreter ABI Platform
pywfp-0.1.42-py3-none-any.whl Python 3 none any Details

Total release size: 34.3 kB

Release files / pywfp-0.1.42.tar.gz

Download URL pywfp-0.1.42.tar.gz
Size 18.3 kB
Tags Source
SHA-256 checksum
How to use checksums
46afcd562037bfdf035322f538fcb79143aacf02d7cb397acd67078b5fabca93
BLAKE2b-256 checksum
How to use checksums
bce4ae5f369e67c97bf7c586f8510fdae1b3a046eb787dbb66762f030eb11721
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 3, 2025.

Transparency log

Release files / pywfp-0.1.42-py3-none-any.whl

Download URL pywfp-0.1.42-py3-none-any.whl
Size 16.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6c22722ea246b0bcb19c8ef42e1afa33045172555d856087a94b288cc09f336d
BLAKE2b-256 checksum
How to use checksums
19f42101a0ac3c47db64cf51f4904b7d9c980faa034dcac68f29700f0149a3a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 3, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.42 This release

2 release files

0.1.3

2 release files

0.1.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page