Settings: Difference between revisions

From VoIPmonitor.org
(Add troubleshooting section for custom headers not visible in central GUI in distributed deployments)
(35 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{DISPLAYTITLE:GUI Settings Reference}}
{{DISPLAYTITLE:GUI Settings Reference}}
Category:GUI manual
[[Category:GUI manual]]


This page documents the configuration options available in the VoIPmonitor web GUI under the '''Settings''' menu. These settings control how the GUI interacts with sensors, displays data, and manages user preferences.
This page documents the configuration options available in the VoIPmonitor web GUI under the '''Settings''' menu.


== Sensors ==
= Sensors =


If <code>id_sensor</code> is set in <code>/etc/voipmonitor.conf</code> (default is blank), you must create sensor entries here to enable downloading files like PCAP, graphs, and WAV recordings from the GUI.
Configure sensor connections for multi-sensor deployments. Required when <code>id_sensor</code> is set in <code>/etc/voipmonitor.conf</code>.


{| class="wikitable"
{| class="wikitable"
Line 12: Line 12:
! Field !! Description
! Field !! Description
|-
|-
| Sensor ID || The numeric ID matching <code>id_sensor = N</code> in <code>voipmonitor.conf</code>
| Sensor ID || Numeric ID matching <code>id_sensor</code> in voipmonitor.conf
|-
|-
| Name || A descriptive name for the sensor
| Name || Descriptive name for the sensor
|-
|-
| Manager IP || IP address of the sensor for fetching data (PCAP, graph, audio files)
| Manager IP || IP address (or hostname) for fetching data (PCAP, audio files)
|-
|-
| Manager Port || TCP port for the manager API (default: 5029)
| Manager Port || TCP port for manager API (default: 5029)
|-
|-
| Remote database || Database connection parameters for "Legs by CID/header" lookups when sensors use different databases. Leave blank if all sensors share the same database.
| Remote database || Database connection for "Legs by CID/header" lookups when sensors use different databases
|}
|}


[[File:settings-sensors.png]]
== Multi-Sensor Deployment ==


=== SSL/TLS Configuration ===
<kroki lang="mermaid">
%%{init: {'flowchart': {'nodeSpacing': 15, 'rankSpacing': 40}}}%%
flowchart TB
    subgraph Sensors["Remote Sensors"]
        S1["Sensor A<br/>id_sensor=2"]
        S2["Sensor B<br/>id_sensor=3"]
    end
    subgraph Central["Central Server"]
        GUI["Web GUI"]
        DB[(MySQL)]
    end
    S1 -->|CDR| DB
    S2 -->|CDR| DB
    GUI -->|"Port 5029"| S1
    GUI -->|"Port 5029"| S2
</kroki>


Sensors can be configured to decrypt TLS-encrypted SIP traffic directly through the GUI. This is particularly useful when VoIPmonitor is not capturing all SIP traffic from specific TLS trunks (e.g., seeing only OPTIONS and 403 responses while INVITEs are missing).
'''Setup:'''


To configure SSL/TLS settings for a sensor:
# Set unique <code>id_sensor</code> in each sensor's <code>/etc/voipmonitor.conf</code>
# Add sensor entries in '''Settings > Sensors''' with matching Sensor ID
# Restart sensors: <code>systemctl restart voipmonitor</code>


# Navigate to '''Settings > Sensors'''
{{Tip|For sensors with dynamic IPs, enter a hostname in the Manager IP field, or use [[Sniffer_distributed_architecture|Client-Server mode]].}}
# Click the '''wrench icon''' next to the affected sensor
 
# In the search field at the top right of the sensor settings dialog, enter '''ssl_'''
== Sensor Configuration via Wrench Icon ==
# Configure the required SSL/TLS parameters:
 
Click the '''wrench icon''' next to a sensor to configure parameters. Use the search field to find settings.


{| class="wikitable"
{| class="wikitable"
|-
|-
! Parameter !! Description !! Example Value
! Parameter !! Description !! Values
|-
|-
| ssl_key || Path to the private key file (PEM format) for decrypting TLS traffic || <code>/etc/pki/tls/private/server.key</code>
| <code>ssl</code> || Enable TLS decryption || <code>yes</code> / <code>no</code>
|-
|-
| ssl_cert || Path to the SSL certificate file (PEM format) matching the private key || <code>/etc/pki/tls/certs/server.crt</code>
| <code>ssl_ipport</code> || IP:port and key path for TLS || <code>192.168.1.10:5061 /path/to/key.pem</code>
|-
|-
| ssl_ipport || IP address and TLS port of the SIP endpoint to decrypt (without key file path for SSL Key Logger mode, or <code>IP:port /path/to/key</code> for Private Key mode) || <code>192.168.1.10:5061</code>
| <code>sipport</code> || SIP ports to capture || <code>5060,5080</code> or <code>5060,5070-5080</code>
|-
|-
| ssl || Enable SSL/TLS decryption module on the sensor || <code>yes</code>
| <code>savertp</code> || RTP recording mode || <code>yes</code> (full), <code>no</code> (none), <code>header</code> (stats only)
|}
 
'''Important Notes:'''
 
* The sensor SSL settings correspond to the configuration parameters in [[Tls|/etc/voipmonitor.conf]] but are managed through the GUI interface
* This is an alternative to editing <code>voipmonitor.conf</code> directly - the GUI applies these settings to the sensor
* After changing SSL settings, you may need to '''restart the sniffer service''' or use the '''"reload sniffer"''' button in the GUI control panel
* '''Important Warning for Sensor Configuration Changes:''' When modifying sensor-level settings (especially parameters loaded via <code>mysqlloadconfig</code> such as <code>dtmf2db</code>, <code>dtmf2pcap</code>, or other sensor options), '''perform a manual restart instead of using reload'''. A reload may leave the sniffer in an inconsistent state with some processes holding old configuration values. To safely apply sensor configuration changes:
 
<syntaxhighlight lang="bash">
# Stop the sensor service
systemctl stop voipmonitor
 
# Check for remaining processes (kill if any)
ps ax | grep voipmonitor
 
# Start the sensor service
systemctl start voipmonitor
</syntaxhighlight>
* For decryption of traffic using Perfect Forward Secrecy (PFS) ciphers like Diffie-Hellman (DHE/ECDHE), see [[Tls|the TLS decryption guide]] for the SSL Key Logger method
 
'''When to use GUI SSL configuration:'''
 
* You prefer managing TLS/SSL settings through the web interface instead of editing config files
* You have multiple sensors and want to manage SSL keys centrally
* You need to quickly enable/disable TLS decryption without editing <code>voipmonitor.conf</code>
 
For detailed information on TLS decryption methods and limitations (including PFS ciphers), see [[Tls]].
 
=== Sensor Health Monitoring with RRD Charts ===
 
If you experience poor call quality (low MOS scores, choppy playback) and need to determine whether the issue is network-related or caused by the sniffer host being overloaded, use the RRD (Round Robin Database) charts available in the GUI.
 
**Accessing Sensor RRD Charts:**
 
# Navigate to '''Settings > Sensors'''
# Locate the sensor you want to monitor
# Click the '''chart icon''' next to the sensor entry
# This opens the RRD performance graphs for that sensor
 
**Key Metrics to Check:**
 
{| class="wikitable"
|-
|-
! Metric !! Description !! What It Indicates
| <code>maxpoolrtpsize</code> || Max RTP storage in MB || <code>51200</code>
|-
|-
| Buffer usage || Shows the percentage of available packet buffer being used || Sensor is approaching capacity limits if consistently high
| <code>maxpoolrtpdays</code> || Max RTP age in days || <code>30</code>
|-
| Packet drops || Counts of packets the sensor could not process || Sensor is overloaded and dropping packets due to high traffic load
|}
|}


**Interpreting the Charts:**
{{Warning|1=GUI settings override <code>voipmonitor.conf</code> when <code>mysqlloadconfig</code> is enabled (default). Changes require a full restart (<code>systemctl stop/start</code>), not reload.}}


If you observe:
For TLS decryption with PFS ciphers, see [[Tls|TLS Decryption Guide]].
* '''Buffer usage growing to 100%''' and remaining at maximum capacity
* '''Packet drops being recorded''' (non-zero values on the packet drops graph)


This indicates the sniffer host is overloaded and is the source of audio quality issues. The sensor cannot keep up with incoming packet rate, causing packets to be dropped before they can be processed and stored. This results in:
== RRD Health Charts ==
* Low MOS scores
* Choppy audio playback in the GUI
* Missing call data


**Solutions for Sensor Overload:**
Click the '''chart icon''' next to a sensor to view performance metrics:


* Increase the kernel packet ring buffer size in <code>voipmonitor.conf</code>: <code>ringbuffer = 200</code> (default: 50, recommended: >= 500 for >100 Mbit traffic). This allows the operating system to buffer more packets before they are passed to VoIPmonitor, reducing kernel-level packet drops.
* '''Buffer usage:''' Approaching 100% indicates capacity limits
* Add more sensors to distribute the load ([[Sniffer_distributed_architecture|Distributed Architecture]])
* '''Packet drops:''' Non-zero values indicate sensor overload
* Use specialized capture hardware ([[DPDK|DPDK]], [[Napatech|Native Napatech cards]], [[PF_RING|PF_RING]])
* Reduce capture scope (more restrictive [[Capture_rules|capture rules]])
* Upgrade sensor hardware (faster CPU, more RAM)
* Reduce PCAP file storage or enable compression
 
