FPTN VPN (Server + Desktop Client + FptnLibrary)
FPTN is a VPN technology engineered from the ground up to provide secure, robust, and censorship-resistant connections capable of bypassing network filtering and deep packet inspection (DPI).
Project website: https://storage.googleapis.com/fptn.org/index.html
Key Technical Features:
SNI scanner utility.Download the FPTN client from the website or GitHub. After downloading, install and launch the client.
The client is a compact application whose icon resides in the system tray.
Simply click the icon to open the context menu.
Navigate to the "Settings" menu, where you need to add an access token. Obtain a token by contacting our Telegram bot,
Copy the token, click the "Add Token" button, paste it into the form, and save.
After this, available servers will appear in the list.
Ease of use:
You can also easily turn your Raspberry Pi or Orange Pi into a WiFi access point and install the FPTN client on it. In this case, all devices connected to this WiFi network will be able to access the internet, bypassing any restrictions. Read more here
Installing and Configuring the FPTN Server
Setting up and running your own FPTN server is done via Docker. This ensures easy deployment, convenient updates, and environment isolation. Instructions are available on DockerHub.
You can also deploy your own management and monitoring tools:
Telegram bot – issuing tokens to users sysadmin-tools/telegram-bot/README.md.
Grafana + Prometheus – monitoring server and user status sysadmin-tools/grafana/README.md
Installing FPTN on an OpenWrt router
The router package carries the client, a service that starts it at boot, and a page in the router web interface. Everything on the network goes through the VPN, and nothing has to be installed on the phones and laptops themselves.
Two OpenWrt branches are supported. They differ in package manager, so the file differs too:
| Branch | Package manager | File |
|---|---|---|
| 25.12.x | apk | .apk |
| 24.10.x | opkg | .ipk |
What matters is the package architecture, not the exact model — one package serves every device sharing it:
| Package arch | OpenWrt targets | Example devices |
|---|---|---|
aarch64_generic |
armsr/armv8, rockchip/armv8 | virtual machines, NanoPi R2S / R4S / R5S |
aarch64_cortex-a53 |
mediatek/filogic, qualcommax/ipq807x | Xiaomi AX3000T, Cudy TR3000, Xiaomi AX3600 / AX9000 |
arm_cortex-a7_neon-vfpv4 |
ipq40xx | GL.iNet GL-A1300 Slate Plus, GL-B1300, ZyXEL NBG6617 |
x86_64 |
x86/64 | mini PCs, Proxmox and other virtual machines |
Ask the router what it needs:
apk --print-archOn 24.10:
opkg print-architectureIt prints several lines; the package architecture is the one with the largest number, for example arch aarch64_cortex-a53 10.
aarch64_generic, aarch64_cortex-a53 and aarch64_cortex-a72 are different package architectures even though all of them are 64-bit ARM. The package manager refuses a package built for another one — opkg reports incompatible with the architectures configured — so the name has to match exactly.
Both the branch and the architecture are in the file name, so take the matching one from Releases — for example fptn-client-0.4.4-openwrt-25.12.x-aarch64_generic.apk. Building it yourself is described in Building for OpenWrt.
Copy the package to the router and install it. On 25.12:
scp fptn-client-*.apk [email protected]:/tmp/apk update && apk add --allow-untrusted /tmp/fptn-client-*.apkOn 24.10:
scp fptn-client-*.ipk [email protected]:/tmp/opkg update && opkg install /tmp/fptn-client-*.ipkThe router needs working internet during installation: kmod-tun and ip-full are pulled from the OpenWrt repository.
Installing sets up everything else on its own: it creates the firewall zone that masquerades LAN traffic into the tunnel, enables the service for boot, and reloads rpcd so the web page appears.
Open VPN → FPTN in the router web interface, paste the access token from @fptn_bot, tick Enabled and press Save & Apply — the service starts right there. The same from the shell:
uci set fptn.config.access_token=''; uci set fptn.config.enabled='1'; uci commit fptn; /etc/init.d/fptn restartIf you administer the router remotely, add your own public address to Routing → Exclude tunnel networks (for example 203.0.113.45/32) before connecting. Otherwise the tunnel takes over the default route, replies to your session leave through it, and you lose access to the router.
The Diagnostics button on the FPTN page checks the tunnel, routes, firewall zone and DNS, and reports what is broken. The full picture is in the system log:
logread -e fptn -fRemoving the package stops the client and disables autostart:
apk del fptn-clientOn 24.10 the same is done with opkg remove fptn-client.
Building for Linux, Windows and macOS
pip install conanconan profile detect --force(For debugging and development purposes, use Debug instead of Release.)
conan install . --output-folder=build --build=missing -s compiler.cppstd=17 -o with_gui_client=True --settings build_type=Debug -c "tools.build:defines=['QT_NO_INT128']"
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug
cmake --build . --config Debug
ctestconan install . --output-folder=build --build=missing -s compiler.cppstd=17 -o with_gui_client=True --settings build_type=Debug
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug
cmake --build . --config Debug
ctestconan install . --output-folder=build --build=missing -s compiler.cppstd=17 -o with_gui_client=True --settings build_type=Debug
cd build
cmake .. -G "Visual Studio 17 2022" -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" -DCMAKE_BUILD_TYPE=Debug
cmake --build . --config Debug
ctest(For debugging and development purposes, use Debug instead of Release.)
Windows
cmake --build . --config Release --target build-installerUbuntu
cmake --build . --config Release --target build-deb-guimacOS
cmake --build . --target build-pkgBuilding for OpenWrt
The router client is cross-compiled inside Docker: the image ships the OpenWrt SDK, builds the CLI client and packs it, the procd service and the LuCI page into a single package. Nothing has to be installed on the host except Docker itself. Installing and using the result is described in Installing FPTN on an OpenWrt router.
Dockerfiles are laid out as deploy/openwrt/target-/. The 25.12.5 directories produce an .apk, the 24.10.7 ones an .ipk:
| Package arch | Directory | Devices |
|---|---|---|
aarch64_generic |
target-armsr-armv8 |
virtual machines, NanoPi R2S / R4S / R5S |
aarch64_cortex-a53 |
target-mediatek-filogic |
Xiaomi AX3000T, Cudy TR3000, Xiaomi AX3600 / AX9000 |
arm_cortex-a7_neon-vfpv4 |
target-ipq40xx |
GL.iNet GL-A1300 Slate Plus, GL-B1300, ZyXEL NBG6617 |
x86_64 |
target-x86-64 |
mini PCs, Proxmox and other virtual machines |
Run the block matching your device and your OpenWrt branch — it builds the image and copies the package into the current directory.
OpenWrt 25.12.x, .apk
aarch64_generic:
docker build -t openwrt-armv8-25.12.5 -f ./deploy/openwrt/target-armsr-armv8/25.12.5/Dockerfile .
docker run --rm -v "$PWDNo open issues yet, or sync has not completed.