The only agent that thinks for itself

Autonomous Monitoring with self-learning AI built-in, operating independently across your entire stack.

Unlimited Metrics & Logs
Machine learning & MCP
5% CPU, 150MB RAM
3GB disk, >1 year retention
800+ integrations, zero config
Dashboards, alerts out of the box
> Discover Netdata Agents

Centralized metrics streaming and storage

Aggregate metrics from multiple agents into centralized Parent nodes for unified monitoring across your infrastructure.

Stream from unlimited agents
Long-term data retention
High availability clustering
Data replication & backup
Scalable architecture
Enterprise-grade security
> Learn about Parents

Fully managed cloud platform

Access your monitoring data from anywhere with our SaaS platform. No infrastructure to manage, automatic updates, and global availability.

Zero infrastructure management
99.9% uptime SLA
Global data centers
Automatic updates & patches
Enterprise SSO & RBAC
SOC2 & ISO certified
> Explore Netdata Cloud

Deploy Netdata Cloud in your infrastructure

Run the full Netdata Cloud platform on-premises for complete data sovereignty and compliance with your security policies.

Complete data sovereignty
Air-gapped deployment
Custom compliance controls
Private network integration
Dedicated support team
Kubernetes & Docker support
> Learn about Cloud On-Premises

Powerful, intuitive monitoring interface

Modern, responsive UI built for real-time troubleshooting with customizable dashboards and advanced visualization capabilities.

Real-time chart updates
Customizable dashboards
Dark & light themes
Advanced filtering & search
Responsive on all devices
Collaboration features
> Explore Netdata UI

Monitor on the go

Native iOS and Android apps bring full monitoring capabilities to your mobile device with real-time alerts and notifications.

iOS & Android apps
Push notifications
Touch-optimized interface
Offline data access
Biometric authentication
Widget support
> Download apps

The future of infrastructure observability

See our strategic direction across AI-native observability, full-stack signals, operational intelligence, and enterprise platform maturity.

AI-native observability
Full-stack signal coverage
Operational intelligence
Enterprise platform maturity
Agent releases every 6 weeks
Cloud continuous delivery
> Explore Product Roadmap

Best energy efficiency

True real-time per-second

100% automated zero config

Centralized observability

Multi-year retention

High availability built-in

Zero maintenance

Always up-to-date

Enterprise security

Complete data control

Air-gap ready

Compliance certified

Millisecond responsiveness

Infinite zoom & pan

Works on any device

Native performance

Instant alerts

Monitor anywhere

AI-native observability

Continuous delivery

Open source foundation

80% Faster Incident Resolution

AI-powered troubleshooting from detection, to root cause and blast radius identification, to reporting.

True Real-Time and Simple, even at Scale

Linearly and infinitely scalable full-stack observability, that can be deployed even mid-crisis.

90% Cost Reduction, Full Fidelity

Instead of centralizing the data, Netdata distributes the code, eliminating pipelines and complexity.

See and Map Your Entire Network

Live topology, flow analytics, and SNMP device and trap monitoring — unified with your full-stack observability.

Control Without Surrender

SOC 2 Type 2 certified with every metric kept on your infrastructure.

Integrations

800+ collectors and notification channels, auto-discovered and ready out of the box.

800+ data collectors
Auto-discovery & zero config
Cloud, infra, app protocols
Notifications out of the box
> Explore integrations
Real Results
46% Cost Reduction

Reduced monitoring costs by 46% while cutting staff overhead by 67%.

— Leonardo Antunez, Codyas

Zero Pipeline

No data shipping. No central storage costs. Query at the edge.

From Our Users
"Out-of-the-Box"

So many out-of-the-box features! I mostly don't have to develop anything.

— Simon Beginn, LANCOM Systems

No Query Language

Point-and-click troubleshooting. No PromQL, no LogQL, no learning curve.

Enterprise Ready
67% Less Staff, 46% Cost Cut

