Configuring Extensions for Internal VoIP Communication
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.

Head to Extensions in the sidebar.
Step 2: Create Extensions
Click New Extension and fill in the basics:
| Field | Example | Notes |
|---|---|---|
| Extension | 1001 | The dialable number |
| Display Name | Alice | Shown on caller ID |
| SIP Password | ******** | Used for SIP registration |
alice@example.com | Optional, for voicemail notifications | |
| Departments | Sales | Optional grouping |
Repeat for 1002 (Bob) and 1003 (Carol). Each extension gets its own SIP credentials.

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

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.

Step 5: Make Internal Calls
Now dial 1002 from extension 1001. The call flows through RustPBX’s SIP proxy, which:
- Authenticates the caller (1001)
- Looks up the callee (1002) in the registration database
- Routes the INVITE to the registered device
- 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)

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_disabledto 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.