monitoring plugin check_netio

Last update: December 08, 2020

This is a plugin to monitor network interfaces on Linux systems. The initial version was developed by Ian Yates. The plugin is currently maintained by Claudio Kuenzler.

The plugin needs to be executed on the same host as you want the interfaces monitored. A typical use case of this plugin is in combination with a remote plugin execution service (e.g. NRPE). The plugin shows performance data related to the selected interface (Bytes in/out, Errors in/out, Drops in/out) and optional system wide tcp related statistics, retrieved from the OS.

As of the current state, the plugin does not support thresholds.

Commercial support

If you are looking for commercial support for this monitoring plugin, need customized modifications or in general customized monitoring plugins, contact us at



1240 downloads so far...

Download plugin and save it in your Nagios/Monitoring plugin folder (usually /usr/lib/nagios/plugins, depends on your distribution). Afterwards adjust the permissions (usually chmod 755).

Community contributions welcome on GitHub repo.

Version history / Changelog

# 2007-09-06 ( - Created
# 2007-09-06 (
# 2008-11-27 ( - Added GPLv3 licence
# 2017-01-27 ( - Added validation checks and compatibility with CentOS/RHEL 7
# 2018-06-05 ( - Added validation checks and compatibility with Ubuntu 18.04
# 2018-08-14 ( - Set LANG to English for correct parsing
# 2018-12-21 ( - Use /proc/net/dev instead of ifconfig (use -l for legacy)
# 2018-12-21 ( - Remove verbose mode (it was never implemented anyway)
# 2018-12-21 ( - Change default exit code to UNKNOWN
# 2018-12-21 ( - Remove dependency to (nagios|monitoring)-plugins-common
# 2019-06-21 ( - 1.4: Add interface error check (-e)
# 2020-02-12 ( - 1.5: Add interface drops to performance data, add tcp stats option (-t)
# 2020-02-13 ( - 1.5.1: Bugfix issue-6
# 2020-09-04 ( - 1.5.2: Bugfix issue-9
# 2020-09-04 ( - 1.6: Allow regular expression lookup for tcp statistics


  • In legacy mode (invoked with -l): ifconfig command must exist and be executable

Definition of the parameters

Parameter Description
-i* Name of the interface to check. Example: eth0
-l Use legacy mode (uses ifconfig command in the background)
-e Enable check of interface errors. The plugin will alert with a WARNING if errors were found. On the next run the plugin will return OK if the error count did not increase. If the error count increased since the last check, plugin will again alert with a WARNING.
-t Enable additional tcp related statistics in the plugin performance data. These stats are retrieved from /proc/net/netstat and are system-wide statistics (not bound to a specific interface).
-r Awaits a comma-separated list of strings. These given strings will be matched as regular expression against the tcp statistics (invoked with -t). TCP statistics not matching the list will not appear in the performance data output..
-h Show help/usage

* mandatory parameter

Usage / running the plugin on the command line


./ -i string [-l] [-e] [-t] [-r "list,of,strings"]


/usr/lib/nagios/plugins/ -i enp5s0
NETIO OK - enp5s0: Receive 2023395071 Bytes, Transmit 4721736880 Bytes|NET_enp5s0_RX=2023395071B;;;; NET_enp5s0_TX=4721736880B;;;; NET_enp5s0_ERR_IN=0;;;; NET_enp5s0_ERR_OUT=0;;;;

Example with interface error check:

/usr/lib/nagios/plugins/ -i enp5s0 -e
NETIO WARNING - Errors on enp5s0: 12 Receive errors (previous check: 7), 0 Transmit errors (previous check: 0)|NET_enp5s0_RX=1995757695B;;;; NET_enp5s0_TX=4720483095B;;;; NET_enp5s0_ERR_IN=12;;;; NET_enp5s0_ERR_OUT=0;;;;

Example with additional tcp stats:

