mirror of
https://github.com/netbirdio/netbird.git
synced 2026-06-11 01:41:55 -04:00
Problem getting NetBird Relay working behind Nginx with TLS on self-hosted setup #2260
Open
opened 2025-11-20 07:06:38 -05:00 by saavagebueno
·
18 comments
No Branch/Tag Specified
main
dependabot/go_modules/aws-sdk-e0d7f0be02
dependabot/github_actions/actions-1b76ec1a46
dependabot/go_modules/otel-e34c790afd
dependabot/go_modules/testcontainers-9a9ed843ba
dependabot/go_modules/gorm-2271c8195b
dependabot/go_modules/pion-04391f0276
dependabot/go_modules/wireguard-dbd6b95108
peer-acl-multi-source
feature/affected-peers
ui-refactor
fix/ios-debug-bundle
mdm_integration
dependabot/go_modules/github.com/fsnotify/fsnotify-1.10.1
relay-transport-observability
embedded-vnc
windows-dns-firewall
tests/enable-race-on-tests
ui-refactor-gtk3
wasm-websocket-dial
feature/affected-peers-grpc
profile-id-name
profile-id
lazyconn-first-packet-fix-v2
claude/focused-gates-VMTgb
feature/immediate-handshake-on-endpoint-change
refactor/mgmt-bootstrap
dependabot/go_modules/github.com/quic-go/quic-go-0.59.1
fix/ios-login-expiry-blackhole
fix/exit-node-v6-deselect-propagation
ui-tray-linux-leftclick
dependabot/go_modules/github.com/rs/cors-1.11.1
dependabot/go_modules/github.com/ebitengine/purego-0.10.1
dependabot/go_modules/github.com/c-robinson/iplib-1.0.8
dependabot/go_modules/github.com/redis/go-redis/v9-9.20.0
dependabot/go_modules/github.com/cilium/ebpf-0.21.0
dependabot/go_modules/github.com/coreos/go-iptables-0.8.0
dependabot/go_modules/golang.org/x/mod-0.36.0
dependabot/go_modules/github.com/spf13/pflag-1.0.10
fix/ctx-enrichment
nmap/components-impl
daemon-owner
dependabot/go_modules/github.com/crowdsecurity/crowdsec-1.7.8
client-json-socket
feature/android-client-ssh
feature/ios-ssh
worktree-accept-ra-forwarding
nmap/combined-deploy
task/align_protobuff_toolset
feature/session-extend
add-json-yaml-flags
refactor/ephemeral-cleanup
claude/webtransport-relay-wasm-mUjY9
claude/vnc-udp-feasibility-6KB1U
fix-ssh-authorized-users-multi-rule
fix/wgport-config
drop-candidateviaroutes-filter
e2e-windows-dns-combined
dependabot/go_modules/github.com/Azure/go-ntlmssp-0.1.1
debug-logs
dependabot/go_modules/github.com/jackc/pgx/v5-5.9.2
fix/login-cmd-root-flags
feat/reseller-openapi-spec
github-issue-resolver
add-steamos-support
fix-darwin-uninstaller
flutter-test
dependabot/npm_and_yarn/proxy/web/postcss-8.5.12
ci/freebsd-pkg-bootstrap
cached-serial-check-on-sync
fix-mgmt-cache-bypass-overlay
revert-easyjson-5938
revert-ice-5820
revert-firewalld-5928
refactor/permissions-manager
revert-dns-5935-systemd-resolved
revert-dns-5935-5945
revert-dns-5945-mgmt-cache
feature/log-most-busy-peers
prototype/ui-wails
coderabbitai/utg/8ae8f20
feature/use-peer-fqdn-on-https
dependabot/go_modules/golang.org/x/image-0.38.0
feature/metrics-push-management-control
release/0.68.3
dependabot/go_modules/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream-1.7.8
dependabot/go_modules/github.com/aws/aws-sdk-go-v2/service/s3-1.97.3
add-slack-channel
claude/rdp-token-passthrough-eNcqW
transparent-proxy
fix/macos-stale-route-eexist
crowdsec-selfhosted
fix/remove-otel-units
entire/checkpoints/v1
dependabot/go_modules/github.com/go-jose/go-jose/v4-4.1.4
fix/getting-started
feat/static-connectors-combined-server
feature/use-local-keys-embedded
feature/fleetdm
set-env-only-if-not-fork
feature/expose-has-channel
fix/connection-status-race
fix/filter-cgnat-cni-ice-candidates
feature/check-cert-locker-before-acme
test/proxy-fixes
test/proxy-mtu
prototype/ui-tauri
test/proxy-speed
fix-reused-ports
feat/migrate-to-embedded-idp
feature/add-serial-to-proxy-merged
deploy/proxy-serial
test/connection
feature/disable-legacy-port
feature/flag-to-disable-legacy-port
test/perftest
dependabot/go_modules/github.com/pion/dtls/v3-3.0.11
fix/http-redirect
poc-token-command
dn-reverse-proxy
prototype/reverse-proxy-rename
prototype/reverse-proxy-logs-pagination
feature/client-metrics
prototype/reverse-proxy-clusters
debug-dns-route
fix/win-dns-batch
add-extra-route-logs
job-stream-notify-disconnection-eof
deploy/secrets-manager
trigger-proxy-update
bug/update-ios-client-code-build-tags
sync-client-netmap-serial
log/conn-disconn
nmap/compaction-deploy
ci-win-test
feature/disk-encryption-check
wasm-debug
swap-dns-prio
fix/dex-config
feature/migrate-auto-groups-to-table
dependabot/go_modules/github.com/quic-go/quic-go-0.57.0
nmap/compaction
dex-nocgo-stub
feature/exclude-terraform-from-rate-limiting
test-freebsd
retries-refactor
coderabbitai/docstrings/b7e98ac
feat/integrate-zitadel
bug/ios-hanging-reconection
zitadel-idp
feat/network-map-serial
refactor/get-account-no-users
feat/auto-upgrade
feature/report-high-pat-id
feature/temporary-access-for-resource
fix/nmap-fwrules
dont-restart-dns
prototype/ui
update-gomobile
go-dns-for-ice
wasm-ldflags
test-ldflags
wasmbuild-test
feature/networks-s2s
vk/compare-nmaps
dbg/bothmaps
feature/changeset
reorder-dns-shutdown
fix/relay-reconnection-race
fix/nmap-exitnodes
vk/debug/nmap-both
move-licensed-code
feat/better-daemon-connection-lost-message
feat/auto-update-2
test/timings
refactor/getaccount-raw
tests/nmap-getaccount
refactor/nmap
refactor/nmap-limit-buffer
feature/detect-mac-wakeup
feature/extract-modules
quick-setings
feat/sync-limiter
feature/store-cache-impl
fix-install-version
feature/store-metrics
feature/metrics-on-store
feature/use-gorm-cache
loadtest-signal
unsymmetrical-squash
refactor/reducate-signaling
test/update-reduce
feature/store-cache
feature/remote-debug
cli-ws-proxy-backend-addr
feat/mgmt-map-serial
snyk-fix-d9d0081a4c7f9137bdb59d0d50a141a2
snyk-fix-7415cea5a11acd66753540ca2c598c63
job-yml-update
feature/android-allow-selecting-routes
fix/up-sequence
fix/dns-hash-update
snyk-fix-967adae9863f17f108ce8948d9117b8d
log/getaccount-by-peer
signal-suppressor
dns-exit-node
feature/auto-updates
feature/cache-srv-key
merged-fixes
fix/missed-offers-and-debug
debug-and-fixes
poc-wasm-clean-backend-s2s
test/remote-debug
debug-api
dependabot/go_modules/github.com/docker/docker-28.0.0incompatible
fix/remove-gpo-if-empty
fix/test-freebsd
fix/mysql-setup
fix/remove-logout-btn
handle-existing-domain-user
chore/unify-domain-validation
snyk-fix-c5fafc8a50ce1f29046e25a1fc346185
feat/profile-edit-btn
snyk-fix-a54966211e18d4cf67e5a2757cc006d1
log-short-id
feat/logout-ephemeral
log-checks
batch-wg-ops
nb-interface-default
feat/aws-integration
add/race-test
feature/relay-feature-versioning
fix/systemd-service-logs
poc/preprocessed-map
add-account-onboarding
bind-ipv6
fix/merge-main
logs/peerlogs-addpeer
feature/net-297-network-migration
feature/support-skip-auto-apply-exit-node-routes
set-cmd
set-command-with-cursor
feature/limit-update-channel
stop-using-locking-share
feature/poc-lazy-detection
feature/net-248-removal-of-sync-mutex-locks
test/multiple-peer-logging
preresolve
add-ns-punnycode-support
apply-routes-early
windows-search-domains
fix/connecting-route-filter
feature/management/rest-client/impersonate
debug-local-records
resource-fields-snake-case
test/grpc-rate-limit
traffic-correlation-policy
feature/rest-client-options
feat/events-metrics
feature/buf-cli
test/add-ratelimiter
test/remove-write-lock-on-add-peer
fix/add-peer-semaphore
feature/users-roles-endpoint
mlsmaycon-patch-1
debug-user-role
chore/primary-key-on-networks
feature/update-account-peers-buffer-startup
remove-ubuntu2004-runners
refactor/permissions-no-pat-allowed
ref/logrus-factory
use-conntrack-zone
deploy/permissions-account
feature/lazy-connection-idle
ref/improve-test-cov
restore-pr-3440
test/increase-grpc-timeouts
feat/buffer-account-peers-update
test/networkmapgeneration-changes
feature/base-manager
feature/flow-receiver
chore/benchmark-with-large-runner
refactor/handshake-initiator
client/ui-update-systray-icons
userspace-router
wgwatcher-test
output-if-key-already-exists
fix/relay-reconnection
feature/port-forwarding-client-codecleaning
detached2
test/callbacks-nil-iceconninfo
refactor/optimize-peer-expiration
enable-udp-port-for-docker-template
fix/relay-update
feature/apply-posture-netmap
fix/group-update-existing-resource
conntrack-stats
upgrade-okta-sdk
multi-price
test/conn-stat
set-min-parallel-tests-for-management
dns-interceptor
debug-dns
router-dns
add-static-system-info
debug-0.29.4
debug-0.33.0
account-refactoring
relay/2800_quic
route-get-account-refactoring
test/seed-random-routes
feature/get-account-refactoring
test/reconnect-race-condition
refactor/get-account-usage
feature/add-session-id-to-update-channel
improve-ipv4conn
fix/async-pion-event-handling
debug
add-offload
feature/validate-group-association-debug
fix/limit-conn-for-sqlite
test/engine-iface
test/transaction-for-jwt-sync
fix/engine-stop-in-foreground
feature/add-mysql-support
test-migration
refactor/header-size-values
relay/eliminate-gob
test/signal-dispatcher-with-relay
relay/debug
validate-icon
feature/ipv6-support
use-pre-expanded-peers-map
feature/use-signal-dispatcher
validate/peer-status
add-read-write-times
fix/sync-peer-race
feature/relay-status
netmap
evaluate/network-map-hash
fix/lower-dns-resolve-interval-on-fail
feature/relay
fix/go-mod-version
upgrade-nftables
synology-userspace-mode
fix/use-ip-for-default-routes-on-darwin
fix/proxy_close
enable-release-workflow-on-pr
deploy/peer-performance
feature/permanent-turn
feature/permanent-turn-proxy
deploy/posture-check-sqlite
feature/optimize_sqlite_save
debug-ios-behavior
fix/delete-route-only-after-adding
tshoot/windows-logger
remove-new-routing
refactor/eliminate-repo-dependency
add-arm-to-ci
refactor-demo-account-object
test/abc2
test/abc
send-ssh-rosenpass-config-meta
refactor-demo
ensure-schedule-never-runs-non-positive
feature/peer-validator-groupmgm
feature/peer-validator-fix
fix/include-active-dashboard-users
fix/handle-canceling-schedule
fix/geo-download
debug-google-workspace
yury/resolve-ip-to-location
feature/extend-sysinfo
sqlite-async-peer-status
yury/add-postgresql-store
fix/route
test-build
posture-checks-poc
debug-keycloak-idp
poc/netstack
for-pascal-tmp
peer-logout-management
manual-peer-logout
detached
chore/refactor-management
test/dns-bind
fix/enforce-acl-for-containers
yury/use-sync-map-in-updatechannel
fix/events-key-handling
filter-cache-on-load-account
fix/user-expiration
handle-user-context-cancellation
nb-client-k8s-statefulset
fake-addr
fix/iptables_in_docker
ebpf-debug
update-getting-started-flow-use-postgres
fix/peer_list_notification
feature/device-authentication-with-client-secret
feature/keep_alive
feat-groups-from-jwt
separate_proxy_from_wgconfig
fix/wg_conn
wg_conn_fix
wg_bind_parallel_processing
fix-rollback-get-acls
proxy_cfg_cleanup
performance-improvement-rego
update-lock-log-level
feat-client-side-acl
refactor/move_grpcserver_logic_to_account_manager
feature/event-storage
feature/update-idp-redeeming-invite
feature/api-peer-info
return-groupminimum-setupkey
feature/interface-bind
documentation_enhancement
fix-peer-registration
ssh
users_cache
pass-client-caller
client_caller_type
revert-283-feat-fix-windows-installer
periodic-peer-updates
ebpf
braginini/wasm
v0.72.3
v0.72.2
v0.72.1
v0.72.0
v0.71.4
v0.71.3
v0.71.2
v0.71.1
v0.71.0
v0.70.5
v0.70.4
v0.70.3
v0.70.2
v0.70.1
v0.70.0
v0.69.0
v0.68.3
v0.68.2
v0.68.1
v0.68.0
v0.67.4
v0.67.3
v0.67.2
v0.67.1
v0.67.0
v0.66.4
v0.66.3
v0.66.2
v0.66.1
v0.66.0
v0.65.3
v0.65.2
v0.65.1
v0.65.0
v0.64.6
v0.64.5
v0.64.4
v0.64.3
v0.64.2
v0.64.1
v0.64.0
v0.63.0
v0.62.3
v0.62.2
v0.62.1
v0.62.0
v0.61.2
v0.61.1
v0.61.0
v0.60.9
v0.60.8
v0.60.7
v0.60.6
v0.60.5
v0.60.4
v0.60.3
v0.60.2
v0.60.1
v0.60.0
v0.59.13
v0.59.12
v0.59.11
v0.59.10
v0.59.9
v0.59.8
v0.59.7
v0.59.6
v0.59.5
v0.59.4
v0.59.3
v0.59.2
v0.59.1
v0.59.0
v0.58.2
v0.58.1
v0.58.0
v0.57.1
v0.57.0
v0.56.1
v0.56.0
v0.55.1
v0.55.0
v0.54.2
v0.54.1
v0.54.0
v0.53.0
v0.52.2
v0.52.1
v0.52.0
v0.51.2
v0.51.1
v0.51.0
v0.50.3
v0.50.2
v0.50.1
v0.50.0
v0.49.0
v0.48.0-dev2
v0.48.0
v0.47.2
v0.47.1
v0.47.0
v0.46.0
v0.45.3
v0.45.2
v0.45.1
v0.45.0
v0.44.0
v0.43.3
v0.43.2
v0.43.1
v0.43.0
v0.42.0
v0.41.3
v0.41.2
v0.41.1
v0.41.0
v0.40.1
v0.40.0
v0.39.2
v0.39.1
v0.39.0
v0.38.2
v0.38.1
v0.38.0
v0.37.2
v0.37.1
v0.37.0
v0.36.7
v0.36.6
v0.36.5
v0.36.4
v0.36.3
v0.36.2
v0.36.1
v0.36.0
v0.35.2
v0.35.1
v0.35.0
v0.34.1
v0.34.0
v0.33.0
v0.32.0
v0.31.1
v0.31.0
v0.30.3
v0.30.2
v0.30.1
v0.30.0
v0.29.4
v0.29.3
0.29.3
v0.29.2
v0.29.1
v0.29.0
v0.28.9
v0.28.8
v0.28.7
v0.28.6
v0.28.5
v0.28.4
v0.28.3
v0.28.2
v0.28.1
v0.28.0
v0.27.10
v0.27.9
v0.27.8
v0.27.7
v0.27.6
v0.27.5
v0.27.4
v0.27.3
v0.27.2
v0.27.1
v0.27.0
v0.26.7
v0.26.6
v0.26.5
v0.26.4
v0.26.3
v0.26.2
v0.26.1
v0.26.0
v0.25.9
v0.25.8
v0.25.7
v0.25.6
v0.25.5
v0.25.4
v0.25.3
v0.25.2
v0.25.1
v0.25.0
v0.24.4
v0.24.3
v0.24.2
v0.24.1
v0.24.0
v0.23.9
v0.23.8
v0.23.7
v0.23.6
v0.23.5
v0.23.4
v0.23.3
v0.23.2
v0.23.1
v0.23.0
v0.22.7
v0.22.6
v0.22.5
v0.22.4
v0.22.3
v0.22.2
v0.22.1
v0.22.0
v0.21.11
v0.21.10
v0.21.9
v0.21.8
v0.21.7
v0.21.6
v0.21.5
v0.21.4
v0.21.3
v0.21.2
v0.21.1
v0.21.0
v0.20.8
v0.20.7
v0.20.6
v0.20.5
v0.20.4
v0.20.3
v0.20.2
v0.20.1
v0.20.0
v0.19.0
v0.18.1
v0.18.0
v0.17.0
v0.16.0
v0.15.3
v0.15.2
v0.15.1
v0.15.0
v0.14.6
v0.14.5
v0.14.4
v0.14.3
v0.14.2
v0.14.1
v0.14.0
v0.13.0
v0.12.0
v0.11.6
v0.11.5
v0.11.4
v0.11.3
v0.11.2
v0.11.1
v0.11.0
v0.10.10
v0.10.9
v0.10.8
v0.10.7
v0.10.6
v0.10.5
v0.10.4
v0.10.3
v0.10.2
v0.10.1
v0.10.0
v0.9.8
v0.9.7
v0.9.6
v0.9.5
v0.9.4
v0.9.3
v0.9.2
v0.9.1
v0.9.0
v0.8.12
v0.8.11
v0.8.10
v0.8.9
v0.8.8
v0.8.7
v0.8.6
v0.8.5
v0.8.4
v0.8.3
v0.8.2
v0.8.1
v0.8.0
v0.7.1
v0.7.0
v0.6.4
v0.6.3
v0.6.2
v0.6.1
v0.6.0
v0.5.11
v0.5.10
v0.5.1
v0.5.0
v0.4.0
v0.3.5
v0.3.4
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.3
v0.2.2-beta.1
v0.2.1-beta.5
v0.2.0-beta.5
v0.2.0-beta.4
v0.2.0-beta.3
v0.2.0-beta.2
v0.2.0-beta.1
v0.1.0-beta.3
v0.1.0-beta.2
v0.1.0-beta.1
v0.1.0-rc.2
v0.1.0-rc-1
v0.0.8-hotfix-1
v0.0.8
v0.0.7
v0.0.6
v0.0.5
v0.0.4
v0.0.3
v0.0.2
v0.0.1
v0.0.0
Labels
Clear labels
2021 Q4
2022 Q1
2022 Q1
accessibility
acl
agent
agent
Android
Android
api
authentik
automation
azure
battery-usage
bug
cache
client
client-ui
cloud
cloud-only
cloudflare
community
compatibility
config-idp
config-issue
connection
contribution
coturn
cross-vpn
dashboard
data-usage
distribution
dns
docker
documentation
duplicate
enhancement
enhancement
event-stream
feature-request
freebsd
getting-started
go
good first issue
gui
help wanted
home-assistant
idp
inconsistency
integration
integrations
ios
ipv6
jwt
k8s
keycloak
linux
login
macos
management-service
missing-docs
mobile
moved-internal
needs-review
netbird-ui
networking
new-platform
nginx
notification
okta
openwrt
packaging
peer-management
peer-management
peer-management
performance
postgres
posture-checks
psk
pull-request
question
refactor
relay
release
rfc
routes
security
security-related
self-hosting
server
signal
sleep-issue
ssh
ssl
status
store
synology
system-compatibility-issue
test-suite
third-party-integration
triage
triage-needed
troubleshooting
UX
waiting-feedback
windows
wontfix
zitadel
Mirrored from GitHub Pull Request
No Label
triage-needed
Milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
saavagebueno
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: SVI/netbird#2260
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @teksrq on GitHub (Sep 9, 2025).
Hi team,
I’ve been working on a self-hosted NetBird docker deployment (signal + relay + management with Zitadel self-hosted docker deployed separately on the same server) and finally have everything working reliably except the Relay server when running behind an Nginx reverse proxy with TLS. Server is Ubuntu 22.04
Peers can connect successfully to the Signal service and management API, but relay connections keep failing with errors like:
I spent a few days alternately trying to terminate TLS at the nginx proxy and then terminating at the containers, but each time I'd end up breaking the working setup with no progress towards solving the relay issue.
Current working set up:
Ports open in UFW:
-3478/udp and 49152:65535/udp (STUN/media)
Other services (signal, management, dashboard) are working fine through the same proxy.
What I’ve tried
Questions
/etc/nginx/sites-available/netbird.conf
docker-compose
management.json
@wooksta commented on GitHub (Sep 11, 2025):
I'm having a similar issue where the webui works, but I can't get android or linux to connect.
I did notice the following in your setup:
your management is running on port 443 (and I didn't see anything to indicate you turned off TLS).
Meanwhile your redirect goes to http?
@teksrq commented on GitHub (Sep 12, 2025):
Yes, TLS is terminated at the proxy, couldn't get it to work passing through the TLS to the containers. I believe this is the root cause of my relay issues.
@wooksta commented on GitHub (Sep 12, 2025):
So i solved my issue and it turned out to be a docker problem. Docker set up my firewalls and didn't forward packets correctly to the servers. Maybe that's your issue too?
@faizansirajuddin commented on GitHub (Sep 14, 2025):
Is that working for you?
I'm trying similar setup with Netbird, Ngingx Proxy and Authentik and still could not able to make it working
@wooksta commented on GitHub (Sep 14, 2025):
So I got it working in the end. I figured it out when I did netbird up on the host Maschine with localhost as the target. When that worked but via nginx didn't, I figured out the problem was on the nginx end. I can post my nginx config if you want.
@faizansirajuddin commented on GitHub (Sep 14, 2025):
Sure. Please
So for me I have a NPM and Authentik installed in different machine than netbird. and I'm trying to get netbird work with reverse proxy.
thanks
@wooksta commented on GitHub (Sep 14, 2025):
So I have NPM (network mode: host) and netbird (own network) running on one machine in docker, and I have my keycloak running on docker on another server.
You have npm and your idp on host (B) and netbird on host (A).
`# ------------------------------------------------------------
netbird..net
------------------------------------------------------------
log_format upstreamlog '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'upstream: $upstream_addr, response_time: $upstream_response_time, '
'status: $upstream_status';
upstream dashboard {
server 127.0.0.1:10080;
keepalive 10;
}
upstream management {
server 127.0.0.1:33073;
keepalive 10;
}
upstream signal {
server 127.0.0.1:10001;
keepalive 10;
}
upstream relay {
server 127.0.0.1:33080;
}
server {
listen 80;
server_name netbird..net;
}
server {
listen 443 ssl http2;
server_name netbird..net;
location /api {
grpc_pass grpc://127.0.0.1:33073;
error_page 502 = /errorgrpc_management;
}
}`
This seems to work fine. As mentioned, try connecting to netbird through something that doesn't have to go through npm to see if npm is the problem or your config of netbird is wrong.
Where I have localhost, you would have to setup the connection to the machine with netbird (A) on it.
If that machine (A) is exposed to the internet, you might consider installing an npm on that machine too. Because I have npm and netbird on the same machine, I can just pass http from npm to netbird. If you are using anything outside a private network (like at your home) I would use https to connect from npm to netbird.
If you put npm on that host (A), you can just pass ssl from (B) to (A) and have http internal.
@faizansirajuddin commented on GitHub (Sep 14, 2025):
Hi Thanks you.
Ealier I tried using direct setup without proxy with zitadel auth provider and it was working fine without any issues. but now with authntik and NMP is creating problems.
I'm pasting my configureation see if you can help me out.
upon visiting netbird.doamin.com I can able to authnticate with auththentik and it is redirecting to netbird peer page
and there it is being stucked and keep load. I have notice one error on netbird side also see
------------------------------------------------------------
netbird.example.com
------------------------------------------------------------
map $scheme $hsts_header {
https "max-age=63072000; preload";
}
server {
set $server "192.168.1.10"; # <-- NetBird host IP
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name netbird.example.com;
ssl_certificate /etc/letsencrypt/live/npm-3/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/npm-3/privkey.pem;
include conf.d/include/letsencrypt-acme-challenge.conf;
include conf.d/include/ssl-cache.conf;
include conf.d/include/ssl-ciphers.conf;
include conf.d/include/block-exploits.conf;
include conf.d/include/force-ssl.conf;
access_log /data/logs/proxy-host-11_access.log proxy;
error_log /data/logs/proxy-host-11_error.log warn;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
Dashboard
location / {
proxy_pass http://$server:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Management API (HTTP)
location /api {
proxy_pass http://$server:33073;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Management gRPC
location /management.ManagementService/ {
grpc_pass grpc://$server:33073;
grpc_read_timeout 1d;
grpc_send_timeout 1d;
grpc_socket_keepalive on;
}
Signal gRPC
location /signalexchange.SignalExchange/ {
grpc_pass grpc://$server:10000;
grpc_read_timeout 1d;
grpc_send_timeout 1d;
grpc_socket_keepalive on;
}
Relay
location /relay/ {
proxy_pass http://$server:33080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Custom
include /data/nginx/custom/server_proxy[.]conf;
}
This error I'm getting on netbird side when starting docker compose
management-1 | 2025-09-14T11:53:05Z WARN management/server/account.go:250: failed warming up cache due to error: 403 Forbidden
@wooksta commented on GitHub (Sep 14, 2025):
So, all I saw was that I set grpc for the relay location, and you use http, that might be it.
I think the cache might be unrelated, butsomething you should look up.
@faizansirajuddin commented on GitHub (Sep 14, 2025):
So after inspecting http request I got to know that I'm getting SSL PROTOCOL ERROR while connecting to management port 33073
8786-6cab84d1f1050c71.js:1 GET https://netbird.example.com:33073/api/users/current net::ERR_SSL_PROTOCOL_ERROR
So in my setup requests to the port 80,443 is availble through NPM and rest port request can bypass proxy and can be directly rechable.
Here are my containers
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
artifacts-coturn-1 coturn/coturn:latest "docker-entrypoint.s…" coturn 3 minutes ago Up 3 minutes
artifacts-dashboard-1 netbirdio/dashboard:latest "/usr/bin/supervisor…" dashboard 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp
artifacts-management-1 netbirdio/management:latest "/go/bin/netbird-mgm…" management 3 minutes ago Up 3 minutes 0.0.0.0:33073->443/tcp, [::]:33073->443/tcp
artifacts-relay-1 netbirdio/relay:latest "/go/bin/netbird-rel…" relay 3 minutes ago Up 3 minutes 0.0.0.0:33080->33080/tcp, [::]:33080->33080/tcp
artifacts-signal-1 netbirdio/signal:latest "/go/bin/netbird-sig…" signal 3 minutes ago Up 3 minutes 0.0.0.0:10000->80/tcp, [::]:10000->80/tcp
[root@netbird artifacts]#
@wooksta commented on GitHub (Sep 15, 2025):
it sounds like your backend is expecting SSL, which it shouldn't according to your config. I think you might have to try to work on that.
@faizansirajuddin commented on GitHub (Sep 15, 2025):
Thanks man @wooksta for your support. now it is working for me as well.
@teksrq commented on GitHub (Sep 15, 2025):
Glad you both got it working, but just want to clarify that my issue is a bit different from what wooksta fixed with container name resolution.
In my setup:
Management and Signal are running fine behind Nginx with TLS.
Relay is also behind Nginx (terminating TLS), and peers are correctly receiving the advertised relay address (rels://netbird.example.com:33080/relay).
Peers can reach the relay, but the connection fails with errors like:
http: server gave HTTP response to HTTPS client
tls: first record does not look like a TLS handshake
Relevant UFW Firewall rules:
TCP 33080 open for relay.
UDP 3478 open for STUN/TURN.
UDP 49152–65535 open for WebRTC media
This looks like a protocol mismatch — the peer expects TLS/WebSocket, but the relay behind Nginx isn’t handling the handshake correctly.
So unlike wooksta’s case (container DNS/hostname discovery), my relay is being discovered, but TLS/WebSocket negotiation fails.
Question:
Does NetBird officially support running the relay behind an Nginx reverse proxy with TLS termination? If so, an example Nginx config that correctly handles rels:// WebSocket traffic would be greatly appreciated!
@faizansirajuddin commented on GitHub (Sep 15, 2025):
Yes Netbird is supported behind the reverse proxy. but you need to terminal all you connection except stun to the proxy.
then proxy will forward it to servers.
what you need to do is while configuring environment file set following things.
Set NETBIRD_DOMAIN to your domain, e.g. demo.netbird.io
Set NETBIRD_DISABLE_LETSENCRYPT=true
Add NETBIRD_MGMT_API_PORT to your reverse-proxy TLS-port (default: 443) ## I have set to 443
Add NETBIRD_SIGNAL_PORT to your reverse-proxy TLS-port ### I have set to 443
Optional:
Add TURN_MIN_PORT and TURN_MAX_PORT to configure the port-range used by the Turn-server (min 10000 max 20000)
when you run configure script it will generate management URLs pointing to the proxy. https://netbird.example.com
at this stag if you run docker compose then it will break as there are conflicting ports so have to change outside ports to non conflicting ports. do not change inside ports.
then configure proxy accordingly. here config from my Nginx proxy manager it is based fully on nginx so configuration will be same.
------------------------------------------------------------
netbird.example.com
------------------------------------------------------------
map $scheme $hsts_header {
https "max-age=63072000; preload";
}
server {
set $forward_scheme http;
set $server "192.168.1.10";
set $port 80;
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name netbird.example.com;
http2 on;
Let's Encrypt SSL
include conf.d/include/letsencrypt-acme-challenge.conf;
include conf.d/include/ssl-cache.conf;
include conf.d/include/ssl-ciphers.conf;
ssl_certificate /etc/letsencrypt/live/npm-3/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/npm-3/privkey.pem;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
access_log /data/logs/proxy-host-11_access.log proxy;
error_log /data/logs/proxy-host-11_error.log warn;
location / {
}
location /api {
}
location /signalexchange.SignalExchange/ {
location /signalexchange.SignalExchange/ {
grpc_pass grpc://192.168.1.10:9443;
grpc_read_timeout 1d;
grpc_send_timeout 1d;
grpc_socket_keepalive on;
}
}
location /management.ManagementService/ {
location /management.ManagementService/ {
grpc_pass grpc://192.168.1.10:443;
grpc_read_timeout 1d;
grpc_send_timeout 1d;
grpc_socket_keepalive on;
}
}
Custom
include /data/nginx/custom/server_proxy[.]conf;
}
and here is docker compose includes on ports and env setting linking to proxy config
services:
UI dashboard
dashboard:
<<: *default
image: netbirdio/dashboard:latest
ports:
- 80:80
- 8443:443
Signal
signal:
<<: *default
image: netbirdio/signal:latest
volumes:
- netbird-signal:/var/lib/netbird
ports:
- 9443:80
Relay
relay:
<<: *default
image: netbirdio/relay:latest
environment:
- NB_LOG_LEVEL=info
- NB_LISTEN_ADDRESS=:33080
- NB_EXPOSED_ADDRESS=rels://netbird.example.com:33080/relay
Management
management:
<<: *default
image: netbirdio/management:latest
depends_on:
- dashboard
volumes:
- netbird-mgmt:/var/lib/netbird
- netbird-letsencrypt:/etc/letsencrypt:ro
- ./management.json:/etc/netbird/management.json
ports:
- 443:443 #API port
@wooksta commented on GitHub (Sep 19, 2025):
@faizansirajuddin hey am I seeing that right? your nginx doesn't proxy the relay, you have an open port for that?
also how do you deal with SSL? can you configure ssl just for relay?
@faizansirajuddin commented on GitHub (Sep 19, 2025):
Yes, I did not proxied the relay as netbird document does not mention it and opened port for that. as far as I know relay is being protected by wiregurd tunnel so your don't need SSL on relay.
In relay case your tunnel is hopping through your netbird server.
@CustomIcon commented on GitHub (Sep 23, 2025):
Im doing the same for now. relay is not UDP as far as i know. rest is working without port forwarding and only using nginx ports
@ykorzikowski commented on GitHub (Nov 19, 2025):
Documentation is kind of slim here. I checked the source code:
You need to set the following Headers:
See https://github.com/netbirdio/netbird/blob/v0.60.0/relay/server/listener/ws/listener.go#L112
Now I see the correct IP adresses (not the local docker one) in my relay logs