{% extends "base.html" %} {% block title %}Web Protection · SD RMM{% endblock %} {% block content %}

Web Protection

The lifetime malicious-domain blocklist served to endpoints at POST /v1/blocklist. {% if saved == 'block' %}domain blocked ✓{% endif %} {% if saved == 'allow' %}allowlist updated ✓{% endif %} {% if saved == 'pin' %}pin updated ✓{% endif %} {% if err == 'invalid' %}not a valid domain — ignored{% endif %}

Web lookup ›
What this blocks: whole domains (DNS names), sinkholed in the endpoint hosts file so the machine can't reach them. It is not URL-path filtering (it can't allow one page of a domain and block another) and it is not anti-virus. Domains accumulate for their lifetime once seen in a feed, so a site stays blocked even after the feed drops it — that is what “lifetime” means. Allowlisting a domain removes it from what agents receive on their next pull (a few minutes), not instantly.
{{ "{:,}".format(stats.active) }}
Blocking (served)
{{ "{:,}".format(stats.total) }}
Retained total
{{ "{:,}".format(stats.pinned) }}
Pinned
{{ "{:,}".format(stats.allowlisted) }}
Allowlisted
{% if stats.top_sources %}

Active domains by feed

{% for name, n in stats.top_sources %}{{ name }} {{ "{:,}".format(n) }}{% endfor %}
{% endif %} {% if is_admin %}

Add a manual block

Added as pinned + active (source “manual”). A full URL is reduced to its host; IPs and shared/CDN hosts are refused.
{% endif %}
{% if rows %} {% for r in rows %} {% endfor %}
DomainFeedsFirst seenLast seenStateActions
{{ r.domain|e }} {{ (r.sources or '—')|e }} {% if r.first_seen %}{{ r.first_seen| pt('%Y-%m-%d') }}{% else %}—{% endif %} {% if r.last_seen %}{{ r.last_seen| pt('%Y-%m-%d') }}{% else %}—{% endif %} {% if r.allowlisted %}allowlisted {% elif r.active %}blocking {% else %}inactive{% endif %} {% if r.pinned %} pinned{% endif %}
{% if is_admin %}
{% endif %}
{{ "{:,}".format(total) }} match{{ '' if total == 1 else 'es' }} · page {{ page }} of {{ pages }} {% if page > 1 %}‹ Prev{% endif %} {% if page < pages %}Next ›{% endif %}
{% else %}
{% if q %}No retained domains match “{{ q|e }}”.{% else %}No domains retained yet. The blocklist fills from the threat-intel feeds on the 6-hour refresh.{% endif %}
{% endif %}
{% endblock %}