**When to Check RRD Charts:**
 
Use RRD charts to diagnose sensor overload when:
* Other platforms show clear audio but VoIPmonitor shows poor quality
* Only the sniffer host is affected, not the actual VoIP network
* Performance log shows high packet drops or buffer saturation
 
This diagnostic step helps distinguish between network quality issues (jitter, loss in the actual VoIP path) vs. sniffer capacity issues (capturing host overload).
 
=== Troubleshooting: Non-deletable Local Sensor ===
 
In server/probe deployments where the GUI server is not sniffing traffic itself, a "local sensor" may be automatically created in the sensor list. This sensor cannot be deleted through the normal GUI interface.
 
'''Workaround:'''
# In '''Settings > Sensors''', add a new sensor with the same Sensor ID, name, and settings as the non-deletable local sensor
# After saving, the original automatically created sensor should either disappear or become deletable
# You can then remove the duplicate entry if both sensors appear
 
This occurs because the GUI automatically creates a sensor entry when it detects that <code>id_sensor</code> is set in the configuration but no active capture is configured on the GUI host.
 
=== Removing and Reconnecting Sensors ===
 
When decommissioning or replacing a sensor, or when you need to refresh the sensor configuration after an upgrade, use the following standard workflow.
 
'''Standard Decommissioning Workflow:'''
 
# Navigate to '''Settings > Sensors''' in the GUI
# Click the sensor entry you want to remove
# Click '''Delete''' or '''Remove''' to delete the sensor probe entry
# Log into the command line of the sensor machine (SSH)
# Restart the voipmonitor service on the sensor:
<syntaxhighlight lang="bash">
systemctl stop voipmonitor
systemctl start voipmonitor
</syntaxhighlight>
# Return to '''Settings > Sensors''' in the GUI
# The sensor will automatically reappear in the list after the service restart
# Rename the sensor entry as needed if the IP or configuration has changed
 
'''How It Works:'''
 
When you restart the voipmonitor service on the sensor machine, it automatically re-registers with the GUI if <code>id_sensor</code> is configured in <code>/etc/voipmonitor.conf</code>. The GUI creates a new sensor entry with the current configuration. This workflow ensures that:
* The sensor configuration is refreshed with the latest sensor settings
* Old IP addresses or obsolete sensor entries are cleaned up
* The system automatically discovers the sensor again after restart
 
'''When to Use This Workflow:'''
 
* After an upgrade that caused errors referencing old/decommissioned sensor IP addresses
* When replacing hardware and reusing a new IP address
* When you need to refresh sensor configuration settings
* When CDRs show warnings about unknown sensors
 
'''Note:''' This standard workflow is different from the emergency cleanup procedure described below, which is used only when the GUI crashes due to thousands of obsolete records.
 
=== Troubleshooting: GUI Crashes When Accessing Settings > Sensors ===
 
If the web GUI becomes unresponsive or crashes when accessing '''Settings > Sensors''', this is typically caused by a large number of obsolete sensor records in the <code>sensors</code> database table. The GUI processes all sensor entries from this table to render the page, and if there are thousands of stale records (from old sensors, decommissioned hardware, or duplicate IDs), the PHP process may run out of memory or exceed execution time limits.
 
'''Symptoms:'''
* Settings > Sensors page does not load or times out
* GUI becomes unresponsive when navigating to sensor configuration
* PHP error logs show memory exhaustion or timeout errors
 
'''Solution: Manually Delete Obsolete Records from Database'''
 
Use the MySQL command line to remove obsolete sensor records directly from the database. The standard GUI interface cannot handle the cleanup if the records are already causing the page to crash.
 
<ol>
<li>'''Access the database:'''
<syntaxhighlight lang="bash">
mysql -u voipmonitor -p voipmonitor
</syntaxhighlight></li>
 
<li>'''Identify obsolete records:'''
Inspect the <code>sensors</code> table to find entries that correspond to obsolete sensors. Look for rows with old interface names, missing sensor IDs, or duplicates.
<syntaxhighlight lang="sql">
-- Example: Find entries referencing old or duplicate IDs
SELECT * FROM sensors WHERE id_sensor IN (1,2,3);
--
-- Check total count of sensors
SELECT COUNT(*) FROM sensors;
</syntaxhighlight></li>


<li>'''Delete obsolete records:'''
{{Note|High buffer/drops cause low MOS and choppy audio. Solutions: increase <code>ringbuffer</code> in config, add sensors, use [[DPDK]] or [[Napatech]].}}
Execute <code>DELETE</code> statements for the identified obsolete rows. Be careful with the <code>WHERE</code> clause to ensure you only delete obsolete data.
<syntaxhighlight lang="sql">
-- Delete records by id_sensor (replace with actual values after inspection)
DELETE FROM sensors WHERE id_sensor IN (<id1>, <id2>, <id3>);


-- Delete by specific criteria
== Disabling a Sensor ==
DELETE FROM sensors WHERE host LIKE '%old-sensor-name%';
</syntaxhighlight></li>


<li>'''Verify cleanup:'''
{{Warning|1=The GUI "Disabled" checkbox does NOT stop data collection. The sniffer continues running regardless of GUI status.}}
<syntaxhighlight lang="sql">
-- Check remaining sensor count
SELECT COUNT(*) FROM sensors;
</syntaxhighlight>
Exit the database:
<syntaxhighlight lang="sql">EXIT;</syntaxhighlight></li>


<li>'''Critical: Users must log out and log back in'''
'''To stop data collection:'''
All users currently logged into the GUI must log out and then log back in for the sensor list to be refreshed. Simply reloading the page is not sufficient.</li>
* '''Complete shutdown:''' <code>systemctl stop voipmonitor</code> on the sensor host
</ol>
* '''Selective blocking:''' Create capture rule with '''Skip = ON''' in '''Control Panel > Capture Rules'''


'''Note:''' The <code>sensors</code> table contains GUI sensor configuration entries, distinct from the <code>sensor_config</code> table which is used for sensor-level parameter overrides when the <code>mysqlloadconfig</code> feature is enabled.
== Deleting Sensors ==


=== Troubleshooting: Server Instance Not Appearing in GUI ===
If deletion fails, the sensor likely has capture rules assigned. Remove rules first via '''Control Panel > Capture Rules'''.


After replacing a server/SBC and reusing its IP address, the server instance may disappear from the GUI sensor list, even though it is sending data and appears in CDRs with a warning.
'''Non-deletable local sensor (GUI+DB only servers):'''


=== Problem: Sensor Appears in CDRs With Warning But Not in GUI List ===
On central servers that don't capture traffic, an auto-created "localhost" sensor may appear. To replace it:


When you replace hardware (server, SBC, sensor host) but reuse the same IP address, the GUI may not automatically rediscover the server instance. CDRs from the new device appear in the database, but:
# Set <code>id_sensor = 1</code> in <code>/etc/voipmonitor.conf</code> on the central server
* The server instance is not visible in '''Settings > Sensors'''
# In GUI: Add new sensor with Manager IP <code>127.0.0.1</code>, same Sensor ID, Port <code>5029</code>
* CDR records contain a warning about unknown sensor or manager connection
# Enable "is server in client/server mode" checkbox
* The new server is working but not properly registered with the GUI
# Disable "show active calls from all sensors in active call view" checkbox


=== Solution: Manually Create Server Instance Entry ===
= CDR Charts =


