Netify Device Discovery Plugin
The Netify Device Discovery Engine provides continuous, near real-time visibility into active devices across a local network. It enables precise asset tracking for both persistent infrastructure, such as desktops, printers, and routers, and transient devices, including smartphones, tablets, and IoT devices.
Operating as a lightweight edge plugin, the engine collects rich device fingerprinting signals directly from the host environment. The collected telemetry can be securely streamed to Netify Cloud, providing a turnkey device discovery solution without requiring integrators to develop their own fingerprinting infrastructure.
For greater control and integration flexibility, the same raw fingerprinting telemetry can also be streamed directly into your own analytics pipelines or third-party device identification platforms such as Lansweeper or Fingerbank.
Related Links
- MAC Attributes Telemetry
- MAC attributes collected for the device discovery engine.
- Device Discovery Telemetry
- Analyzed devices that have been processed by device discovery.
- Device Monitoring Blueprint
- Provides an example on how to implement a customer-facing solution.
License
The Netify Device Discovery plugin is a proprietary plugin requiring a license. Please contact us for details.
Installation
Netify plugins are distributed through the same packaging workflow as the Netify Agent, allowing for a consistent installation experience using standard package manager syntax. While pre-compiled binaries are readily available for x86_64 architectures via our public mirrors, support for ARM, MIPS, and other specialized architectures is available upon request. Please contact us for details.
Step 1 - Select your installation target:
Step 2 - Add Netify's package signing key and repository:
sudo apt-get update
sudo apt-get -y install curl gnupg2
sudo curl https://download.netify.ai/5/debian/netify-archive-keyring.gpg -o /usr/share/keyrings/netify-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/netify-archive-keyring.gpg] http://download.netify.ai/5/debian/13/ /' | sudo tee /etc/apt/sources.list.d/netify.list
Step 3 - Install Netify Device Discovery:
sudo apt update
sudo apt install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo apt-get update
sudo apt-get -y install curl gnupg2
sudo curl https://download.netify.ai/5/debian/netify-archive-keyring.gpg -o /usr/share/keyrings/netify-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/netify-archive-keyring.gpg] http://download.netify.ai/5/debian/12/ /' | sudo tee /etc/apt/sources.list.d/netify.list
Step 3 - Install Netify Device Discovery:
sudo apt update
sudo apt install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo apt-get update
sudo apt-get -y install curl gnupg2
sudo curl https://download.netify.ai/5/ubuntu/netify-archive-keyring.gpg -o /usr/share/keyrings/netify-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/netify-archive-keyring.gpg] http://download.netify.ai/5/ubuntu/resolute/ /' | sudo tee /etc/apt/sources.list.d/netify.list
Step 3 - Install Netify Device Discovery:
sudo apt update
sudo apt install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo apt-get update
sudo apt-get -y install curl gnupg2
sudo curl https://download.netify.ai/5/ubuntu/netify-archive-keyring.gpg -o /usr/share/keyrings/netify-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/netify-archive-keyring.gpg] http://download.netify.ai/5/ubuntu/noble/ /' | sudo tee /etc/apt/sources.list.d/netify.list
Step 3 - Install Netify Device Discovery:
sudo apt update
sudo apt install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo apt-get update
sudo apt-get -y install curl gnupg2
sudo curl https://download.netify.ai/5/ubuntu/netify-archive-keyring.gpg -o /usr/share/keyrings/netify-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/netify-archive-keyring.gpg] http://download.netify.ai/5/ubuntu/jammy/ /' | sudo tee /etc/apt/sources.list.d/netify.list
Step 3 - Install Netify Device Discovery:
sudo apt update
sudo apt install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo apt-get update
sudo apt-get -y install curl gnupg2
curl -fsSL https://download.netify.ai/5/ubuntu/apt-gpg-key-netify.asc | sudo apt-key add -
echo 'deb http://download.netify.ai/5/ubuntu/focal/ /' | sudo tee /etc/apt/sources.list.d/netify.list
Step 3 - Install Netify Device Discovery:
sudo apt update
sudo apt install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
wget https://download.netify.ai/5/openwrt/netify-6a0f68af.rsa.pub -O /etc/apk/keys/netify-6a0f68af.rsa.pub
echo 'https://download.netify.ai/5/openwrt/25.12/x86/packages.adb' >> /etc/apk/repositories.d/customfeeds.list
Step 3 - Install Netify Device Discovery:
apk update
apk add netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
wget https://download.netify.ai/5/openwrt/key-build.pub -O /etc/opkg/keys/b18c240cb821dad2
echo 'src/gz netify https://download.netify.ai/5/openwrt/24.10/x86' >> /etc/opkg/customfeeds.conf
Step 3 - Install Netify Device Discovery:
opkg update
opkg install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
wget https://download.netify.ai/5/openwrt/key-build.pub -O /etc/opkg/keys/b18c240cb821dad2
echo 'src/gz netify https://download.netify.ai/5/openwrt/23.05/x86' >> /etc/opkg/customfeeds.conf
Step 3 - Install Netify Device Discovery:
opkg update
opkg install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
wget https://download.netify.ai/5/openwrt/key-build.pub -O /etc/opkg/keys/b18c240cb821dad2
echo 'src/gz netify https://download.netify.ai/5/openwrt/22.03/x86' >> /etc/opkg/customfeeds.conf
Step 3 - Install Netify Device Discovery:
opkg update
opkg install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
wget https://download.netify.ai/5/openwrt/key-build.pub -O /etc/opkg/keys/b18c240cb821dad2
echo 'src/gz netify https://download.netify.ai/5/openwrt/21.02/x86' >> /etc/opkg/customfeeds.conf
Step 3 - Install Netify Device Discovery:
opkg update
opkg install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
wget http://download.netify.ai/5/openwrt/key-build.pub -O /etc/opkg/keys/b18c240cb821dad2
echo 'src/gz netify http://download.netify.ai/5/openwrt/19.07/x86' >> /etc/opkg/customfeeds.conf
Step 3 - Install Netify Device Discovery:
opkg update
opkg install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo rpm --import https://download.netify.ai/5/opensuse/15.6/stable/RPM-GPG-KEY-netify
sudo curl https://download.netify.ai/5/opensuse/netify.repo -o /etc/zypp/repos.d/repo-netify.repo
Step 3 - Install Netify Device Discovery:
sudo zypper update
sudo zypper install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo rpm --import https://download.netify.ai/5/opensuse/15.5/stable/RPM-GPG-KEY-netify
sudo curl https://download.netify.ai/5/opensuse/netify.repo -o /etc/zypp/repos.d/repo-netify.repo
Step 3 - Install Netify Device Discovery:
sudo zypper update
sudo zypper install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo rpm --import https://download.netify.ai/5/almalinux/9/stable/RPM-GPG-KEY-netify
sudo curl https://download.netify.ai/5/almalinux/9/netify.repo -o /etc/yum.repos.d/netify.repo
Step 3 - Install Netify Device Discovery:
sudo yum update
sudo yum install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo rpm --import https://download.netify.ai/5/almalinux/8/stable/RPM-GPG-KEY-netify
sudo curl https://download.netify.ai/5/almalinux/8/netify.repo -o /etc/yum.repos.d/netify.repo
Step 3 - Install Netify Device Discovery:
sudo yum update
sudo yum install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo rpm --import http://download.netify.ai/5/rockylinux/9/stable/RPM-GPG-KEY-netify
sudo curl https://download.netify.ai/5/rockylinux/9/netify.repo -o /etc/yum.repos.d/netify.repo
Step 3 - Install Netify Device Discovery:
sudo yum update
sudo yum install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
sudo rpm --import http://download.netify.ai/5/rockylinux/8/stable/RPM-GPG-KEY-netify
sudo curl https://download.netify.ai/5/rockylinux/8/netify.repo -o /etc/yum.repos.d/netify.repo
Step 3 - Install Netify Device Discovery:
sudo yum update
sudo yum install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
mkdir -p /usr/local/etc/pkg/fingerprints/Netify/trusted
curl https://download.netify.ai/5/opnsense/fingerprint -o /usr/local/etc/pkg/fingerprints/Netify/trusted/fingerprint
cat << EOF > /usr/local/etc/pkg/repos/Netify.conf
Netify: {
fingerprints: "/usr/local/etc/pkg/fingerprints/Netify",
url: "https://download.netify.ai/5/opnsense/25.7",
signature_type: "fingerprints",
mirror_type: "http",
priority: 11,
enabled: yes
}
EOF
Step 3 - Install Netify Device Discovery:
pkg update
pkg install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
mkdir -p /usr/local/etc/pkg/fingerprints/Netify/trusted
curl https://download.netify.ai/5/opnsense/fingerprint -o /usr/local/etc/pkg/fingerprints/Netify/trusted/fingerprint
cat << EOF > /usr/local/etc/pkg/repos/Netify.conf
Netify: {
fingerprints: "/usr/local/etc/pkg/fingerprints/Netify",
url: "https://download.netify.ai/5/opnsense/24.7",
signature_type: "fingerprints",
mirror_type: "http",
priority: 11,
enabled: yes
}
EOF
Step 3 - Install Netify Device Discovery:
pkg update
pkg install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
mkdir -p /usr/local/etc/pkg/fingerprints/Netify/trusted
curl https://download.netify.ai/5/freebsd/fingerprint -o /usr/local/etc/pkg/fingerprints/Netify/trusted/fingerprint
cat << EOF > /usr/local/etc/pkg/repos/Netify.conf
Netify: {
fingerprints: "/usr/local/etc/pkg/fingerprints/Netify",
url: "https://download.netify.ai/5/freebsd/15.0",
signature_type: "fingerprints",
mirror_type: "http",
priority: 11,
enabled: yes
}
EOF
Step 3 - Install Netify Device Discovery:
pkg update
pkg install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
mkdir -p /usr/local/etc/pkg/fingerprints/Netify/trusted
curl https://download.netify.ai/5/freebsd/fingerprint -o /usr/local/etc/pkg/fingerprints/Netify/trusted/fingerprint
cat << EOF > /usr/local/etc/pkg/repos/Netify.conf
Netify: {
fingerprints: "/usr/local/etc/pkg/fingerprints/Netify",
url: "https://download.netify.ai/5/freebsd/14.0",
signature_type: "fingerprints",
mirror_type: "http",
priority: 11,
enabled: yes
}
EOF
Step 3 - Install Netify Device Discovery:
pkg update
pkg install netify-proc-dev-discovery
Step 2 - Add Netify's package signing key and repository:
mkdir -p /usr/local/etc/pkg/fingerprints/Netify/trusted
curl https://download.netify.ai/5/freebsd/fingerprint -o /usr/local/etc/pkg/fingerprints/Netify/trusted/fingerprint
cat << EOF > /usr/local/etc/pkg/repos/Netify.conf
Netify: {
fingerprints: "/usr/local/etc/pkg/fingerprints/Netify",
url: "https://download.netify.ai/5/freebsd/14.0",
signature_type: "fingerprints",
mirror_type: "http",
priority: 11,
enabled: yes
}
EOF
Step 3 - Install Netify Device Discovery:
pkg update
pkg install netify-proc-dev-discovery
Setup
To use the Netify Device Discovery plugin, ensure your license.json includes the netify-proc-dev-discovery entitlement.
All plugins are disabled by default, and the Netify Device Discovery plugin is no different. Use netifyd's --enable-plugin and --disable-plugin flags to enable or disable the plugin.
netifyd --enable-plugin proc-dev-discovery # Enables loader
netifyd --disable-plugin proc-dev-discovery # Disables loader
For orchestration tools or manual setup, you can also directly update configuration file in the plugins.d subdirectory and set enable to yes.
See the advanced configuration section for details on instantiating multiple instances of the plugin.
$ cat 10-netify-proc-dev-discovery.conf
[proc-dev-discovery]
enable = yes
plugin_library = /usr/lib64/libnetify-proc-dev-discovery.so.0.0.0
conf_filename = ${path_state_persistent}/netify-proc-dev-discovery.json
AI Integration
For AI integration and machine learning models, the Netify Device Discovery Configuration JSON schema is available for reference.
Modes
Netify's Device Discovery Engine offers two flexible deployment modes designed to match your security policies, hardware constraints, and data pipeline requirements. Whether deploying across air-gapped industrial sites or streaming data into an established cloud platform, select the mode that best aligns with your infrastructure.
Netify Cloud Engine
The Netify Cloud mode provides a zero-code, SaaS-driven model engineered for rapid deployment and maximum recognition accuracy.
- Architectural Fit
- Cloud-managed CPEs, enterprise Wi-Fi solutions, and SaaS network management dashboards.
- Capabilities
- Offloads heavy payload inspection to Netify Cloud, matching telemetry against global device signatures.
- Key Advantage
- Maximum device identification rates with zero local signature file overhead.
Telemetry Streaming
Telemetry Streaming is designed for engineering teams with established data lakes or third-party fingerprinting subscriptions, e.g., Lansweeper and Fingerbank.
- Architectural Fit
- Direct ingestion into internal analytics platforms or SIEM systems.
- Capabilities
- Feeds raw, unparsed device telemetry directly to custom pipelines via open APIs.
- Key Advantage
- Eliminates vendor lock-in by giving you full control over raw telemetry.
Main Configuration
The plugin is configured via the JSON file referenced by its loader (typically /etc/netifyd/netify-proc-dev-discovery.json ).
compressor
string
The default compression algorithm applied to the payload.
confidence_policy
object
Confidence threshold policy object.
confidence_policy.max
integer
Confidence threshold (0-100) required before discovery stops for a device.
confidence_policy.update_ttl
integer
Seconds an entry is re-analyzed even if above confidence level. 0 to never re-analyze.
macs_policy
integer
Maximum number of MAC addresses to track in memory. 0 for unlimited.
mac_age_policy
integer
Maximum idle time (seconds) before a MAC address entry is purged from memory.
http
object
HTTP collection policy object.
http.user_agents_policy
object
Policy for managing HTTP user agent strings on any given MAC address.
http.user_agents_policy.max
integer
Maximum number of entries to retain.
http.user_agents_policy.update_min
integer
Minimum seconds between updates to an existing entry.
http.user_agents_policy.update_ttl
integer
Seconds an entry is retained since its last update before expiring.
mdns
object
mDNS collection policy object.
mdns.answers_policy
object
Policy for managing mDNS answer (PTR service instance name) strings on any given MAC address.
mdns.answers_policy.max
integer
Maximum number of entries to retain.
mdns.answers_policy.update_min
integer
Minimum seconds between updates to an existing entry.
mdns.answers_policy.update_ttl
integer
Seconds an entry is retained since its last update before expiring.
ssdp
object
SSDP collection policy object.
ssdp.user_agents_policy
object
Policy for managing SSDP user agent strings on any given MAC address.
ssdp.user_agents_policy.max
integer
Maximum number of entries to retain.
ssdp.user_agents_policy.update_min
integer
Minimum seconds between updates to an existing entry.
ssdp.user_agents_policy.update_ttl
integer
Seconds an entry is retained since its last update before expiring.
client_ja4_policy
object
Policy for managing JA4 client hashes on any given MAC address.
client_ja4_policy.max
integer
Maximum number of entries to retain.
client_ja4_policy.update_min
integer
Minimum seconds between updates to an existing entry.
client_ja4_policy.update_ttl
integer
Seconds an entry is retained since its last update before expiring.
path_device_cache
string
Filesystem path for persistent device cache.
process_all_macs
boolean
If true, also creates a minimal device entry (MAC and one IP address only, no fingerprint data) for the counterparty MAC on each flow, not just the fully profiled origin MAC.
device_mac_ignore
array
List of MAC addresses to exclude from discovery.
device_mac_ignore_group
string
Filesystem path to a group file containing MAC addresses to exclude from discovery.
netify_api
object
Netify API object definition.
netify_api.enable
boolean
Enables or disables this Netify Cloud discovery engine.
sinks
object
Sink configuration.
Example: netify-proc-dev-discovery.json
{
"compressor": "gz",
"format": "json",
"confidence_policy": {
"max": 80,
"update_ttl": 86400
},
"macs_policy": 1500,
"mac_age_policy": 4147200,
"path_device_cache": "${path_state_persistent}/device-discovery-cache.json",
"device_mac_ignore": [
"00:00:00:00:00:00",
"ff:ff:ff:ff:ff:ff"
],
"http": {
"user_agents_policy": {
"max": 10
}
},
"mdns": {
"answers_policy": {
"max": 10
}
},
"ssdp": {
"user_agents_policy": {
"max": 10
}
},
"client_ja4_policy": {
"max": 10,
"update_min": 1,
"update_ttl": 3600
},
"netify_api": {
"enable": true
},
"sinks": {
"sink-log": {
"mac_attributes": {
"type": "mac_attributes",
"enable": true,
"flush": true,
"format": "json",
"compressor": "none"
},
"device_discovery": {
"type": "device_discovery",
"enable": true,
"flush": true,
"format": "json",
"compressor": "none"
}
}
}
}
Sink Configuration
We need to send our telemetry to a configured output using a Sink Plugin: log, socket, message queue, etc. This sink configuration is highly flexible, but it can also be easy to misconfigure if the relationships between components are not clear. Let's get started.
Sink Tag - First Level Key
The Device Discovery Processor's sinks object determines which sinks (outputs) receive the telemetry data and how the data should be sent to each one. A single processor can send data to multiple sinks, but in this example it is configured to send to only one.
The sink tag is the first-level key under the sinks property. This key must match the section name defined by the corresponding plugin loader. In our example, the sink tag is sink-log , which must exactly match the loader section name sink-log as shown below:
Sinks Configuration - Overview
"sinks": {
"sink-log": {
"devices": {
"enable": true,
... other properties ...
}
}
}
$ cat /etc/netifyd/plugins.d/10-netify-sink-log.conf
[sink-log]
enable = yes
plugin_library = /usr/lib64/libnetify-sink-log.so.0.0.0
conf_filename = ${path_state_persistent}/netify-sink-log.json
Here we can see that the section name [sink-log] matches the sink tag used in the Device Discovery configuration. The presence of this configuration file indicates that the plugin has been installed, and the enable = yes setting confirms that it is currently enabled. The loader configuration also specifies the sink's runtime configuration file through the conf_filename property.
This mapping is critical: if the names do not match, the processor will not be able to deliver data to the sink.
The Channel - Second Level Key
The second-level key in JSON configuration is the channel. Sink output channels provide a way to separate different types of telemetry into different output targets. For example, you can send:
- aggregator data to /tmp/netify-aggregate-x
- interface statistics to /tmp/netify-interface-stats-x
- intelligence detections to /tmp/netify-intelligence-x
This channel must be configured in the target sink configuration as shown.
Refer to the relevant Sink Plugin configuration for channel configuration details.
Sink Log Config: /etc/netifyd/netify-sink-log.json
{
"overwrite": false,
"log_path": "/tmp",
"channels": {
"devices": {
"overwrite": true,
"log_path": "/tmp",
"log_name": "netify-devices-"
}
}
}
Channel Properties
enable
boolean
Enables or disables this specific sink channel.
type
string
The telemetry type this channel receives. Defaults to the channel's own key name if omitted, so it only needs to be set explicitly when the channel key isn't itself "mac_attributes" or "device_discovery".
compressor
string
The compression algorithm applied to the payload.
flush
boolean
The flush policy.
Example Sinks Configuration
{
...
"sinks": {
"sink-log": {
"devices": {
"enable": true,
"flush": true,
"format": "json",
"compressor": "none"
}
}
}
}
Policies
Counterparty MAC Collection
For every flow, Device Discovery fully profiles one side - the origin MAC - attributing all available fingerprint data to it: DHCP vendor/hostname, HTTP user agent, JA4 client hash, mDNS, and SSDP. The MAC on the other side of that flow (the counterparty) is not tracked or reported by default.
Enabling process_all_macs
(default false) extends discovery to also record counterparty MACs - devices that only ever appear on the receiving end of a flow and never initiate one, and so would otherwise never surface in Device Discovery at all. This comes at the cost of much thinner data: a counterparty entry only ever contains the MAC address and a single IP, with none of the fingerprint data collected for a fully profiled device, since fingerprints are only ever attributed to the origin side of a flow.
A counterparty entry is also a one-time submission rather than an ongoing profile: once it has been reported, it is not created again, even if the device is later seen on the counterparty side of further flows. If it later appears as an origin MAC in its own right, it will instead be picked up and fully profiled through the normal discovery process described above.
Devices excluded via device_mac_ignore or device_mac_ignore_group are never created as counterparty entries, regardless of this setting.
Fingerprint and Agent Policies
Four properties control how many distinguishing fingerprints the Device Discovery plugin retains per device:
- max_ja4_clients
- max_mdns_services
- max_http_user_agents
- max_ssdp_user_agents
Each is configured as an object with the following attributes:
- max
- The maximum number of entries to retain per device. When a new, previously unseen value is discovered after the limit has been reached, the oldest entry is evicted to make room for it. A higher value reduces event volume for fingerprints that recur often, such as JA4 client hashes, at the cost of retaining more state per device.
- update_min
- Squelches repeat events for an existing entry. Renewed activity observed before this many seconds have elapsed since its last update will not trigger a new event.
- update_ttl
- Forces a refresh of an existing entry after this many seconds, regardless of whether new activity has been observed since the last one.