
Prove that your local server is receiving real QUIC traffic from a remote client
Seeing an HTTP/3 response in a browser does not automatically prove that a local development server received HTTP/3 end to end. A valid protocol test must send UDP-based QUIC traffic from an external network, carry it through the public endpoint, deliver it to the local QUIC listener, and confirm the negotiated protocol at both ends. This guide explains that path, shows how to expose the listener with a Localtonet UDP tunnel, and provides a verification method that distinguishes genuine HTTP/3 from silent fallback to HTTP/2 or HTTP/1.1 over TCP.
๐ What's in this guide
Why remote HTTP/3 testing requires protocol fidelity
HTTP/3 is not simply a newer HTTP response header. It maps HTTP semantics onto QUIC, and QUIC runs over UDP. HTTP/2 and HTTP/1.1 normally use TCP, with TLS layered above TCP for HTTPS. This transport difference matters when a test is intended to validate a local QUIC implementation, UDP reachability, connection migration behavior, QUIC-specific logging, or application behavior under real HTTP/3 negotiation.
A test can appear successful while validating the wrong thing. For example, a public web endpoint might negotiate HTTP/3 with a remote browser, then communicate with the local application using a different protocol. That can demonstrate that the public edge supports HTTP/3, but it does not demonstrate that the local development server accepted QUIC packets. The local server might have received HTTP/2, HTTP/1.1, or another proxied request format.
For a genuine local QUIC test, UDP datagrams must reach the port on which the local server is listening. The client and server must then complete the QUIC handshake, negotiate HTTP/3 through ALPN, validate the certificate according to the client's policy, and exchange an HTTP request and response over that QUIC connection.
A successful page load proves application reachability, but not necessarily HTTP/3 transport. Record the protocol selected by the remote client and confirm the connection in the local server's QUIC or HTTP/3 logs. When possible, also observe UDP traffic arriving at the local listener.
With Localtonet, the appropriate primitive for this protocol-fidelity test is a UDP tunnel pointing to the local QUIC server's IP address and port. Our client establishes an outbound connection to a Localtonet relay, so the test does not require inbound router port forwarding, a public IP address, VPN setup, or inbound firewall changes. The tunnel supplies a public host and port while it is running.
Understand the complete client-to-server path

