ProFTPD module mod_snmp

## ProFTPD module `mod_snmp`

The `mod_snmp` module implements SNMPv1 and SNMPv2, for monitoring of `proftpd` statistics via SNMP.

The `mod_snmp` module does not currently support:

- SNMPv3
- AgentX
- SNMP `Set` requests

The `mod_snmp` module is contained in the `mod_snmp/` directory, is intended for ProFTPD 1.3.4rc3 and later, and is not compiled by default. Installation instructions are discussed here.

The most current version of `mod_sftp` is distributed with the ProFTPD source code.

## Author

Please contact TJ Saunders <tj at castaglia.org> with any questions, concerns, or suggestions regarding this module.

## Thanks

2013-01-09: Thanks to <cliles at capario.com> for testing out most of the `mod_snmp` features, requesting additional useful functionality, and providing OpenNMS support/examples.

## Directives

- SNMPAgent
- SNMPCommunity
- SNMPEngine
- SNMPLog
- SNMPMaxVariables
- SNMPNotify
- SNMPOptions
- SNMPTables

### SNMPAgent

Syntax: SNMPAgent master|agentx address[:port] ...
Default: None
Context: server config
Module: mod_snmp
Compatibility: 1.3.4rc3 and later

The `SNMPAgent` directive configures the `mod_snmp` module to act as a "master" SNMP agent/entity, or as an AgentX sub-agent. (Note that the AgentX capability is not currently implemented.)

The address parameter can be an IP address or a DNS name; this parameter configures the address/port on which `mod_snmp` will listen for UDP SNMP packets. By default, a port of 161 is assumed, use address:port to specify an alternate port, e.g.:

      SNMPAgent master localhost:1161

Note that IPv6 addresses should be enclosed in square brackets, as they can contain colons as well, e.g.:

      SNMPAgent master [::1]:1161

Multiple addresses can be supplied, allowing `mod_snmp` to listen on multiple addresses/ports simultaneously:

      SNMPAgent master 1.2.3.4:1161 [a::f]:2262

Note that the `SNMPAgent` directive is required.

### SNMPCommunity

Syntax: SNMPCommunity community
Default: None
Context: server config
Module: mod_snmp
Compatibility: 1.3.4rc3 and later

The `SNMPCommunity` directive configures the community string (effectively a passphrase) used for authenticating SNMPv1 and SNMPv2 messages.

Note that the `SNMPCommunity` directive is required.

### SNMPEngine

Syntax: SNMPEngine on|off
Default: off
Context: server config
Module: mod_snmp
Compatibility: 1.3.4rc3 and later

The `SNMPEngine` directive controls whether the `mod_snmp` will run as an SNMP agent, and handle SNMP messages.

### SNMPLog

Syntax: SNMPLog file|"none"
Default: None
Context: server config
Module: mod_snmp
Compatibility: 1.3.4rc3 and later

The `SNMPLog` directive is used to specify a log file for `mod_snmp`'s reporting. The file parameter given must be the full path to the file to use for logging.

Note that this path must not be to a world-writable directory and, unless `AllowLogSymlinks` is explicitly set to on (generally a bad idea), the path must not be a symbolic link.

### SNMPNotify

Syntax: SNMPNotify address[:port]
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_snmp
Compatibility: 1.3.4rc3 and later

The `SNMPNotify` directive is used to specify the address of any SNMP manager that should receive any notification (i.e. SNMPv2 trap) that `mod_snmp` can generated. Read here for more details on the types of notifications that `mod_snmp` supports.

The address parameter can be an IP address or DNS name. By default, a port number of 162 is assumed. To specify the port number, use:

      SNMPNotify address:port

Multiple `SNMPNotify` directives can be configured; `mod_snmp` will send notifications to all of them.

### SNMPOptions

Syntax: SNMPOptions opt1 ...
Default: None
Context: server config
Module: mod_snmp
Compatibility: 1.3.4rc3 and later

The `SNMPOptions` directive is used to configure various optional behaviors of `mod_snmp`.

Example:

      SNMPOptions RestartClearsCounters

The currently implemented options are:

