Daemon Troubleshooting
Common issues and solutions for Scanopy daemons.
Common issues and solutions for Scanopy daemons.
Daemon Issues
Daemon Not Connecting to Server
Symptoms: Daemon shows as offline in the UI, or logs show connection errors
Diagnosis:
# Check daemon logs
docker logs scanopy-daemon
# Test connectivity to server
curl https://your-server-url/api/healthSolutions:
- Verify server URL: Ensure
SCANOPY_SERVER_URLis correct and reachable from the daemon host - Check API key: Verify the API key is valid and not expired in Manage > API Keys
- Firewall rules: Ensure outbound HTTPS (port 443) is allowed from the daemon host
Discovery Fails with "CONCURRENT_SCANS too high"
Symptoms: Daemon crashes or runs out of memory during scans
Solution: Reduce concurrent scans in daemon configuration:
Docker:
environment:
- SCANOPY_CONCURRENT_SCANS=10 # Reduce from defaultBinary:
scanopy-daemon --concurrent-scans 10 ...See Daemon Configuration for recommended values.
"Too Many Open Files" Error
Symptoms: Critical error scanning: Too many open files (os error 24) in daemon logs
Causes: System file descriptor limit is too low for the configured concurrent scans.
Solutions:
-
Reduce concurrent scans (easiest):
environment: - SCANOPY_CONCURRENT_SCANS=10 -
Increase system file descriptor limit:
# Check current limit ulimit -n # Increase temporarily ulimit -n 65535 # Increase permanently (add to /etc/security/limits.conf) * soft nofile 65535 * hard nofile 65535 -
For Docker: Add to your daemon container:
ulimits: nofile: soft: 65535 hard: 65535
Permission Denied Errors (Linux)
Symptoms: "Permission denied" when accessing Docker socket
Solution: Add user to docker group:
sudo usermod -aG docker $USER
newgrp dockerLog out and back in for changes to take effect.
If you're using a Docker socket proxy and getting permission errors, see Docker Socket Proxy troubleshooting.
Daemon Stops When Terminal Closes
Symptoms: Daemon runs in foreground and stops when SSH session ends
Solution: Install as a systemd service (see Installing a Daemon), or run with a process manager like screen or tmux.
Discovery Issues
Hosts Not Discovered / Missing IPs
Symptoms: Discovery completes but some known hosts are missing from results. Manual arping to the missing IPs works fine.
Most likely cause: Switch rate limiting is dropping ARP packets before they reach hosts or before responses return.
Understanding ARP Scanning
Scanopy uses broadcast ARP for fast host discovery. For each target IP, we send an ARP "who-has" request and wait for a reply. This is faster and more reliable than TCP/UDP probing because hosts cannot firewall ARP and still communicate on the network.
However, many managed switches implement Dynamic ARP Inspection (DAI) to prevent ARP spoofing attacks. DAI rate-limits ARP packets on untrusted ports to a maximum number of packets per second (pps). When the limit is exceeded, the switch either drops excess packets silently or disables the port entirely.
Known default rate limits:
| Vendor | Default Limit | Exceeded Behavior | Documentation |
|---|---|---|---|
| Cisco Catalyst/Nexus | 15 pps | Port enters errdisable | Cisco DAI Guide |
| Dell OS9/OS10 | 15 pps | Interface error-disabled | Dell DAI Config |
| Juniper MX/SRX | ~150 kbps (~2500 pps) | Packets dropped | Juniper ARP Policer |
| Juniper EX | No default limit | N/A (unless configured) | Lindsay Hill |
| Aruba, Ruckus, Extreme, Consumer Networking Equipment | Varies by model | Check switch docs | — |
If your switch has DAI enabled and Scanopy sends ARP faster than the limit allows, excess packets are dropped and those hosts appear offline.
How Retries Work
Scanopy uses targeted retries rather than simple broadcast flooding:
- Round 1: Send ARP request to all target IPs at the configured rate
- Wait: Collect responses for 3 seconds
- Round 2: Send ARP requests only to IPs that didn't respond
- Repeat: Continue for the configured number of retry rounds
- Final wait: Extra collection period for late-arriving responses
This approach minimizes total packets sent (only non-responders are retried) while giving slow or rate-limited hosts multiple chances to be discovered.
Example with arp_retries=2 (default) scanning a /24:
| Round | Target IPs | Packets Sent | Cumulative |
|---|---|---|---|
| 1 | 256 (all) | 256 | 256 |
| 2 | ~50 (no response) | ~50 | ~306 |
| 3 | ~10 (still no response) | ~10 | ~316 |
If rate limiting caused packet loss in round 1, rounds 2 and 3 retry only those hosts—often successfully since the burst is smaller.
Diagnosis
-
Check if your switch has DAI enabled. Consult your switch documentation for how to view DAI configuration and statistics. Look for rate limit violations or dropped ARP packets.
-
Check for port shutdown. Some switches (notably Cisco) disable the port entirely when the rate limit is exceeded. If your scanner lost network connectivity during a scan, this is likely the cause.
-
Test with manual arping:
# If this finds the host but Scanopy doesn't, rate limiting is likely arping -c 3 <missing-ip>
Solutions
Option 1: Reduce ARP scan rate
Lower arp_rate_pps to stay within your switch's DAI limit:
# CLI
scanopy-daemon --arp-rate-pps 15
# Environment variable
export SCANOPY_ARP_RATE_PPS=15
# Docker
environment:
- SCANOPY_ARP_RATE_PPS=15Recommended values:
| Scenario | arp_rate_pps |
|---|---|
| Cisco/Dell with DAI enabled | 10-15 |
| Unknown managed switch | 30-50 |
| DAI disabled or trusted port | 100-500 |
Option 2: Increase retries
If rate limiting causes occasional packet loss, more retries give hosts additional chances to respond:
# CLI
scanopy-daemon --arp-retries 4 # 5 total rounds (default is 2 = 3 rounds)
# Environment variable
export SCANOPY_ARP_RETRIES=4Higher retries help when:
- Rate limiting drops some packets but not all
- Hosts are slow to respond (busy or sleeping devices)
- Network has high background traffic
The tradeoff is longer scan time, but since retries only target non-responders, the overhead is usually small.
Option 3: Adjust your switch DAI configuration
If you control the switch, you can increase the rate limit on the scanner's port or mark it as trusted (no rate limit). Consult your switch documentation for the specific commands.
Option 4: Use Npcap for broadcast ARP (Windows only)
On Windows, Scanopy defaults to the SendARP API which scans hosts sequentially. For faster scanning, you can enable Npcap broadcast ARP:
# CLI
scanopy-daemon --use-npcap-arp
# Environment variable
export SCANOPY_USE_NPCAP_ARP=true
# Docker
environment:
- SCANOPY_USE_NPCAP_ARP=trueRequirements:
- Npcap must be installed (free for personal use)
- During Npcap installation, enable "WinPcap API-compatible Mode"
When to use Npcap:
- Scanning large subnets where sequential SendARP is too slow
- You need the same broadcast ARP behavior as Linux/macOS
When to stick with SendARP (default):
- Npcap is not installed or cannot be installed
- Scanning small networks where speed doesn't matter
- You want zero additional dependencies
Tuning for Your Network
| Situation | Recommended Settings |
|---|---|
| Port disabled during scan (Cisco errdisable) | arp_rate_pps=10, check DAI config |
| Missing hosts | arp_retries=3 or arp_retries=4 |
| Scans are too slow | Increase arp_rate_pps if DAI allows, or trust the port |
See Daemon Configuration for all ARP settings.
Discovery Takes Hours
Symptoms: Network discovery takes 10+ hours to complete
Most likely cause: You're scanning a Docker bridge network. The default 172.17.0.0/16 is 65,536 IPs.
Solutions:
-
Remove large subnets: In your Network Scan discovery, remove any Docker bridge networks (172.17.0.0/16, etc.)
-
Use Docker discovery instead: It queries the Docker API directly and takes seconds
-
Check your subnet list: Only scan subnets that actually contain hosts
Topology Empty After Discovery
Symptoms: Discovery completes but topology shows nothing
Check these:
- Discovery errors: Check Discover > Sessions for failures
- Network filter: Check topology options panel — wrong network may be selected
- Refresh mode: Press "Rebuild" or change from manual to auto to get live updates
- Service filters: Category filters may be hiding everything
- Reachability: Verify daemon can actually reach the target network
Getting Help
If your issue isn't covered here:
- Discord: Join our Discord community
- GitHub Issues: Open an issue