特定IPからの通信をログから抽出(grep)する

# はじめに
apacheやvsftpdのログをgrepして、特定のIPからの通信が発生しているか確かめたい。
`grep -wF <IP> logfile`が鉄則。

# 準備
ログのサンプルとして、以下を用意。apacheの`/var/log/httpd/access_log`を一部改変。
```:access_log
123.123.123.123 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
123.123.123.111 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
123.123.123.1 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
```

# 特定IPからの通信をgrep 
* `123.123.123.123`からの通信をgrep
* `-w`：単語単位で検索　が重要。
    * `-w`をつけ忘れると、`123.123.123.111`とか`123.123.123.123`まで引っかかってしまう。
* `-F`で正規表現を無効化。
    * これはつけ忘れてもうまくいってしまうこともある

```
[ec2-user@ip-xxx-xxx-xxx-xxx log_bk]$ grep -wF 123.123.123.1  access_log
123.123.123.1 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
```

* (参考１) : `-w`をつけ忘れたときの挙動。
    * `123.123.123.1`をgrepしたつもりが、余計な`123.123.123.111`とか`123.123.123.123`まで引っかかってしまう。
```
[ec2-user@ip-xxx-xxx-xxx-xxx log_bk]$ grep -F 123.123.123.1  access_log
123.123.123.123 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
123.123.123.111 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
123.123.123.1 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
```

* (参考２) : `-F`をつけ忘れたときの挙動
    * 実は`-F`をつけていなくてもうまく抽出されている・・・ように見えるが、内部的には
      `123.123.123.1`→`123(任意一文字)123(任意一文字)123(任意一文字)1`と解釈されていることに注意。
      `-F`もつけておいた方が無難。
```
[ec2-user@ip-xxx-xxx-xxx-xxx log_bk]$ grep -w 123.123.123.1  access_log
123.123.123.1 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
```

# (蛇足)調べたいIPが複数ある時

まず、抽出したいIPアドレスのリストを準備する。
```:ip.list
123.123.123.123
123.123.123.1
```

### ①単にfor文で回す
* 簡単だが、ip.listの行数 * access_logの行数で検索するので、ip_listの量が多い時は不向き。
```
[ec2-user@ip-xxx-xxx-xxx-xxx log_bk]$ for i in `cat ip.list`; do grep -wF $i access_log; done
123.123.123.123 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
123.123.123.1 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
```

### ②or条件 でgrepする
* `grep -wF -e 123.123.123.123 -e 123.123.123.1 access_log`とする。
* ①よりは負荷が少ない。
* ip.listから`-e 123.123.123.123 -e 123.123.123.1`を生成する方法はいくらでもあるが、無理やりsedでやる場合は以下。
    * `sed 's/^/-e /g'` で各行頭に`-e `をつけてから、`tr '\n' ' '`で改行を削る。



```
[ec2-user@ip-xxx-xxx-xxx-xxx log_bk]$ cat ip.list | sed 's/^/-e /g' | tr '\n' ' '
-e 123.123.123.123 -e 123.123.123.1 [ec2-user@ip-xxx-xxx-xxx-xxx log_bk]$ cat ip.list | sed 's/^/-e /g' | tr '\n' ' ' > param
[ec2-user@ip-xxx-xxx-xxx-xxx log_bk]$ grep -wF `cat param` access_log
123.123.123.123 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
123.123.123.1 - - [24/Feb/2022:10:03:34 +0000] "GET /favicon.ico HTTP/1.1" 404 196 "http://999.999.999.999:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
```