WHIP Ingress ICE fails with “Failed to ping without candidate pairs” - UDP port range not initializing

I’m trying to get WHIP ingress working with LiveKit v1.11.0 in a datacenter environment (public IP 173.208.153.61). My guests can connect to rooms normally via TURN, but my WHIP connections from OBS consistently fail with ICE connection state: failed.

The symptom in ingress logs:

text
WARN: Failed to ping without candidate pairs
ICE connection state changed: failed
The smoking gun in livekit-server logs:

text
“rtc.portUDP”: {“Start”:7882,“End”:0}
The UDP port range never initializes properly. I have port_range_start: 50000 and port_range_end: 60000 in my config, but LiveKit ignores them and shows “End”:0. I’ve tried:

Setting port_range as a string

Environment variables (LIVEKIT_RTC_PORT_RANGE_START, etc.)

Removing udp_port: 7882 (suggested by some threads)

Nothing changes the “End”:0 behavior.

My config:

yaml
rtc:
tcp_port: 7881
port_range_start: 50000
port_range_end: 60000
use_external_ip: true
node_ip: “173.208.153.61”
stun_servers:

RTMP ingress works fine

Guest participants connect via TURN

STUN discovers my external IP correctly (logs show found external IP via STUN)

UDP port 7882 is reachable from outside (nc -uv succeeds)

What doesn’t work:

WHIP connections always fail ICE

rtc.portUDP always shows “End”:0

Is this a bug in v1.11.0? Am I missing a required config field? Any help appreciated. I have been working on this for awhile, and this is the last leg of it. Once I get this worked out, it will be solid. ObsVirtual Cam works for my host cam if needed. But, I know Ingress Whip would be more efficient. Again, thanks for any help. I will provide more info, if you need it. Or, more logs.

my livekit.yaml

port: 7880
bind_addresses:

  • “173.208.153.61”
    keys:
  • logging:
    level: info

redis:
address: “127.0.0.1:6379”

rtc:
udp_port: 7882
tcp_port: 7881
use_external_ip: true
node_ip: “173.208.153.61”
stun_servers:

ingress:
rtmp_base_url: “rtmp://vdo.donoconnor.com/x”
whip_base_url: “https://vdo.donoconnor.com/w

Ingress.yaml

redis:
address: “127.0.0.1:6379”

rtmp_port: 1936
whip_port: 8080
http_relay_port: 9090

bind_address: “173.208.153.61”

rtc_config:
udp_port: 7885
tcp_port: 7886
node_ip: “173.208.153.61”
use_external_ip: false
external_ip: “173.208.153.61”

interfaces:
includes:

whip:
enabled: true

webrtc:
ice_servers:

  • urls:
  • “stun:stun.l.google.com:19302”
  • urls:
  • “turn:turn.donoconnor.com”

cpu_cost:
rtmp_cpu_cost: 1.0
whip_cpu_cost: 1.0
whip_bypass_transcoding_cpu_cost: 0.1

logging:
level: debug
json: false

Made adjustments in my Nginx config, and finally connected. Got buffering in my logs, and stayed connected. Once I saw connected and buffering, I knew it was good.
I’ve been working on the PWA app for a month, and down to the testing, fine tuning and cosmetics. But, seeing connected and buffering was a huge win. Another one of those self exciting moments, that only I will know is a win. Yet, darn good moment.

Once I disabled IPv6 on my server, I was able to make a whip connection. Still not sure how to work around the IPv6 with Whio. It works great when I use obsvirtual cam, without having to disable IPv6. The stun servers have issues with iov6.

Glad you got unblocked - I did look for other examples of IPv6 not working and, although there aren’t many, most of the time it was something along the network path not supporting IPv6.