A useful HTTP/3 test separates the path into components. This makes it easier to identify whether a failure originates in DNS, certificate validation, the remote network, the public UDP endpoint, the tunnel, the local operating system, or the QUIC server itself.
The logical packet path is:
Remote HTTP/3 client
|
| UDP and QUIC
v
Localtonet public UDP host and port
|
| Localtonet tunnel path
v
Localtonet client on the target device
|
| UDP to the configured local IP and port
v
Local QUIC listener
|
| HTTP/3 request handling
v
Local application
QUIC includes its cryptographic handshake in the protocol rather than placing a traditional TLS connection over TCP. The certificate still matters. The client must connect using a server name expected by the certificate, send the intended server name during the handshake, negotiate an HTTP/3 ALPN value, and trust the certificate chain unless the test environment deliberately uses a private trust root.
UDP forwarding and certificate identity are separate concerns. A UDP tunnel can deliver packets to the correct local port without making the tunnel's assigned public hostname valid for the certificate presented by the local server. Plan the server name and certificate before treating a failed handshake as a tunnel problem.
Prepare the local and remote test environments
The exact installation and startup commands for a QUIC server depend on the web server, framework, runtime, and operating system. This guide does not invent a universal command because no single command applies to every implementation. Before creating the public tunnel, establish the following facts for your actual server.
| Requirement | What to determine | Why it matters |
|---|---|---|
| HTTP/3-capable server | Confirm that HTTP/3 and QUIC are enabled in the installed build and runtime. | An HTTPS server that supports only TCP cannot become a QUIC server merely by placing it behind a UDP tunnel. |
| UDP listener | Record the exact local IP address and UDP port used by the server. | The Localtonet target must match the actual listener rather than a TCP-only HTTPS port selected by assumption. |
| Certificate identity | Record the hostname covered by the server certificate and the trust chain required by clients. | QUIC handshakes can fail before an HTTP request is visible if the name or trust configuration is wrong. |
| HTTP/3 client | Confirm that the remote client build supports HTTP/3 and can report the negotiated protocol. | A client without QUIC support may use TCP or fail without testing the intended path. |
| External network | Use a device or network that is genuinely outside the server's LAN. | A local test does not exercise public UDP reachability or the complete relay path. |
| Localtonet client | Install and run it on the server device or another device that can reach the local UDP listener. | The selected client must remain connected for the tunnel to be available. |
| Diagnostic access | Enable the server's documented QUIC or HTTP/3 logs where available. | Server-side evidence helps distinguish a successful HTTP/3 request from client-side fallback. |
Choose a meaningful local target
If the Localtonet client runs on the same machine as the server, a loopback target may be appropriate when the QUIC server listens on that loopback address. If the client runs on another device, the target must be an address reachable from that device, and the server must listen on an interface that accepts the traffic. Do not assume that a server bound only to one loopback interface is reachable from a different machine.
Treat the UDP and TCP listeners independently. Some deployments use the same numeric port for HTTPS over TCP and HTTP/3 over UDP, but that is a server configuration choice rather than a universal requirement. Check the actual listeners instead of inferring UDP availability from a working TCP URL.
Prepare a client that can force HTTP/3
A browser is useful for realistic testing, but browsers can fall back automatically. A diagnostic client that supports an HTTP/3-only mode is usually better for the first protocol test because it converts silent fallback into an explicit failure.
If using curl, first inspect the installed build:
curl --version
The output must indicate that the build includes HTTP/3 support. Package features vary across operating systems and distributions, so the presence of curl alone is not proof that its HTTP/3 options are usable.
An option that ignores certificate errors can hide a hostname, trust-chain, or server-name problem. Configure the intended hostname and trust relationship first. A deliberately insecure request may be useful only as a tightly controlled diagnostic comparison, never as evidence that production certificate handling is correct.
Validate the QUIC server locally before publishing it
Do not introduce the public tunnel until the server works from a client that can reach it directly. Local verification narrows the problem. If the local HTTP/3-only request fails, changing relay regions or tunnel settings will not repair the server's QUIC listener.
Confirm the process is listening on UDP
Use the operating system's supported network inspection tools to verify that the expected process owns the intended UDP port. Tool names and output differ by platform, so rely on the utilities available for the server's operating system. Confirm all three values: protocol is UDP, the port is correct, and the bound address is reachable from the Localtonet client.
A TCP listening result for the same numeric port is not sufficient. TCP and UDP maintain separate transport endpoints. HTTP/1.1 or HTTP/2 may work over TCP while no process accepts UDP on that port.
Make an HTTP/3-only local request
With an HTTP/3-capable curl build, the general form of an enforced local test is:
curl -v --http3-only https://SERVER_NAME:LOCAL_UDP_PORT/
Replace SERVER_NAME with the hostname expected by the certificate and LOCAL_UDP_PORT with the server's configured port. The hostname must resolve to an address that reaches the server. In a controlled development environment, use the operating system or client's documented name-resolution mechanism rather than replacing the hostname with an IP address that the certificate does not cover.
The request should complete without switching to TCP, and verbose output should identify HTTP/3. At the same time, the server should record a QUIC connection and an HTTP/3 request if its logging system exposes those events.
Record a baseline before remote testing
Save the following baseline details:
- The local UDP address and port.
- The certificate hostname used in the successful request.
- The certificate issuer or private trust root used by the client.
- The HTTP path and expected status code or response body.
- The client's reported HTTP version.
- The corresponding local server log entry.
This baseline prevents unrelated application behavior from being mistaken for a networking failure. Use a lightweight health or test endpoint when the application provides one, but avoid exposing administrative diagnostics or sensitive status information publicly.
Expose the local QUIC listener with a Localtonet UDP tunnel
Localtonet supports UDP tunnels that point to a local IP address and port on, or reachable from, the connected client device. The relay server or region values available to an account can change, so obtain the current choices from our dashboard instead of copying a server code from an old tutorial.
The verified workflow is the following:
Install and run the Localtonet client
Run the Localtonet client on the machine hosting the QUIC server or on another device that can reach the server's local UDP address and port. The client establishes the outbound connection used by the tunnel.
Authenticate and select the correct device
Use the device-specific authentication token through the supported application workflow, then select that device for the tunnel. Never place the token in scripts, screenshots, logs, or article examples.
Select a currently available relay server or region
Choose from the values currently offered in our dashboard. Do not guess or hardcode a server code because availability can vary by current product configuration.
Create a UDP tunnel to the local QUIC target
Select the UDP tunnel type and point it to the verified local IP address and UDP port. Recheck that this is the QUIC listener, not merely the application's TCP HTTPS listener.
Start the tunnel
Creating a tunnel does not start it. Use the Start control and wait until the selected client is connected and the tunnel is running.
Record the assigned public host and port
Use the public UDP host and port shown for the running tunnel as the network destination for the remote test. Stop or delete the tunnel when public testing is complete.
The public endpoint is usable only while the selected Localtonet client is connected and the tunnel is running. If a previously working test stops, check both states before changing the QUIC server configuration.
Our maintained Localtonet documentation is the appropriate place to confirm the current dashboard workflow and available relay choices. Exact region names, server codes, plan availability, endpoint allocation, and UI details should be read from the current product rather than assumed from this guide.
Resolve the certificate hostname correctly
The assigned UDP destination and the hostname covered by the local server's certificate may not be the same name. The tunnel forwards UDP traffic, but the QUIC server still presents its configured certificate. A strict client validates that certificate against the hostname in the request.
A sound test therefore needs two related values:
- The network destination, which is the public host and port assigned to the running UDP tunnel.
- The application server name, which is the hostname expected by the local QUIC server and covered by its certificate.
Some HTTP/3 clients provide a documented way to connect to one network endpoint while retaining another hostname for URL identity, SNI, and certificate verification. A controlled DNS arrangement can serve the same purpose when appropriate. The exact method depends on the client and DNS configuration. Current custom-domain requirements for Localtonet UDP endpoints are not established in the supplied product information, so this guide does not claim a specific UDP custom-domain workflow.
Prove that the remote request negotiated HTTP/3

