# How to advertise both private and public IPs as ICE candidates in Kubernetes

**URL:** <https://community.livekit.io/t/how-to-advertise-both-private-and-public-ips-as-ice-candidates-in-kubernetes/242>\
**Category:** Self Hosting\
**Tags:** kubernetes\
**Created:** [January 21, 2026, 3:52pm UTC](https://community.livekit.io/t/how-to-advertise-both-private-and-public-ips-as-ice-candidates-in-kubernetes/242 "2026-01-21T15:52:47Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![LiveKit-Community](https://sea1.discourse-cdn.com/flex001/user_avatar/community.livekit.io/livekit-community/32/67_2.png) [@LiveKit-Community](https://community.livekit.io/u/LiveKit-Community)\
**Post date:** [January 21, 2026, 3:52pm UTC](https://community.livekit.io/t/how-to-advertise-both-private-and-public-ips-as-ice-candidates-in-kubernetes/242/1 "2026-01-21T15:52:47Z")

</div>

_This question originally came up in our Slack community and the thread has been consolidated here for long-term reference._

How do I make the LiveKit server advertise both private IP and public IP as ICE candidates?

**Current setup:**

- LiveKit server runs in Kubernetes cluster on Azure
- Public load balancer exposes the server with UDP-MUX ports for media and HTTP for signaling
- TURN is disabled

The configuration works, but internal clients also use the public IP of the load balancer, adding unnecessary network costs and potential latency.

How can I make the server advertise both internal and public IPs so internal clients choose the internal IP?

---

<div class="post-metadata">

**Author:** ![LiveKit-Community](https://sea1.discourse-cdn.com/flex001/user_avatar/community.livekit.io/livekit-community/32/67_2.png) [@LiveKit-Community](https://community.livekit.io/u/LiveKit-Community)\
**Post date:** [January 21, 2026, 3:52pm UTC](https://community.livekit.io/t/how-to-advertise-both-private-and-public-ips-as-ice-candidates-in-kubernetes/242/2 "2026-01-21T15:52:50Z")

</div>

One approach that partially works:

Configure `rtc.use_external_ip` as `false` with no `node_ip` value. This makes the server advertise:

- Private IP as `host` candidate
- Public IP (via load balancer) as `srflx` candidate

Internal clients will connect using the `host` candidate, and external clients will use `srflx`.

**Caveats:**

- This may not work reliably at production load due to potential NAT pinhole / SNAT port exhaustion issues
- Once `use_external_ip` is set to `true`, LiveKit does not advertise the private host IP

**Alternative approaches:**

- Use split DNS with Azure Private DNS Zone
- Set up two load balancers (internal and external) routing to the same cluster
- Internal A record uses private DNS → internal LB
- External A record uses public DNS → public LB

This ensures internal clients always route to the internal LB, and during ICE negotiation they’ll choose the reachable internal IP.

---

<div class="post-metadata">

**Author:** ![parth.thoriya](https://avatars.discourse-cdn.com/v4/letter/p/3be4f8/32.png) [@parth.thoriya](https://community.livekit.io/u/parth.thoriya)\
**Post date:** [March 18, 2026, 9:01am UTC](https://community.livekit.io/t/how-to-advertise-both-private-and-public-ips-as-ice-candidates-in-kubernetes/242/3 "2026-03-18T09:01:02Z")

</div>

I having similar issue but in AWS. I am using AWS EKS and livekit is running as a pod in that cluster and the cluster it self is on private subnet so call’s sip signal is connecting through NLB and kamailio proxy but two way media communication is no working.