- `RestartClearsCounters`

  This option will cause `mod_snmp` to clear/reset every counter (except for the `daemon.restartCount` counter) whenever `proftpd` is restarted via the SIGHUP signal.

### SNMPTables

Syntax: SNMPTables path
Default: None
Context: server config
Module: mod_snmp
Compatibility: 1.3.4rc3 and later

The `SNMPTables` directive is used to specify a directory that `mod_snmp` will use for storing its database files; these files are used for tracking the various statistics reported via SNMP.

## Installation

The `mod_snmp` module is distributed with ProFTPD. For including `mod_snmp` as a statically linked module, use:

      $ ./configure --with-modules=mod_snmp ...

Alternatively, `mod_snmp` can be built as a DSO module:

      $ ./configure --enable-dso --with-shared=mod_snmp ...

Then follow the usual steps:

      $ make
      $ make install

## Usage

Important Security Considerations
Do not configure `mod_snmp` to listen on a public Internet address. The information provided via `mod_snmp` can be used by attackers to gain more information about your running `proftpd`, including being able to determine whether their logins fail due to a wrong password (in which case, they know that that user name is valid) or not. It is highly recommended that you configure `mod_snmp` to only listen on internal/LAN addresses. Furthermore, you should employ a firewall rule that rejects any UDP packets from the public Internet to your `proftpd` instance.

SNMP Listening Process
When `proftpd` starts up with `mod_snmp` enabled, the `mod_snmp` module will fork a new process that acts as the SNMP agent, receiving and responding to all SNMP requests. This SNMP listening process automatically switches to the privileges configured by the `User` and `Group` directives, and will also automatically chroot itself to a subdirectory of the `SNMPTables` directory, after which all root privileges are permanently dropped.

Example Configuration
The `mod_snmp` module uses a UDP socket for listening for SNMP requests. Thus it does not require any separate `<VirtualHost>` sections, and does not interfere with the normal FTP operations.

Here is an example configuration for `mod_snmp`:

      <IfModule mod_snmp.c>
        SNMPEngine on
        SNMPLog /etc/proftpd/snmp/snmp.log

        # Configure the agent to listen on 1.2.3.4, port 161
        SNMPAgent master 1.2.3.4 161

        # Configure the SNMP community string
        SNMPCommunity MySnmpCommunity

        # Configure the directory that mod_snmp will use for its database files
        SNMPTables /var/proftpd/snmp
      </IfModule>

Access Controls for SNMP Messages
Since the SNMPv1/SNMPv2 does not have authentication of "users" as such, the normal user/group-based ACLs that can be configured in `proftpd` have no effect on SNMP messages.

In order to provide IP-based access control, then, the `mod_snmp` module supports a `<Limit SNMP>` section, like the following:

Example:

      <Limit SNMP>
        # Allow SNMP packets from 10.x.x.x and 127.0.0.1 addresses
        Allow from 10., 127.0.0.1
        DenyAll
      </Limit>

It is easy to spoof the source address for UDP packets, however. So it is far better (and more secure) to use a firewall to restrict which UDP packets can reach the `mod_snmp` address/port.

Logging
The `mod_snmp` module supports different forms of logging. The main module logging is done via the `SNMPLog` directive. For debugging purposes, the module also uses trace logging, via the module-specific log channels:

- snmp
- snmp.asn1
- snmp.db
- snmp.mib
- snmp.msg
- snmp.notify
- snmp.pdu
- snmp.smi

Thus for trace logging, to aid in debugging, you would use the following in your `proftpd.conf`:

      TraceLog /path/to/snmp-trace.log
      Trace snmp:20

This trace logging can generate large files; it is intended for debugging use only, and should be removed from any production configuration.

`mod_snmp` OIDs
Note that all `mod_snmp` OIDs begin with 1.3.6.1.4.1.17852.2.2. The `ProFTPD` column in the table below contains the ProFTPD versions where the OID is present.