Enterprise efficiency without enterprise complexity—real ROI from day one.

— Leonardo Antunez, Codyas

SOC 2 Type 2 Certified

Zero data egress. Only metadata reaches the cloud. Your metrics stay on your infrastructure.

Full Coverage
800+ Collectors

Auto-discovered and configured. No manual setup required.

Any Notification Channel

Slack, PagerDuty, Teams, email, webhooks—all built-in.

Built for the People Who Get Paged

Because 3am alerts deserve instant answers, not hour-long hunts.

Every Industry Has Rules. We Master Them.

See how healthcare, finance, and government teams cut monitoring costs 90% while staying audit-ready.

Monitor Any Technology. Configure Nothing.

Install the agent. It already knows your stack.
From Our Users
"A Rare Unicorn"

Netdata gives more than you invest in it. A rare unicorn that obeys the Pareto rule.

— Eduard Porquet Mateu, TMB Barcelona

99% Downtime Reduction

Reduced website downtime by 99% and cloud bill by 30% using Netdata alerts.

— Falkland Islands Government

Real Savings
30% Cloud Cost Reduction

Optimized resource allocation based on Netdata alerts cut cloud spending by 30%.

— Falkland Islands Government

46% Cost Cut

Reduced monitoring staff by 67% while cutting operational costs by 46%.

— Codyas

Real Coverage
"Plugin for Everything"

Netdata has agent capacity or a plugin for everything, including Windows and Kubernetes.

— Eduard Porquet Mateu, TMB Barcelona

"Out-of-the-Box"

So many out-of-the-box features! I mostly don't have to develop anything.

— Simon Beginn, LANCOM Systems

Real Speed
Troubleshooting in 30 Seconds

From 2-3 minutes to 30 seconds—instant visibility into any node issue.

— Matthew Artist, Nodecraft

20% Downtime Reduction

20% less downtime and 40% budget optimization from out-of-the-box monitoring.

— Simon Beginn, LANCOM Systems

Pay per Node. Unlimited Everything Else.

One price per node. Unlimited metrics, logs, users, and retention. No per-GB surprises.

Free tier—forever
No metric limits or caps
Retention you control
Cancel anytime
> See pricing plans

What's Your Monitoring Really Costing You?

Most teams overpay by 40-60%. Let's find out why.

Expose hidden metric charges
Calculate tool consolidation
Customers report 30-67% savings
Results in under 60 seconds
> See what you're really paying

Your Infrastructure Is Unique. Let's Talk.

Because monitoring 10 nodes is different from monitoring 10,000.

On-prem & air-gapped deployment
Volume pricing & agreements
Architecture review for your scale
Compliance & security support
> Start a conversation

Monitoring That Sells Itself

Deploy in minutes. Impress clients in hours. Earn recurring revenue for years.

30-second live demos close deals
Zero config = zero support burden
Competitive margins & deal protection
Response in 48 hours
> Apply to partner

Per-Second Metrics at Homelab Prices

Same engine, same dashboards, same ML. Just priced for tinkerers.

Community: Free forever · 5 nodes · non-commercial
Homelab: $90/yr · unlimited nodes · fair usage
> Get the Homelab Plan

$1,000 Per Referral. Unlimited Referrals.

Your colleagues get 10% off. You get 10% commission. Everyone wins.

10% of subscriptions, up to $1,000 each
Track earnings inside Netdata Cloud
PayPal/Venmo payouts in 3-4 weeks
No caps, no complexity
> Get your referral link
Cost Proof
40% Budget Optimization

"Netdata's significant positive impact" — LANCOM Systems

Calculate Your Savings

Compare vs Datadog, Grafana, Dynatrace

Savings Proof
46% Cost Reduction

"Cut costs by 46%, staff by 67%" — Codyas

30% Cloud Bill Savings

"Reduced cloud bill by 30%" — Falkland Islands Gov

Enterprise Proof
"Better Than Combined Alternatives"

