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と3に基づいてスクリプトを設定するために使用されますawk。次に、からスクリプトを実行します。これは変換されます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

21つのプロトコル番号に変更したい場合ははるかにIGMP簡単です。

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

awkスクリプトは正規表現検索と代替規則を使用して、以下のように約50行を生成します。すべての既知のプロトコルに対して1つずつ/etc/protocols

関連情報