ngrep - Linux用のネットワークパケットアナライザ


ある[ Ngrep ネットワークgrep )は、シンプルでありながら強力なネットワークパケットアナライザです。それはネットワーク層に適用されたgrepのようなツールです - それはネットワークインターフェースを通過するトラフィックと一致します。これを使用すると、パケットのデータペイロード(送信データ内の実際の情報またはメッセージだが自動生成されたメタデータではない)と照合するための拡張正規表現または16進表現を指定できます。

このツールは、IPv4/6、TCP、UDP、ICMPv4/6、IGMP、さらに多くのインターフェース上のRawなど、さまざまな種類のプロトコルで動作します。 tcpdumpパケットスニッフィングツールと同じように動作します。

パッケージ ngrep は、図に示すように、パッケージ管理ツールを使用して、主流のLinuxディストリビューションのデフォルトのシステムリポジトリからインストールできます。

$ sudo apt install ngrep
$ sudo yum install ngrep
$ sudo dnf install ngrep

ngrep をインストールしたら、次の例を参考にしてLinuxネットワーク上のトラフィックの分析を開始できます。

1. 次のコマンドを使用すると、デフォルトの作業用インターフェースですべてのpingリクエストを照合できます。別の端末を開いて別のリモートマシンにpingを試行する必要があります。 -q フラグは ngrep に静かに動作し、パケットヘッダーとそのペイロード以外の情報を出力しないように指示します。

$ sudo ngrep -q '.' 'icmp'

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ( icmp ) and ((ip || ip6) || (vlan && (ip || ip6)))
match: .