OID | Name | Type | `ProFTPD` | Description
*.1.1.0 | daemon.software | STRING | 1.3.4rc3+ | Always "proftpd"
*.1.2.0 | daemon.version | STRING | 1.3.4rc3+ | Version of `proftpd`
*.1.3.0 | daemon.admin | STRING | 1.3.4rc3+ | Administrative contact, i.e. the `ServerAdmin`
*.1.4.0 | daemon.uptime | TimeTicks | 1.3.4rc3+ | Uptime of the `proftpd` daemon
*.1.5.0 | daemon.vhostCount | INTEGER | 1.3.4rc3+ | Number of vhosts (including "server config") configured
*.1.6.0 | daemon.connectionCount | Gauge32 | 1.3.4rc3+ | Number of current connections
*.1.7.0 | daemon.connectionTotal | Counter32 | 1.3.4rc3+ | Total number of connections since daemon started
*.1.8.0 | daemon.connectionRefusedTotal | Counter32 | 1.3.4rc3+ | Total number of connections refused
*.1.9.0 | daemon.restartCount | Counter32 | 1.3.4rc3+ | Total number of times daemon has been restarted
*.1.10.0 | daemon.segfaultCount | Counter32 | 1.3.4rc3+ | Total number of `SIGSEGV` occurrences
*.1.11.0 | daemon.maxInstancesLimitCount | Counter32 | 1.3.4rc3+ | Total number of times `MaxInstances` reached
*.2.1.0 | timeouts.idleTimeoutTotal | Counter32 | 1.3.4rc3+ | Total number of times `TimeoutIdle` was reached
*.2.2.0 | timeouts.loginTimeoutTotal | Counter32 | 1.3.4rc3+ | Total number of times `TimeoutLogin` was reached
*.2.3.0 | timeouts.noTransferTimeoutTotal | Counter32 | 1.3.4rc3+ | Total number of times `TimeoutNoTransfer` was reached
*.2.4.0 | timeouts.stalledTimeoutTotal | Counter32 | 1.3.4rc3+ | Total number of times `TimeoutStalled` was reached
*.3.1.1.0 | ftp.sessions.sessionCount | Gauge32 | 1.3.4rc3+ | Number of current FTP sessions
*.3.1.2.0 | ftp.sessions.sessionTotal | Counter32 | 1.3.4rc3+ | Total number of FTP sessions handled
*.3.1.3.0 | ftp.sessions.commandInvalidTotal | Counter32 | 1.3.4rc3+ | Total number of invalid FTP commands received
*.3.2.1.0 | ftp.logins.loginTotal | Counter32 | 1.3.4rc3+ | Total number of successful FTP logins
*.3.2.2.0 | ftp.logins.loginFailedTotal | Counter32 | 1.3.4rc3+ | Total number of failed FTP logins
*.3.2.3.0 | ftp.logins.loginBadUserTotal | Counter32 | 1.3.4rc3+ | Total number of failed FTP logins due to bad/wrong user name
*.3.2.4.0 | ftp.logins.loginBadPasswordTotal | Counter32 | 1.3.4rc3+ | Total number of failed FTP logins due to bad password
*.3.2.5.0 | ftp.logins.loginGeneralErrorTotal | Counter32 | 1.3.4rc3+ | Total number of failed FTP logins due to config/other issues
*.3.2.6.0 | ftp.logins.anonLoginCount | Gauge32 | 1.3.4rc3+ | Number of current anonymous FTP logins
*.3.2.7.0 | ftp.logins.anonLoginTotal | Counter32 | 1.3.4rc3+ | Total number of anonymous FTP logins
*.3.3.1.0 | ftp.dataTransfers.dirListCount | Gauge32 | 1.3.4rc3+ | Number of directories currently being listed via FTP
*.3.3.2.0 | ftp.dataTransfers.dirListTotal | Counter32 | 1.3.4rc3+ | Total number of directories listed via FTP
*.3.3.3.0 | ftp.dataTransfers.dirListFailedTotal | Counter32 | 1.3.4rc3+ | Total number of directory list failures via FTP
*.3.3.4.0 | ftp.dataTransfers.fileUploadCount | Gauge32 | 1.3.4rc3+ | Number of files currently being uploaded via FTP
*.3.3.5.0 | ftp.dataTransfers.fileUploadTotal | Counter32 | 1.3.4rc3+ | Total number of files uploaded via FTP
*.3.3.6.0 | ftp.dataTransfers.fileUploadFailedTotal | Counter32 | 1.3.4rc3+ | Total number of file upload failures via FTP
*.3.3.7.0 | ftp.dataTransfers.fileDownloadCount | Gauge32 | 1.3.4rc3+ | Number of files currently being downloaded via FTP
*.3.3.8.0 | ftp.dataTransfers.fileDownloadTotal | Counter32 | 1.3.4rc3+ | Total number of files downloaded via FTP
*.3.3.9.0 | ftp.dataTransfers.fileDownloadFailedTotal | Counter32 | 1.3.4rc3+ | Total number of file download failures via FTP
*.3.3.10.0 | ftp.dataTransfers.kbUploadTotal | Counter32 | 1.3.4rc3+ | Total number of KB uploaded via FTP
*.3.3.11.0 | ftp.dataTransfers.kbDownloadTotal | Counter32 | 1.3.4rc3+ | Total number of KB downloaded via FTP
*.4.1.0 | snmp.packetsReceivedTotal | Counter32 | 1.3.4rc3+ | Total number of SNMP packets received
*.4.2.0 | snmp.packetsSentTotal | Counter32 | 1.3.4rc3+ | Total number of SNMP packets sent
*.4.3.0 | snmp.trapsSentTotal | Counter32 | 1.3.4rc3+ | Total number of SNMP traps/notifications sent
*.4.4.0 | snmp.packetsAuthFailedTotal | Counter32 | 1.3.4rc3+ | Total number of SNMP packets failing authentication check
*.4.5.0 | snmp.packetsDroppedTotal | Counter32 | 1.3.4rc3+ | Total number of SNMP packets dropped
*.5.1.1.0 | ftps.tlsSessions.sessionCount | Gauge32 | 1.3.4rc3+ | Number of current FTPS sessions
*.5.1.2.0 | ftps.tlsSessions.sessionTotal | Counter32 | 1.3.4rc3+ | Total number of FTPS sessions handled
*.5.1.3.0 | ftps.tlsSessions.ctrlHandshakeFailedTotal | Counter32 | 1.3.5rc1+ | Total number of failed control connection SSL/TLS handshakes
*.5.1.4.0 | ftps.tlsSessions.dataHandshakeFailedTotal | Counter32 | 1.3.5rc1+ | Total number of failed data connection SSL/TLS handshakes
*.5.1.5.0 | ftps.tlsSessions.clearCommandChannelTotal | Counter32 | 1.3.4rc3+ | Total number of successful CCC (Clear Command Channel) FTP commands
*.5.1.6.0 | ftps.tlsSessions.clearCommandChannelFailedTotal | Counter32 | 1.3.4rc3+ | Total number of failed CCC (Clear Command Channel) FTP commands
*.5.1.7.0 | ftps.tlsSessions.verifyClientTotal | Counter32 | 1.3.5rc2+ | Total number of successful client cert verifications
*.5.1.8.0 | ftps.tlsSessions.verifyClientFailedTotal | Counter32 | 1.3.4rc3+ | Total number of failed client cert verifications
*.5.2.1.0 | ftps.tlsLogins.loginTotal | Counter32 | 1.3.4rc3+ | Total number of successful FTPS logins
*.5.2.2.0 | ftps.tlsLogins.loginFailedTotal | Counter32 | 1.3.4rc3+ | Total number of failed FTPS logins
*.5.2.3.0 | ftps.tlsLogins.loginBadUserTotal | Counter32 | 1.3.4rc3+ | Total number of failed FTPS logins due to bad/wrong user name
*.5.2.4.0 | ftps.tlsLogins.loginBadPasswordTotal | Counter32 | 1.3.4rc3+ | Total number of failed FTPS logins due to bad password
*.5.2.5.0 | ftps.tlsLogins.loginGeneralErrorTotal | Counter32 | 1.3.4rc3+ | Total number of failed FTPS logins due to config/other issues
*.5.2.6.0 | ftps.tlsLogins.loginCertTotal | Counter32 | 1.3.4rc3+ | Total number of FTPS logins succeeding due to the client cert (e.g. AllowDotLogin `TLSOption`, `TLSUserName`, etc)
*.5.3.1.0 | ftps.tlsDataTransfers.dirListCount | Gauge32 | 1.3.4rc3+ | Number of directories currently being listed via FTPS
*.5.3.2.0 | ftps.tlsDataTransfers.dirListTotal | Counter32 | 1.3.4rc3+ | Total number of directories listed via FTPS
*.5.3.3.0 | ftps.tlsDataTransfers.dirListFailedTotal | Counter32 | 1.3.4rc3+ | Total number of directory list failures via FTPS
*.5.3.4.0 | ftps.tlsDataTransfers.fileUploadCount | Gauge32 | 1.3.4rc3+ | Number of files currently being uploaded via FTPS
*.5.3.5.0 | ftps.tlsDataTransfers.fileUploadTotal | Counter32 | 1.3.4rc3+ | Total number of files uploaded via FTPS
*.5.3.6.0 | ftps.tlsDataTransfers.fileUploadFailedTotal | Counter32 | 1.3.4rc3+ | Total number of file upload failures via FTPS
*.5.3.7.0 | ftps.tlsDataTransfers.fileDownloadCount | Gauge32 | 1.3.4rc3+ | Number of files currently being downloaded via FTPS
*.5.3.8.0 | ftps.tlsDataTransfers.fileDownloadTotal | Counter32 | 1.3.4rc3+ | Total number of files downloaded via FTPS
*.5.3.9.0 | ftps.tlsDataTransfers.fileDownloadFailedTotal | Counter32 | 1.3.4rc3+ | Total number of file download failures via FTPS
*.5.3.10.0 | ftps.tlsDataTransfers.kbUploadTotal | Counter32 | 1.3.4rc3+ | Total number of KB uploaded via FTPS
*.5.3.11.0 | ftps.tlsDataTransfers.kbDownloadTotal | Counter32 | 1.3.4rc3+ | Total number of KB downloaded via FTPS
*.6.1.1.0 | ssh.sshSessions.keyExchangeFailedTotal | Counter32 | 1.3.4c+ | Total number of SSH2 key exchange failures
*.6.1.2.0 | ssh.sshSessions.clientCompressionTotal | Counter32 | 1.3.4c+ | Total number of SSH2 sessions using client-to-server compression
*.6.1.3.0 | ssh.sshSessions.serverCompressionTotal | Counter32 | 1.3.4c+ | Total number of SSH2 sessions using server-to-client compression
*.6.2.1.0 | ssh.sshLogins.hostbasedAuthTotal | Counter32 | 1.3.4c+ | Total number of SSH2 hostbased authentications
*.6.2.2.0 | ssh.sshLogins.hostbasedAuthFailedTotal | Counter32 | 1.3.4c+ | Total number of failed SSH2 hostbased authentications
*.6.2.3.0 | ssh.sshLogins.keyboardInteractiveAuthTotal | Counter32 | 1.3.4c+ | Total number of SSH2 keyboard-interactive authentications
*.6.2.4.0 | ssh.sshLogins.keyboardInteractiveAuthFailedTotal | Counter32 | 1.3.4c+ | Total number of failed SSH2 keyboard-interactive authentications
*.6.2.5.0 | ssh.sshLogins.passwordAuthTotal | Counter32 | 1.3.4c+ | Total number of SSH2 password authentications
*.6.2.6.0 | ssh.sshLogins.passwordAuthFailedTotal | Counter32 | 1.3.4c+ | Total number of failed SSH2 password authentications
*.6.2.7.0 | ssh.sshLogins.publickeyAuthTotal | Counter32 | 1.3.4c+ | Total number of SSH2 publickey authentications
*.6.2.8.0 | ssh.sshLogins.publickeyAuthFailedTotal | Counter32 | 1.3.4c+ | Total number of failed SSH2 publickey authentications
*.7.1.1.0 | sftp.sftpSessions.sessionCount | Gauge32 | 1.3.4c+ | Number of current SFTP sessions
*.7.1.2.0 | sftp.sftpSessions.sessionTotal | Counter32 | 1.3.4c+ | Total number of SFTP sessions handled
*.7.2.1.0 | sftp.sftpDataTransfers.dirListCount | Gauge32 | 1.3.4rc3+ | Number of directories currently being listed via SFTP
*.7.2.2.0 | sftp.sftpDataTransfers.dirListTotal | Counter32 | 1.3.4rc3+ | Total number of directories listed via SFTP
*.7.2.3.0 | sftp.sftpDataTransfers.dirListFailedTotal | Counter32 | 1.3.4rc3+ | Total number of directory list failures via SFTP
*.7.2.4.0 | sftp.sftpDataTransfers.fileUploadCount | Gauge32 | 1.3.4rc3+ | Number of files currently being uploaded via SFTP
*.7.2.5.0 | sftp.sftpDataTransfers.fileUploadTotal | Counter32 | 1.3.4rc3+ | Total number of files uploaded via SFTP
*.7.2.6.0 | sftp.sftpDataTransfers.fileUploadFailedTotal | Counter32 | 1.3.4rc3+ | Total number of file upload failures via SFTP
*.7.2.7.0 | sftp.sftpDataTransfers.fileDownloadCount | Gauge32 | 1.3.4rc3+ | Number of files currently being downloaded via SFTP
*.7.2.8.0 | sftp.sftpDataTransfers.fileDownloadTotal | Counter32 | 1.3.4rc3+ | Total number of files downloaded via SFTP
*.7.2.9.0 | sftp.sftpDataTransfers.fileDownloadFailedTotal | Counter32 | 1.3.4rc3+ | Total number of file download failures via SFTP
*.7.2.10.0 | sftp.sftpDataTransfers.kbUploadTotal | Counter32 | 1.3.4rc3+ | Total number of KB uploaded via SFTP
*.7.2.11.0 | sftp.sftpDataTransfers.kbDownloadTotal | Counter32 | 1.3.4rc3+ | Total number of KB downloaded via SFTP
*.8.1.1.0 | scp.scpSessions.sessionCount | Gauge32 | 1.3.4c+ | Number of current SCP sessions
*.8.1.2.0 | scp.scpSessions.sessionTotal | Counter32 | 1.3.4c+ | Total number of SCP sessions handled
*.8.2.1.0 | scp.scpDataTransfers.fileUploadCount | Gauge32 | 1.3.4rc3+ | Number of files currently being uploaded via SCP
*.8.2.2.0 | scp.scpDataTransfers.fileUploadTotal | Counter32 | 1.3.4rc3+ | Total number of files uploaded via SCP
*.8.2.3.0 | scp.scpDataTransfers.fileUploadFailedTotal | Counter32 | 1.3.4rc3+ | Total number of file upload failures via SCP
*.8.2.4.0 | scp.scpDataTransfers.fileDownloadCount | Gauge32 | 1.3.4rc3+ | Number of files currently being downloaded via SCP
*.8.2.5.0 | scp.scpDataTransfers.fileDownloadTotal | Counter32 | 1.3.4rc3+ | Total number of files downloaded via SCP
*.8.2.6.0 | scp.scpDataTransfers.fileDownloadFailedTotal | Counter32 | 1.3.4rc3+ | Total number of file download failures via SCP
*.8.2.7.0 | scp.scpDataTransfers.kbUploadTotal | Counter32 | 1.3.4rc3+ | Total number of KB uploaded via SCP
*.8.2.8.0 | scp.scpDataTransfers.kbDownloadTotal | Counter32 | 1.3.4rc3+ | Total number of KB downloaded via SCP
*.9.1.1.0 | ban.connections.connectionBannedTotal | Counter32 | 1.3.5rc2+ | Total number of connections rejected by bans
*.9.1.2.0 | ban.connections.userBannedTotal | Counter32 | 1.3.5rc2+ | Total number of connections rejected by user-specific bans
*.9.1.3.0 | ban.connections.hostBannedTotal | Counter32 | 1.3.5rc2+ | Total number of connections rejected by host-specific bans
*.9.1.4.0 | ban.connections.classBannedTotal | Counter32 | 1.3.5rc2+ | Total number of connections rejected by class-specific bans
*.9.2.1.0 | ban.bans.banCount | Gauge32 | 1.3.5rc2+ | Total number of bans currently in effect
*.9.2.2.0 | ban.bans.banTotal | Counter32 | 1.3.5rc2+ | Total number of bans that were ever in effect
*.9.2.3.0 | ban.bans.userBanCount | Gauge32 | 1.3.5rc2+ | Total number of user-specific bans currently in effect
*.9.2.4.0 | ban.bans.userBanTotal | Counter32 | 1.3.5rc2+ | Total number of user-specific bans that were ever in effect
*.9.2.5.0 | ban.bans.hostBanCount | Gauge32 | 1.3.5rc2+ | Total number of host-specific bans currently in effect
*.9.2.6.0 | ban.bans.hostBanTotal | Counter32 | 1.3.5rc2+ | Total number of host-specific bans that were ever in effect
*.9.2.7.0 | ban.bans.classBanCount | Gauge32 | 1.3.5rc2+ | Total number of class-specific bans currently in effect
*.9.2.8.0 | ban.bans.classBanTotal | Counter32 | 1.3.5rc2+ | Total number of class-specific bans that were ever in effect

