В какой-то момент 3-й в мире работный сайт начал периодически падать на несколько минут. Сюрпризом стало то, что в этот раз действительно из-за сети.
Для масштабирования сервисов и их взаимодействия между собой hh.ru использует внутренний балансировщик. Обработку 25 тыс. запросов в секунду обеспечивают 5 серверов с nginx. Обращение к этим серверам балансирует коммутатор.
Я расскажу, как мы расследовали серию инцидентов, которая была вызвана нарушением протокола TCP при балансировке. И что мы придумали, чтобы продолжить безнаказанно его нарушать.
20240507 QFM013 Machine Intelligence Reading List April 2024.pdf
Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые ловушки сервисной архитектуры
1. Как HeadHunter удалось
безопасно нарушить RFC 793 (TCP)
и обойти сетевые ловушки
сервисной архитектуры
Андрей Шорин
замдиректора эксплуатации
hh.ru
2.
3.
4.
5.
6.
7.
8. # 0 - no source validation
net.ipv4.conf.all.rp_filter=0
# 2 - always use the best local address for this target
net.ipv4.conf.all.arp_announce=2
# 1 - reply only if the target IP address is local
# address configured on the incoming interface
net.ipv4.conf.all.arp_ignore=1
9.
10. ip sla 1
tcp-connect 192.168.1.11 80 control disable
timeout 1000
threshold 1000
frequency 1
tag balancer1
ip sla schedule 1 life forever start-time now
11. ip route 10.1.1.1 255.255.255.255 192.168.1.11 track 1
track 1 ip sla 1 reachability
ip route 10.1.1.1 255.255.255.255 192.168.1.12 track 2
track 2 ip sla 2 reachability
20. Monit:
check program gw_ready with path /usr/local/bin/bfdd.sh
if status != 0 then alert
check process openbfdd with pidfile /var/run/openbfdd.pid
start program = "/sbin/start openbfdd"
stop program = "/sbin/stop openbfdd"
mode active
21. /usr/local/bin/bfdd.sh:
check_nginx_up() {
wget -qO /dev/null --timeout=1 —tries=1 http://127.0.0.1:80/nginx-satus
}
retval=0
if ! check_nginx_up; then
echo nginx is down >&2
retval=3
fi
if [ $retval -eq 0 ]; then
/usr/bin/pgrep bfdd-beacon || /usr/bin/monit -c /etc/monit/monitrc start openbfdd
else
/usr/bin/pgrep bfdd-beacon && /usr/bin/monit -c /etc/monit/monitrc stop openbfdd
fi