An unofficial PdaNet+ Wi-Fi Direct client for Linux desktops. PdaNet Linux turns the Android app's HTTP CONNECT proxy into system-wide IPv4 TCP access, so browsers, code editors, Git, SSH-over-TCP tools, remote-management clients, and other desktop applications can connect without individual proxy settings.
The included GTK 3 system tray indicator automatically enables transparent
networking when Linux joins a DIRECT-*-PDANET Wi-Fi network and restores
normal networking after it disconnects. The icon is green while transparent
mode is active and gray while it is off.
Important
This project is developed and live-tested on Pop!_OS and is intended first for Debian-family distributions using NetworkManager, systemd-resolved, iptables, GTK 3, and Ayatana AppIndicator. Ubuntu, Debian, Linux Mint, and similar systems may work with little or no adjustment. Fedora, Arch Linux, openSUSE, and other distributions are YMMV/best effort: package names, service paths, firewall backends, DNS integration, and system-tray support differ. Review the installer before running it and keep a normal network connection available for recovery.
- Uses PdaNet+'s Wi-Fi Direct proxy at
192.168.49.1:8000. - Transparently redirects public IPv4 TCP connections through redsocks and HTTP CONNECT.
- Sends system DNS through a small DNS-over-HTTPS forwarder, with bounded concurrency to avoid overwhelming the phone proxy after reconnecting.
- Rejects QUIC and DNS-over-QUIC on the PdaNet interface so compatible apps promptly fall back to TCP.
- Preserves localhost, private LANs, Docker/libvirt networks, and the PdaNet proxy subnet instead of redirecting them.
- Provides
pdanet-on,pdanet-off,pdanet-status, andpdanet-stateCLI commands. - Provides a GNOME/Unity-compatible AppIndicator tray menu with automatic Wi-Fi switching, manual controls, status, and desktop notifications.
- Rolls back its own firewall, DNS, runtime, and service changes if activation fails.
- Creates backups before installation and includes a defensive uninstaller.
PdaNet Linux does not intercept TLS, install a certificate authority, or read application traffic. HTTPS remains end-to-end encrypted between each application and its destination.
Linux application TCP
-> iptables nat/OUTPUT (public IPv4 on the PdaNet Wi-Fi interface only)
-> redsocks on 127.0.0.1:12345
-> HTTP CONNECT at 192.168.49.1:8000
-> Internet destination
Linux application DNS
-> systemd-resolved
-> temporary pdanet-dns0 link at 10.254.254.1:5300
-> DNS-over-HTTPS through the PdaNet HTTP proxy
-> Cloudflare DoH, with Google DoH fallback
The controller creates dedicated PDANET_TPROXY, PDANET_DNS, and
PDANET_UDP iptables chains. Its jumps are tagged pdanet-transparent and
scoped to the selected Wi-Fi interface. It does not flush the host firewall or
replace the complete ruleset.
| Platform | Expected status | Notes |
|---|---|---|
| Pop!_OS | Tested | Primary development platform. |
| Ubuntu | Expected | Install the Ayatana AppIndicator GI package if it is not already present. |
| Debian | Expected | GNOME may need an AppIndicator/KStatusNotifier extension. |
| Linux Mint | Expected | Cinnamon generally exposes AppIndicator tray icons. |
| Fedora | Best effort / YMMV | Install equivalent packages; verify systemd-resolved and iptables compatibility. |
| Arch Linux | Best effort / YMMV | Install equivalent packages; package/service paths can differ. |
| openSUSE | Best effort / YMMV | Manual dependency and firewall adjustments may be needed. |
| Windows, macOS, ChromeOS, WSL | Unsupported | This program depends on Linux NetworkManager, systemd, netfilter, and a desktop status-notifier host. |
The tray uses GTK 3 plus Ayatana AppIndicator (with Ubuntu AppIndicator as a fallback). Pop!_OS, Ubuntu, Unity, Cinnamon, and many KDE Plasma installations normally show it. Plain GNOME may require an AppIndicator/KStatusNotifier shell extension. Xfce, MATE, and other panels need a compatible status-notifier or indicator plugin. Tray behavior outside the tested Debian-family desktop is YMMV even if the networking controller itself works.
- The official PdaNet+ app from June Fabrics.
- Wi-Fi Direct Hotspot enabled in PdaNet+.
- The phone must expose the usual
192.168.49.1:8000HTTP proxy.
- Python 3.10 or newer.
- NetworkManager (
nmcli). - systemd and systemd-resolved (
systemctl,resolvectl). - iptables, iproute2, curl, DNS utilities (
dig), sudo, and PolicyKit. - redsocks.
- PyGObject/GTK 3 and Ayatana AppIndicator for the tray.
- Root access for installation and network-mode changes.
Install dependencies (the exact package set can vary by release):
sudo apt update
sudo apt install -y \
redsocks iptables curl dnsutils iproute2 network-manager sudo policykit-1 \
python3 python3-gi gir1.2-gtk-3.0 \
gir1.2-ayatanaappindicator3-0.1 gir1.2-notify-0.7Clone and install:
git clone https://github.com/brisksystems-us/pdanet-linux.git
cd pdanet-linux
sudo ./install.shThe installer detects the first NetworkManager Wi-Fi interface, installs
root-owned executables and service files, validates its narrow sudoers rules,
backs up relevant firewall/configuration state under
/var/lib/pdanet-transparent/backups, and finishes in normal networking mode.
Start the tray without logging out:
pdanet-trayIt is also installed in the current desktop user's autostart directory for future logins.
Install equivalents for these components before running the installer:
redsocks, iptables, curl, bind-utils, iproute, NetworkManager,
python3-gobject, gtk3, libayatana-appindicator-gtk3, libnotify, sudo, polkit
Then clone the repository, review transparent/config/ and the systemd unit
paths, and run sudo ./install.sh. Fedora releases can default to different
firewall and DNS arrangements; this is best-effort and must be tested with
pdanet-status immediately after activation.
Install equivalents for these components before running the installer:
redsocks, iptables-nft (or iptables), curl, bind, iproute2, networkmanager,
python-gobject, gtk3, libayatana-appindicator, libnotify, sudo, polkit
Enable NetworkManager and systemd-resolved if your installation does not use
them. Review the service paths and resolvectl behavior before running
sudo ./install.sh. Arch-based systems are untested and explicitly YMMV.
Install packages providing all commands checked near the top of install.sh,
plus the GTK/AppIndicator typelibs used by pdanet-tray. The controller assumes
NetworkManager, systemd-resolved, and iptables-compatible netfilter behavior.
If your distribution uses another network manager, DNS resolver, init system,
or firewall stack, the installer is not directly compatible.
- Open PdaNet+ on Android.
- Enable WiFi Direct Hotspot.
- In Linux network settings, join the shown
DIRECT-…-PdaNetSSID using the password displayed by the phone. - Leave PdaNet+ running on the phone.
- The tray checks state every five seconds and turns transparent mode on.
- When Linux leaves that PdaNet SSID, the tray turns transparent mode off and restores the active NetworkManager DNS information.
If the phone proxy is still starting, the tray waits for readiness. A failed automatic attempt is retried after a short cooldown. The DNS forwarder limits concurrent upstream requests so the initial desktop lookup burst does not saturate PdaNet.
Uncheck Automatic PdaNet switching in the tray menu for temporary manual control.
pdanet-on # Enable transparent mode after joining PdaNet Wi-Fi
pdanet-off # Restore normal networking
pdanet-status # Full privileged health and connectivity checks
pdanet-state # Fast unprivileged state used by the tray
pdanet-tray # Start the desktop indicatorpdanet-on refuses to modify the system unless:
- the configured Wi-Fi interface is connected;
- its SSID matches
DIRECT-*-PDANETcase-insensitively; 192.168.49.0/24is directly attached to that interface;192.168.49.1:8000accepts TCP; and- an HTTPS request succeeds through that proxy.
Configuration lives at /etc/pdanet-transparent.conf. The default values are:
PDANET_INTERFACE="wlo1"
PDANET_SSID_GLOB="DIRECT-*-PDANET"
PDANET_PROXY_IP="192.168.49.1"
PDANET_PROXY_PORT="8000"
PDANET_PROXY_SUBNET="192.168.49.0/24"
PDANET_REDSOCKS_PORT="12345"
PDANET_DNS_ADDRESS="10.254.254.1"
PDANET_DNS_PORT="5300"The installer normally replaces wlo1 with the detected Wi-Fi interface.
After manual changes, run pdanet-off before testing pdanet-on again.
Run all offline controller, rollback, DNS, tray, and socket tests:
tests/transparent/test-controller.shWhile connected through PdaNet:
pdanet-status
getent hosts github.com
curl -I https://github.com
git ls-remote https://github.com/openai/codex.git HEADService logs:
journalctl -u pdanet-redsocks -u pdanet-dnscrypt-proxy --since todayConfirm the GI modules are installed:
python3 -c 'import gi; gi.require_version("Gtk", "3.0")'Install or enable your desktop's AppIndicator/KStatusNotifier integration, then
run pdanet-tray from a terminal to see import errors.
Confirm Linux is connected to the PdaNet SSID and the phone proxy responds:
nmcli -t -f NAME,DEVICE connection show --active
ip -4 route show
curl --proxy http://192.168.49.1:8000 -I https://example.com
pdanet-statusReturn to normal mode first:
pdanet-offIf the wrapper is unavailable:
sudo /usr/local/libexec/pdanet-transparent offThe controller is designed to make off idempotent and safe to repeat.
From the repository checkout:
sudo ./uninstall.shThe uninstaller removes only this project's named chains, comments, services,
commands, icons, and configuration. Full firewall backups remain under
/var/lib/pdanet-transparent/backups for manual review.
- PdaNet's upstream is HTTP CONNECT, so this implementation transports TCP, not arbitrary UDP.
- DNS is carried separately over HTTPS. QUIC/HTTP3 and DoQ are rejected on the PdaNet link so applications can fall back to TCP.
- PPTP cannot work through this path: its TCP control channel may connect, but PPTP also requires GRE, which HTTP CONNECT cannot carry.
- Only public IPv4 TCP is redirected. This project does not claim IPv6 tunnel support.
- Existing applications may briefly reconnect when transparent mode changes.
- Software that insists on UDP and offers no TCP fallback will not work.
- PdaNet+, Android releases, mobile networks, Linux distributions, and desktop environments change independently. There is no guarantee this workaround will work on every device or release.
- Installed executables and configuration are root-owned.
- The desktop user receives passwordless sudo access only to the installed
controller's fixed
on,off, andstatusactions—not to scripts in the writable Git checkout. - Runtime configuration contains proxy addresses but no credentials.
- The installer validates sudoers syntax before installing it.
- The networking controller owns narrowly named firewall chains and restores only state it selected.
- No PdaNet password, Wi-Fi password, API key, token, certificate, or other secret is stored by this project.
Please inspect privileged networking software before installing it. Use PdaNet+ and your mobile service in accordance with applicable laws and service terms.
install.sh Installer
uninstall.sh Defensive cleanup and uninstall
transparent/bin/ Controller, command wrapper, DoH, tray
transparent/config/ Default configuration and desktop entries
transparent/icons/ Gray/off and green/on tray assets
transparent/systemd/ Hardened system services
tests/transparent/ Focused offline and guarded live tests
This release grew from and was inspired by several projects:
- wtyler2505/pdanet-linux — the original PdaNet Linux project from which this work began. The current focused transparent Wi-Fi Direct controller, rollback model, DoH forwarder, tests, and tray workflow were substantially redesigned after that starting point.
- darkk/redsocks — provides the transparent TCP-to-HTTP-CONNECT bridge at the center of the data path.
- DNSCrypt/dnscrypt-proxy — informed the early DNS-over-HTTPS approach. The current release uses its own small per-query DoH forwarder and does not require DNSCrypt Proxy.
- AyatanaIndicators/libayatana-appindicator — provides the desktop indicator API used by the tray application.
- PdaNet+ by June Fabrics — provides the Android Wi-Fi Direct hotspot and HTTP proxy this independent Linux integration uses.
Thank you to those maintainers and contributors for making this work possible.
PdaNet and PdaNet+ are trademarks of June Fabrics Technology Inc. This is an independent, unofficial open-source project. It is not affiliated with, endorsed by, or supported by June Fabrics Technology Inc.
MIT. See the license and disclaimer before use.