{"library":"pytun-pmd3","title":"PyTun-PMD3 (IPv6-ONLY TUN device)","description":"pytun-pmd3 is a fork of the original python-pytun library, providing support for TUN/TAP network devices on Darwin (macOS), Windows, and Linux. It exclusively supports IPv6, making it suitable for applications like VPNs that specifically require IPv6 tunneling. The library is currently at version 3.0.3 and has a moderate release cadence, focusing on bug fixes and platform compatibility.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install pytun-pmd3"],"cli":null},"imports":["from pytun import TunTapDevice","from pytun import IFF_TUN","from pytun import IFF_NO_PI"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nimport sys\nimport time\nfrom pytun import TunTapDevice, IFF_TUN, IFF_NO_PI\n\n# Note: Requires appropriate permissions (e.g., run as root/administrator\n# or user added to 'tun' group on Linux). On Windows, the wintun driver\n# might need manual installation first, though pytun-pmd3 attempts to manage it.\n\ntry:\n    # Use a unique name to avoid conflicts, or a fixed one for specific setup\n    device_name = os.environ.get('PYTUN_DEV_NAME', 'pytun-pmd3-tun0')\n    tun = TunTapDevice(name=device_name, flags=IFF_TUN | IFF_NO_PI)\n    print(f\"Created TUN device: {tun.name}\")\n\n    tun.up()\n    print(f\"Device {tun.name} is up.\")\n\n    # Configure IPv6 address (pytun-pmd3 is IPv6-ONLY)\n    ipv6_address = os.environ.get('PYTUN_IPV6', 'fcd0::1/64')\n    tun.ifconfig(ipv6=ipv6_address)\n    print(f\"Configured IPv6 address {ipv6_address} on {tun.name}\")\n\n    print(f\"\\nDevice {tun.name} configured. You can now try pinging its address.\")\n    print(\"Example: ping fcd0::1 (from another host/interface that can route to it)\")\n    print(\"Waiting for 10 seconds. Press Ctrl+C to stop.\")\n\n    start_time = time.time()\n    while time.time() - start_time < 10:\n        try:\n            # Read up to 1500 bytes with a 1-second timeout\n            packet = tun.read(1500, timeout=1)\n            if packet:\n                print(f\"Received {len(packet)} bytes from TUN device.\")\n            sys.stdout.flush()\n        except Exception as e:\n            # Ignore common 'Resource temporarily unavailable' when no packets\n            pass\n        time.sleep(0.1)\n\nexcept PermissionError:\n    print(\"Error: Permission denied. Try running as root/administrator or\")\n    print(\"ensure your user has appropriate permissions (e.g., added to 'tun' group).\")\n    print(\"On Linux: sudo usermod -a -G tun $(whoami) && sudo reboot\")\nexcept FileNotFoundError as e:\n    print(f\"Error: File not found: {e}\")\n    print(\"On Windows, ensure the wintun driver is correctly installed and accessible.\")\nexcept Exception as e:\n    print(f\"An unexpected error occurred: {e}\")\nfinally:\n    if 'tun' in locals():\n        try:\n            print(f\"Closing TUN device: {tun.name}\")\n            tun.close()\n            print(\"Device closed.\")\n        except Exception as e:\n            print(f\"Error closing TUN device: {e}\")","lang":"python","description":"This quickstart demonstrates how to create an IPv6-only TUN device, bring it up, and configure its IPv6 address. It then enters a brief loop to show packet reception. Remember to run with appropriate permissions.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"3.0.3","pypi_latest":"3.0.3","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.8,"avg_import_s":null,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pytun-pmd3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"19.5M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pytun-pmd3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":1.8,"import_time_s":null,"mem_mb":null,"disk_size":"20M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pytun-pmd3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"21.3M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pytun-pmd3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":1.8,"import_time_s":null,"mem_mb":null,"disk_size":"22M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pytun-pmd3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"13.2M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pytun-pmd3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":1.7,"import_time_s":null,"mem_mb":null,"disk_size":"14M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pytun-pmd3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"12.9M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pytun-pmd3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":1.7,"import_time_s":null,"mem_mb":null,"disk_size":"13M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pytun-pmd3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":"19.0M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pytun-pmd3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":2.1,"import_time_s":null,"mem_mb":null,"disk_size":"19M"}]}}