Tailscale is not setup on my OpenWRT router but on my LAN-Server on address 192.168.2.100 what runs Debian. Tailscale works and I can access my Server when logged on e.g. with my Android phone running Tailscale.
Now I am trying to setup “Funnel” for easy accessing my server without the need to login to my tailnet.
Problem:
When trying to setup the funnel using “tailscale funnel :8123 for my immich server I am getting the answer that something is already listening on port 443 what stops setting up funnel in tailscale.
Can I find out on my OpenWRT router what is listening to that port 443?
I stopped already NGINX what is somehow working with 443 but that was not helping.
Also the port forwarding for NGINX port 443 I stopped - no help.
So I stopped DDNS service cause that is used for my NGINX - no help either
Does anybody know how to identify the culprit listening 443?
Just to clarify: since you're behind CGNAT, any port forwarding rules on your OpenWrt router are irrelevant for external access — there's no public IP to forward from. However, they could still interfere locally if traffic is being redirected to a different machine before reaching your Debian server.
Ok I was running that command on Debian and it points to nginx, what I thought might be the culprit.
I did stop the NGINX container and also deactivated the port forwards for NGINX on the OWRT Router but this was not helping.
Do I need to restart the OWRT router when deactivating the port forward
There is a nginx process (PID 552615) running directly on your Debian host (not inside a container) that is binding port 443. Stopping the Docker container is not enough if nginx is also installed natively on the machine.
Regarding the OpenWrt uhttpd web server: that's unrelated to your issue. It only matters if something on the router itself is blocking port 443, which is not your case here. You don't need to restart the router either — disabling a port forward in OpenWrt takes effect immediately without reboot.
The output confirms it: nginx is running inside Docker, but Docker is binding port 443 on your host network interface, which is exactly what blocks Tailscale Funnel.
You need to stop the Docker container that uses port 443. To find it:
docker ps | grep 443
Then stop it:
docker stop <container_name>
After that, verify port 443 is free:
sudo ss -tlnp | grep 443
If nothing shows up, Tailscale Funnel should work.
Regarding the OpenWrt router: port forwards on the router are irrelevant here. Since you are behind CGNAT there is no public IP anyway, and the conflict is happening locally on your Debian host between Docker and Tailscale. The router is not involved.
Look at "nginx-app-1" in your list — it shows no ports in the PORTS column. This usually means it is running in Docker host network mode, which means it uses the host's network interfaces directly without port mapping. That's why it doesn't show up in the ports list but still binds port 443.
Verify with:
docker inspect nginx-app-1 | grep -i networkmode
If it returns "host", that's your culprit. To confirm it's using port 443:
docker inspect nginx-app-1 | grep -i 443
To fix it, simply stop that container:
docker stop nginx-app-1
Then check port 443 is free:
sudo ss -tlnp | grep 443
Regarding installing Tailscale on the OpenWrt router instead: it would not help here. The conflict is on your Debian host between Docker and Tailscale Funnel. Moving Tailscale to the router would create a different setup entirely and would not solve the port 443 issue on the Debian machine.
Ok I tried all of that I can see it is stopped also reflected in portainer but when I try to start that funnel I still get the same error “something listening on 443”
Thanks a lot!!! Good that we have such people like you supporting here!
The output looks promising now it generates a https code for accessing
and I need to play around a bit with this funnel, but that is another story…
I also think I need to put it with - -bg into background so it survives a restart.
Yes, you are right about --bg. To make the funnel persistent across reboots:
tailscale funnel --bg :8123
This saves the funnel configuration permanently in Tailscale, so it survives restarts without any systemd service or cron job needed.
A few more tips for your setup:
You can check your active funnel configuration anytime with:
tailscale funnel status
If you want to expose multiple services, you can define them by path:
tailscale funnel --bg :8123 /immich
tailscale funnel --bg :8080 /homeassistant
Since nginx-app-1 was your reverse proxy, you now have two options going forward:
Keep using Tailscale Funnel and leave nginx stopped (simpler)
Reconfigure nginx to listen on a non-standard port (e.g. 8443) and let Tailscale Funnel forward to it, so you can keep using nginx as a reverse proxy for internal routing
The /immich and /homeassistant paths are URL prefixes — so when you visit https://yourdevice.ts.net/immich, Tailscale forwards that request to the local port you specified (e.g. :8123). However, this only works well if the backend app supports being served from a subpath, which many self-hosted apps (like Immich or Home Assistant) do NOT natively — they expect to run at /. So for most cases, using separate ports per service is simpler and more reliable.
2. Exposing all ports / the whole server IP
Tailscale Funnel is intentionally limited to HTTPS (port 443) only for public internet exposure — you cannot expose arbitrary ports publicly with Funnel. However, if you just need access within your own Tailscale network (not public internet), you don't need Funnel at all — Tailscale VPN already makes your server reachable on all ports from your other Tailscale devices directly via its Tailscale IP (e.g. 100.x.x.x). So for private access: just use the Tailscale IP + port directly. For public access: Funnel is limited to 443.
3. Tailscale Funnel → NGINX (not a big story at all!)
This is actually a clean setup. The idea is:
Tailscale Funnel listens on port 443 (public HTTPS)
It forwards to NGINX on a local port, e.g. 8080
NGINX acts as reverse proxy and routes to your apps by hostname or path
Step 1 — reconfigure NGINX to listen on port 8080 instead of 443:
server {
listen 8080;
...
}
Step 2 — point Tailscale Funnel to NGINX:
tailscale funnel --bg :8080
Now all traffic from https://yourdevice.ts.net → Tailscale (443) → NGINX (8080) → your apps.
This gives you the best of both worlds: Tailscale handles the public TLS certificate, NGINX handles internal routing to multiple services.