On Tue, 2021-06-15 at 17:39 +0100, Stuart Henderson wrote:
> > > > - if the concern is amplification attacks then setting the minlevel to
> > > > authpriv is too high, since you'll silently break logins for users
> > > > that miss the enckey parameter.
> > > > I changed this to always default to seclevel auth.
> > >
> > > I do still think enc is the safer default (i.e. "the user has to do
> > > something to weaken things") though I don't strongly object to auth
> > > instead of enc.
> >
> > I agree that it's safer, but do we want to break the config of more
> > people than needed for the goal of preventing simple amplification
> > attacks?
>
> Can we take a straw poll of readers of this email who are using SNMPv3
> (if any ;-) -- are you using auth+enc, just auth, or no authentication?
> I'm thinking that somebody who went to the trouble of using v3
> probably uses auth+enc though I could be wrong..
Since the limited of people that responded all responded with auth+enc
and you prefer to go with auth+enc I've updated the diff.
>
> > Then again, I don't get the feeling many people use snmpd at this time
> > and maybe it's a good moment to bite the bullet and go for safest
> > defaults possible at this time. But if that's the case I would like to
> > follow up with a diff to changes the default auth to hmac-sha512,
> > because snmp drops trailing bytes of the result and enc to aes instead
> > of des.
>
> This is the change that feels most likely to affect existing SNMPv3 users.
> Support in management software beyond aes/sha1 is a bit lacking and prone
> to incompatibility (I had issues with net-snmp and snmpd using hmac-sha256
> though it seems it will work with hmac-sha512..)
>
> > > and i'll try to have another read through and actually test it
> > > in the morning :)
> > >
> > Hopefully you haven't spend too much on a second read.
>
> didn't get there yet, i have spent the best part of 8 hours on 2 emails
> so far today ;)
>
> > | READWRITE DISABLED {
> > - conf->sc_readonly = 1;
> > + /* XXX Remove after 7.0 */
> > + conf->sc_rwcommunity[0] = '\0';
> > + log_warnx("'read-write disabled' is deprecated");
>
> if it's going, might as well just disable it? almost nobody will react
> to that warning unless it refuses to start, it's not like this will
> lock someone out of their machine if it doesn't run.
Fair enough. Removed in new diff.
>
> > +.It Ic write
> > +Specifies if the listen address accepts set requests.
> > +.It Ic notify
> > +Specifies if the listen address accepts trapv1 and trapv2 requests.
> > +.It Ic snmpv1
> > +Enables SNMPv1 subsystem on the listen address.
> > +.It Ic snmpv2c
> > +Enables SNMPv2c subsystem on the listen address.
> > +.It Ic snmpv3
> > +Enables SNMPv3 subsystem on the listen address.
>
> I like this! I guess we could also do
>
> listen on 127.0.0.1 snmpv2c read
> listen on 0.0.0.0 read
> listen on :: read
> read-only community public
>
> to allow localhost requests with v2c for quick lookups and require
> something better on the network.
>
> I'll do some testing and get back to you.
>
I didn't change the example, since the example below shows how to set
up snmpv3 and this example's accompanying text is already on the long
side. I did change the text a little to "for SNMPv2c messages only",
so that it's clearer that this does disable snmpv3.
OK?
martijn@
Index: usr.sbin/snmpd/parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/parse.y,v
retrieving revision 1.63
diff -u -p -r1.63 parse.y
--- usr.sbin/snmpd/parse.y 22 Jan 2021 06:33:26 -0000 1.63
+++ usr.sbin/snmpd/parse.y 20 Jun 2021 10:08:00 -0000
@@ -120,10 +120,10 @@ typedef struct {
%}
%token INCLUDE
-%token LISTEN ON READ WRITE NOTIFY
+%token LISTEN ON READ WRITE NOTIFY SNMPV1 SNMPV2 SNMPV3
%token SYSTEM CONTACT DESCR LOCATION NAME OBJECTID SERVICES RTFILTER
%token READONLY READWRITE OCTETSTRING INTEGER COMMUNITY TRAP RECEIVER
-%token SECLEVEL NONE AUTH ENC USER AUTHKEY ENCKEY ERROR DISABLED
+%token SECLEVEL NONE AUTH ENC USER AUTHKEY ENCKEY ERROR
%token HANDLE DEFAULT SRCADDR TCP UDP PFADDRFILTER PORT
%token <v.string> STRING
%token <v.number> NUMBER
@@ -216,9 +216,6 @@ main : LISTEN ON listenproto
}
free($3);
}
- | READWRITE DISABLED {
- conf->sc_readonly = 1;
- }
| TRAP COMMUNITY STRING {
if (strlcpy(conf->sc_trcommunity, $3,
sizeof(conf->sc_trcommunity)) >=
@@ -287,6 +284,9 @@ listenopts : /* empty */ { $$ = 0; }
listenopt : READ { $$ = ADDRESS_FLAG_READ; }
| WRITE { $$ = ADDRESS_FLAG_WRITE; }
| NOTIFY { $$ = ADDRESS_FLAG_NOTIFY; }
+ | SNMPV1 { $$ = ADDRESS_FLAG_SNMPV1; }
+ | SNMPV2 { $$ = ADDRESS_FLAG_SNMPV2; }
+ | SNMPV3 { $$ = ADDRESS_FLAG_SNMPV3; }
;
listen_udp : STRING port listenopts {
@@ -295,7 +295,8 @@ listen_udp : STRING port listenopts {
char *port = $2;
if (port == NULL) {
- if ($3 == ADDRESS_FLAG_NOTIFY)
+ if (($3 & ADDRESS_FLAG_PERM) ==
+ ADDRESS_FLAG_NOTIFY)
port = SNMPTRAP_PORT;
else
port = SNMP_PORT;
@@ -328,7 +329,8 @@ listen_tcp : STRING port listenopts {
char *port = $2;
if (port == NULL) {
- if ($3 == ADDRESS_FLAG_NOTIFY)
+ if (($3 & ADDRESS_FLAG_PERM) ==
+ ADDRESS_FLAG_NOTIFY)
port = SNMPTRAP_PORT;
else
port = SNMP_PORT;
@@ -711,7 +713,6 @@ lookup(char *s)
{ "contact", CONTACT },
{ "default", DEFAULT },
{ "description", DESCR },
- { "disabled", DISABLED},
{ "enc", ENC },
{ "enckey", ENCKEY },
{ "filter-pf-addresses", PFADDRFILTER },
@@ -733,6 +734,9 @@ lookup(char *s)
{ "receiver", RECEIVER },
{ "seclevel", SECLEVEL },
{ "services", SERVICES },
+ { "snmpv1", SNMPV1 },
+ { "snmpv2c", SNMPV2 },
+ { "snmpv3", SNMPV3 },
{ "source-address", SRCADDR },
{ "string", OCTETSTRING },
{ "system", SYSTEM },
@@ -1102,7 +1106,10 @@ parse_config(const char *filename, u_int
struct sockaddr_storage ss;
struct sym *sym, *next;
struct address *h;
- int found;
+ struct trap_address *tr;
+ const struct usmuser *up;
+ const char *errstr;
+ int found;
if ((conf = calloc(1, sizeof(*conf))) == NULL) {
log_warn("%s", __func__);
@@ -1112,10 +1119,8 @@ parse_config(const char *filename, u_int
conf->sc_flags = flags;
conf->sc_confpath = filename;
TAILQ_INIT(&conf->sc_addresses);
- strlcpy(conf->sc_rdcommunity, "public", SNMPD_MAXCOMMUNITYLEN);
- strlcpy(conf->sc_rwcommunity, "private", SNMPD_MAXCOMMUNITYLEN);
- strlcpy(conf->sc_trcommunity, "public", SNMPD_MAXCOMMUNITYLEN);
TAILQ_INIT(&conf->sc_trapreceivers);
+ conf->sc_min_seclevel = SNMP_MSGFLAG_AUTH | SNMP_MSGFLAG_PRIV;
if ((file = pushfile(filename, 0)) == NULL) {
free(conf);
@@ -1141,6 +1146,10 @@ parse_config(const char *filename, u_int
if (listen_add(&ss, SOCK_DGRAM, 0) == -1)
fatal("calloc");
}
+
+ if ((up = usm_check_mincred(conf->sc_min_seclevel, &errstr)) != NULL)
+ fatalx("user '%s': %s", up->uu_name, errstr);
+
found = 0;
TAILQ_FOREACH(h, &conf->sc_addresses, entry) {
if (h->flags & ADDRESS_FLAG_NOTIFY)
@@ -1157,6 +1166,16 @@ parse_config(const char *filename, u_int
return (NULL);
}
+ if (conf->sc_trcommunity[0] == '\0') {
+ TAILQ_FOREACH(tr, &conf->sc_trapreceivers, entry) {
+ if (tr->sa_community == NULL) {
+ log_warnx("trap receiver: missing community");
+ free(conf);
+ return (NULL);
+ }
+ }
+ }
+
/* Free macros and check which have not been used. */
TAILQ_FOREACH_SAFE(sym, &symhead, entry, next) {
if ((conf->sc_flags & SNMPD_F_VERBOSE) && !sym->used)
@@ -1299,12 +1318,14 @@ listen_add(struct sockaddr_storage *ss,
h->port = ntohs(sin6->sin6_port);
}
h->type = type;
- if ((h->flags = flags) == 0) {
+ if (((h->flags = flags) & ADDRESS_FLAG_PERM) == 0) {
if (h->port == 162)
- h->flags = ADDRESS_FLAG_NOTIFY;
+ h->flags |= ADDRESS_FLAG_NOTIFY;
else
- h->flags = ADDRESS_FLAG_READ | ADDRESS_FLAG_WRITE;
+ h->flags |= ADDRESS_FLAG_READ | ADDRESS_FLAG_WRITE;
}
+ if ((h->flags & ADDRESS_FLAG_MPS) == 0)
+ h->flags |= ADDRESS_FLAG_SNMPV3;
TAILQ_INSERT_TAIL(&(conf->sc_addresses), h, entry);
return 0;
Index: usr.sbin/snmpd/snmpd.conf.5
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/snmpd.conf.5,v
retrieving revision 1.48
diff -u -p -r1.48 snmpd.conf.5
--- usr.sbin/snmpd/snmpd.conf.5 14 Jun 2021 12:28:58 -0000 1.48
+++ usr.sbin/snmpd/snmpd.conf.5 20 Jun 2021 10:08:00 -0000
@@ -95,20 +95,30 @@ Routing table information will not be av
reduced during bulk updates.
The default is
.Ic no .
-.It Ic listen on Oo Ic tcp | udp Oc Ar address Oo Ic port Ar port Oc Op Ic
read | Ic write | Ic notify
+.It Ic listen on Oo Ic tcp | udp Oc Ar address Oo Ic port Ar port Oc Op Ar
flags
Specify the local address
.Xr snmpd 8
should listen on for incoming SNMP messages.
+.Pp
The
-.Ic read
-flag specifies if the listen address accepts get, getnext and bulkget
+.Ar flags
+are as follows:
+.Bl -tag -width Ds
+.It Ic read
+Specifies if the listen address accepts get, getnext and bulkget
requests.
-The
-.Ic write
-flag specifies if the listen address accepts set requests
-and the
-.Ic notify
-flag specifies if the listen address accepts trapv1 and trapv2 requests.
+.It Ic write
+Specifies if the listen address accepts set requests.
+.It Ic notify
+Specifies if the listen address accepts trapv1 and trapv2 requests.
+.It Ic snmpv1
+Enables SNMPv1 subsystem on the listen address.
+.It Ic snmpv2c
+Enables SNMPv2c subsystem on the listen address.
+.It Ic snmpv3
+Enables SNMPv3 subsystem on the listen address.
+.El
+.Pp
Multiple
.Ic listen on
statements are supported.
@@ -118,17 +128,19 @@ The default
.Ar port
is 161, unless
.Ic notify
-is the only listen flags
-which sets the
+is the only permission flag; which sets the
.Ar port
to 162.
-If no flags are specified it defaults to
+If no permission flags are specified it defaults to
.Dq Ic read Ic write ,
or
.Ic notify
when
.Ar port
is 162.
+If no subsystem flags are specified it defaults to
+.Ic snmpv3 .
+.Pp
Having
.Ic notify
set requires at least one
@@ -136,35 +148,27 @@ set requires at least one
statement.
.It Ic read-only community Ar string
Specify the name of the read-only community.
-The default value is
-.Ar public .
-.It Ic read-write Pq Ic community Ar string Ic | disabled
+There is no default value.
+.It Ic read-write Ic community Ar string
Specify the name of the read-write community, or disallow writes completely.
-The default value is
-.Ar private .
+There is no default value.
.It Ic seclevel Pq Ic none | auth | enc
Specify the lowest security level that
.Xr snmpd 8
-accepts:
+accepts on SNMPv3:
.Bl -tag -width "auth" -offset ident
.It Ic none
Both authentication and encryption of messages is optional.
-This is the default value.
.It Ic auth
Authentication of messages is mandatory.
.Xr snmpd 8
will discard any messages that don't have a valid digest.
Encryption of messages is optional.
+This is the default value.
.It Ic enc
Messages must be encrypted and must have a valid digest for authentication.
Otherwise they will be discarded.
.El
-.Pp
-If the chosen value is different from
-.Ic none
-.Xr snmpd 8
-will accept only SNMPv3 requests since older versions neither support
-authentication nor encryption.
.It Ic system contact Ar string
Specify the name or description of the system contact, typically a
name or an email address.
@@ -206,8 +210,7 @@ description in the SNMP MIB for details.
.\"XXX describe the complicated services alg here
.It Ic trap community Ar string
Specify the name of the trap community.
-The default value is
-.Ar public .
+There is no default value.
.It Ic trap handle Ar oid Qq Ar command
Execute
.Ic command
@@ -326,10 +329,12 @@ Example configuration file.
.Sh EXAMPLES
The following example will tell
.Xr snmpd 8
-to listen on localhost, override the default system OID, set the
-magic services value and provides some custom OID values:
+to listen on localhost for SNMPv2c messages only with the public community,
+override the default system OID, set the magic services value and provides some
+custom OID values:
.Bd -literal -offset indent
-listen on 127.0.0.1
+listen on 127.0.0.1 snmpv2c
+read-only community public
system oid 1.3.6.1.4.1.30155.23.2
system services 74
Index: usr.sbin/snmpd/snmpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/snmpd.h,v
retrieving revision 1.95
diff -u -p -r1.95 snmpd.h
--- usr.sbin/snmpd/snmpd.h 20 May 2021 08:53:12 -0000 1.95
+++ usr.sbin/snmpd/snmpd.h 20 Jun 2021 10:08:00 -0000
@@ -498,9 +498,16 @@ struct address {
};
TAILQ_HEAD(addresslist, address);
-#define ADDRESS_FLAG_READ 0x1
-#define ADDRESS_FLAG_WRITE 0x2
-#define ADDRESS_FLAG_NOTIFY 0x4
+#define ADDRESS_FLAG_READ 0x01
+#define ADDRESS_FLAG_WRITE 0x02
+#define ADDRESS_FLAG_NOTIFY 0x04
+#define ADDRESS_FLAG_PERM \
+ (ADDRESS_FLAG_READ | ADDRESS_FLAG_WRITE | ADDRESS_FLAG_NOTIFY)
+#define ADDRESS_FLAG_SNMPV1 0x10
+#define ADDRESS_FLAG_SNMPV2 0x20
+#define ADDRESS_FLAG_SNMPV3 0x40
+#define ADDRESS_FLAG_MPS \
+ (ADDRESS_FLAG_SNMPV1 | ADDRESS_FLAG_SNMPV2 | ADDRESS_FLAG_SNMPV3)
struct trap_address {
struct sockaddr_storage ss;
@@ -576,7 +583,6 @@ struct snmpd {
int sc_pfaddrfilter;
int sc_min_seclevel;
- int sc_readonly;
int sc_traphandler;
struct privsep sc_ps;
@@ -740,6 +746,7 @@ struct ber_element *usm_encode(struct sn
struct ber_element *usm_encrypt(struct snmp_message *, struct ber_element *);
void usm_finalize_digest(struct snmp_message *, char *, ssize_t);
void usm_make_report(struct snmp_message *);
+const struct usmuser *usm_check_mincred(int, const char **);
/* proc.c */
enum privsep_procid
Index: usr.sbin/snmpd/snmpe.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/snmpe.c,v
retrieving revision 1.71
diff -u -p -r1.71 snmpe.c
--- usr.sbin/snmpd/snmpe.c 20 May 2021 08:53:12 -0000 1.71
+++ usr.sbin/snmpd/snmpe.c 20 Jun 2021 10:08:01 -0000
@@ -254,19 +254,31 @@ snmpe_parse(struct snmp_message *msg)
msg->sm_version = ver;
switch (msg->sm_version) {
case SNMP_V1:
+ if (!(msg->sm_aflags & ADDRESS_FLAG_SNMPV1)) {
+ msg->sm_errstr = "SNMPv1 disabled";
+ goto badversion;
+ }
case SNMP_V2:
- if (env->sc_min_seclevel != 0)
+ if (msg->sm_version == SNMP_V2 &&
+ !(msg->sm_aflags & ADDRESS_FLAG_SNMPV2)) {
+ msg->sm_errstr = "SNMPv2c disabled";
goto badversion;
+ }
if (ober_scanf_elements(a, "seS$", &comn, &msg->sm_pdu) != 0)
goto parsefail;
if (strlcpy(msg->sm_community, comn,
- sizeof(msg->sm_community)) >= sizeof(msg->sm_community)) {
+ sizeof(msg->sm_community)) >= sizeof(msg->sm_community) ||
+ msg->sm_community[0] == '\0') {
stats->snmp_inbadcommunitynames++;
- msg->sm_errstr = "community name too long";
+ msg->sm_errstr = "invalid community name";
goto fail;
}
break;
case SNMP_V3:
+ if (!(msg->sm_aflags & ADDRESS_FLAG_SNMPV3)) {
+ msg->sm_errstr = "SNMPv3 disabled";
+ goto badversion;
+ }
if (ober_scanf_elements(a, "{iisi$}e",
&msg->sm_msgid, &msg->sm_max_msg_size, &flagstr,
&msg->sm_secmodel, &a) != 0)
@@ -295,9 +307,9 @@ snmpe_parse(struct snmp_message *msg)
msg->sm_ctxname[len] = '\0';
break;
default:
- badversion:
+ msg->sm_errstr = "unsupported snmp version";
+badversion:
stats->snmp_inbadversions++;
- msg->sm_errstr = "bad snmp version";
goto fail;
}
@@ -332,8 +344,7 @@ snmpe_parse(struct snmp_message *msg)
}
if (msg->sm_version != SNMP_V3 &&
strcmp(env->sc_rdcommunity, msg->sm_community) != 0 &&
- (env->sc_readonly ||
- strcmp(env->sc_rwcommunity, msg->sm_community) != 0)) {
+ strcmp(env->sc_rwcommunity, msg->sm_community) != 0) {
stats->snmp_inbadcommunitynames++;
msg->sm_errstr = "wrong read community";
goto fail;
@@ -347,8 +358,7 @@ snmpe_parse(struct snmp_message *msg)
goto fail;
}
if (msg->sm_version != SNMP_V3 &&
- (env->sc_readonly ||
- strcmp(env->sc_rwcommunity, msg->sm_community) != 0)) {
+ strcmp(env->sc_rwcommunity, msg->sm_community) != 0) {
if (strcmp(env->sc_rdcommunity, msg->sm_community) != 0)
stats->snmp_inbadcommunitynames++;
else
@@ -498,16 +508,13 @@ snmpe_parsevarbinds(struct snmp_message
stats->snmp_intotalreqvars++;
break;
case SNMP_C_SETREQ:
- if (snmpd_env->sc_readonly == 0) {
- /*
- * XXX A set varbind should only be committed if
- * all variables are staged
- */
- if (mps_setreq(msg, value, &o) == 0) {
- /* XXX Adjust after fixing staging */
- stats->snmp_intotalsetvars++;
- break;
- }
+ /*
+ * XXX A set varbind should only be committed if
+ * all variables are staged
+ */
+ if (mps_setreq(msg, value, &o) == 0) {
+ stats->snmp_intotalsetvars++;
+ break;
}
msg->sm_error = SNMP_ERROR_READONLY;
goto varfail;
Index: usr.sbin/snmpd/usm.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/usm.c,v
retrieving revision 1.19
diff -u -p -r1.19 usm.c
--- usr.sbin/snmpd/usm.c 20 May 2021 08:53:12 -0000 1.19
+++ usr.sbin/snmpd/usm.c 20 Jun 2021 10:08:01 -0000
@@ -177,6 +177,27 @@ usm_newuser(char *name, const char **err
return up;
}
+const struct usmuser *
+usm_check_mincred(int minlevel, const char **errstr)
+{
+ struct usmuser *up;
+
+ if (minlevel == 0)
+ return NULL;
+
+ SLIST_FOREACH(up, &usmuserlist, uu_next) {
+ if (minlevel & SNMP_MSGFLAG_PRIV && up->uu_privkey == NULL) {
+ *errstr = "missing enckey";
+ return up;
+ }
+ if (minlevel & SNMP_MSGFLAG_AUTH && up->uu_authkey == NULL) {
+ *errstr = "missing authkey";
+ return up;
+ }
+ }
+ return NULL;
+}
+
struct usmuser *
usm_finduser(char *name)
{
Index: regress/usr.sbin/snmpd/snmpd.sh
===================================================================
RCS file: /cvs/src/regress/usr.sbin/snmpd/snmpd.sh,v
retrieving revision 1.13
diff -u -p -r1.13 snmpd.sh
--- regress/usr.sbin/snmpd/snmpd.sh 22 Jan 2021 06:35:26 -0000 1.13
+++ regress/usr.sbin/snmpd/snmpd.sh 20 Jun 2021 10:08:01 -0000
@@ -64,14 +64,19 @@ echo "\nConfiguration: default community
cat > ${OBJDIR}/snmpd.conf <<EOF
# This is config template (1) for snmpd regression testing
# Restrict daemon to listen on localhost only
-listen on 127.0.0.1
-listen on 127.0.0.1 notify
-listen on ::1
-listen on ::1 notify
+listen on 127.0.0.1 snmpv1 snmpv2c snmpv3
+listen on 127.0.0.1 snmpv2c notify
+listen on ::1 snmpv1 snmpv2c snmpv3
+listen on ::1 snmpv2c notify
# Specify a number of trap receivers
trap receiver localhost
+# Specify communities
+read-only community public
+read-write community private
+trap community public
+
trap handle 1.2.3.4 "/usr/bin/touch ${TMPFILE}"
EOF
@@ -130,7 +135,7 @@ carp_allow="$(eval $snmp_command)"
carp_allow="${carp_allow##.1.3.6.1.4.1.30155.6.1.1.0 }"
if [ "$carp" -ne "$carp_allow" ]
then
- echo "Retrieval of carp.allow with default ro cummunity string failed."
+ echo "Retrieval of carp.allow with default ro community string failed."
FAILED=1
fi
@@ -258,8 +263,8 @@ boe="$(printf '\303')"
cat > ${OBJDIR}/snmpd.conf <<EOF
# This is config template (4) for snmpd regression testing
# Restrict daemon to listen on localhost only
-listen on 127.0.0.1
-listen on ::1
+listen on 127.0.0.1 snmpv1 snmpv2c
+listen on ::1 snmpv1 snmpv2c
read-only community non-default-ro
@@ -288,7 +293,7 @@ carp_allow="$(eval $snmp_command)"
carp_allow="${carp_allow##.iso.org.dod.internet.private.enterprises.openBSD.carpMIBObjects.carpSysctl.carpAllow.0
= }"
if [ "$carp" -ne "$carp_allow" ]
then
- echo "Retrieval test with default ro cummunity string failed."
+ echo "Retrieval test with default ro community string failed."
FAILED=1
fi
Index: regress/usr.bin/snmp/Makefile
===================================================================
RCS file: /cvs/src/regress/usr.bin/snmp/Makefile,v
retrieving revision 1.1
diff -u -p -r1.1 Makefile
--- regress/usr.bin/snmp/Makefile 9 Mar 2021 17:38:24 -0000 1.1
+++ regress/usr.bin/snmp/Makefile 20 Jun 2021 10:08:01 -0000
@@ -23,11 +23,14 @@ snmpd.conf: Makefile
printf 'listen_addr="127.0.0.1"\n' > snmpd.conf
printf 'listen6_addr="::1"\n\n' >> snmpd.conf
printf '# Restrict daemon to listen on localhost only\n' >> snmpd.conf
- printf 'listen on $$listen_addr\n' >> snmpd.conf
- printf 'listen on tcp $$listen_addr\n' >> snmpd.conf
- printf 'listen on $$listen6_addr\n' >> snmpd.conf
- printf 'listen on tcp $$listen6_addr\n' >> snmpd.conf
- printf 'listen on $$listen_addr notify\n\n' >> snmpd.conf
+ printf 'listen on $$listen_addr snmpv1 snmpv2c snmpv3\n' >> snmpd.conf
+ printf 'listen on tcp $$listen_addr snmpv1 snmpv2c snmpv3\n' >>
snmpd.conf
+ printf 'listen on $$listen6_addr snmpv1 snmpv2c snmpv3\n' >> snmpd.conf
+ printf 'listen on tcp $$listen6_addr snmpv1 snmpv2c snmpv3\n' >>
snmpd.conf
+ printf 'listen on $$listen_addr notify snmpv1 snmpv2c snmpv3\n\n' >>
snmpd.conf
+ printf 'read-only community public\n' >> snmpd.conf
+ printf 'read-write community private\n' >> snmpd.conf
+ printf 'trap community public\n\n' >> snmpd.conf
printf '# (ab)use sysContact for DisplayString (255a) testing\n' >>
snmpd.conf
printf 'system contact "Reyk Fl\303\266ter"\n' >> snmpd.conf
printf 'system services 74\n\n' >> snmpd.conf