如何使 iptables 日志通过名称而不是数字来识别协议?

如何使 iptables 日志通过名称而不是数字来识别协议?

在我的 iptables 日志文件(Ubuntu 16-04)中,来自 LAN 路由器和 LAN 中其他主机的与 IGMP 相关的所有消息都有“PROTO=2”。有没有办法改变这个并获得“PROTO=IGMP”?

答案1

sed -e "$(awk '/^[[:space:]]*(#|$)/ { next } ;
               { print "s/ PROTO="$2" / PROTO="$3" /;" }' \
          /etc/protocols)" /path/to/iptables.log

这用于根据文件的字段 2 和 3awk构造脚本。然后它在 上运行该脚本。这将转换sed/etc/protocolssed/path/to/iptables.log全部将日志文件中的协议编号为其相应的名称。

如果您愿意,您可以将脚本的输出保存awk到文件中(例如调用verbose-proto.sed然后运行它sed -f(甚至编辑它以添加#!/bin/sed -f为第一行并chmod使其可执行)。例如

$ awk '/^[[:space:]]*(#|$)/ { next } ;
     { print "s/ PROTO="$2" / PROTO="$3" /;" }' \
    /etc/protocols > ./verbose-proto.sed

$ printf "%s\n" 1 i '#!/bin/sed -f' . w | ed -s verbose-proto.sed
$ chmod +x ./verbose-proto.sed 
$ ./verbose-proto.sed /path/to/iptables.log

如果您只想将一个协议号更改2IGMP,则要简单得多:

sed -e 's/ PROTO=2 / PROTO=IGMP /' /path/to/iptables.log

(该awk脚本使用正则表达式搜索和替换规则生成大约 50 行,如下所示 - 对应 中的每个已知协议/etc/protocols

相关内容