Run the first test from a different network. A mobile connection, separate office, cloud test host, or another external environment can be suitable if it permits outbound UDP. Testing from the same LAN can validate some routing behavior, but it does not prove the complete public internet path.
Start with an HTTP/3-only request
For a compatible curl build, the conceptual request is:
curl -v --http3-only https://CERTIFICATE_HOSTNAME:PUBLIC_PORT/
The request hostname must remain the certificate hostname. Configure the client or controlled DNS so that it sends the traffic to the tunnel's assigned public destination. Replace PUBLIC_PORT with the port shown for the running UDP tunnel. Do not copy these placeholders literally.
Because client features vary, consult the selected client's built-in help for its supported mechanism for separating the URL hostname from the connection destination. Do not assume that a flag used for TCP behaves identically for QUIC without confirming it in that client.
Collect evidence at multiple layers
| Evidence layer | Successful indication | What it proves |
|---|---|---|
| Remote client | The request succeeds in HTTP/3-only mode and reports HTTP/3. | The client did not satisfy the request by silently selecting HTTP/2 or HTTP/1.1. |
| QUIC handshake | Certificate validation succeeds and the negotiated ALPN identifies HTTP/3. | The client established the intended secure QUIC application protocol. |
| Local server logs | The server records the connection or request as QUIC or HTTP/3. | The local server, rather than only a public edge, processed HTTP/3. |
| Local packet observation | UDP datagrams arrive on the configured local target port during the request. | The transport reaching the local listener is UDP. |
| Application response | The expected path, status, headers, and response body are returned. | The HTTP/3 request reached the intended application behavior. |
No single observation is as strong as the combined result. Client output can be misunderstood, server logs can be incomplete, and packet capture may show encrypted UDP without revealing the application protocol. Together, they provide a defensible test.
Use a unique request marker
When the application and server logging configuration permit it, send a unique request path, query value, or non-sensitive diagnostic header. Match that marker in the local application log. This helps distinguish the current remote request from a local health check or an earlier connection.
Do not place credentials, authentication tokens, customer information, or secrets in the marker. URLs and headers can be recorded by clients, servers, observability systems, and test tooling.
Run a negative control
A negative control deliberately removes one required condition and verifies that the HTTP/3-only request fails. For example, stop the UDP tunnel temporarily or stop the local QUIC listener while leaving any TCP HTTPS listener untouched. The HTTP/3-only request should no longer succeed.
If the request still returns the application response, investigate whether the client reached a different endpoint, used cached routing information, or did not actually enforce HTTP/3. Restore the tunnel or listener after completing the controlled test.
Detect silent fallback to TCP-based HTTP
Many user-facing clients prioritize successful page delivery over protocol diagnostics. If QUIC fails, they may retry using HTTP/2 or HTTP/1.1 over TCP. That is useful for normal browsing, but it can produce a false positive in an HTTP/3 test.
| Test mode | Possible result | Interpretation |
|---|---|---|
| HTTP/3-only | Request succeeds and reports HTTP/3. | Strong client-side evidence that QUIC and HTTP/3 worked. |
| HTTP/3 preferred | Request succeeds as HTTP/2. | The application is reachable, but the HTTP/3 attempt failed or was not selected. |
| Ordinary browser navigation | Page loads with no protocol inspection. | Reachability is proven, but the transport remains unknown. |
| TCP HTTPS request | Request succeeds while HTTP/3-only fails. | The server or route supports TCP HTTPS, but the UDP or QUIC path still has a problem. |
Browser developer tools may expose the protocol used for each request. Make sure the displayed value applies to the specific request being tested, not a cached resource, service worker response, or connection to another hostname. Clear or isolate state when necessary, and compare the result with the local server logs.
A public endpoint negotiating HTTP/3 with a browser does not, by itself, establish that the local application received QUIC. Use a UDP tunnel to the local QUIC listener and verify the protocol on the server side when end-to-end protocol fidelity is the objective.
Troubleshoot remote QUIC connectivity systematically