/usr/lib/nagios/plugins/ -i eth0 -t
NETIO OK - eth0: Receive 23284649421956 Bytes, Transmit 24036117884475 Bytes|NET_eth0_RX=23284649421956B;;;; NET_eth0_TX=24036117884475B;;;; NET_eth0_ERR_RX=0;;;; NET_eth0_ERR_TX=0;;;; NET_eth0_DROP_RX=236;;;; NET_eth0_DROP_TX=0;;;; SyncookiesSent=0;;;; SyncookiesRecv=0;;;; SyncookiesFailed=10708;;;; EmbryonicRsts=11;;;; PruneCalled=1132207;;;; RcvPruned=57163;;;; OfoPruned=210;;;; OutOfWindowIcmps=1756;;;; LockDroppedIcmps=0;;;; ArpFilter=0;;;; TW=8844650;;;; TWRecycled=0;;;; TWKilled=3966390849;;;; PAWSPassive=265;;;; PAWSActive=0;;;; PAWSEstab=69;;;; DelayedACKs=145526473;;;; DelayedACKLocked=86600;;;; DelayedACKLost=15639;;;; ListenOverflows=0;;;; ListenDrops=0;;;; TCPPrequeued=2257462558;;;; TCPDirectCopyFromBacklog=1634542275;;;; TCPDirectCopyFromPrequeue=910314455124;;;; TCPPrequeueDropped=0;;;; TCPHPHits=6748083892;;;; TCPHPHitsToUser=77529122;;;; TCPPureAcks=18521820705;;;; TCPHPAcks=2042634393;;;; TCPRenoRecovery=0;;;; TCPSackRecovery=23122;;;; TCPSACKReneging=157;;;; TCPFACKReorder=9886;;;; TCPSACKReorder=5568;;;; TCPRenoReorder=0;;;; TCPTSReorder=18825;;;; TCPFullUndo=19886;;;; TCPPartialUndo=95443;;;; TCPDSACKUndo=94;;;; TCPLossUndo=532376;;;; TCPLoss=6206;;;; TCPLostRetransmit=117;;;; TCPRenoFailures=0;;;; TCPSackFailures=629;;;; TCPLossFailures=241;;;; TCPFastRetrans=78667;;;; TCPForwardRetrans=3195;;;; TCPSlowStartRetrans=11752;;;; TCPTimeouts=795630;;;; TCPRenoRecoveryFail=0;;;; TCPSackRecoveryFail=105;;;; TCPSchedulerFailed=19;;;; TCPRcvCollapsed=11304426;;;; TCPDSACKOldSent=15653;;;; TCPDSACKOfoSent=4;;;; TCPDSACKRecv=30684;;;; TCPDSACKOfoRecv=2;;;; TCPAbortOnData=1363337089;;;; TCPAbortOnClose=104580;;;; TCPAbortOnMemory=0;;;; TCPAbortOnTimeout=11042;;;; TCPAbortOnLinger=0;;;; TCPAbortFailed=0;;;; TCPMemoryPressures=0;;;; TCPSACKDiscard=0;;;; TCPDSACKIgnoredOld=1;;;; TCPDSACKIgnoredNoUndo=23213;;;; TCPSpuriousRTOs=34;;;; TCPMD5NotFound=0;;;; TCPMD5Unexpected=0;;;; TCPSackShifted=39551;;;; TCPSackMerged=28792;;;; TCPSackShiftFallback=197072;;;; TCPBacklogDrop=1682;;;; TCPMinTTLDrop=0;;;; TCPOFOQueue=209658;;;; TCPOFODrop=22478;;;; TCPOFOMerge=4;;;; TCPChallengeACK=50266;;;; TCPSYNChallenge=49967;;;; BusyPollRxPackets=0;;;; TCPFromZeroWindowAdv=138540;;;; TCPToZeroWindowAdv=138540;;;; TCPWantZeroWindowAdv=3576590;;;; TCPACKSkippedSynRecv=0;;;; TCPACKSkippedPAWS=1;;;; TCPACKSkippedSeq=98514;;;; TCPACKSkippedFinWait2=0;;;; TCPACKSkippedTimeWait=0;;;; TCPACKSkippedChallenge=14;;;;

Example with tcp stats and regular expression list only showing tcp statistics matching lost and drop:

/usr/lib/nagios/plugins/ -i eth0 -t -r "lost,drop"
NETIO OK - eth0: Receive 27643984493 Bytes, Transmit 13167948141 Bytes|NET_eth0_RX=27643984493B;;;; NET_eth0_TX=13167948141B;;;; NET_eth0_ERR_RX=0;;;; NET_eth0_ERR_TX=0;;;; NET_eth0_DROP_RX=0;;;; NET_eth0_DROP_TX=0;;;; LockDroppedIcmps=0;;;; DelayedACKLost=5654;;;; ListenDrops=0;;;; TCPLostRetransmit=2;;;; TCPBacklogDrop=0;;;; PFMemallocDrop=0;;;; TCPMinTTLDrop=0;;;; TCPDeferAcceptDrop=0;;;; TCPReqQFullDrop=0;;;; TCPOFODrop=0;;;;

Command definition (NRPE)

command[check_netio]=/usr/lib/nagios/plugins/ -i $ARG1$ -e -t
command[check_netio_regex]=/usr/lib/nagios/plugins/ -i $ARG1$ -e -t -r $ARG2$

Service definition

Service definition in Nagios, Icinga 1.x, Shinken, Naemon

# Check network io of eth0
define service{
  use generic-service
  host_name mylinux1
  service_description NetIO eth0
  check_command check_nrpe!check_netio!-a "eth0"

# Check network io of eth0 with TCP stats of lost and drop
define service{
  use generic-service
  host_name mylinux1
  service_description NetIO eth0
  check_command check_nrpe!check_netio_regex!-a "eth0" "lost,drop"

Service object definition Icinga 2.x

# Check network io of eth0
object Service "NetIO eth0" {
  import "generic-service"
  host_name "mylinux1"
  check_command = "nrpe"
  vars.nrpe_command = "check_netio"
  vars.nrpe_arguments = ["eth0"]

# Check network io of eth0 with TCP stats of lost and drop
object Service "NetIO eth0" {
  import "generic-service"
  host_name "mylinux1"
  check_command = "nrpe"
  vars.nrpe_command = "check_netio_regex"
  vars.nrpe_arguments = ["eth0", "lost,drop"]

Apply rule in Icinga 2.x

The next example is more interesting as it uses apply rules (a feature of Icinga 2.x). Let's assume we have a couple of Linux hosts already defined with custom attributes:

object Host "mylinuxserver" {
  import "generic-host"
  address = ""
  vars.os = "Linux"
  vars.interfaces = [ "eth0" ]

Using these custom attributes (vars.os and vars.interfaces) we can now create an apply rule:

# Apply check_netio on Linux servers
apply Service "Network IO " for (interface in host.vars.interfaces) {
  import "generic-service"

  check_command = "nrpe"
  vars.nrpe_command = "check_netio"
  vars.nrpe_arguments = [ interface ]

  assign where host.address && host.vars.os == "Linux" && host.vars.interfaces

This "Network IO" service object will now be applied to all hosts which have the custom host attributes host.vars.os set to "Linux" and host.vars.server.interfaces is defined. As vars.interfaces is an array, you can define multiple interfaces.


check_netio grafana graph tx rx
check_netio in icinga2