"Better observability with Netdata than combining other tools." — TMB Barcelona

Real Engineers, <24h Response

DPA, SLAs, on-prem, volume pricing

Why Partners Win
Demo Live Infrastructure

One command, 30 seconds, real data—no sandbox needed

Zero Tickets, High Margins

Auto-config + per-node pricing = predictable profit

Homelab Ready
Free Video Course

8-episode Netdata tutorial by LearnLinux.tv

76k+ GitHub Stars

3rd most starred monitoring project

Worth Recommending
Product That Delivers

Customers report 40-67% cost cuts, 99% downtime reduction

Zero Risk to Your Rep

Free tier lets them try before they buy

AI Support Assistant, Available 24/7

Nedi has access to all official documentation, source code, and resources. Ask any question about Netdata—responds in your language.

Deployment & configuration
Troubleshooting & sizing
Alerts & notifications
Evidence-based answers
> Ask Nedi now

Never Fight Fires Alone

Docs, community, and expert help—pick your path to resolution.

Learn.netdata.cloud docs
Discord, Forums, GitHub
Premium support available
> Get answers now

60 Seconds to First Dashboard

One command to install. Zero config. 850+ integrations documented.

Linux, Windows, K8s, Docker
Auto-discovers your stack
> Read our documentation

76,000+ Engineers Strong

615+ contributors. 1.5M daily downloads. One mission: simplify observability.

Per-Second. 90% Cheaper. Data Stays Home.

Side-by-side comparisons: costs, real-time granularity, and data sovereignty for every major tool.

See why teams switch from Datadog, Prometheus, Grafana, and more.

> Browse all comparisons
Edge-Native Observability, Born Open Source
Per-second visibility, ML on every metric, and data that never leaves your infrastructure.
Founded in 2016
615+ contributors worldwide
Remote-first, engineering-driven
Open source first
> Read our story
Promises We Publish—and Prove
12 principles backed by open code, independent validation, and measurable outcomes.
Open source, peer-reviewed
Zero config, instant value
Data sovereignty by design
Aligned pricing, no surprises
> See all 12 principles
Edge-Native, AI-Ready, 100% Open
76k+ stars. Full ML, AI, and automation—GPLv3+, not premium add-ons.
76,000+ GitHub stars
GPLv3+ licensed forever
ML on every metric, included
Zero vendor lock-in
> Explore our open source
Build Real-Time Observability for the World
Remote-first team shipping per-second monitoring with ML on every metric.
Remote-first, fully distributed
Open source (76k+ stars)
Challenging technical problems
Your code on millions of systems
> See open roles
Meet the Team Behind Netdata
Conferences, meetups, and tradeshows where you can see Netdata in action and talk to the engineers who build it.
Live demos and deep dives
Book 1-on-1 meetings
Talks and panel sessions
Event recaps and photos
> See all events
Talk to a Netdata Human in <24 Hours
Sales, partnerships, press, or professional services—real engineers, fast answers.
Discuss your observability needs
Pricing and volume discounts
Partnership opportunities
Media and press inquiries
> Book a conversation
Your Data. Your Rules.
On-prem data, cloud control plane, transparent terms.
Trust & Scale
76,000+ GitHub Stars

One of the most popular open-source monitoring projects

SOC 2 Type 2 Certified

Enterprise-grade security and compliance

Data Sovereignty

Your metrics stay on your infrastructure

Validated
University of Amsterdam

"Most energy-efficient monitoring solution" — ICSOC 2023, peer-reviewed

ADASTEC (Autonomous Driving)

"Doesn't miss alerts—mission-critical trust for safety software"

Community Stats
615+ Contributors

Global community improving monitoring for everyone

1.5M+ Downloads/Day

Trusted by teams worldwide

GPLv3+ Licensed

Free forever, fully open source agent

Why Join?
Remote-First

Work from anywhere, async-friendly culture

Impact at Scale

Your work helps millions of systems

$ guides / postfix / postfix-helo-hostname-rejected ▌

