Configuring Extensions for Internal VoIP Communication

M
Miuda Team
Building conversational AI tooling
Rust Telephony SIP WebRTC

Every PBX starts with the same basic need: let people inside the organization call each other. Whether your team uses desk phones, softphones, or web browsers, it all comes down to configuring extensions and getting them registered.

This post walks through setting up internal VoIP communication in RustPBX from scratch, using its web console.

The Goal

We want:

  • A few extensions (e.g. 1001, 1002, 1003) that can call each other
  • Support for SIP softphones AND WebRTC browser clients
  • Call forwarding when someone is away
  • Everything managed through the web console

Step 1: Open the Console

After deploying RustPBX, open the web console (default http://your-server:8080/console) and log in with your admin credentials. You’ll land on the dashboard.

Dashboard overview

Head to Extensions in the sidebar.

Step 2: Create Extensions

Click New Extension and fill in the basics:

FieldExampleNotes
Extension1001The dialable number
Display NameAliceShown on caller ID
SIP Password ********Used for SIP registration
Emailalice@example.comOptional, for voicemail notifications
DepartmentsSalesOptional grouping

Repeat for 1002 (Bob) and 1003 (Carol). Each extension gets its own SIP credentials.

Extension creation form

Back on the extensions list, you’ll see all three entries. The status column shows “Unregistered” – that’s expected until a device connects.

Extension list view

Step 3: Register SIP Devices

Your team can use any SIP-compatible softphone (MicroSIP, Linphone, Zoiper, etc.). Point the softphone to your RustPBX server:

  • Server: your RustPBX IP address
  • Transport: UDP (default), TCP, or TLS
  • Username/Extension: 1001
  • Password: the SIP password you set

Once registered, the extension list updates to show the registration status, transport type, and user-agent string.

Step 4: Use WebRTC from a Browser

No softphone? No problem. RustPBX has a built-in WebRTC phone accessible from the browser. Each extension’s detail page shows registration info including WebRTC support.

For custom integrations, you can use JsSIP or SIP.js:

const ua = new JsSIP.UA({
  uri: "sip:1001@your-server",
  password: "your-password",
  sockets: [new JsSIP.WebSocketInterface("wss://your-server:8080/ws")],
});
ua.start();

WebRTC clients connect over WebSocket, so there’s no need for a separate media server like Janus. RustPBX handles ICE/DTLS/SRTP natively.

WebRTC registration details

Step 5: Make Internal Calls

Now dial 1002 from extension 1001. The call flows through RustPBX’s SIP proxy, which:

  1. Authenticates the caller (1001)
  2. Looks up the callee (1002) in the registration database
  3. Routes the INVITE to the registered device
  4. Bridges the media (with optional recording)

The whole thing takes milliseconds. Check Call Records in the console to see the CDR.

Step 6: Set Up Call Forwarding

What if Bob steps out? On the extension detail page, configure forwarding:

  • Mode: Always, No Answer, or Busy
  • Destination: another extension, a queue, or an external number
  • Timeout: seconds to ring before forwarding (e.g. 15s)

Call forwarding configuration

For example, set Bob (1002) to forward to Carol (1003) after 15 seconds of no answer. The forwarding engine respects the mode and timeout, so Bob’s phone rings first, then Carol’s takes over.

Tips

  • Bulk creation: Use the API to create dozens of extensions at once with a script
  • Departments: Group extensions by team for easier filtering and permissions
  • Login control: Toggle login_disabled to temporarily block a compromised extension without deleting it
  • Security: RustPBX supports frequency limits and auto-blocking for brute-force protection

What’s Next?

Internal calling is just the beginning. In the next post, we’ll connect RustPBX to the outside world by configuring SIP trunks and routing rules – turning your PBX into a full SBC.