INTERNET | ┌──────────────────┼──────────────────────┐ | | | | ViciDial | | | VICIDIAL_IP | | | (Public IP) | | | UDP 5060 SIP | | | UDP 10000- | | | 20000 RTP | | | | | └──────────────────┘ | NAT Router/Firewall GATEWAY_PUBLIC_IP | ┌──────┴──────┐ | LAN | | e.g. | | 192.168.1.0 | | /24 | | | | Dinstar | | GATEWAY_ | | PRIVATE_IP | | UC2000-VE | | Ports 1-8 | └──────────────┘ | GSM Network | Mobile Phones
INTERNET | ┌──────────────────┼──────────────────────┐ | | | | ViciDial | | | VICIDIAL_IP | | | (Public IP) | | | UDP 5060 SIP | | | UDP 10000- | | | 20000 RTP | | | | | └──────────────────┘ | NAT Router/Firewall GATEWAY_PUBLIC_IP | ┌──────┴──────┐ | LAN | | e.g. | | 192.168.1.0 | | /24 | | | | Dinstar | | GATEWAY_ | | PRIVATE_IP | | UC2000-VE | | Ports 1-8 | └──────────────┘ | GSM Network | Mobile Phones
INTERNET | ┌──────────────────┼──────────────────────┐ | | | | ViciDial | | | VICIDIAL_IP | | | (Public IP) | | | UDP 5060 SIP | | | UDP 10000- | | | 20000 RTP | | | | | └──────────────────┘ | NAT Router/Firewall GATEWAY_PUBLIC_IP | ┌──────┴──────┐ | LAN | | e.g. | | 192.168.1.0 | | /24 | | | | Dinstar | | GATEWAY_ | | PRIVATE_IP | | UC2000-VE | | Ports 1-8 | └──────────────┘ | GSM Network | Mobile Phones
curl -s https://ifconfig.me
curl -s https://ifconfig.me
curl -s https://ifconfig.me
# SSH to your ViciDial server
ssh root@VICIDIAL_IP # Check current iptables rules to find the right insertion point
# Look for the line number of the final DROP/REJECT rule for UDP 5060
iptables -L INPUT -n --line-numbers | grep -E "5060|DROP" # Insert an ACCEPT rule BEFORE the DROP rule
# Replace LINE_NUMBER with the position before the DROP
# Replace GATEWAY_PUBLIC_IP with the actual public IP
iptables -I INPUT LINE_NUMBER -p udp -s GATEWAY_PUBLIC_IP -j ACCEPT # Verify the rule was added correctly
iptables -L INPUT -n --line-numbers | grep GATEWAY_PUBLIC_IP # Save the rules so they persist after reboot
# On CentOS/ViciBox (openSUSE):
iptables-save > /etc/sysconfig/iptables # On Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4
# SSH to your ViciDial server
ssh root@VICIDIAL_IP # Check current iptables rules to find the right insertion point
# Look for the line number of the final DROP/REJECT rule for UDP 5060
iptables -L INPUT -n --line-numbers | grep -E "5060|DROP" # Insert an ACCEPT rule BEFORE the DROP rule
# Replace LINE_NUMBER with the position before the DROP
# Replace GATEWAY_PUBLIC_IP with the actual public IP
iptables -I INPUT LINE_NUMBER -p udp -s GATEWAY_PUBLIC_IP -j ACCEPT # Verify the rule was added correctly
iptables -L INPUT -n --line-numbers | grep GATEWAY_PUBLIC_IP # Save the rules so they persist after reboot
# On CentOS/ViciBox (openSUSE):
iptables-save > /etc/sysconfig/iptables # On Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4
# SSH to your ViciDial server
ssh root@VICIDIAL_IP # Check current iptables rules to find the right insertion point
# Look for the line number of the final DROP/REJECT rule for UDP 5060
iptables -L INPUT -n --line-numbers | grep -E "5060|DROP" # Insert an ACCEPT rule BEFORE the DROP rule
# Replace LINE_NUMBER with the position before the DROP
# Replace GATEWAY_PUBLIC_IP with the actual public IP
iptables -I INPUT LINE_NUMBER -p udp -s GATEWAY_PUBLIC_IP -j ACCEPT # Verify the rule was added correctly
iptables -L INPUT -n --line-numbers | grep GATEWAY_PUBLIC_IP # Save the rules so they persist after reboot
# On CentOS/ViciBox (openSUSE):
iptables-save > /etc/sysconfig/iptables # On Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4
# Check if there's an existing ipset for SIP providers
ipset list -name # If there's a set like 'sip-providers', add the IP to it:
ipset add sip-providers GATEWAY_PUBLIC_IP # Save ipset so it persists:
ipset save > /etc/ipset.conf
# Check if there's an existing ipset for SIP providers
ipset list -name # If there's a set like 'sip-providers', add the IP to it:
ipset add sip-providers GATEWAY_PUBLIC_IP # Save ipset so it persists:
ipset save > /etc/ipset.conf
# Check if there's an existing ipset for SIP providers
ipset list -name # If there's a set like 'sip-providers', add the IP to it:
ipset add sip-providers GATEWAY_PUBLIC_IP # Save ipset so it persists:
ipset save > /etc/ipset.conf
[dinstar_gsm]
type=peer
host=GATEWAY_PUBLIC_IP
port=5060
context=trunkinbound
disallow=all
allow=alaw
allow=ulaw
insecure=port,invite
dtmfmode=rfc2833
qualify=yes
nat=force_rport,comedia
directmedia=no
[dinstar_gsm]
type=peer
host=GATEWAY_PUBLIC_IP
port=5060
context=trunkinbound
disallow=all
allow=alaw
allow=ulaw
insecure=port,invite
dtmfmode=rfc2833
qualify=yes
nat=force_rport,comedia
directmedia=no
[dinstar_gsm]
type=peer
host=GATEWAY_PUBLIC_IP
port=5060
context=trunkinbound
disallow=all
allow=alaw
allow=ulaw
insecure=port,invite
dtmfmode=rfc2833
qualify=yes
nat=force_rport,comedia
directmedia=no
[dinstar_gsm]
type=friend
host=dynamic
secret=PEER_PASSWORD
context=trunkinbound
disallow=all
allow=alaw
allow=ulaw
insecure=port,invite
dtmfmode=rfc2833
qualify=yes
nat=force_rport,comedia
directmedia=no
[dinstar_gsm]
type=friend
host=dynamic
secret=PEER_PASSWORD
context=trunkinbound
disallow=all
allow=alaw
allow=ulaw
insecure=port,invite
dtmfmode=rfc2833
qualify=yes
nat=force_rport,comedia
directmedia=no
[dinstar_gsm]
type=friend
host=dynamic
secret=PEER_PASSWORD
context=trunkinbound
disallow=all
allow=alaw
allow=ulaw
insecure=port,invite
dtmfmode=rfc2833
qualify=yes
nat=force_rport,comedia
directmedia=no
; Outbound via Dinstar GSM Gateway
; Prefix 88 is stripped before sending to the gateway
; Example: agent dials 88393331234567 -> sends 393331234567 to Dinstar -> GSM
exten => _88X.,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _88X.,n,Dial(SIP/dinstar_gsm/${EXTEN:2},,tTo)
exten => _88X.,n,Hangup()
; Outbound via Dinstar GSM Gateway
; Prefix 88 is stripped before sending to the gateway
; Example: agent dials 88393331234567 -> sends 393331234567 to Dinstar -> GSM
exten => _88X.,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _88X.,n,Dial(SIP/dinstar_gsm/${EXTEN:2},,tTo)
exten => _88X.,n,Hangup()
; Outbound via Dinstar GSM Gateway
; Prefix 88 is stripped before sending to the gateway
; Example: agent dials 88393331234567 -> sends 393331234567 to Dinstar -> GSM
exten => _88X.,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _88X.,n,Dial(SIP/dinstar_gsm/${EXTEN:2},,tTo)
exten => _88X.,n,Hangup()
# Option 1: Reload the carrier from ViciDial Admin
# Go to Admin -> Carriers -> DINSTAR_GSM -> click "RELOAD CARRIER" # Option 2: Force a full config rebuild and reload via CLI
ssh root@VICIDIAL_IP # Trigger ViciDial config rebuild
mysql -e "UPDATE servers SET rebuild_conf_files='Y' WHERE server_ip='VICIDIAL_IP';" asterisk # Wait 30-60 seconds for the keepalive process to pick up the change, then:
asterisk -rx "sip reload"
asterisk -rx "dialplan reload"
# Option 1: Reload the carrier from ViciDial Admin
# Go to Admin -> Carriers -> DINSTAR_GSM -> click "RELOAD CARRIER" # Option 2: Force a full config rebuild and reload via CLI
ssh root@VICIDIAL_IP # Trigger ViciDial config rebuild
mysql -e "UPDATE servers SET rebuild_conf_files='Y' WHERE server_ip='VICIDIAL_IP';" asterisk # Wait 30-60 seconds for the keepalive process to pick up the change, then:
asterisk -rx "sip reload"
asterisk -rx "dialplan reload"
# Option 1: Reload the carrier from ViciDial Admin
# Go to Admin -> Carriers -> DINSTAR_GSM -> click "RELOAD CARRIER" # Option 2: Force a full config rebuild and reload via CLI
ssh root@VICIDIAL_IP # Trigger ViciDial config rebuild
mysql -e "UPDATE servers SET rebuild_conf_files='Y' WHERE server_ip='VICIDIAL_IP';" asterisk # Wait 30-60 seconds for the keepalive process to pick up the change, then:
asterisk -rx "sip reload"
asterisk -rx "dialplan reload"
ssh root@VICIDIAL_IP # Show the Dinstar peer details
asterisk -rx "sip show peer dinstar_gsm" # Quick status check — look for OK (latency) or UNREACHABLE
asterisk -rx "sip show peers" | grep dinstar # If using registration mode, check registration status
asterisk -rx "sip show registry"
ssh root@VICIDIAL_IP # Show the Dinstar peer details
asterisk -rx "sip show peer dinstar_gsm" # Quick status check — look for OK (latency) or UNREACHABLE
asterisk -rx "sip show peers" | grep dinstar # If using registration mode, check registration status
asterisk -rx "sip show registry"
ssh root@VICIDIAL_IP # Show the Dinstar peer details
asterisk -rx "sip show peer dinstar_gsm" # Quick status check — look for OK (latency) or UNREACHABLE
asterisk -rx "sip show peers" | grep dinstar # If using registration mode, check registration status
asterisk -rx "sip show registry"
dinstar_gsm GATEWAY_PUBLIC_IP 5060 OK (45 ms)
dinstar_gsm GATEWAY_PUBLIC_IP 5060 OK (45 ms)
dinstar_gsm GATEWAY_PUBLIC_IP 5060 OK (45 ms)
# From the ViciDial server, originate a test call
asterisk -rx "channel originate SIP/dinstar_gsm/MOBILE_NUMBER application Playback hello-world"
# From the ViciDial server, originate a test call
asterisk -rx "channel originate SIP/dinstar_gsm/MOBILE_NUMBER application Playback hello-world"
# From the ViciDial server, originate a test call
asterisk -rx "channel originate SIP/dinstar_gsm/MOBILE_NUMBER application Playback hello-world"
# Watch SIP signaling for the Dinstar peer
asterisk -rx "sip set debug peer dinstar_gsm" # In another terminal, watch active channels
watch -n 1 'asterisk -rx "core show channels" | grep -i dinstar'
# Watch SIP signaling for the Dinstar peer
asterisk -rx "sip set debug peer dinstar_gsm" # In another terminal, watch active channels
watch -n 1 'asterisk -rx "core show channels" | grep -i dinstar'
# Watch SIP signaling for the Dinstar peer
asterisk -rx "sip set debug peer dinstar_gsm" # In another terminal, watch active channels
watch -n 1 'asterisk -rx "core show channels" | grep -i dinstar'
# Watch for the inbound call
asterisk -rx "sip set debug peer dinstar_gsm" # Check active channels
asterisk -rx "core show channels" | grep -i dinstar
# Watch for the inbound call
asterisk -rx "sip set debug peer dinstar_gsm" # Check active channels
asterisk -rx "core show channels" | grep -i dinstar
# Watch for the inbound call
asterisk -rx "sip set debug peer dinstar_gsm" # Check active channels
asterisk -rx "core show channels" | grep -i dinstar
# Enable RTP debugging to check for audio packet flow
asterisk -rx "rtp set debug on" # After testing, disable it (very verbose)
asterisk -rx "rtp set debug off"
# Enable RTP debugging to check for audio packet flow
asterisk -rx "rtp set debug on" # After testing, disable it (very verbose)
asterisk -rx "rtp set debug off"
# Enable RTP debugging to check for audio packet flow
asterisk -rx "rtp set debug on" # After testing, disable it (very verbose)
asterisk -rx "rtp set debug off"
# Enable SIP debugging for the Dinstar peer only (less noise than global debug)
asterisk -rx "sip set debug peer dinstar_gsm" # Disable SIP debug
asterisk -rx "sip set debug off" # Show full peer configuration and status
asterisk -rx "sip show peer dinstar_gsm" # Quick peer status (one-line summary)
asterisk -rx "sip show peers" | grep dinstar # Show all SIP registrations (for registration mode)
asterisk -rx "sip show registry" # Show active channels (calls in progress)
asterisk -rx "core show channels" # Show channels filtered by Dinstar
asterisk -rx "core show channels" | grep -i dinstar # Enable RTP debugging (very verbose — use briefly)
asterisk -rx "rtp set debug on"
asterisk -rx "rtp set debug off" # Show dialplan for the carrier prefix pattern
asterisk -rx "dialplan show _88X.@vicidial-auto-external" # Reload SIP configuration without restarting Asterisk
asterisk -rx "sip reload" # Reload dialplan without restarting Asterisk
asterisk -rx "dialplan reload"
# Enable SIP debugging for the Dinstar peer only (less noise than global debug)
asterisk -rx "sip set debug peer dinstar_gsm" # Disable SIP debug
asterisk -rx "sip set debug off" # Show full peer configuration and status
asterisk -rx "sip show peer dinstar_gsm" # Quick peer status (one-line summary)
asterisk -rx "sip show peers" | grep dinstar # Show all SIP registrations (for registration mode)
asterisk -rx "sip show registry" # Show active channels (calls in progress)
asterisk -rx "core show channels" # Show channels filtered by Dinstar
asterisk -rx "core show channels" | grep -i dinstar # Enable RTP debugging (very verbose — use briefly)
asterisk -rx "rtp set debug on"
asterisk -rx "rtp set debug off" # Show dialplan for the carrier prefix pattern
asterisk -rx "dialplan show _88X.@vicidial-auto-external" # Reload SIP configuration without restarting Asterisk
asterisk -rx "sip reload" # Reload dialplan without restarting Asterisk
asterisk -rx "dialplan reload"
# Enable SIP debugging for the Dinstar peer only (less noise than global debug)
asterisk -rx "sip set debug peer dinstar_gsm" # Disable SIP debug
asterisk -rx "sip set debug off" # Show full peer configuration and status
asterisk -rx "sip show peer dinstar_gsm" # Quick peer status (one-line summary)
asterisk -rx "sip show peers" | grep dinstar # Show all SIP registrations (for registration mode)
asterisk -rx "sip show registry" # Show active channels (calls in progress)
asterisk -rx "core show channels" # Show channels filtered by Dinstar
asterisk -rx "core show channels" | grep -i dinstar # Enable RTP debugging (very verbose — use briefly)
asterisk -rx "rtp set debug on"
asterisk -rx "rtp set debug off" # Show dialplan for the carrier prefix pattern
asterisk -rx "dialplan show _88X.@vicidial-auto-external" # Reload SIP configuration without restarting Asterisk
asterisk -rx "sip reload" # Reload dialplan without restarting Asterisk
asterisk -rx "dialplan reload"
# Show all SIP messages (INVITE, ACK, BYE, etc.)
deb sip msg all # Stop SIP message debug
deb sip msg off # Show GSM port status (SIM registration, signal strength)
show port status # Show SIP trunk status (connected, heartbeat OK, etc.)
show sip trunk status # Show active calls
show call status # Show routing table
show route
# Show all SIP messages (INVITE, ACK, BYE, etc.)
deb sip msg all # Stop SIP message debug
deb sip msg off # Show GSM port status (SIM registration, signal strength)
show port status # Show SIP trunk status (connected, heartbeat OK, etc.)
show sip trunk status # Show active calls
show call status # Show routing table
show route
# Show all SIP messages (INVITE, ACK, BYE, etc.)
deb sip msg all # Stop SIP message debug
deb sip msg off # Show GSM port status (SIM registration, signal strength)
show port status # Show SIP trunk status (connected, heartbeat OK, etc.)
show sip trunk status # Show active calls
show call status # Show routing table
show route
# Check all fail2ban jails
fail2ban-client status # Check the Asterisk jail specifically
fail2ban-client status asterisk # Look for the gateway's public IP in the banned list
fail2ban-client status asterisk | grep GATEWAY_PUBLIC_IP
# Check all fail2ban jails
fail2ban-client status # Check the Asterisk jail specifically
fail2ban-client status asterisk # Look for the gateway's public IP in the banned list
fail2ban-client status asterisk | grep GATEWAY_PUBLIC_IP
# Check all fail2ban jails
fail2ban-client status # Check the Asterisk jail specifically
fail2ban-client status asterisk # Look for the gateway's public IP in the banned list
fail2ban-client status asterisk | grep GATEWAY_PUBLIC_IP
fail2ban-client set asterisk unbanip GATEWAY_PUBLIC_IP
fail2ban-client set asterisk unbanip GATEWAY_PUBLIC_IP
fail2ban-client set asterisk unbanip GATEWAY_PUBLIC_IP
[asterisk]
ignoreip = 127.0.0.1/8 GATEWAY_PUBLIC_IP
[asterisk]
ignoreip = 127.0.0.1/8 GATEWAY_PUBLIC_IP
[asterisk]
ignoreip = 127.0.0.1/8 GATEWAY_PUBLIC_IP
systemctl restart fail2ban
systemctl restart fail2ban
systemctl restart fail2ban
# Example Prometheus alerting rules
groups: - name: gsm_gateway rules: - alert: DinstarPeerDown expr: asterisk_sip_peer_status{peer="dinstar_gsm"} == 0 for: 5m labels: severity: critical annotations: summary: "Dinstar GSM gateway SIP peer is UNREACHABLE" - alert: DinstarHighLatency expr: asterisk_sip_peer_latency_ms{peer="dinstar_gsm"} > 200 for: 10m labels: severity: warning annotations: summary: "Dinstar GSM gateway SIP latency is high ({{ $value }}ms)"
# Example Prometheus alerting rules
groups: - name: gsm_gateway rules: - alert: DinstarPeerDown expr: asterisk_sip_peer_status{peer="dinstar_gsm"} == 0 for: 5m labels: severity: critical annotations: summary: "Dinstar GSM gateway SIP peer is UNREACHABLE" - alert: DinstarHighLatency expr: asterisk_sip_peer_latency_ms{peer="dinstar_gsm"} > 200 for: 10m labels: severity: warning annotations: summary: "Dinstar GSM gateway SIP latency is high ({{ $value }}ms)"
# Example Prometheus alerting rules
groups: - name: gsm_gateway rules: - alert: DinstarPeerDown expr: asterisk_sip_peer_status{peer="dinstar_gsm"} == 0 for: 5m labels: severity: critical annotations: summary: "Dinstar GSM gateway SIP peer is UNREACHABLE" - alert: DinstarHighLatency expr: asterisk_sip_peer_latency_ms{peer="dinstar_gsm"} > 200 for: 10m labels: severity: warning annotations: summary: "Dinstar GSM gateway SIP latency is high ({{ $value }}ms)" - Why GSM Gateways?
- Hardware Overview: Dinstar UC2000-VE
- Network Architecture and NAT Scenarios
- Prerequisites
- ViciDial Server Configuration Firewall Rules
SIP Peer (Carrier) Configuration
Outbound Dialplan Entry
Inbound DID Routing
Inbound Group Setup
- Firewall Rules
- SIP Peer (Carrier) Configuration
- Outbound Dialplan Entry
- Inbound DID Routing
- Inbound Group Setup
- Dinstar Gateway Configuration SIP Profile (Codecs, DTMF, NAT)
SIP Trunk to ViciDial
Port Group Configuration
Outbound Routing: IP to Tel
Inbound Routing: Tel to IP
Number Manipulation
- SIP Profile (Codecs, DTMF, NAT)
- SIP Trunk to ViciDial
- Port Group Configuration
- Outbound Routing: IP to Tel
- Inbound Routing: Tel to IP
- Number Manipulation
- Applying Configuration and Reloading
- Testing Connectivity Test
Outbound Call Test
Inbound Call Test
Audio Quality Verification
- Connectivity Test
- Outbound Call Test
- Inbound Call Test
- Audio Quality Verification
- Troubleshooting Common Problems and Fixes
Asterisk Debug Commands
Dinstar Debug Commands
fail2ban Considerations
- Common Problems and Fixes
- Asterisk Debug Commands
- Dinstar Debug Commands
- fail2ban Considerations
- Multi-SIM and Scaling
- Production Tips
- Quick Reference Checklist - Firewall Rules
- SIP Peer (Carrier) Configuration
- Outbound Dialplan Entry
- Inbound DID Routing
- Inbound Group Setup - SIP Profile (Codecs, DTMF, NAT)
- SIP Trunk to ViciDial
- Port Group Configuration
- Outbound Routing: IP to Tel
- Inbound Routing: Tel to IP
- Number Manipulation - Connectivity Test
- Outbound Call Test
- Inbound Call Test
- Audio Quality Verification - Common Problems and Fixes
- Asterisk Debug Commands
- Dinstar Debug Commands
- fail2ban Considerations - Port: A physical SIM slot. Port 1 holds SIM 1, Port 2 holds SIM 2, etc.
- Port Group: A logical grouping of one or more ports. You assign a SIP identity (username) to a port group, not to individual ports.
- SIP Trunk: The connection to your ViciDial/Asterisk server. Defined by IP address, port, and optional credentials.
- IP-to-Tel Route: Outbound direction — a call arrives from SIP (ViciDial) and exits through GSM (a SIM card).
- Tel-to-IP Route: Inbound direction — a call arrives from GSM (someone called the SIM number) and is forwarded via SIP to ViciDial. - Mount the gateway in a location with good GSM signal (near a window, or use external antennas with extension cables)
- Insert SIM cards — ensure PIN lock is disabled on each SIM before inserting (put the SIM in a phone first and disable PIN if needed)
- Connect Ethernet to your LAN
- Connect power — the gateway boots in about 60 seconds
- Access the web interface at the gateway's IP address (default: DHCP, or check your router's DHCP leases) - ViciDial prepends 88 to the phone number before dialing (configured per-campaign in the Dial Prefix field)
- Asterisk matches the pattern _88X. (starts with 88, followed by one or more digits)
- ${EXTEN:2} strips the first 2 characters (the 88 prefix), passing only the actual phone number to the Dinstar
- The Dinstar receives the number and places the call through the GSM network - Click Submit Carrier
- Return to the carrier page and click RELOAD CARRIER
- Or restart Asterisk for a clean reload - It introduces the least additional quality loss (only one transcoding step: GSM -> G.711)
- It is universally supported by all SIP devices
- Bandwidth is not a concern for 8 simultaneous calls (8 x 87 kbps with overhead = ~700 kbps) - STUN (Session Traversal Utilities for NAT): The gateway queries a STUN server on the internet to discover its public IP and port mapping. Simple and automatic, but may be unreliable if the NAT is symmetric.
- Static NAT IP: You manually tell the gateway its public IP. More reliable but requires a static IP. If both STUN and Static NAT IP are configured, static takes precedence. - ViciDial may send numbers in international format (+39333... or 39333...) but the local GSM network expects national format (333...)
- Inbound calls from GSM may arrive with national caller IDs, and you want international format in ViciDial - Try the "Apply" or "Save & Apply" button (firmware-dependent)
- Reboot the gateway from: System -> Reboot (or power cycle) - Verify the firewall rule allows the gateway's public IP
- Check that the Dinstar's heartbeat is enabled (sends OPTIONS packets)
- Look for fail2ban bans (see Section 9.4) - Log into ViciDial as an agent
- Click "Manual Dial" or use the dial pad
- Enter: DIAL_PREFIX + COUNTRY_CODE + MOBILE_NUMBER (e.g., 88393331234567)
- The call should ring the mobile phone - Create a test campaign or use an existing one
- Set the Dial Prefix to your chosen prefix (e.g., 88)
- Set the carrier to DINSTAR_GSM
- Load a test lead and let the dialer call it - From any mobile phone, call the SIM card's number (SIM_MOBILE_NUMBER)
- The call should arrive at ViciDial and route to the configured inbound group
- An agent assigned to that inbound group should see the call ringing - The peer is not yet configured on ViciDial (OPTIONS from unknown IP)
- There is a brief period during reload where the peer config is not loaded
- The Dinstar sends credentials that do not match - Insert additional SIMs into empty ports
- Edit the Port Group (Section 6.3) and check the additional port boxes
- Set the Mode to Round-Robin for even distribution
- No changes needed on ViciDial — it sends calls to the same SIP peer, and the Dinstar distributes them - Each gateway gets its own IP, its own ViciDial carrier, and its own dial prefix
- Use ViciDial's carrier load balancing (multiple carriers per campaign) to distribute calls
- Or use Asterisk's Dial() with failover: Dial(SIP/dinstar1/${EXTEN:2}&SIP/dinstar2/${EXTEN:2}) - Use the included external GSM antennas
- Mount antennas near windows facing a cell tower
- Use SMA extension cables to place antennas optimally while keeping the gateway in a rack
- In severe cases, use a directional Yagi antenna aimed at the nearest tower - Anonymous calls: If outbound calls show "Anonymous" or "Private Number," check the Dinstar's caller ID settings and the SIM's CLIR (Calling Line Identification Restriction) status. Some SIMs have CLIR enabled by default — contact the carrier to disable it.
- Custom caller ID: You cannot set an arbitrary caller ID on GSM calls — the mobile network enforces the SIM's own number. This is different from SIP trunks where you can set any caller ID. - Balance monitoring: If using prepaid SIMs, monitor credit regularly. The Dinstar may support USSD commands (e.g., *100#) to check balance — configure under SMS/USSD settings.
- PIN lock: Always disable PIN before inserting. If a SIM locks due to wrong PIN attempts, you will need the PUK code from the carrier.
- Data plans: SIMs in GSM gateways do not need data plans — only voice/SMS. Choose the cheapest voice plan.
- SIM lifespan: SIMs used in gateways with high call volumes may wear out faster than normal. Keep spare SIMs on hand. - Change default credentials on the Dinstar web UI immediately after setup
- Restrict web UI access to management VLANs or VPN — do not expose port 80/443 of the gateway to the internet
- Use registration mode with a strong password if the gateway's public IP is dynamic — this adds SIP-level authentication
- Keep firmware updated — Dinstar periodically releases firmware updates with security fixes and bug fixes - [ ] SIM card(s) active with voice credit/plan
- [ ] SIM PIN lock disabled (test in a phone first)
- [ ] Dinstar powered on, connected to LAN, web UI accessible at GATEWAY_PRIVATE_IP
- [ ] Gateway's public IP identified (GATEWAY_PUBLIC_IP)
- [ ] Network path confirmed: gateway can reach VICIDIAL_IP on UDP 5060 - [ ] Firewall rule added allowing GATEWAY_PUBLIC_IP on UDP 5060
- [ ] Carrier created: DINSTAR_GSM with SIP peer [dinstar_gsm]
- [ ] Carrier account entry configured (IP peer or registration mode)
- [ ] Dialplan entry configured with chosen dial prefix (_88X. pattern)
- [ ] Carrier reloaded (RELOAD CARRIER or sip reload + dialplan reload)
- [ ] DID entry created matching Dinstar's "To VOIP Hotline" value
- [ ] Inbound group created and assigned to DID
- [ ] fail2ban whitelist updated with GATEWAY_PUBLIC_IP - [ ] SIP Profile: codecs set to PCMA first, DTMF to RFC2833, NAT traversal enabled
- [ ] SIP Trunk: points to VICIDIAL_IP:5060, heartbeat enabled
- [ ] Port Group: SIP User ID matches ViciDial peer name, "To VOIP Hotline" matches DID
- [ ] IP-to-Tel route: SIP trunk -> Port group (outbound)
- [ ] Tel-to-IP route: Port group -> SIP trunk (inbound)
- [ ] Number manipulation rules configured (if needed)
- [ ] Port/SIM status shows "Registered" with good signal - [ ] sip show peers | grep dinstar shows OK with latency
- [ ] Outbound test call: ViciDial -> GSM -> mobile phone rings and connects
- [ ] Inbound test call: mobile phone -> SIM number -> ViciDial agent receives call
- [ ] Two-way audio confirmed on both outbound and inbound
- [ ] DTMF works (press digits during test call)
- [ ] Call stays connected for more than 60 seconds (no session timer drops)
- [ ] Caller ID displays correctly in both directions - ViciDial side: Firewall rule, SIP carrier with NAT-aware settings (nat=force_rport,comedia, directmedia=no), dialplan with a unique prefix, DID for inbound, fail2ban whitelist
- Dinstar side: SIP profile (codecs, DTMF, NAT traversal), SIP trunk pointing to ViciDial, port group linking SIMs to the trunk, bidirectional routing rules, and number manipulation