Назад | Перейти на главную страницу

Как отфильтровать результаты tcpdump на основе отсутствующего заголовка?

Мой HAProxy добавляет «X-Proto: SSL» в качестве заголовка к запросам, которые отправляются через HTTPS.

Я хотел бы использовать tcpdump, чтобы увидеть заголовок Host: всех запросов, которые не иметь заголовок X-Proto: SSL.

Вот как выглядит с ним образец запроса (полученный с помощью sudo tcpdump -AA port 80):

14:06:48.834405 IP x.x.x.x.39989 > hostname.com.http: Flags [P.], seq 1:809, ack 1, win 58, length 808: HTTP: GET /req/?key=value&timeid=52989238 HTTP/1.1
..>........
...
.......GET /req/?key=value&timeid=52989238 HTTP/1.1
Host: r457.hostname.com
Origin: https://originhostname.com
User-Agent: Mozilla/5.0 (Linux; Android 8.1.0; TA-1044 Build/OPR1; wv) AppleWebKit/537 (KHTML, like Gecko) Version/4.0 Chrome/65 Mobile Safari/53;]
Accept: */*
Referer: https://originhostname.com/2018/
Accept-Encoding: gzip, deflate
Accept-Language: es-ES,es-MX;q=0.9,en-US;q=0.8
Cookie: cookieid
X-Requested-With: com.request.lite
X-Proto: SSL
X-Forwarded-For: x.x.x.x

Я хотел бы исключить это и видеть только вывод:

Host: r457.hostname.com

Если заголовок "X-Proto: SSL" не настоящее время.

Вот очень хитрое решение, которое я придумал, но все еще интересуюсь The Right Way ™:

cd /mnt
mkdir -p ngrep/no-ssl
cd ngrep/
sudo ngrep -qW byline port 80 > all-traffic
awk -v RS= '{print > ("request-" NR ".ngrep")}' all-traffic
mv all-traffic ../
for x in $(ls); do if [ $(grep -c 'X-Proto: SSL' $x) -eq 0 ]; then mv $x no-ssl/; fi; done
cd no-ssl/
for x in $(ls); do grep 'Host:' $x; done|sort|uniq