ProtonVPN + Gluetun: port forwarded but externally closed (confirmed multiple servers/countries)
Hi all, hitting a port forwarding wall and need a sanity check.
Setup
- Raspberry Pi 5, Docker Compose: Gluetun + qBittorrent
- ProtonVPN Plus, WireGuard
- Gluetun
v3.40.0(pinned to avoid56789placeholder bug in latest) - qBittorrent connected via
network_mode: "service:gluetun" - Tested with both Netherlands (NL#614) and Switzerland configs, P2P selected, NAT-PMP ON, Moderate NAT OFF, VPN Accelerator ON
- IPv4 only (
WIREGUARD_ADDRESSES=10.2.0.2/32) WIREGUARD_MTU=1412(PPPoE IPv4)
Symptom
Gluetun successfully negotiates a forwarded port:
[port forwarding] port forwarded is (E.g.) 62884
[firewall] setting allowed input port 62884 through interface tun0
qBittorrent listen port stays in sync with the forwarded one (auto-sync via VPN_PORT_FORWARDING_UP_COMMAND, works fine — confirmed Session\Port=62884).
But: testing the forwarded port externally on canyouseeme.org, yougetsignal.com, and portchecker.io (all run from inside the gluetun-routed qBittorrent container, so request goes through Proton) — all return PORT CLOSED.
Tested multiple times on both NL and CH servers. Same result: Gluetun reports success, qBittorrent has the right port, firewall rule is in place, but the port is unreachable from the outside.
Also: DHT reports 0 nodes in qBittorrent regardless of VPN provider (tested with Mullvad too, same).
What I've checked
- ✅ Port reported by Gluetun matches firewall rule (no
56789bug on v3.40.0) - ✅ qBittorrent listen port matches Gluetun's forwarded port
- ✅ Container is healthy, port forwarding logs clean
- ✅ Outbound from container works fine (HTTPS, DNS, all good)
- ✅ Moderate NAT confirmed OFF in Proton dashboard
- ✅ No IPv6 in WIREGUARD_ADDRESSES
- ✅ Trackers can't reach me — peers timeout
Without VPN, qBittorrent connects to trackers and peers immediately. With Proton, port is reported open but actually closed externally.
docker-compose.yml
yaml
services:
gluetun:
image: qmcgaw/gluetun:v3.40.0
container_name: gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
ports:
- 8080:8080
- 6881:6881
- 6881:6881/udp
volumes:
- ./gluetun:/gluetun
- ./gluetun:/tmp/gluetun
environment:
- VPN_SERVICE_PROVIDER=protonvpn
- VPN_TYPE=wireguard
- WIREGUARD_PRIVATE_KEY=<REDACTED>
- WIREGUARD_ADDRESSES=10.2.0.2/32
- WIREGUARD_MTU=1412
- SERVER_COUNTRIES=Switzerland
- VPN_PORT_FORWARDING=on
- VPN_PORT_FORWARDING_PROVIDER=protonvpn
- VPN_PORT_FORWARDING_UP_COMMAND=/bin/sh -c 'wget -O- --retry-connrefused --post-data "json={\"listen_port\":{{PORTS}}}" http://127.0.0.1:8080/api/v2/app/setPreferences 2>
&1'
- PORT_FORWARD_ONLY=on
- TZ=America/Sao_Paulo
restart: unless-stopped
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: "service:gluetun"
environment:
- PUID=1000
- PGID=1000
- WEBUI_PORT=8080
volumes:
- ./qbittorrent-public:/config
- /mnt/media:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
Question
Is this a known Proton quirk? Has anyone gotten Proton port forwarding to be actually reachable externally on Gluetun lately, or is everyone seeing this "reported but closed" behavior? Worth opening a Proton support ticket, or is the issue on Gluetun's side?