Operations Guides

Postfix HELO command rejected: need fully-qualified hostname

You see lines like this filling your mail log:

NOQUEUE: reject: RCPT from unknown[203.0.113.45]: 504 5.5.2 <desktop-abc123>: Helo command rejected: need fully-qualified hostname; from=<user@example.com> to=<recipient@example.org> proto=ESMTP helo=<desktop-abc123>

Postfix is rejecting the connection because the client sent a bare hostname in its HELO or EHLO command instead of a fully-qualified domain name. The restriction responsible is reject_non_fqdn_helo_hostname in your smtpd_helo_restrictions.

Most rejections are legitimate: bots and spam scripts routinely send garbage or bare names in HELO. The problem starts when a legitimate client gets caught – a desktop mail client sending its machine name, an internal monitoring server using a short hostname, or an application hardcoded with localhost as its HELO string. All trigger the same 504 rejection.

What this means

The reject_non_fqdn_helo_hostname restriction rejects any HELO or EHLO command where the hostname argument is not a fully-qualified domain form or a valid address literal enclosed in brackets (such as [192.0.2.1]). The response code is 504 by default, controlled by the non_fqdn_reject_code parameter.

In Postfix versions before 2.3, this restriction was called reject_non_fqdn_hostname. The old name still works as a deprecated alias.

Postfix evaluates HELO restrictions at the RCPT TO stage, not at HELO time. This is because smtpd_delay_reject defaults to yes, which defers restriction evaluation until after the recipient address is known. That is why the rejection appears in logs as RCPT from rather than at the HELO stage.

Two companion restrictions are often configured alongside the non-FQDN check:

  • reject_invalid_helo_hostname: rejects malformed hostnames. Response code 501, controlled by invalid_hostname_reject_code.
  • reject_unknown_helo_hostname: rejects hostnames with no DNS A or MX record. Response code 450 by default (a temporary failure), controlled by unknown_hostname_reject_code. The log message reads Helo command rejected: Host not found.

For HELO restrictions to be fully enforced, smtpd_helo_required must be set to yes. Without it, a client can skip the HELO or EHLO command entirely and bypass all HELO checks.

Common causes

CauseWhat it looks likeFirst thing to check
Spam or bot trafficHigh volume of 504 rejects from many rotating IPs with random or garbage HELO namesReject rate by IP over time
Misconfigured MUAAuthenticated user on port 587 rejected; mail client sends its machine name (e.g., DESKTOP-ABC123)Whether submission port has a HELO restriction override
Internal host with bare nameMonitoring server, cron job, or hypervisor notification rejected; hostname is a single-label name with no dotWhether the sender is in mynetworks or needs a check_helo_access exception
Your own applicationApp-generated mail rejected; application sends localhost or a bare hostname in HELOWhat HELO name the application’s SMTP library sends

Postfix source confirms the distinction: reject_non_fqdn_helo_hostname fails a name only when it has no dot (strchr(test_name, '.') == 0) or fails hostname syntax validation. Multi-label names such as host.local or host.home.arpa contain a dot and pass the FQDN check; they are only caught by reject_unknown_helo_hostname (if configured), which requires a DNS A/AAAA/MX record.

Quick checks

# Show current HELO restrictions
postconf -h smtpd_helo_restrictions

# Check if HELO is required
postconf -h smtpd_helo_required

# Check the reject code for non-FQDN HELO
postconf -h non_fqdn_reject_code

# Check delayed reject behavior (explains why rejection is at RCPT, not HELO)
postconf -h smtpd_delay_reject

# Find recent HELO rejections (Debian/Ubuntu: /var/log/mail.log, RHEL/CentOS: /var/log/maillog)
grep 'Helo command rejected' /var/log/mail.log | tail -20

# Count HELO rejections by client IP
grep 'Helo command rejected' /var/log/mail.log | grep -oE 'from [^[]+\[[^]]+\]' | sort | uniq -c | sort -rn | head -20

