invsという調査に使えるリクエストを標準出力に表示させるサーバーを作りました

invsというリクエストを標準出力に表示させるサーバーを作ってみました。

なぜこれを作ったのかというと

今までAWSのサーバーなどでロードバランサーやCloudFrontを経由して来たリクエストをncコマンドで確認していたのですがncコマンドは何でもできて便利な一方、リクエストを見たいだけでも指定コマンドが複雑で毎回調べていたので簡単に使えるようにしました。

また、ヘルスチェックなど見たくない標準出力を表示しないようにする機能やリバースプロキシの機能もつけて便利にデバッグできるようにしました。

インストール方法

goの環境が入っている場合は以下のようにインストールできます。

go get github.com/kozakana/invs

クロスコンパイル

サーバーにgoの環境がない場合はMacなど手元の環境でクロスコンパイルしてscpなどで送ります。

今回AmazonLinux2で試したので以下の様にgoの環境がある場所でbuildして使用しています。

GOOS=linux GOARCH=amd64 go build

オプション

-p

サーバーを起動するポートを指定できます。

# invs -p 9999

--filter-url

指定した文字列が含まれるURLのみリクエストを表示します。

# invs --filter-url

--exclude-url

指定した文字列が含まれるURLはリクエストを表示しません。

# invs --exclude-url health

/healthcheckなどのアクセスは表示されません(レスポンスは200で返します)

--proxy-host

リバースプロキシ先のhostとポートを指定できます。

# invs --proxy-host 172.31.24.126:80

リクエストを見る

AWS環境を使って実際に試してみました。Chromeからリクエストを送っています。

*IPアドレスなど一部を伏せています

起動

今回は80番ポートで起動します。

sudo ./invs -p 80

直接リクエスト

GET / HTTP/1.1
Host: 13.231.xxx.xxx
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36


GET /favicon.ico HTTP/1.1
Host: 13.231.xxx.xxx
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Connection: keep-alive
Referer: http://13.231.xxx.xxx/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36

ロードバランサー(ALB)経由でのリクエスト

+-----+    +-----+
| ALB |    | EC2 |
|     | => |     |
+-----+    +-----+

Connectionヘッダーがなくなり、X-Amzn-Trace-Id X-Forwarded-For X-Forwarded-Port X-Forwarded-Protoのヘッダーが追加されているのがわかります。

GET / HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
X-Amzn-Trace-Id: Root=1-5ce60a98-1c4a3ce6c9b337f447e8bea0
X-Forwarded-For: 110.4.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http


GET /favicon.ico HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Referer: http://test-1968106xxx.ap-northeast-1.elb.amazonaws.com/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
X-Amzn-Trace-Id: Root=1-5ce60a98-ec6c0ab6ad2e1bbe3b0924b2
X-Forwarded-For: 110.4.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http

CloudFront->ロードバランサー(ALB)経由でのリクエスト

+-----+    +-----+    +-----+
|Cloud|    | ALB |    | EC2 |
|Front| => |     | => |     |
+-----+    +-----+    +-----+

CloudFrontからのリクエストの場合はConnectionヘッダーがなくなり、Via X-Amz-Cf-Id X-Amzn-Trace-Id X-Forwarded-For X-Forwarded-Port X-Forwarded-Protoのヘッダーが追加されていました。

GET / HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept-Encoding: gzip
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Amazon CloudFront
Via: 1.1 456e40d63981bdbeea319544611f7xxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: vqi1HWM1PVDoL0EUOIh_ccXIHHU93n4i10FpfhY1UQ3tNrYKUEmDrw==
X-Amzn-Trace-Id: Root=1-5ce60cce-e1d500985d90ce8c60e172f0
X-Forwarded-For: 110.4.xxx.xxx, 52.46.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http


GET /favicon.ico HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept-Encoding: gzip
User-Agent: Amazon CloudFront
Via: 1.1 456e40d63981bdbeea319544611f7xxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: UGmqGqRdOfG3r-DY9zrWjgW4rcD-IAd0hGqkz5oIz6At415A7-r_1g==
X-Amzn-Trace-Id: Root=1-5ce60ccf-52f82d2a8b638fc2e9ce0f62
X-Forwarded-For: 110.4.xxx.xxx, 52.46.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http

ロードバランサーからのヘルスチェック

ヘルスチェックのURLは/healthcheckにしています。

GET /healthcheck HTTP/1.1
Host: 172.31.xxx.xxx
Connection: close
Accept-Encoding: gzip, compressed
Connection: close
User-Agent: ELB-HealthChecker/2.0

ヘルスチェックを表示したくない場合は--exclude-urlのオプションを使って

# invs --exclude-url healthcheck

のようにすれば表示されなくなります。

リバースプロキシ

sudo ./invs -p 80 --proxy-host 172.31.24.126:80

proxy-hostオプションを指定することで指定先のサーバーに転送できます。

+-----+    +-----+    +-----+    +-----+
|Cloud|    | ALB |    | EC2 |    | EC2 |
|Front| => |     | => |Proxy| => |     |
+-----+    +-----+    +-----+    +-----+
                              172.31.24.126:80
GET / HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept-Encoding: gzip
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Amazon CloudFront
Via: 1.1 914d96cee7bcce13e9c9de2002a9axxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: jE2_4A_rTuVWIcCdU-x-J6pwsUwVda0Ml8zbLgeGBVP8oqAn-N5t_Q==
X-Amzn-Trace-Id: Root=1-5ce66ae0-b59f60647d100e20be5a8a3c
X-Forwarded-For: 110.4.xxx.xxx, 52.46.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http


GET /favicon.ico HTTP/1.1
Host: test-1968106xxx.ap-northeast-1.elb.amazonaws.com
Accept-Encoding: gzip
User-Agent: Amazon CloudFront
Via: 1.1 914d96cee7bcce13e9c9de2002a9axxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: wCFCKHmjJq7x8ZP4zPUYQsdG8DO5wKdfhPe4F1FyXk_Ch5YIi64A3w==
X-Amzn-Trace-Id: Root=1-5ce66ae0-62608948eb971d37a4ad10b5
X-Forwarded-For: 110.4.xxx.xxx, 52.46.xxx.xxx
X-Forwarded-Port: 80
X-Forwarded-Proto: http