Troubleshooting is fastest when it proceeds from the local server outward. Avoid changing certificates, server ports, relay selections, and client options simultaneously. Change one layer, repeat the same HTTP/3-only request, and record the outcome.
The local HTTP/3-only test fails
Do not troubleshoot the public tunnel yet. Confirm that the installed server build actually includes HTTP/3 support, that the feature is enabled, and that the process owns the expected UDP port. Review startup logs for certificate loading, unsupported configuration, address conflicts, missing runtime capabilities, or an HTTP/3 feature that was disabled at build time.
Also confirm that the local client supports HTTP/3. If the client reports that the option is unknown or that HTTP/3 is unavailable, use a build that includes the required support before drawing conclusions about the server.
The local test works but no remote packets reach the server
Check the Localtonet lifecycle first:
- Is the intended device selected?
- Is its Localtonet client connected?
- Is the UDP tunnel running rather than merely created?
- Does the target contain the exact local UDP address and port from the successful baseline?
- Is the remote client using the currently assigned public host and port?
If the client runs on a different local device, verify that it can reach the server's target address directly. A loopback address on one machine refers to that machine itself, not to another server on the LAN.
UDP reaches the server but the QUIC handshake fails
This points away from basic tunnel reachability and toward QUIC or TLS configuration. Check the certificate hostname, trust chain, validity, server-name handling, and ALPN negotiation. Confirm that the remote request uses the hostname for which the certificate was issued, even if the packets are routed to a different public network destination.
Review the server's QUIC diagnostics for handshake alerts or connection closures. Packet observation may confirm two-way UDP exchange, but encrypted QUIC traffic requires protocol-aware diagnostics and endpoint logs for meaningful application-level interpretation.
The request times out only from one remote network
Some networks restrict or degrade outbound UDP. Test from a second external network before changing the server. If HTTP/3-only works from one network and fails from another while the tunnel and local server remain unchanged, the difference is evidence that the client-side network path may be responsible.
A normal browser may hide this condition by falling back to TCP. Compare HTTP/3-only and TCP-based tests from the affected network, and preserve the exact timestamps for correlation with server logs.
The browser loads the page, but the server shows only HTTP/2
The browser probably used a TCP path, reached another hostname, or connected through an endpoint that did not preserve QUIC to the local listener. Inspect the protocol for the exact request, disable assumptions based solely on page load success, and repeat with an HTTP/3-only diagnostic client through the UDP tunnel.
The first request works, but later requests behave differently
Client caches, connection reuse, prior protocol advertisements, DNS caching, and alternate endpoints can make repeated tests non-equivalent. Use a controlled test profile, verify the destination each time, and correlate each request with a unique marker in the server log. If the testing tool supports explicit protocol enforcement, keep it enabled for every verification run.
The public endpoint stopped responding
Confirm that the Localtonet client is still connected and the tunnel remains running. A tunnel is available only while both conditions hold. Also verify that the local server process has not restarted on a different address or port and that the current public endpoint matches the running tunnel shown in the dashboard.
Keep public QUIC testing controlled
Publishing a development listener makes it reachable through a public endpoint while the tunnel is running. Treat that endpoint as internet-accessible, even when the test is expected to be brief.
Do not expose a debug build that includes unauthenticated administrative endpoints, stack traces containing secrets, development dashboards, or unrestricted state-changing operations. If the application cannot be safely exposed, create a minimal test service containing only the endpoint needed to validate QUIC behavior.
Localtonet removes the need for inbound router port forwarding and firewall changes in this workflow, but it does not remove the application's security responsibilities. Authentication, authorization, safe certificate handling, input validation, and least-privilege configuration remain necessary.
Frequently asked questions
Can I test a local HTTP/3 server with an ordinary HTTP or HTTPS tunnel?
Not when the goal is to prove that the local server itself received QUIC. HTTP/3 uses QUIC over UDP, so protocol-fidelity testing requires UDP traffic to reach the local QUIC listener. A public HTTPS endpoint may provide a working web response without proving that the local connection used HTTP/3.
Does a successful browser page load prove HTTP/3 is working?
No. Browsers can fall back to HTTP/2 or HTTP/1.1 over TCP. Inspect the protocol for the exact request, repeat the test with an HTTP/3-only client, and confirm the corresponding QUIC or HTTP/3 event in the local server logs.
Can HTTP/3 and HTTPS over TCP use the same port number?
They can use the same numeric port because UDP and TCP are separate transports, but the actual arrangement depends on the server configuration. Verify the UDP listener directly. A working TCP listener on a port does not prove that a QUIC listener exists on UDP at the same number.
Why does the certificate fail when UDP packets reach the server?
Network delivery and certificate identity are separate. The client must validate the certificate against the hostname in the request. If the public tunnel destination differs from the certificate hostname, use a client or controlled DNS configuration that routes to the public endpoint while preserving the correct hostname, SNI, and certificate checks.
Why does QUIC work from one network but fail from another?
The failing network may restrict or impair outbound UDP. Test with the same HTTP/3-only client from at least two external networks while keeping the server and tunnel unchanged. A browser may conceal the difference by falling back to TCP.
Does creating a Localtonet UDP tunnel start it automatically?
No. Creating a tunnel and running it are separate lifecycle states. Start the tunnel and keep the selected Localtonet client connected. The public endpoint is available only while the client is connected and the tunnel is running.
Do I need router port forwarding or a public IP address?
No. The Localtonet client establishes an outbound connection to our relay, so this workflow does not require inbound router port forwarding, inbound firewall changes, VPN setup, or a public IP address.
What is the strongest proof that the local server handled HTTP/3?
Combine an HTTP/3-only success from a remote client with a matching local server log entry and observation of UDP traffic on the configured local port. Use a unique, non-sensitive request marker to correlate the client request with the server event.
Test your local QUIC listener from a real external network
Run the Localtonet client on a device that can reach your verified UDP listener, create and start a UDP tunnel, then use the assigned public endpoint for an HTTP/3-only remote test.
Get Started Free โ