应用|创建SNMPEngineID的小工具

Posted by 琉璃康康 on February 25, 2023

2023年2月25日日出

学习永无止境,记录相伴相随!

—— 琉璃康康

为什么要写这个工具?

是因为在做K8s(Kubernetes)项目的时候遇到了告警监控的问题。

背景就是如果一个业务是走K8s Primary network,会发生一次SNAT,将发出去的包的原地址SNAT成对应worker上的接口IP。

然而一般来说snmp client需要定义的是业务地址,而不是某一个worker的地址,如果snmp client只通过IP层的原地址来判定这个数据的来源,就会出现混淆,导致snmp的数据解析有问题。

那么一个很好的解决方案就是在snmp server上定义一个叫做snmpEngineID的参数作为其唯一标识,然后snmp client如果支持这个engineID的解析就可以唯一区分不同的snmp server信息,做正确的数据解析了。

那么engineID要怎么定义呢?如果是一个随机的ID是否可以被snmp client识别呢?答案是不确定,要看snmp client具体实现,是可以直接定义一个engineID还是从一个有规律的engineID中自动检测。

如果是从一个有规律的engineID中自动检测,就需要有一定的行业规范。RFC3411给出了很明确的定义,截取了最高bit位为1的Item 3规则如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
左右滑动
1) The very first bit is used to indicate how the rest of the data is composed.
    0 - as defined by enterprise using former methods that existed before SNMPv3. See item 2 below.
    1 - as defined by this architecture, see item 3 below.
3) The length of the octet string varies.
    The first four octets are set to the binary equivalent of the agent's SNMP management private enterprise number as assigned by the Internet Assigned Numbers Authority (IANA).
    For example, if Acme Networks has been assigned{ enterprises 696 }, the first four octets wouldbe assigned '000002b8'H.
    The very first bit is set to 1. For example, the above value for Acme Networks now changes to be '800002b8'H.
    The fifth octet indicates how the rest (6th and following octets) are formatted. The values for the fifth octet are:
        0     - reserved, unused.
        1     - IPv4 address (4 octets) lowest non-special IP address
        2     - IPv6 address (16 octets) lowest non-special IP address
        3     - MAC address (6 octets)lowest IEEE MAC address, canonical order
        4     - Text, administratively assigned Maximum remaining length 27
        5     - Octets, administratively assigned Maximum remaining length 27
        6-127 - reserved, unused
        128-255 - as defined by the enterprise Maximum remaining length 27
    SYNTAX       OCTET STRING (SIZE(5..32))

规则说的挺清楚,分三块儿:

  • IANA分配的Privite Enterprise Number转换成占有前四个八位字节的字符串后最高位再置为1。
  • 第五个八位字节定义了第六位和之后的数据格式
  • 从第六位的八位字节到最后一个就是具体的engine ID Data,根据第五位会有不同的定义,因此长度可变,最终导致一个engine ID的八位字节长度从5到32。

规则清楚算起来还是要颇费周章的,所以就应运而生了这个小软件,取名为SeiFor:S——SNMP, E——Engine,I——ID,For——Format。

SeiFor将三大块儿规则做了格式化自动计算,然后在任何一个输入窗口输入的时候就自动检测三个条件,一旦满足就在Result里生成对应的engineID:

如果有任何错误或者不匹配的输入,都会在result里提示错误信息,如:

  • PEN不为空且必须为整数,目前没有规定必须是IANA分配的区间,具体值可以通过超链接打开IANA网站查询。。
  • 三个必须参数不能为空。
  • Engine ID Data是根据Format来判断是否正确,比如Format选择了IPv4,Data里的每一行都必须是一个IPv4,否则对应行就会有错误提示。

然后从主窗口可以打开About窗口,有简单的软件介绍,同时可以通过关注公众号(qiheyehk)来反馈任何的问题。

最后是一个snmp的测试结果,可以看到wireshark抓包正确解析engine ID:

如何获取这个应用?

以上!


网络和应用

摄影和旅行

工作和生活

欢迎关注公众号:七禾页话(qiheyehk)