SNMP MIB
The MIB provided for `proftpd` is distributed with the `mod_snmp` module source code, and will be installed by default. It is contained in the "PROFTPD-MIB.txt" file, and uses SMIv2.

Suggested Future Features
The following lists the features I hope to add to `mod_snmp`, according to need, demand, inclination, and time:

- AgentX support
- SNMPv3 support
- Controls support (e.g. for "ftpdctl snmp" action)

Notifications
The `mod_snmp` module supports sending notifications (via SNMP traps) whenever certain events occur or conditions are met. Note that only SNMPv2 traps are generated; there is currently no support for SNMPv1 traps.

Currently supported notifications:

- `MaxInstances` limit exceeded
- Failed FTP login due to bad/wrong password
- Failed FTP login due to bad/unknown user name

To enable notifications, simply configure the address of an SNMP manager that should be notified via the `SNMPNotify` directive.

Frequently Asked Questions
Question: How can I query the `mod_snmp` Agent process?
Answer: You can test if your `proftpd` supports SNMP with the `snmpwalk` program (`snmpwalk` is a part of the `Net-SNMP` project). Note that you have to specify the SNMP port, which in `mod_snmp` is configured via the `SNMPAgent` directive.

For example, you might try:

      # snmpwalk -m /path/to/PROFTPD-MIB.txt -v2c -Cc -c communitystring hostname:161 .1.3.6.1.4.1.17852.2.2

