Troubleshooting · Qeli 0.8.1

Errors and step-by-step checks

Start with safe commands that do not change the system, identify the failing stage, and only then edit configuration.

Safe start

Five commands before changing config

They do not create TUN devices or change routes; they only read system state. Save the exact first error because later messages are often consequences of it.

server · baseline snapshot
$ qeli --version
$ sudo qeli check-config --config /etc/qeli/server.conf
$ sudo systemctl status qeli --no-pager
$ sudo journalctl -u qeli -n 200 --no-pager
$ sudo ss -lntup | grep qeli
Supervisor and worker. The service can be running while a profile worker keeps restarting because of a configuration error. A green systemd status alone is therefore insufficient: inspect the journal.
Quick path

Symptom → likely area

SymptomCheck firstNext step
The service keeps restartingcheck-config, journal, TUN/bind collisionServer startup ↓
The client times outPort, firewall, tcp/udp transport and public addressHandshake ↓
Connected, but AUTH is rejecteduser/pass, profiles, enabled, lockoutHandshake ↓
Tunnel is up, but there is no internetgateway, NAT, ip_forward, firewallNetwork ↓
Small pages work, but downloads stallMTU, MSS clamp, PMTU black-holeNetwork ↓
An IP opens, but a domain does notdns.enabled, dns.push_servers, client DNS modeNetwork ↓
The panel returns 403allowed_ips or allowed_originsPanel ↓
The panel behind a proxy returns 404 or redirects to rootbase_path, trusted proxy, prefix strippingPanel ↓
Reconnect after sleep takes too longClient version, network switch and battery policyClients ↓
Server

The service does not start a working profile

The 0.8.1 validator finds syntax errors, unknown keys, user errors, overlapping IPv4/IPv6 pools, duplicate TUN names, bind collisions, unreachable REALITY targets and incompatible roaming/recordizer policies.

sudo qeli check-config --config /etc/qeli/server.confvalidate before restart
sudo journalctl -u qeli -b --no-pagerjournal for the current boot
sudo ip tuntap showexisting TUN/TAP devices and name collisions
sudo ss -lntupwhich process already owns the port
getent passwd qeliwhether the service user exists

After manual edits, restore file ownership: the service and panel must read and atomically update /etc/qeli. For a .deb installation the usual owner is qeli:qeli.

Connection

From listener to AUTH

Split the failure by stage: no TCP/UDP connection, wire-mode mismatch, pinning/REALITY failure, or user rejection by the server.

StageWhat to verify
ConnectPublic host:port, TCP/UDP, firewall and port forwarding
Wire modeproto, mode, obfs_key, QUIC toggle
REALITY / H-1key, reality_sid, sni, target reachability
AUTHuser, pass, enabled, profiles, expire_at, quota
Lockoutsudo qeli list-blocked / sudo qeli unblock <ip>
verify pinned identity
$ sudo qeli show-identity --config /etc/qeli/server.conf
# the client key must match the profile it connects to
Do not disable pinning as a test. The real key is mandatory for reality-tls and H-1. Correct diagnosis means comparing keys and profiles, not weakening AUTH.
Data plane

Routes, NAT, MTU and DNS

If the handshake completed and TUN is up, look in the routing table, forwarding, NAT/firewall, MTU or resolver.

server and Linux client
$ sudo qeli show-routes <user>
$ ip route show
$ sudo sysctl net.ipv4.ip_forward
$ sudo iptables-save | grep -iE 'qeli-nat|MASQUERADE|TCPMSS'
$ ping -c 3 10.9.0.1
$ getent hosts example.com
ObservationMeaning
No route to the TUN poolThe client did not finish interface setup or the route conflicts
tun.address responds, but internet does notCheck gateway=true, NAT, ip_forward and FORWARD
Small responses pass, large ones stallTypical PMTU black hole: MSS clamp or MTU is too large
IP works, DNS name does notCompare dns.push_servers, dns.listen and the local dns mode
Push appears in the log, but the route is absentPlatform application, permissions or an OS routing-table conflict

Detailed routing and push →

Administration

Panel: 403, 404 and no access

SymptomWhat to fix
VPN works, but :8080 is not listeningSet password_hash with set-web-password; the panel fails closed even on loopback
403 when opening the pageYour source IP is not in allowed_ips
The page opens, but Save returns 403Add the browser host[:port] to allowed_origins
Behind a proxy you get 404 or a redirect to /Align base_path with X-Forwarded-Prefix; do not strip the prefix when base_path is set
Apply & Restart does not worksudo qeli install-polkit
QR cannot be generated for an existing userCheck the users.conf owner and that /var/lib/qeli/panel-secret.key exists
Platforms

Client-specific cases

PlatformTypical caseAction
Androidprotect() failedDisable a conflicting always-on VPN or Block connections without VPN
AndroidSlow recovery after sleepUse client 0.8.1, keep roaming=auto, and check the vendor's battery restrictions
Windows / macOSPushed gateway/metric was not appliedThe CIDR is still bound to TUN; read the explanatory log line
macOSTunnel DNS remains after removalRun the client's normal disconnect/cleanup and inspect system DNS
Windows/macOS on the same LAN as the serverReconnect loop in full-tunnel modeSet local to the client's LAN IP so the carrier reaches the server on-link without an asymmetric /32 through the gateway
Advanced

Debug log and QELI_TRACE

Enable debug only while reproducing the issue. QELI_TRACE records packet shape and timing without payloads or addresses; still inspect the file before publishing it.

temporary systemd drop-in
$ sudo systemctl edit qeli
# add:
[Service]
Environment=RUST_LOG=debug
Environment=QELI_TRACE=/tmp/qeli-server.csv

$ sudo systemctl daemon-reload
$ sudo systemctl restart qeli
Remove the drop-in after diagnosis. Debug logs grow faster than normal, and a file in /tmp is not permanent storage.
Primary sources

Complete message and error catalogue

The repository covers connection stages, exact log messages, UDP/REALITY errors and additional platform scenarios.