# Show the actual HELO names being rejected
grep 'Helo command rejected' /var/log/mail.log | grep -oE 'helo=<[^>]*>' | sort | uniq -c | sort -rn | head -20

# Check for submission port overrides in master.cf
postconf -M submission/inet

# Check if reject_unknown_helo_hostname is also firing (different root cause)
grep 'Host not found' /var/log/mail.log | tail -20

How to diagnose it

flowchart TD
    A["504 HELO reject in logs"] --> B{"High volume
from many IPs?"} B -->|"Yes"| C["Likely spam or bot traffic
Restrictions working as intended"] B -->|"No"| D{"On port 587?"} D -->|"Yes"| E["Authenticated MUA rejected
Add submission port override"] D -->|"No, port 25"| F{"Internal host?"} F -->|"Yes"| G["Uses bare name
Add to mynetworks or helo_access"] F -->|"No"| H["Remote client misconfig
Whitelist or notify sender"]
  1. Determine whether this is attack traffic or a false positive. Extract the rejected HELO names and client IPs using the quick checks above. A high reject rate from many rotating IPs with random strings is bot traffic. A small number of IPs with consistent, human-readable machine names (such as DESKTOP-ABC123 or proxmox-host01) are legitimate clients with misconfigured HELO.

  2. Check whether authenticated users are being rejected. Look for sasl_method= in the rejected log lines. If an authenticated user on port 587 is being rejected by HELO restrictions, your submission service needs an override (see Fixes below).

  3. Identify which port the rejections are on. Port 25 is server-to-server traffic where strict HELO is appropriate. Port 587 is for authenticated mail user agents where strict HELO will break clients that send machine names instead of FQDNs.

  4. Extract the exact HELO name being rejected. The helo=<...> field in the log line shows what the client sent. A bare name like localhost or workstation confirms the restriction is firing correctly against a non-FQDN. A name that looks like an FQDN but is still being rejected may indicate reject_unknown_helo_hostname is also active, which is a different restriction with a different response code.

  5. Read reject categories together. Check sender and recipient reject counts alongside HELO rejects. If HELO rejects spike while sender and recipient rejects stay flat, you are seeing bot traffic that fails at the HELO stage. If all three spike together, a broader configuration or policy change may be involved.

Fixes

The standard pattern is to keep strict HELO restrictions on port 25 and relax them on port 587 where authenticated users submit mail. Add this -o line to your existing submission service definition in master.cf:

submission inet n       -       n       -       -       smtpd
  -o smtpd_helo_restrictions=permit_sasl_authenticated,permit

This lets authenticated users send whatever HELO name their mail client chooses. The trailing permit effectively disables HELO checks for all port 587 connections; unauthenticated connections are still rejected by recipient or relay restrictions later in the SMTP transaction.

Verified against smtpd source: with the default smtpd_delay_reject = yes, HELO restrictions are evaluated at RCPT TO time (after SASL can complete), so permit_sasl_authenticated matches there. With smtpd_delay_reject = no, HELO restrictions are evaluated and answered immediately after the HELO command, before the client can issue AUTH, so permit_sasl_authenticated cannot match; keep the default if you rely on it.

Whitelist specific hosts via check_helo_access

For a known internal host that sends a bare hostname, create a HELO access map. check_helo_access matches on the HELO string, not the source IP, so entries apply globally to all senders – including external bots:

# /etc/postfix/helo_access
internal-monitor-01    OK

Build the map and reference it before the reject:

postmap /etc/postfix/helo_access
postconf -e 'smtpd_helo_restrictions = permit_mynetworks, check_helo_access hash:/etc/postfix/helo_access, reject_non_fqdn_helo_hostname'
postfix reload

Place check_helo_access before the reject rules so exceptions take effect first.

Add internal hosts to mynetworks

If the sender is an internal host, placing it in mynetworks and using permit_mynetworks early in the restriction list is the cleanest fix. permit_mynetworks is IP-based, so it will not accidentally whitelist external clients sending the same HELO string.

# WARNING: this replaces mynetworks entirely. Include all existing entries.
postconf -e 'mynetworks = 127.0.0.0/8, 10.0.0.0/8, 192.168.1.0/24'
postconf -e 'smtpd_helo_restrictions = permit_mynetworks, reject_non_fqdn_helo_hostname'
postfix reload

Note that reject_unknown_helo_hostname will also reject names with no public DNS A or MX record. If you use both restrictions, permit_mynetworks must precede both.

Fix the client-side HELO name

The correct long-term fix for your own applications and servers is to configure them to send a proper FQDN in HELO. For Postfix itself, this is controlled by myhostname in main.cf. For applications, check the SMTP library configuration. Many libraries default to localhost or the machine’s short hostname.

Do not just remove the restriction

Removing reject_non_fqdn_helo_hostname stops the rejections but weakens your anti-spam posture on port 25. Legitimate mail servers send valid FQDNs in HELO. Keep the restriction on port 25 and handle false positives with targeted exceptions.

Prevention

  • Keep HELO restrictions on port 25. This is where server-to-server mail arrives and where bot traffic concentrates.
  • Override HELO restrictions on the submission port. Port 587 authenticated users should not be subject to FQDN HELO checks.
  • Place permit_mynetworks before reject rules. Internal hosts using short names should be exempted before the reject fires.
  • Monitor reject categories together. Read HELO, sender, and recipient reject counts as a group. A spike in HELO rejects alone tells a different story than a spike across all three categories.
  • Watch for configuration drift. Package updates, automation runs, or manual edits can reorder restriction lists, placing a reject before an allow.
  • Verify fail2ban coverage if you rely on it. The default fail2ban Postfix filter’s normal mode matches the RCPT from ...: Helo command rejected: need fully-qualified hostname variant of HELO rejection lines; older or customized filters may not. If you depend on fail2ban to rate-limit rejected connections, verify your filter catches these lines or add a custom rule.

Current fail2ban’s default postfix filter (normal mode) does match these lines: its mdre-normal regex accepts RCPT from <host>: ... Helo command rejected: ... need fully-qualified hostname under the NOQUEUE: reject: prefix. Regex sets vary by fail2ban version, so test against the specific version in production.

Metrics and signals to monitor

SignalWhy it mattersWarning sign
Reject rate by category (HELO, sender, recipient)Distinguishes attack patterns from config driftSpike in HELO rejects alone suggests bot traffic; spike across all categories suggests broader policy issue
Reject rate by client IPIdentifies repeat offenders or compromised hostsSingle IP generating disproportionate rejects
Authenticated vs unauthenticated rejection ratioCatches false positives on legitimate usersAny authenticated user being rejected by HELO rules on port 587
Mail flow velocity (injected vs delivered)Confirms whether rejections affect legitimate mailInjection rate dropping while rejects rise could indicate legitimate mail being blocked
SASL auth success and failure ratesCorrelates with submission port issuesAuth failures rising alongside HELO rejects on port 587
smtpd_helo_required settingEnsures HELO checks cannot be bypassedSetting changed to no after config edit

How Netdata helps

  • Per-second log parsing reveals reject rate spikes within seconds rather than minutes, which matters during botnet bursts that can generate thousands of rejected connections per minute.
  • Reject categorization across HELO, sender, and recipient restrictions lets you correlate whether a HELO reject spike is isolated or part of a broader attack hitting multiple restriction layers.
  • Mail flow velocity correlation (injection vs delivery rate) confirms whether rejections are noise from bots or are actually blocking legitimate mail.
  • Queue depth tracking catches secondary effects. If HELO rejections are blocking legitimate clients, mail may accumulate in upstream or local retry queues.
  • SASL authentication metrics on submission ports help you distinguish a bot hitting port 25 from an authenticated user being rejected on port 587, which requires a different fix.