If it gives output like:

      enterprises.proftpd.modules.snmp.daemon.software = proftpd
      enterprises.proftpd.modules.snmp.daemon.softwareVersion = ProFTPD Version 1.3.4rc4 (built at Sat Oct 22 2011 11:50:38 PDT)
      enterprises.proftpd.modules.snmp.daemon.admin = root@127.0.0.1

or

      PROFTPD-MIB::software.0 = String: proftpd
      PROFTPD-MIB::softwareVersion.0 = STRING: ProFTPD Version 1.3.4rc4 (built at Sat Oct 22 2011 11:50:38 PDT)
      PROFTPD-MIB::admin.0 = STRING: root@127.0.0.1

or

      SNMPv2-SMI::enterprises.17852.2.2.1.1.0 = STRING: "proftpd"
      SNMPv2-SMI::enterprises.17852.2.2.1.2.0 = STRING: "ProFTPD Version 1.3.4rc4 (built at Sat Oct 22 2011 11:50:38 PDT)"
      SNMPv2-SMI::enterprises.17852.2.2.1.3.0 = STRING: "root@127.0.0.1"

then your `proftpd` was compiled with the `mod_snmp` module and it is working properly; you should be able to make nice statistics out of it.

Question: Why doesn't the `scp.scpDataTransfers` arc have any directory listing counters/gauges, such as the `ftp.dataTransfers` and `sftp.sftpDataTransfers` arcs do?
Answer: The SCP protocol does not have the ability to get just a directory listing; the protocol only transfers files.

© Copyright 2011-2017 TJ Saunders
All Rights Reserved