I 192.168.0.104 -> 192.168.0.103 8:0
  ]...~oG[....j....................... !"#$%&'()*+,-./01234567                                                                                                             

I 192.168.0.103 -> 192.168.0.104 0:0
  ]...~oG[....j....................... !"#$%&'()*+,-./01234567                                                                                                             

I 192.168.0.104 -> 192.168.0.103 8:0
  ]....oG[............................ !"#$%&'()*+,-./01234567                                                                                                             

I 192.168.0.103 -> 192.168.0.104 0:0
  ]....oG[............................ !"#$%&'()*+,-./01234567  

終了するには Ctrl + C を押します。

2. 特定のリンク先サイト、たとえば 'google.com' に向かうトラフィックのみを照合するには、次のコマンドを実行してからブラウザからアクセスします。

$ sudo ngrep -q '.' 'host google.com'

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ( host google.com ) and ((ip || ip6) || (vlan && (ip || ip6)))
match: .

T 172.217.160.174:443 -> 192.168.0.103:54008 [AP]
  ..................;.(...RZr..$....s=..l.Q+R.U..4..g.j..I,.l..:{y.a,....C{5>[email protected]                                                                       

T 172.217.160.174:443 -> 192.168.0.103:54008 [AP]
  .............l.......!,0hJ....0.%F..!...l|.........PL..X...t..T.2DC..... ..y...~Y;[email protected]

3. ウェブを閲覧している場合は、次のコマンドを実行してブラウザが要求しているファイルを監視します。

$ sudo ngrep -q '^GET .* HTTP/1.[01]'

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ((ip || ip6) || (vlan && (ip || ip6)))
match: ^GET .* HTTP/1.[01]

T 192.168.0.104:43040 -> 172.217.160.174:80 [AP]
  GET / HTTP/1.1..Host: google.com..User-Agent: Links (2.13; Linux 4.17.6-1.el7.elrepo.x86_64 x86_64; 
  GNU C 4.8.5; text)..Accept: */*..Accept-Language: en,*;q=0.1..Accept-
  Encoding: gzip, deflate, bzip2..Accept-Charset: us-ascii,ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4,
  ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,ISO-8859-9,ISO-8859-10,I
  SO-8859-13,ISO-8859-14,ISO-8859-15,ISO-8859-16,windows-1250,windows-1251,windows-1252,windows-1256,
  windows-1257,cp437,cp737,cp850,cp852,cp866,x-cp866-u,x-mac,x-mac-ce,x-
  kam-cs,koi8-r,koi8-u,koi8-ru,TCVN-5712,VISCII,utf-8..Connection: keep-alive.... 

4. 送信元ポートまたは宛先ポートを通過するすべてのアクティビティを表示するには、 25 SMTP )、次のコマンドを実行します。

$ sudo ngrep port 25

5. ネットワークベースのsyslogトラフィックで“エラー” の発生を監視するには、次のコマンドを使用します。

 
$ sudo ngrep -d any 'error' port 514

重要なことに、このツールは“/etc/services” (LinuxなどのUnix系システムの場合)に保存されているサービスポート名をポート番号に変換できます。このコマンドは上記のコマンドと同等です。

$ sudo ngrep -d any 'error' port syslog

6. HTTP サーバー(ポート 80 )に対してngrepを実行することもできます。これは、表示されているようにすべてのリクエストを宛先ホストに一致させます。

$ sudo ngrep port 80

interface: eth0 (64.90.164.72/255.255.255.252)
filter: ip and ( port 80 )
####
T 67.169.59.38:42167 -> 64.90.164.74:80 [AP]
  GET / HTTP/1.1..User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i
  686) Opera 7.21  [en]..Host: www.darkridge.com..Accept: text/html, applicat
  ion/xml;q=0.9, application/xhtml+xml;q=0.9, image/png, image/jpeg, image/gi
  f, image/x-xbitmap, */*;q=0.1..Accept-Charset: iso-8859-1, utf-8, utf-16, *
  ;q=0.1..Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0..Cookie: SQ
  MSESSID=5272f9ae21c07eca4dfd75f9a3cda22e..Cookie2: $Version=1..Connection:
  Keep-Alive, TE..TE: deflate, gzip, chunked, identity, trailers....
##

上記の出力からわかるように、すべてのHTTPヘッダーの送信は非常に詳細に表示されています。解析は難しいので、 -W bylineモードを適用したときに何が起こるか見てみましょう。

$ sudo ngrep -W byline port 80

interface: eth0 (64.90.164.72/255.255.255.252)
filter: ip and ( port 80 )
####
T 67.169.59.38:42177 -> 64.90.164.74:80 [AP]
GET / HTTP/1.1.
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686) Opera ...
Host: www.darkridge.com.
Accept: text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9 ...
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1.
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0.
Cookie: SQMSESSID=5272f9ae21c07eca4dfd75f9a3cda22e.
Cookie2: $Version=1.
Cache-Control: no-cache.
Connection: Keep-Alive, TE.
TE: deflate, gzip, chunked, identity, trailers.

7. パケットが一致するたびに YYYY/MM/DD の形式でタイムスタンプを印刷するには -t フラグを使用してください。

$ sudo ngrep -t -W byline port 80

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ( port 80 ) and ((ip || ip6) || (vlan && (ip || ip6)))
####
T 2018/07/12 16:33:19.348084 192.168.0.104:43048 -> 172.217.160.174:80 [AP]
GET / HTTP/1.1.
Host: google.com.
User-Agent: Links (2.13; Linux 4.17.6-1.el7.elrepo.x86_64 x86_64; GNU C 4.8.5; text).
Accept: */*.
Accept-Language: en,*;q=0.1.
Accept-Encoding: gzip, deflate, bzip2.
Accept-Charset: us-ascii,ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4,ISO-8859-5,utf-8.
Connection: keep-alive.

8. 監視されているインターフェースを無差別モード(完全に到着する各ネットワークパケットを傍受して読み取るモード)にしないようにするには、 -p フラグを追加します。

$ sudo ngrep -p -W byline port 80

9. もう1つの重要なオプションは -N です。これは、未加工のプロトコルや未知のプロトコルを観察している場合に便利です。サブプロトコル番号と1文字の識別子を表示するように ngrep に指示します。

$ sudo ngrep -N -W byline

詳細については、 ngrep のmanページをご覧ください。

$ man ngrep

ngrep Githubリポジトリ:https://github.com/jpr5/ngrep

それで全部です!ある[ Ngrep ネットワークgrep )は、同じ方法でBPFフィルタロジックを理解するネットワークパケットアナライザですtcpdump。コメント欄に ngrep に関するご意見をお寄せください。