NeuroAgent

Telegram calls not working with VLESS+REALITY: complete solution

Complete solution for fixing hanging voice calls in Telegram when using VLESS+REALITY VPN. Learn how to configure UDP traffic routing and fix device connections.

Question

Telegram calls not working with VLESS+REALITY VPN: how to solve the problem?

I have a server (aeza provider) with a 3X-UI panel configured with VLESS, XTLS Vision, and REALITY protocols. Overall, the VPN works stably: it bypasses blocks and provides normal internet connection. However, for the past few days, there has been a problem with voice calls in Telegram - they hang at the “Connecting…” stage and don’t establish.

The key point: the problem only occurs under the following conditions:

  • Both devices (phones or tablets) are connected to my VPN server
  • Calls between two mobile devices don’t go through

At the same time:

  • Calls from a mobile device to a computer (connected to the same VPN) work normally
  • Calls go through if one of the devices uses a different VPN (for example, PaperVPN)

I have already taken the following steps to solve the problem:

  1. Configured SOCKS proxy
  2. Changed transport mode from TCP(RAW) to WebSocket and other available options
  3. Enabled the Sniffing function
  4. Changed Flow from xtls-rprx-vision to xtls-rprx-vision-udp443
  5. Tried various SNI options, including those that should work with whitelists
  6. Forced TCP usage in Telegram settings

None of these solutions helped. If anyone has encountered a similar problem, please share your experience solving it.

NeuroAgent

VLESS+REALITY VPN default configurations often don’t properly handle UDP traffic, which causes issues with voice calls in Telegram since they use UDP for data transmission. This problem occurs when both devices are connected to the same VPN server, because traffic between clients doesn’t go through proper routes and tries to connect directly via UDP.

Table of Contents


Main Causes of the Problem

The problem with voice calls in Telegram when using VLESS+REALITY VPN occurs because:

  1. UDP traffic is not properly routed: As noted in GitHub issue #3283, Telegram voice and video calls use UDP under the hood, and standard VLESS/Reality configuration doesn’t always properly handle this traffic between clients.

  2. Direct connection between clients: When both devices are connected to the same VPN server, Telegram tries to establish a direct UDP connection between them, bypassing the server. This causes hanging at the “Connecting…” stage.

  3. Lack of proper routing rules: Without special rules, traffic between clients may go through the standard internet rather than through the secure VPN channel.

Interestingly, calls from mobile to computer work because desktop Telegram clients can use alternative communication methods such as TCP tunneling or WebRTC through TURN servers.


Solution Through Routing Settings in 3X-UI

You need to configure proper routing rules in the 3X-UI panel:

1. Outbound Configuration

Go to Xray Configuration → Outbounds and ensure you have the correct settings:

json
{
  "tag": "direct",
  "protocol": "freedom",
  "settings": {}
}
json
{
  "tag": "proxy",
  "protocol": "vless",
  "settings": {
    "vnext": [
      {
        "address": "your-server-ip",
        "port": 443,
        "users": [
          {
            "id": "your-uuid",
            "encryption": "none",
            "flow": "xtls-rprx-vision"
          }
        ]
      }
    ]
  }
}

2. Routing Rules

This is the key point. In the Xray Configuration → Routing Rules section, add the following rules:

json
{
  "type": "field",
  "outboundTag": "proxy",
  "inboundTag": ["vless"],
  "network": ["udp"],
  "domain": ["domain:telegram.org", "domain:tdesktop.com"]
}

Also add a rule to force TCP usage for all Telegram traffic:

json
{
  "type": "field",
  "outboundTag": "proxy",
  "inboundTag": ["vless"],
  "network": ["tcp"],
  "domain": ["domain:telegram.org", "domain:tdesktop.com"]
}

3. Enabling UDP Support

In your VLESS inbound settings, ensure UDP is enabled:

  • Go to Inbounds → your VLESS inbound
  • In the Stream section, ensure sockopt includes UDP:
json
{
  "sockopt": {
    "mark": 255,
    "tcpFastOpen": true,
    "udp": true
  }
}

Alternative Methods to Fix the Issue

1. Using Proxy for UDP Traffic

If standard routes don’t work, try configuring a SOCKS5 proxy specifically for UDP:

  1. In 3X-UI, create a separate SOCKS5 inbound
  2. Configure it to work with UDP:
json
{
  "listen": "127.0.0.1",
  "port": 10808,
  "protocol": "socks",
  "settings": {
    "auth": "noauth",
    "udp": true,
    "ip": "127.0.0.1"
  }
}
  1. In Telegram, configure SOCKS5 proxy for calls

2. Changing VLESS Operation Mode

Try using xtls-rprx-vision mode instead of xtls-rprx-vision-udp443, but with additional settings:

json
{
  "flow": "xtls-rprx-vision",
  "settings": {
    "vnext": [
      {
        "address": "your-server-ip",
        "port": 443,
        "users": [
          {
            "id": "your-uuid",
            "encryption": "none",
            "flow": "xtls-rprx-vision"
          }
        ]
      }
    ]
  }
}

3. Using WireGuard as an Additional Layer

Add WireGuard on top of your VLESS+REALITY connection for better UDP handling:

bash
# WireGuard configuration example for UDP traffic
[Interface]
PrivateKey = your-private-key
Address = 10.0.0.2/24
DNS = 1.1.1.1, 8.8.8.8

[Peer]
PublicKey = server-public-key
Endpoint = your-server-ip:51820
AllowedIPs = 0.0.0.0/0

Verification and Testing

After making changes, perform the following checks:

1. UDP Connection Verification

Use ping or mtr to check UDP connectivity between devices:

bash
# UDP availability check
nc -u -z -w2 your-server-ip 443

# Routing check
mtr --udp --tcp your-server-ip

2. Call Testing

  1. Restart Telegram on both devices
  2. Try making a call between two mobile devices
  3. If the problem persists, check server logs for UDP errors

3. Traffic Analysis

Use tcpdump to analyze UDP traffic:

bash
tcpdump -i any -n udp port 443 or udp port 80 or udp port 5228

Additional Recommendations

1. Updating 3X-UI and X-Ray

Ensure you have the latest version of 3X-UI and X-Ray core:

bash
# Update 3X-UI
bash <(curl -Ls https://github.com/MHSanaei/3x-ui/raw/main/install.sh)

2. Alternative Protocols

If the issue isn’t resolved, consider alternative protocols:

  • VMESS+REALITY: may handle UDP traffic better
  • Shadowsocks: works great with UDP
  • Trojan+REALITY: natively supports UDP

3. Professional VPN Services

As a temporary solution, you can use PaperVPN or similar services for calls, while directing main traffic through your VLESS+REALITY VPN.

Sources

  1. GitHub issue #3283: Telegram voice/video calls not working – how to enable UDP for my VLESS inbound?
  2. FASTVPS documentation: 3X-UI configuration
  3. SpaceCore WIKI: Installing 3X UI
  4. Hostkey documentation: 3X-UI Graphics Panel
  5. Reddit: VLESS Reality configuration issues

Conclusion

The problem with voice calls in Telegram when using VLESS+REALITY VPN is common and is related to improper handling of UDP traffic between clients. The main solutions include:

  1. Configuring proper routing rules to force all Telegram traffic (including UDP) to go through the VPN server
  2. Enabling UDP support in VLESS inbound settings
  3. Using alternative protocols or proxies for UDP traffic
  4. Updating software to the latest versions

The most effective solution is usually configuring proper routing rules that force all Telegram traffic (including UDP) to pass through the VPN server rather than trying to establish direct connections between clients. If the issue isn’t resolved, consider using alternative VPN protocols or professional services for voice calls.