Everything you need to build, configure, and sail with your own GhostPort privacy router. Your data never leaves your hands.
☠ VERSION 1.0 — MARCH 2026 ☠| COMPONENT | SPEC | STATUS |
|---|---|---|
| Raspberry Pi 5 | 4GB or 8GB RAM recommended | REQUIRED |
| MicroSD Card | 32GB+ Class 10 / A2 rated | REQUIRED |
| USB-C Power Supply | 27W official Pi 5 adapter | REQUIRED |
| USB Ethernet Adapter | USB 3.0 gigabit (second NIC) | REQUIRED |
| PCIe Ethernet HAT | Pi 5 compatible dual NIC | OPTIONAL |
| Case with cooling | Active cooling recommended | OPTIONAL |
ghostport in the advanced settings before flashing.sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl wget nftables wireguardcurl -sSL https://install.pi-hole.net | bash/etc/wireguard/wg0.conf then enable it.sudo systemctl enable --now wg-quick@wg0
sudo wg show # verify connectionsudo mkdir -p /etc/gpmodes
# Download and install gp-mode script
sudo curl -sSL https://ghostport.io/install.sh | bashcurl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo mkdir -p /opt/ghostport/public
# Copy server and UI files to /opt/ghostport
sudo systemctl enable --now ghostporthttp://YOUR_PI_IP:4200sudo gp-mode isp # Open passthrough
sudo gp-mode zerotrust # Pi-hole + DNS lockdown
sudo gp-mode doublehop # WireGuard VPN
sudo gp-mode zhop # WireGuard + DNS lockdown
sudo gp-mode status # View current statesudo gp-mode isp to reset to safe mode.ls -la /usr/local/bin/gp-mode
sudo chmod +x /usr/local/bin/gp-mode
which gp-modesudo systemctl status wg-quick@wg0
sudo wg show/etc/wireguard/wg0.conf credentials and that your VPS is reachable.
ls /opt/ghostport/public/
# If index.html is missing, copy it there
sudo cp /path/to/index.html /opt/ghostport/public/
sudo systemctl restart ghostportsudo systemctl status pihole-FTL
sudo systemctl status lighttpd
# Restart both if needed
sudo systemctl restart pihole-FTL lighttpdhttp://YOUR_PI_IP/admin
http://YOUR_PI_IP:4200{
"ok": true,
"activeMode": "zerotrust",
"tunnels": {
"wg0": "down",
"tailscale": "down",
"pihole": "up"
},
"ip": "68.108.166.49",
"uptime": "3h 42m",
"adsBlocked": 1847
}curl http://YOUR_PI_IP:4200/api/statusisp, zerotrust, doublehop, zhop{
"mode": "doublehop"
}{
"ok": true,
"mode": "doublehop",
"message": "Mode: DoubleHop (LAN -> wg0)."
}curl -X POST http://YOUR_PI_IP:4200/api/mode \
-H "Content-Type: application/json" \
-d '{"mode":"doublehop"}'start, stopcurl -X POST http://YOUR_PI_IP:4200/api/tailscale \
-H "Content-Type: application/json" \
-d '{"action":"start"}'{
"ok": true,
"peers": [{
"pubkey": "6km9PuJTdT0g...",
"endpoint": "18.225.7.204:51820",
"allowedIps": "0.0.0.0/0",
"lastHandshake": "11:42:05 PM",
"rx": "308.95 KiB",
"tx": "242.14 KiB"
}]
}curl http://YOUR_PI_IP:4200/api/pihole