If your deployment uses server instances that connect directly to the MySQL database, follow these steps:
Define predefined charts for the [[Call_Detail_Record_-_CDR#Charts|CDR detail Charts tab]].


'''Step 1: Create the server instance entry in the GUI'''
= CDR Custom Headers =


# Navigate to '''Settings > Sensors'''
Capture and display custom SIP headers in CDR views. Requires sniffer version 7.0RC7+.
# Click '''Add new sensor''' or '''New sensor'''
# Configure the following fields:
** Sensor ID: Enter a unique identifier (e.g., <code>2</code>)
** Name: Descriptive name for the server instance (e.g., <code>SBC-Production</code>)
** Manager IP: IP address of the server instance (the new hardware's IP)
** Manager Port: TCP port for the manager connection (default: <code>5029</code>)


'''Step 2: Configure managerip and managerport on the server instance'''
== Setup Workflow ==


Edit the <code>voipmonitor.conf</code> file on the new server instance to point to the GUI:
<kroki lang="mermaid">
%%{init: {'flowchart': {'nodeSpacing': 10, 'rankSpacing': 30}}}%%
flowchart LR
    A[voipmonitor.conf<br/>custom_headers] --> B[Restart Sensor]
    B --> C[DB Column Created]
    C --> D[Settings > CDR<br/>Custom Headers]
    D --> E[CDR List View]
</kroki>


# Add header to <code>/etc/voipmonitor.conf</code>:
<syntaxhighlight lang="ini">
<syntaxhighlight lang="ini">
# On the new server instance (/etc/voipmonitor.conf)
custom_headers = X-Cisco-Org-ID
managerip  = gui.server.ip    # GUI server IP address
managerport = 5029            # Manager API port (matches GUI Manager Port)
</syntaxhighlight>
</syntaxhighlight>
# Restart sensor: <code>systemctl restart voipmonitor</code>
# Generate a test call
# Configure in '''Settings > CDR Custom Headers''': select header, set Name, enable "Show as Column"


Restart the voipmonitor service after making changes:
== Configuration Fields ==
 
<syntaxhighlight lang="bash">systemctl restart voipmonitor</syntaxhighlight>
 
'''Step 3: Verify network connectivity'''
 
Ensure bidirectional network connectivity:
 
* '''GUI host → Server instance:''' GUI must be able to reach the server instance on the configured Manager IP/Port (for data retrieval and control)
* '''Server instance → MySQL database:''' Server instance must be able to write CDRs to the MySQL database
 
Test connectivity from both directions:
 
<syntaxhighlight lang="bash">
# From GUI host to server instance (verify Manager IP/Port)
nc -zv server.instance.ip 5029
 
# From server instance to MySQL database
mysql -h mysql.server.ip -u voipmonitor -p voipmonitor -e "SELECT 1"
</syntaxhighlight>
 
Check firewall rules on both systems to ensure:
* TCP/5029 (Manager port) is allowed from GUI to server instance
* MySQL port (usually 3306) is allowed from server instance to database
 
'''Step 4: Verify server instance status'''
 
After configuration, the server instance should appear in '''Settings > Sensors''' with a green status indicating it is connected. Any probes or sniffing interfaces connected to that server instance will be automatically discovered and listed under the server instance in the sensor tree.
 
=== Alternative: Using Modern Client-Server Mode ===
 
If you are planning a new deployment or can reconfigure your architecture, consider using the modern [[Sniffer_distributed_architecture|Client-Server mode]] which provides:
 
* Encrypted TCP connections between sensors and central server
* Automatic sensor registration (no manual GUI entry required)
* Simplified firewall configuration (single port: 60024 by default)
 
In Client-Server mode, sensors connect to a central server using <code>server_destination</code> and <code>server_destination_port</code>, and the central server handles SQL database writes. Sensors do not need direct MySQL database access.
 
== CDR Charts ==
 
This section allows you to define predefined charts that appear in the [[Call_Detail_Record_-_CDR#Charts|CDR detail view's Charts tab]]. These charts provide quick visual analysis for specific call records based on caller/called information.
 
[[File:settings-cdrcharts.png]]
 
== CDR Custom Headers ==
 
Since sniffer version 7.0RC7, VoIPmonitor can store custom SIP headers in the database for viewing and searching in the GUI. For the sniffer configuration, see [[Sniffer_configuration#custom_headers]].
 
[[File:customheaderform.png]]
 
=== Configuration Fields ===
 
;Header Field
:Combo box listing available headers from the <code>cdr_next.custom_header*</code> database columns. These are automatically created when you add headers to <code>custom_headers</code> in <code>voipmonitor.conf</code> and restart the sniffer.
 
;Name
:The display name for this header in the CDR view header panel.
 
;Match in SIP by Header
:When enabled, this header is used for matching CDRs in the [[Call_Detail_Record_-_CDR#Legs_by_header|Legs by header]] tab. This is useful when you have a unique correlation identifier that links multiple call legs (e.g., from phone to SBC, and from SBC to provider). Alternative method: [[Sniffer_configuration#matchheader|matchheader]] in voipmonitor.conf.
 
;Show as Column
:When enabled, displays this header as a column in the CDR list view.
 
;Restrict to Regex pattern
:Optional regular expression pattern to filter which header values are stored in the database. Only headers matching this regex pattern will be captured. For example: <code>^[0-9]+$</code> to capture only numeric values.
 
=== Apply Configuration Changes ===
 
'''Important: Restart Required'''
 
After configuring or modifying custom header settings in the GUI, you must '''restart the sensor service''' for the changes to take effect. The restart applies the new configuration so that the sensor begins capturing and storing custom SIP headers as specified.
 
To restart the sensor:
<syntaxhighlight lang="bash">
# Using systemd
systemctl restart voipmonitor
 
# Using init scripts
/etc/init.d/voipmonitor restart
</syntaxhighlight>
 
After restarting, generate new test calls to verify that the custom header is being captured and stored correctly in the database.
 
[[File:customheaderscdrpanel.png]]
 
=== Filtering Custom Headers ===
 
After configuring custom headers in the GUI, they appear in the CDR filter form where you can search for them using special values:
 
*'''Find all CDRs with this header present:''' Use the <code>%</code> wildcard as the filter value. This matches any non-empty value.
*'''Find all CDRs without this header:''' Type <code>NULL</code> (or leave empty) as the filter value to find calls where this header was not present.
*'''Specific value search:''' Enter the exact header value (or use <code>%</code> as a wildcard for partial matches, e.g., <code>sip:%</code> to find SIP URIs).
 
These filters appear in the CDR filter form after you have processed at least one call containing the custom header.
 
=== Troubleshooting: Header Capture Issues ===
 
If custom SIP headers are not being captured at all or are showing truncated content in the database, check the sniffer configuration parameters in <code>voipmonitor.conf</code>:


{| class="wikitable"
{| class="wikitable"
|-
|-
! Problem !! Cause !! Solution
! Field !! Description
|-
| Header Field || SIP header to capture (from dropdown after restart)
|-
| Name || Display label in GUI
|-
|-
| '''Complete header not captured''' || SIP packets are truncated before the custom header content is fully captured | In <code>voipmonitor.conf</code>, increase the <code>snaplen</code> parameter to capture larger packets: <code>snaplen = 3200</code> (or higher for long headers). The default may be too low for extended SIP headers used in STIR/SHAKEN (e.g., <code>P-Asserted-Identity</code> with <code>verstat</code> parameters).
| Match in SIP by Header || Enable for [[Call_Detail_Record_-_CDR#Legs_by_header|Legs by header]] correlation
|-
|-
| '''Header content truncated''' || Custom header value exceeds the maximum allowed size | In <code>voipmonitor.conf</code>, increase the <code>custom_headers_max_size</code> parameter (default: 1024 bytes): <code>custom_headers_max_size = 2048</code>. Headers longer than this value will be truncated during capture.
| Show as Column || Display in CDR list view
|}
|-
 
| Restrict to Regex pattern || Filter which values to capture
For complete parameter documentation, see [[Sniffer_configuration#custom_headers]] and [[Sniffer_configuration#snaplen]].
 
=== Limitations ===
 
The GUI custom header feature has the following limitations:
 
{| class="wikitable"
|-
|-
! Limitation !! Description
| Boundary start/end || Extract substring between delimiters
|-
|-
| '''No Regexp extraction''' || Custom headers store the '''complete raw header value'''. While you can use the "Restrict to Regex pattern" field to filter which headers to capture, you cannot extract partial values such as just an IP address from a SIP URI (e.g., extracting <code>192.168.1.1</code> from <code>sip:192.168.1.1</code>).
| Regexp || Extract using regex with capture groups <code>(...)</code>
|-
|-
| '''No Delimiter aggregation''' || If a SIP header appears multiple times in a message (e.g., multiple Contact headers in a SIP 300 response), only one value is stored. Controlled by <code>custom_headers_last_value</code> in voipmonitor.conf (first or last occurrence).
| Select occurrence || <code>First found value</code>, <code>Last found value</code>, or <code>Nth occurrence</code>
|-
|-
| '''No per-method filtering''' || Custom headers are captured from all SIP messages. There is no option to capture only from specific SIP methods (INVITE, BYE, etc.) or response codes (200, 300, etc.).
| Nth occurrence || '''(New in 2026.01)''' When "Nth occurrence" is selected, specify which occurrence number to extract (e.g., <code>2</code> for second occurrence). Uses packet timestamps for accurate ordering even when packet reordering is disabled.
|}
|}


For advanced header extraction needs, contact VoIPmonitor support to discuss custom development or alternative approaches such as external PCAP processing.
== Extracting Substrings ==


=== Distributed Architecture: Headers Not Visible in Central GUI ===
'''Boundary method (recommended):''' Extract between delimiters.


If your deployment uses multiple sensors connected to a central GUI, and custom SIP headers are not appearing for calls from a specific sensor despite being configured and present in the traffic, the issue is typically that the sensor is not sending CDRs to the central database.
Example: From <code>sip:1000@192.168.1.1;tag=123</code>, extract IP:
* Boundary start: <code>@</code>
* Boundary end: <code>;</code>
* Result: <code>192.168.1.1</code>


'''Core Issue: Sensor Not Connected to Central Server'''
'''Regexp method:''' Use capture groups for complex patterns.


The sensor may be capturing custom headers locally but not transmitting them to the central GUI database because:
<syntaxhighlight lang="text">
* The <code>server_destination</code> configuration is incorrect or missing on the sensor
# Extract version from: User-Agent: Asterisk/20.6.0
* The <code>server_destination_port</code> does not match the central server's <code>server_bind_port</code>
Regexp: Asterisk/([0-9.]+)
* The <code>server_password</code> is incorrect
Result: 20.6.0
* The sensor entry in the GUI has conflicting configuration
 
'''Solution Workflow:'''
 
;1. Verify sensor configuration:
On the affected sensor, check <code>/etc/voipmonitor.conf</code>:
<syntaxhighlight lang="ini">
# /etc/voipmonitor.conf on the SENSOR
id_sensor              = 2
server_destination      = central.server.ip
server_destination_port = 60024  # Must match server_bind_port on central server
server_password        = your_strong_password
 
# For Local Processing mode (recommended)
packetbuffer_sender    = no
</syntaxhighlight>
</syntaxhighlight>


Use a working sensor's configuration as a reference if available.
{{Warning|1=Regexp MUST include parentheses <code>(...)</code> to define what to capture. Without them, the entire match is stored.}}


;2. Delete and re-register the sensor in GUI:
== Filtering by SIP Method and Response Code ==
Sometimes stale sensor entries in the GUI database can cause connection issues.
# Navigate to '''Settings > Sensors'''
# Click the entry for the problematic sensor
# Click '''Delete''' to remove it
# Restart the sensor service:
<syntaxhighlight lang="bash">
systemctl restart voipmonitor
</syntaxhighlight>
# The sensor will automatically re-register with the GUI


;3. Verify connection:
You can filter custom header extraction to specific SIP methods (e.g., INVITE) or SIP response codes (e.g., 300, 404).
After restarting, check that the sensor appears in '''Settings > Sensors''' with a connected status. Generate a test call and verify the custom headers appear in the CDR list.


'''Key Point:''' The <code>server_destination</code>, <code>server_destination_port</code>, and <code>server_password</code> settings control the encrypted TCP connection from the sensor to the central server. Without this connection, CDRs (including custom headers) cannot be transmitted to the central database.
{| class="wikitable"
|-
! Field !! Description !! Example Usage
|-
| CSeq method || Filter by SIP request method || <code>INVITE</code> to capture only from INVITE requests
|-
| response code || Filter by SIP response code number || <code>300</code> to capture only from 300 redirect responses
|}


For complete distributed architecture documentation, see [[Sniffer_distributed_architecture|Distributed Architecture: Client-Server Mode]].
=== Example: Extract Contact IP from 300 Redirect Responses ===


=== Troubleshooting ===
To filter CDRs for calls involving SIP 300 redirect responses and identify the redirect destination IP:


If custom SIP header data is correctly stored in the database and available for filtering but not displayed in the CDR list, follow these diagnostic steps:
# Navigate to '''Settings > Custom headers > CDR''' in the GUI
# Click '''Add new'''
# Set '''Header field''' to <code>Contact</code>
# Set '''Name''' to descriptive label (e.g., <code>SIP300RedirectDestinations</code>)
# Set '''Regexp''' to <code>sip:.*@([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+);</code> to extract the IP address
# Set '''CSeq method''' to <code>INVITE</code>
# Set '''response code''' to <code>300</code>
# Save the configuration


'''Verify the sniffer has loaded the custom header configuration:'''
Use the new custom header and '''Last SIP response code''' as filters in the CDR list to identify calls with 300 redirects and their destinations.


Use the manager API to confirm that the custom headers are loaded into the sniffer's memory:
{{Tip|The CSeq method and response code fields allow you to capture headers from specific SIP messages rather than all headers in the call.}}


<syntaxhighlight lang="bash">
== Database Index for Custom Headers ==
# Create a temporary path for the manager socket
echo 'manager_file start /tmp/vmsck' | nc <manager_ip> <manager_port>


# Check loaded CDR custom headers
Custom header columns are not indexed by default. For frequent queries:
echo 'custom_headers_dump cdr' | nc -U /tmp/vmsck
 
# Cleanup
rm -f /tmp/vmsck
</syntaxhighlight>
 
Replace <code>&lt;manager_ip&gt;</code> and <code>&lt;manager_port&gt;</code> with your sensor's manager connection settings (configured in [[Settings#Sensors|Settings > Sensors]] or in <code>voipmonitor.conf</code> with <code>managerip</code> and <code>managerport</code>). The default manager port is <code>5029</code>.
 
If no headers are listed, verify that:
* You have added the header names to the <code>custom_headers</code> directive in <code>voipmonitor.conf</code>
* You have restarted the voipmonitor service after adding headers
* The <code>cdr_custom_headers</code> table contains the expected entries
 
'''Verify the data is present in the database:'''
 
Check that the custom header data is actually being captured and stored:


<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
-- Step 1: Find the dynamic table and column for your custom header
-- Find table/column location
SELECT dynamic_table, dynamic_column
SELECT dynamic_table, dynamic_column FROM cdr_custom_headers
FROM cdr_custom_headers
WHERE header_field = 'X-Custom-Header';
WHERE header_field = '<your_header_name>'\G
 
-- Step 2: Query the actual CDR data to confirm values are stored
SELECT cdr_ID, calldate, custom_header_<column_number>
FROM cdr_next_<table_number>
WHERE custom_header_<column_number> IS NOT NULL
ORDER BY cdr_ID DESC
LIMIT 1\G
</syntaxhighlight>
 
Replace <code>&lt;your_header_name&gt;</code>, <code>&lt;table_number&gt;</code>, and <code>&lt;column_number&gt;</code> with the values returned by the first query.
 
'''Check for manual changes to the database:'''
 
{{Warning|
'''Do NOT manually modify''' the <code>cdr_custom_headers</code> table outside of the GUI. Manual changes (inserting, updating, or deleting records directly in the database) can cause synchronization issues between the GUI, the sniffer, and the actual data storage. Always use the GUI Settings > CDR Custom Headers interface to manage custom header definitions.
}}
 
If you suspect manual changes were made, compare the entries in <code>cdr_custom_headers</code> with the headers listed in the manager API output and the columns present in the <code>cdr_next_*</code> tables.
 
'''Check for GUI rendering issues:'''


If the header data exists in the database but does not display in the CDR list, enable GUI debug mode to check for JavaScript errors:
-- Create index (use values from above query)
 
CREATE INDEX idx_custom_header_3 ON cdr_next_2 (custom_header_3);
<syntaxhighlight lang="text">
Append ?debug=31415 to any GUI URL (e.g., https://your-gui.com/cdr/?debug=31415)
</syntaxhighlight>
</syntaxhighlight>


Then open your browser's Developer Console (F12) and look for JavaScript errors that might indicate a rendering problem. Common issues include:
== Troubleshooting Custom Headers ==
* Browser cache issues (try clearing cache or using incognito mode)
* JavaScript conflicts from browser extensions
* GUI service not restarted after configuration changes
 
'''Summary: Troubleshooting Checklist'''
* [ ] Header appears in <code>custom_headers_dump cdr</code> manager API output
* [ ] <code>cdr_custom_headers</code> table has correct mapping
* [ ] Data exists in the appropriate <code>cdr_next_*</code> table
* [ ] No manual modifications to <code>cdr_custom_headers</code> were made
* [ ] "Show as Column" checkbox is enabled in Settings > CDR Custom Headers
* [ ] Voipmonitor service has been restarted after configuration changes
* [ ] No JavaScript errors in browser console (enable debug mode with <code>?debug=31415</code>)
 
== Load GeoIP Data ==
 
Loads GeoIP data into the internal database for the [[Call_Detail_Record_-_CDR#Map|CDR detail Map tab]], which displays geographic locations of call participants.
 
[[File:settiongs-loadgeoip.png]]
 
== System Configuration ==
 
The System Configuration section contains core settings that affect the overall behavior of the GUI.
 
=== Basic ===
 
[[File:settings-sysbasic.png]]


{| class="wikitable"
{| class="wikitable"
|-
|-
! Setting !! Description
! Problem !! Solution
|-
| WEB URL || Base URL for the GUI, used in hypertext links (e.g., in email alerts)
|-
|-
| Sniffer data path || Directory where sniffer stores data (default: <code>/var/spool/voipmonitor</code>)
| Header not captured || Increase <code>snaplen</code> in voipmonitor.conf (default may be too low)
|-
|-
| Default sensor hostname || Default hostname for connecting to the sniffer (default: localhost). For multiple sensors, configure them in Settings > Sensors
| Header truncated || Increase <code>custom_headers_max_size</code> (default: 1024 bytes)
|-
|-
| Default sensor TCP port || Default TCP port for the manager API (default: 5029)
| Not visible in distributed setup || Check <code>server_destination</code> and <code>server_password</code> on sensor
|}
|}


=== Database ===
Verify loaded headers: <code>echo 'custom_headers_dump cdr' | nc localhost 5029</code>
 
Configuration for the MySQL/MariaDB database connection used by the GUI.


[[File:settings-sysdb.png]]
= Load GeoIP Data =


=== National ===
Loads GeoIP data for the [[Call_Detail_Record_-_CDR#Map|CDR Map tab]]. See [[Order_of_GeoIP_processing]] for processing priority.


Settings for localizing call classification and date/time display formats.
= System Configuration =


[[File:settings-sysnational.png]]
== Basic ==


{| class="wikitable"
{| class="wikitable"
Line 556: Line 246:
! Setting !! Description
! Setting !! Description
|-
|-
| Timezone || Server timezone for the GUI host (format: Country/City, e.g., Europe/Prague). This setting is used for scheduling reports and alerts generated by the GUI. It does NOT affect CDR data timestamps.
| WEB URL || Base URL for hyperlinks in emails
|-
| Sensors Timezone || Timezone for sensors sending CDR data to this database (format: Country/City, e.g., Europe/London). This setting controls how CDR timestamps are displayed in the GUI. Set this to match the timezone where your sensors are operating. All sensors sending data to this database should use the same timezone. This is the primary setting for correcting CDR timezone display issues.
|-
|-
| National prefix, 2, 3 || Prefixes used to classify calls as national vs. international (used in [[Active_calls|Active calls]] view)
| Sniffer data path || PCAP storage directory (default: <code>/var/spool/voipmonitor</code>)
|-
|-
| Max national number length || Numbers longer than this are classified as international regardless of prefix
| Sniffer second datapath || Secondary spool directory (<code>spooldir_2</code>)
|-
|-
| Date format || PHP date format string (default: <code>Y-m-d</code>). See [https://www.php.net/manual/en/datetime.format.php PHP DateTime format]
| Default sensor hostname || Default hostname for sniffer connection
|-
|-
| Time format || PHP time format string (default: <code>G:i:s</code>). See [https://www.php.net/manual/en/datetime.format.php PHP DateTime format]
| Default sensor TCP port || Default manager API port (5029)
|-
| Week start || First day of the week for calendar displays
|}
|}


{{InfoBox|
{{Warning|1=If sensors connect to wrong destination after upgrade, disable '''Default sensor hostname''' and '''Default sensor TCP port''' in this section. When enabled, sensors ignore individual Manager IP/Port settings.}}
'''CDR Timezone Troubleshooting:'''


If CDR times are displaying in UTC instead of local timezone (e.g., showing in UTC instead of BST):
== Database ==


* The fix is to set '''Sensors Timezone''' (NOT the regular '''Timezone''' setting) to the correct timezone for your sensors
MySQL/MariaDB connection settings.
* Ensure all sensors sending data to this database are configured to use the same timezone
* If a sensor's OS timezone differs from the Sensors Timezone setting, you can override it by editing <code>/etc/voipmonitor.conf</code> on the sensor and using the <code>timezone</code> or <code>utc</code> options
* The regular '''Timezone''' setting is for the GUI host itself (report scheduling, alerts), not for CDR data display
}}


=== Intervals ===
'''Custom port:''' Enter host with port in MySQL hostname field: <code>127.0.0.1:33306</code>


Default time intervals for various GUI views and filters.
Also configure <code>mysqlport</code> in <code>/etc/voipmonitor.conf</code>. See [[Database_troubleshooting]] for details.


[[File:settings-sysintervals.png]]
== National ==


{| class="wikitable"
{| class="wikitable"
Line 592: Line 273:
! Setting !! Description
! Setting !! Description
|-
|-
| Default CDR interval || Default time filter when entering the CDR section. If set to "specified number of days", configure in the next option
| Timezone || GUI host timezone (for reports/alerts scheduling)
|-
|-
| Default CDR interval in days || Number of days for the CDR filter (only editable if above is set to "specified number of days")
| '''Sensors Timezone''' || '''CDR display timezone''' - set this to fix UTC display issues
|-
|-
| Default dashboard interval || Default time filter when entering the dashboard
| National prefix || Prefixes for national call classification
|-
|-
| Default Legs by CID interval || Time window (+/-) for finding related calls in the Legs by CID tab (default: 5 seconds)
| International prefix || International dialing prefix (e.g., <code>00</code>, <code>011</code>)
|-
|-
| Default Legs by header interval || Time window (+/-) for finding related calls in the Legs by header tab (default: 5 seconds)
| Local number || Country name for number normalization
|}
|}


=== Email / HTTP Referer ===
{{Tip|1=If CDRs display in UTC instead of local time, set '''Sensors Timezone''' (not regular Timezone) to your sensors' timezone.}}
 
== Intervals ==


Email configuration settings.
Default time filters for CDR view, dashboard, and Legs correlation.


[[File:settings-sysemailhttpreferer.png]]
== Email / HTTP Referer ==


{| class="wikitable"
{| class="wikitable"
Line 615: Line 298:
| DEFAULT_EMAIL_FROM || Default "From" address for outgoing emails
| DEFAULT_EMAIL_FROM || Default "From" address for outgoing emails
|-
|-
| Disable email plain text || Enable to force HTML-only emails. Useful for mail clients that display only plain text incorrectly (e.g., older Outlook versions)
| Disable email plain text || Force HTML-only emails
|}
|}


=== License ===


License and notification email configuration.


[[File:settings-syslicense.png]]
=== Troubleshooting Email Delivery ===


{| class="wikitable"
If users report not receiving verification emails or new user setup emails, verify the email sending status:
|-
! Setting !! Description
|-
| License email || Email address for receiving license issue and overage notification emails
|}


To configure the license expiry notification for multiple recipients, enter all email addresses separated by a comma (e.g., <code>user1@example.com,user2@example.com</code>).
<b>For Exim mail servers:</b>
<syntaxhighlight lang="bash"># Check Exim mail log for delivery attempts
grep "recipient@example.com" /var/log/exim/main.log


'''Disabling License Notification Emails:'''
# Or search by timestamp
grep "2025-01-09 14:30:" /var/log/exim/main.log
</syntaxhighlight>


To stop receiving license issue and overage notification emails:
Look for the response code in the log entry:
# Navigate to '''Settings > License'''
* <code>250 message accepted</code> - Email was successfully delivered to remote server. The issue is on the recipient side (spam folder, quarantine, mail filtering).
# Remove the email address from the "License email" field
* No <code>250</code> code - Email delivery failed at the server level. Check mail queue and server MTA configuration.
# Save the changes


'''Note:''' This only disables license-related notification emails. Other automated emails (QoS alerts, daily reports, sensor health alerts) will continue to function.
<b>If logs confirm successful delivery:</b> Inform the client that the email left the server successfully and advise them to check their Spam, Bulk, or Junk folders, or consult their internal IT team regarding mail filtering policies.


=== GeoIP ===
<b>General MTA verification:</b>
<syntaxhighlight lang="bash"># Check if mail agent is running
systemctl status postfix    # or exim4, sendmail


Configuration for GeoIP services used in the CDR Map view.
# Test email from command line
echo "Test message" | mail -s "VoIPmonitor Test" your@email.com


[[File:settings-sysgeoip.png]]
# Check mail queue
mailq
 
# View general mail logs
tail -f /var/log/mail.log    # Debian/Ubuntu
tail -f /var/log/maillog      # RHEL/CentOS
</syntaxhighlight>
== License ==


{| class="wikitable"
{| class="wikitable"
Line 652: Line 341:
! Setting !! Description
! Setting !! Description
|-
|-
| Use GeoIP local database || Enable/disable the internal GeoIP database (if loaded via [[#Load_GeoIP_Data|Load GeoIP Data]])
| License token || Short token for retrieving license from portal
|-
|-
| GeoIP maxmind.com KEY || API key for MaxMind GeoIP service
| License key || Full license key content (multi-line)
|-
|-
| GeoIP ipinfodb.com KEY || API key for IPInfoDB service
| License email || Email for license notifications (leave empty to disable)
|}
|}


=== Advanced ===
'''Update license after payment:''' Click '''get/update license key''' button.
 
'''Manual activation:''' Copy full license key from portal (Services > My services) and paste into License key field.
 
'''Disable notification emails:''' Remove email from "License email" field.


Advanced configuration options for power users and specific use cases.
== GeoIP ==


[[File:settings-sysadvanced.png]]
Configure API keys for MaxMind or IPInfoDB services.
 
== Advanced ==


{| class="wikitable"
{| class="wikitable"
Line 669: Line 364:
! Setting !! Description
! Setting !! Description
|-
|-
| Enable CDR group panel || Show/hide the group panel at the bottom of the CDR view
| ENABLE_CSRF_CHECK || Enable CSRF protection (recommended for production)
|-
|-
| ENABLE_CDR_FORCE_INDEX_CALLDATE || Force use of the calldate index on CDR queries. Enable only for unoptimized MySQL installations experiencing slow queries
| Pcap deduplication before download || Remove duplicate packets from PCAP downloads
|-
|-
| Enable database IP reverse lookup || Resolve IP addresses to names using the internal IP lookup table
| Http proxy (for upgrades) || Proxy for GUI/sniffer upgrades: <code>http://proxy:port</code>
|-
|-
| Enable DNS reverse lookup || Resolve IP addresses to names using DNS
| Enable GUI to run in iframe || Allow embedding in iframes (disabled by default for security)
|-
|-
| Enable database number lookup || Resolve phone numbers to names using the internal prefix lookup table
| CDR share key || Secret for CDR share URLs
|-
| Disable rtpfirstleg param || Disable the <code>--rtp-firstleg</code> parameter for PCAP audio decoding. Enable only if experiencing audio issues
|-
| Disable URL wav protection || Skip session authentication for WAV file downloads. Use with '''WAV download key''' for secure external access
|-
| WAV download key || Secret key required for WAV downloads when URL protection is disabled
|-
| Hide SIP domain in CDR || Hide SIP domains in the CDR display
|-
| Hide live play || Hide live playback buttons in [[Active_calls|Active calls]]
|-
| Hide WAV play || Hide WAV playback buttons in CDR view
|-
| Upload sniffer conf path || Path to voipmonitor.conf for PCAP upload functionality
|-
| CDR share key || Secret string used to generate unique hashes for CDR share URLs
|-
| Folder for export CSV || Directory where CSV files from [[Reports#CSV_Export_via_Crontab_Scheduler|crontab scheduler tasks]] are saved
|-
| CSV name prefix || Optional prefix for CSV filenames generated by crontab tasks
|-
| Delete CSV after X days || Auto-delete CSV files older than specified days
|-
| Pcap deduplication before download || Enable to remove duplicate and retransmitted SIP/RTP packets when downloading PCAP files from the GUI. This may cause a mismatch between the packet count shown in the GUI SIP History and the packet count in the downloaded PCAP file. Disable to ensure the downloaded PCAP contains all captured packets including duplicates
|-
| Http proxy (for upgrades) || Proxy server address and port for automatic GUI and sniffer upgrades via the web interface. Required when the VoIPmonitor server is behind a corporate firewall or proxy and cannot connect directly to download.voipmonitor.org or github.com. Format: <code>http://proxy-server-ip:port</code> or <code>http://username:password@proxy-server-ip:port</code> for authenticated proxies
|-
| Enable GUI to run in iframe || Allow the GUI to be loaded in an <code>iframe</code> (embed the VoIPmonitor interface in other web applications). Set to <code>true</code> to enable. This is required when hosting the GUI in subfolders (e.g., <code>/ucloud</code>, <code>/unite</code>) within an iframe. By default, the GUI sends security headers that prevent iframe embedding for clickjacking protection
|}
|}


=== Troubleshooting: GUI Upgrades Behind Proxy Servers ===
'''Firewall requirements:''' Allow outbound HTTPS to:
* <code>voipmonitor.org</code> - License updates
* <code>download.voipmonitor.org</code> - Software upgrades
* <code>share.voipmonitor.org</code> - CDR sharing
* <code>reports.voipmonitor.org</code> - Debug reports


If the GUI or sensor upgrade process fails due to network restrictions or firewall blocking direct internet access:
= Localization =


'''Solution 1: Configure HTTP Proxy in GUI (Recommended)'''
Create GUI translations. Red numbers indicate untranslated items. Changes apply after logout/login.
# Navigate to '''Settings > System Configuration > Advanced'''
# Find the '''Http proxy (for upgrades)''' field
# Enter your proxy server address: <code>http://proxy-server-ip:port</code>
# If authentication is required, include credentials: <code>http://username:password@proxy-server-ip:port</code>
# Save the settings
# Retry the GUI upgrade (Settings > System > Upgrade) or sensor upgrade (Settings > Sensors)


'''Solution 2: Proxy for Remote Sensors (curlproxy)'''
= CDR View Custom URL =
For remote sensors that need to download packages independently, configure the <code>curlproxy</code> parameter directly on the sensor:
# SSH into the remote sensor server
# Edit the sensor configuration: <code>sudo nano /etc/voipmonitor.conf</code>
# Add or modify the <code>curlproxy</code> line in the <code>[general]</code> section:
<syntaxhighlight lang="ini">
[general]
curlproxy = http://proxy-server-ip:port
</syntaxhighlight>
# Restart the sensor service: <code>sudo systemctl restart voipmonitor</code>
# Retry the upgrade from the GUI (Settings > Sensors)


'''References:'''
Add custom hyperlinks to CDR Commands column. Use <nowiki>{{paramName}}</nowiki> in URL to include CDR values.
* [[FAQ#How_do_I_troubleshoot_internet_connectivity_issues|FAQ: Troubleshooting Internet Connectivity]]
* [[GUI_Installation|GUI Installation Guide]]


=== Troubleshooting: GUI in iframe Not Loading Properly ===
= Troubleshooting =


If the VoIPmonitor GUI is embedded in an <code>iframe</code> (e.g., from another web application) and fails to load or shows 301 redirect errors:
== Sensors Connect to Wrong Destination After Upgrade ==


'''Symptoms:'''
'''Cause:''' Default sensor hostname/port settings override individual sensor configurations.
* Iframe displays error messages or blank content
* 301 redirect when accessing subfolder URLs (e.g., <code>/ucloud</code>, <code>/unite</code>)
* Browser console shows refused to load in iframe errors


'''Solution: Enable iframe Support in System Configuration'''
'''Fix:''' Disable '''Default sensor hostname''' and '''Default sensor TCP port''' in Settings > System Configuration > Basic.


The GUI sends security headers (such as <code>X-Frame-Options</code>) by default to prevent clickjacking attacks. To allow the GUI to run in an iframe:
== GUI Crashes on Settings > Sensors Page ==


# Navigate to '''Settings > System Configuration > Advanced'''
'''Cause:''' Too many obsolete sensor records in database.
# Find the '''Enable GUI to run in iframe''' setting
# Set it to <code>true</code>
# Save the settings
# Re-test the iframe functionality


Apply this setting to all relevant GUI installations/folders if you have multiple instances (e.g., <code>/ucloud</code> and <code>/unite</code>).
'''Fix:''' Delete obsolete records directly:
 
<syntaxhighlight lang="sql">
'''Additional Notes:'''
-- Check count
* This is a GUI-level setting for security header configuration, not a web server configuration
SELECT COUNT(*) FROM sensors;
* After enabling, the browser should be able to load the GUI content within the iframe
-- Delete obsolete entries (adjust WHERE clause)
* For security reasons, only enable this if you trust the parent application hosting the iframe
DELETE FROM sensors WHERE host LIKE '%old-sensor%';
 
</syntaxhighlight>
== Localization ==
All users must log out and back in after cleanup.
 
Create custom translations for the GUI interface. Localizations are not 100% complete; please report missing translation items.
 
[[File:settings-localisationform.png]]
 
[[File:settings-localisationgrid.png]]
 
* Red numbers indicate untranslated items, which is useful after upgrading to identify new strings
* Changes take effect after logout/login
 
== CDR View Custom URL ==
 
Add custom hyperlinks to the CDR view Commands column. This is useful for integrating external monitoring or CRM systems.
 
=== Configuration ===


Navigate to '''GUI > Settings > CDR view custom URL'''.
== License Update Fails ==


[[File:cdr_view_custom_url.png]]
'''Cause:''' Firewall blocking outbound HTTPS.


You can include CDR parameters in the URL using two methods:
'''Fix:''' Allow outbound TCP 443 to <code>voipmonitor.org</code>, or configure HTTP proxy in Advanced settings, or use offline activation.


# '''Via Parameters and Custom headers items:''' Values are appended as query parameters (e.g., <code>?paramName=value</code>)
== GUI Not Loading in iframe ==
# '''Directly in URL:''' Use <nowiki>{{paramName}}</nowiki> syntax, which is replaced with the actual value


=== Display ===
'''Fix:''' Enable '''Enable GUI to run in iframe''' in Advanced settings.


Configured custom URLs appear as links in the Commands column of the CDR view.
== PCAP Download Has Fewer Packets Than GUI Shows ==


== AI Summary for RAG ==
'''Cause:''' Pcap deduplication is enabled (removes retransmissions).


'''Summary:''' This article documents VoIPmonitor GUI settings including sensor configuration (with SSL/TLS parameters for decrypting encrypted SIP traffic), sensor health monitoring via RRD charts (buffer usage and packet drops graphs to diagnose sniffer host overload), troubleshooting server instances that do not appear in the GUI after hardware replacement, CDR custom headers with their limitations, distributed architecture troubleshooting for custom headers not visible in central GUI, GeoIP data loading, system configuration (basic, database, national, intervals, email, license, GeoIP, advanced), localization, and custom CDR URLs. Advanced settings include Http proxy (for upgrades) for configuring proxy servers behind firewalls, and Pcap deduplication before download which can cause packet count mismatches between GUI SIP History and downloaded PCAP files. Key topics: Enable GUI to run in iframe setting in Settings > System Configuration > Advanced allows embedding the VoIPmonitor GUI in iframes for subfolders like /ucloud or /unite - by default the GUI sends security headers (X-Frame-Options) to prevent iframe embedding for clickjacking protection; GUI in iframe not loading properly with 301 redirect errors can be fixed by enabling the "Enable GUI to run in iframe" setting to true; custom headers store raw SIP header values without regexp extraction or delimiter aggregation; sensor SSL settings (ssl_key, ssl_cert, ssl_ipport) can be configured via GUI wrench icon; sensor health monitoring via RRD charts (Settings > Sensors > chart icon) showing buffer usage and packet drops to diagnose sniffer overload vs network quality issues; sensor troubleshooting for non-deletable local sensors in server/probe deployments; server instance troubleshooting when replacing hardware (server/SBC) and reusing IP address - requires manually creating sensor entry in Settings > Sensors and configuring managerip/managerport in voipmonitor.conf on the new server instance; DISTRIBUTED ARCHITECTURE: Custom headers not visible in central GUI for specific sensor despite being configured - check sensor's server_destination, server_destination_port, and server_password in /etc/voipmonitor.conf; delete sensor entry from GUI Settings > Sensors and restart sniffer service to re-register; without correct server_destination configuration, sensor captures headers locally but does not transmit CDRs to central database; GUI and sensor upgrades behind proxy servers can be configured via Settings > System Configuration > Advanced > Http proxy (for upgrades) or via curlproxy in voipmonitor.conf for remote sensors; license notification emails can be disabled by removing the email address in Settings > License; license email supports multiple recipients by entering email addresses separated by a comma (e.g., user1@example.com,user2@example.com); troubleshooting CDR custom headers not being captured or showing truncated content - check snaplen parameter (increase to 3200 or higher for long SIP headers like STIR/SHAKEN P-Asserted-Identity with verstat parameters) and custom_headers_max_size parameter (increase from default 1024 if header content is truncated); CDR timezone configuration - use "Sensors Timezone" setting in Settings > System Configuration > National to fix CDR times displaying in UTC instead of local timezone; the regular "Timezone" setting is for GUI host (reports, alerts), not for CDR data; all sensors sending data to the same database should use the same timezone; sensor OS timezone can be overridden via timezone or utc options in voipmonitor.conf.
'''Fix:''' Disable '''Pcap deduplication before download''' in Advanced settings.


'''Keywords:''' GUI settings, sensors, CDR custom headers, header limitations, GeoIP, system configuration, timezone, national prefix, date format, intervals, email settings, license settings, license notification emails, overage notification, multiple recipients, comma-separated emails, advanced settings, localization, custom URL, CSV export, ssl_key, ssl_cert, ssl_ipport, tls decryption, ssl configuration, pcap deduplication, packet count mismatch, missing packets in PCAP, RRD charts, sensor health monitoring, buffer usage, packet drops, sniffer overload, choppy audio, poor call quality, MOS score, sensor capacity limits, server instance troubleshooting, hardware replacement, SBC replacement, reusing IP address, managerip, managerport, server not appearing in GUI, CDR warning about unknown sensor, proxy, http proxy, proxy server, firewall, corporate proxy, GUI upgrade, sensor upgrade, curlproxy, proxy authentication, custom headers troubleshooting, snaplen, custom_headers_max_size, header capture issues, SIP packet capture, STIR, SHAKEN, P-Asserted-Identity, verstat, truncated headers, long SIP headers, CDR timezone, sensors timezone, UTC time display, BST time display, incorrect CDR times, iframe, embed, X-Frame-Options, clickjacking, GUI in iframe, iframe 301 redirect, ucloud, unite, subfolder, security headers, distributed architecture, custom headers not visible central GUI, sensor not sending CDRs to central database, server_destination, server_destination_port, server_password, delete sensor from GUI, re-register sensor, sensor configuration wrong, headers captured locally not in central GUI
= See Also =


'''Key Questions:'''
* [[Sniffer_configuration]] - Full voipmonitor.conf reference
* How do I configure sensors in the VoIPmonitor GUI?
* [[Sniffer_distributed_architecture]] - Client-Server mode
* How do I enable the GUI to run in an iframe?
* [[Tls]] - TLS/SRTP decryption
* How do I fix 301 redirect errors when loading the GUI in an iframe?
* [[Data_Cleaning]] - Storage retention
* Where is the "Enable GUI to run in iframe" setting located?
* [[User_Management]] - User permissions
* Why does the GUI not load when embedded in an iframe from another application?
* [[License]] - License management
* How do I enable iframe support for subfolders like /ucloud or /unite?
* How do I fix CDR times displaying in UTC instead of local timezone?
* Where do I set the sensors timezone for CDR data?
* What is the difference between "Timezone" and "Sensors Timezone" in Settings?
* How do I configure timezone for multiple sensors sending to the same database?
* How do I configure SSL/TLS settings for a sensor using the GUI?
* How do I enable TLS decryption for specific trunks through the web interface?
* Where do I find SSL/TLS parameters (ssl_key, ssl_cert, ssl_ipport) in the GUI?
* How do I access sensor RRD charts for health monitoring?
* How do I check if the sniffer host is overloaded using RRD charts?
* What do buffer usage and packet drops graphs indicate in sensor RRD charts?
* How can I tell if poor call quality is caused by the sniffer host vs network issues?
* What does buffer usage at 100% mean for VoIPmonitor sensor performance?
* How do I delete a non-deletable local sensor in a server/probe deployment?
* How do I create and configure CDR custom headers?
* Can I extract part of a SIP header using regexp in custom headers?
* Can I aggregate multiple occurrences of a SIP header?
* What are the limitations of CDR custom headers?
* Why are my custom SIP headers not being captured or showing truncated content?
* How do I capture long SIP headers like P-Asserted-Identity for STIR/SHAKEN?
* What is the snaplen parameter in voipmonitor.conf and how does it affect custom header capture?
* What is the custom_headers_max_size parameter in voipmonitor.conf?
* How do I fix truncated custom header content in the database?
* How do I create alerts based on CDR custom headers?
* How do I load GeoIP data for the map view?
* What system configuration options are available?
* How do I set national prefixes and date/time formats?
* What interval settings control CDR and dashboard filters?
* How do I configure GeoIP services?
* How do I create GUI localizations?
* How do I add custom URLs to the CDR view?
* How do I export CDRs to CSV via crontab scheduler?
* Why are custom SIP headers not visible in the central GUI for a specific sensor in a distributed deployment?
* How do I fix custom headers not appearing in central GUI when they capture locally on the sensor?
* Where are server_destination, server_destination_port, and server_password configured in distributed architecture?
* How do I re-register a sensor with the central GUI after configuration changes?
* When should I delete and recreate a sensor entry in Settings > Sensors?
* Why does the downloaded PCAP file have fewer packets than shown in the GUI SIP History?
* How do I disable Pcap deduplication before download to include all packets in downloaded PCAP?
* Where do I configure license notification email addresses?
* How do I configure multiple recipients for license expiry notification emails?
* How do I stop receiving license issue and overage notification emails?
* What should I do if a server/SBC does not appear in the GUI after replacing hardware and reusing the IP address?
* How do I manually create a server instance entry in the GUI?
* What are managerip and managerport configuration options in voipmonitor.conf?
* After replacing a server/SBC, why does data appear in CDRs with warnings but the sensor is not visible in Settings > Sensors?
* How do I configure network connectivity for server instances that connect directly to MySQL database?
* Can I switch from the old server instance architecture to modern Client-Server mode?
* How do I configure HTTP proxy for GUI and sensor upgrades?
* Where is the Http proxy (for upgrades) setting in the GUI?
* How do I configure proxy server in Settings > System Configuration?
* How do I fix GUI upgrade failures behind a corporate proxy or firewall?
* How do I configure curlproxy for remote sensors?
* What is the format for HTTP proxy configuration in VoIPmonitor?

Revision as of 11:29, 19 January 2026


This page documents the configuration options available in the VoIPmonitor web GUI under the Settings menu.

Sensors

Configure sensor connections for multi-sensor deployments. Required when id_sensor is set in /etc/voipmonitor.conf.

Field Description
Sensor ID Numeric ID matching id_sensor in voipmonitor.conf
Name Descriptive name for the sensor
Manager IP IP address (or hostname) for fetching data (PCAP, audio files)
Manager Port TCP port for manager API (default: 5029)
Remote database Database connection for "Legs by CID/header" lookups when sensors use different databases

Multi-Sensor Deployment

Setup:

  1. Set unique id_sensor in each sensor's /etc/voipmonitor.conf
  2. Add sensor entries in Settings > Sensors with matching Sensor ID
  3. Restart sensors: systemctl restart voipmonitor

💡 Tip: For sensors with dynamic IPs, enter a hostname in the Manager IP field, or use Client-Server mode.

Sensor Configuration via Wrench Icon

Click the wrench icon next to a sensor to configure parameters. Use the search field to find settings.

Parameter Description Values
ssl Enable TLS decryption yes / no
ssl_ipport IP:port and key path for TLS 192.168.1.10:5061 /path/to/key.pem
sipport SIP ports to capture 5060,5080 or 5060,5070-5080
savertp RTP recording mode yes (full), no (none), header (stats only)
maxpoolrtpsize Max RTP storage in MB 51200
maxpoolrtpdays Max RTP age in days 30

⚠️ Warning: GUI settings override voipmonitor.conf when mysqlloadconfig is enabled (default). Changes require a full restart (systemctl stop/start), not reload.

For TLS decryption with PFS ciphers, see TLS Decryption Guide.

RRD Health Charts

Click the chart icon next to a sensor to view performance metrics:

  • Buffer usage: Approaching 100% indicates capacity limits
  • Packet drops: Non-zero values indicate sensor overload

ℹ️ Note: High buffer/drops cause low MOS and choppy audio. Solutions: increase ringbuffer in config, add sensors, use DPDK or Napatech.

Disabling a Sensor

⚠️ Warning: The GUI "Disabled" checkbox does NOT stop data collection. The sniffer continues running regardless of GUI status.

To stop data collection:

  • Complete shutdown: systemctl stop voipmonitor on the sensor host
  • Selective blocking: Create capture rule with Skip = ON in Control Panel > Capture Rules

Deleting Sensors

If deletion fails, the sensor likely has capture rules assigned. Remove rules first via Control Panel > Capture Rules.

Non-deletable local sensor (GUI+DB only servers):

On central servers that don't capture traffic, an auto-created "localhost" sensor may appear. To replace it:

  1. Set id_sensor = 1 in /etc/voipmonitor.conf on the central server
  2. In GUI: Add new sensor with Manager IP 127.0.0.1, same Sensor ID, Port 5029
  3. Enable "is server in client/server mode" checkbox
  4. Disable "show active calls from all sensors in active call view" checkbox

CDR Charts

Define predefined charts for the CDR detail Charts tab.

CDR Custom Headers

Capture and display custom SIP headers in CDR views. Requires sniffer version 7.0RC7+.

Setup Workflow

  1. Add header to /etc/voipmonitor.conf:
custom_headers = X-Cisco-Org-ID
  1. Restart sensor: systemctl restart voipmonitor
  2. Generate a test call
  3. Configure in Settings > CDR Custom Headers: select header, set Name, enable "Show as Column"

Configuration Fields

Field Description
Header Field SIP header to capture (from dropdown after restart)
Name Display label in GUI
Match in SIP by Header Enable for Legs by header correlation
Show as Column Display in CDR list view
Restrict to Regex pattern Filter which values to capture
Boundary start/end Extract substring between delimiters
Regexp Extract using regex with capture groups (...)
Select occurrence First found value, Last found value, or Nth occurrence
Nth occurrence (New in 2026.01) When "Nth occurrence" is selected, specify which occurrence number to extract (e.g., 2 for second occurrence). Uses packet timestamps for accurate ordering even when packet reordering is disabled.

Extracting Substrings

Boundary method (recommended): Extract between delimiters.

Example: From sip:1000@192.168.1.1;tag=123, extract IP:

  • Boundary start: @
  • Boundary end: ;
  • Result: 192.168.1.1

Regexp method: Use capture groups for complex patterns.

# Extract version from: User-Agent: Asterisk/20.6.0
Regexp: Asterisk/([0-9.]+)
Result: 20.6.0

⚠️ Warning: Regexp MUST include parentheses (...) to define what to capture. Without them, the entire match is stored.

Filtering by SIP Method and Response Code

You can filter custom header extraction to specific SIP methods (e.g., INVITE) or SIP response codes (e.g., 300, 404).

Field Description Example Usage
CSeq method Filter by SIP request method INVITE to capture only from INVITE requests
response code Filter by SIP response code number 300 to capture only from 300 redirect responses

Example: Extract Contact IP from 300 Redirect Responses

To filter CDRs for calls involving SIP 300 redirect responses and identify the redirect destination IP:

  1. Navigate to Settings > Custom headers > CDR in the GUI
  2. Click Add new
  3. Set Header field to Contact
  4. Set Name to descriptive label (e.g., SIP300RedirectDestinations)
  5. Set Regexp to sip:.*@([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+); to extract the IP address
  6. Set CSeq method to INVITE
  7. Set response code to 300
  8. Save the configuration

Use the new custom header and Last SIP response code as filters in the CDR list to identify calls with 300 redirects and their destinations.

💡 Tip: The CSeq method and response code fields allow you to capture headers from specific SIP messages rather than all headers in the call.

Database Index for Custom Headers

Custom header columns are not indexed by default. For frequent queries:

-- Find table/column location
SELECT dynamic_table, dynamic_column FROM cdr_custom_headers
WHERE header_field = 'X-Custom-Header';

-- Create index (use values from above query)
CREATE INDEX idx_custom_header_3 ON cdr_next_2 (custom_header_3);

Troubleshooting Custom Headers

Problem Solution
Header not captured Increase snaplen in voipmonitor.conf (default may be too low)
Header truncated Increase custom_headers_max_size (default: 1024 bytes)
Not visible in distributed setup Check server_destination and server_password on sensor

Verify loaded headers: echo 'custom_headers_dump cdr' | nc localhost 5029

Load GeoIP Data

Loads GeoIP data for the CDR Map tab. See Order_of_GeoIP_processing for processing priority.

System Configuration

Basic

Setting Description
WEB URL Base URL for hyperlinks in emails
Sniffer data path PCAP storage directory (default: /var/spool/voipmonitor)
Sniffer second datapath Secondary spool directory (spooldir_2)
Default sensor hostname Default hostname for sniffer connection
Default sensor TCP port Default manager API port (5029)

⚠️ Warning: If sensors connect to wrong destination after upgrade, disable Default sensor hostname and Default sensor TCP port in this section. When enabled, sensors ignore individual Manager IP/Port settings.

Database

MySQL/MariaDB connection settings.

Custom port: Enter host with port in MySQL hostname field: 127.0.0.1:33306

Also configure mysqlport in /etc/voipmonitor.conf. See Database_troubleshooting for details.

National

Setting Description
Timezone GUI host timezone (for reports/alerts scheduling)
Sensors Timezone CDR display timezone - set this to fix UTC display issues
National prefix Prefixes for national call classification
International prefix International dialing prefix (e.g., 00, 011)
Local number Country name for number normalization

💡 Tip: If CDRs display in UTC instead of local time, set Sensors Timezone (not regular Timezone) to your sensors' timezone.

Intervals

Default time filters for CDR view, dashboard, and Legs correlation.

Email / HTTP Referer

Setting Description
DEFAULT_EMAIL_FROM Default "From" address for outgoing emails
Disable email plain text Force HTML-only emails


Troubleshooting Email Delivery

If users report not receiving verification emails or new user setup emails, verify the email sending status:

For Exim mail servers:

# Check Exim mail log for delivery attempts
grep "recipient@example.com" /var/log/exim/main.log

# Or search by timestamp
grep "2025-01-09 14:30:" /var/log/exim/main.log

Look for the response code in the log entry:

  • 250 message accepted - Email was successfully delivered to remote server. The issue is on the recipient side (spam folder, quarantine, mail filtering).
  • No 250 code - Email delivery failed at the server level. Check mail queue and server MTA configuration.

If logs confirm successful delivery: Inform the client that the email left the server successfully and advise them to check their Spam, Bulk, or Junk folders, or consult their internal IT team regarding mail filtering policies.

General MTA verification:

# Check if mail agent is running
systemctl status postfix     # or exim4, sendmail

# Test email from command line
echo "Test message" | mail -s "VoIPmonitor Test" your@email.com

# Check mail queue
mailq

# View general mail logs
tail -f /var/log/mail.log     # Debian/Ubuntu
tail -f /var/log/maillog      # RHEL/CentOS

License

Setting Description
License token Short token for retrieving license from portal
License key Full license key content (multi-line)
License email Email for license notifications (leave empty to disable)

Update license after payment: Click get/update license key button.

Manual activation: Copy full license key from portal (Services > My services) and paste into License key field.

Disable notification emails: Remove email from "License email" field.

GeoIP

Configure API keys for MaxMind or IPInfoDB services.

Advanced

Setting Description
ENABLE_CSRF_CHECK Enable CSRF protection (recommended for production)
Pcap deduplication before download Remove duplicate packets from PCAP downloads
Http proxy (for upgrades) Proxy for GUI/sniffer upgrades: http://proxy:port
Enable GUI to run in iframe Allow embedding in iframes (disabled by default for security)
CDR share key Secret for CDR share URLs

Firewall requirements: Allow outbound HTTPS to:

  • voipmonitor.org - License updates
  • download.voipmonitor.org - Software upgrades
  • share.voipmonitor.org - CDR sharing
  • reports.voipmonitor.org - Debug reports

Localization

Create GUI translations. Red numbers indicate untranslated items. Changes apply after logout/login.

CDR View Custom URL

Add custom hyperlinks to CDR Commands column. Use {{paramName}} in URL to include CDR values.

Troubleshooting

Sensors Connect to Wrong Destination After Upgrade

Cause: Default sensor hostname/port settings override individual sensor configurations.

Fix: Disable Default sensor hostname and Default sensor TCP port in Settings > System Configuration > Basic.

GUI Crashes on Settings > Sensors Page

Cause: Too many obsolete sensor records in database.

Fix: Delete obsolete records directly:

-- Check count
SELECT COUNT(*) FROM sensors;
-- Delete obsolete entries (adjust WHERE clause)
DELETE FROM sensors WHERE host LIKE '%old-sensor%';

All users must log out and back in after cleanup.

License Update Fails

Cause: Firewall blocking outbound HTTPS.

Fix: Allow outbound TCP 443 to voipmonitor.org, or configure HTTP proxy in Advanced settings, or use offline activation.

GUI Not Loading in iframe

Fix: Enable Enable GUI to run in iframe in Advanced settings.

PCAP Download Has Fewer Packets Than GUI Shows

Cause: Pcap deduplication is enabled (removes retransmissions).

Fix: Disable Pcap deduplication before download in Advanced settings.

See Also