Я пытаюсь найти проблемный сервер, скрывающийся за виртуальным IP (используя LVS / ipvs). У меня есть тестовая программа, которая отправляет запросы на виртуальный IP-адрес до тех пор, пока не получит плохой ответ, но как я могу определить, на какой реальный IP-адрес был перенаправлен запрос на виртуальный IP-адрес?
На коробке, выполняющей магию виртуального IP, вот конфигурация виртуального IP (для службы, которая мне небезразлична):
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
...
TCP 10.1.0.254:5025 nq
-> 10.1.0.5:5025 Route 1 0 1
-> 10.1.0.6:5025 Route 1 0 5
-> 10.1.0.7:5025 Route 1 0 2
-> 10.1.0.9:5025 Local 1 0 3
-> 10.1.0.11:5025 Route 1 0 3
...
Моя клиентская программа отправляет TCP-запросы на 10.1.0.254:5025, обычно получая хороший ответ, но иногда и плохой. С этими несколькими серверами я мог бы отправлять свой запрос каждому серверу по очереди, пока не обнаружу виновника, но мне интересно, будет ли этот метод масштабироваться по мере добавления серверов. Какие существуют средства, позволяющие мне узнать, куда направляются запросы?
ipvsadm -Lcn
на LB (он же «директор») должен быть указан список ваших подключений. Grep для IP, который вы ищете.
Это довольно типичная проблема с IPVS / ldirectord, у вас есть несколько вариантов, чтобы попытаться решить эту проблему.
X-Served-by
или намек в приветственном заголовкеlogfile="/var/log/ldirectord.log"
в глобальных опцияхЛучше всего будет запустить tcpdump на реальных серверах, чтобы увидеть, куда идет ваш запрос.
Попался. LVS-TUN прослушивает виртуальный интерфейс на предмет адреса клиента, потому что пакеты инкапсулированы, вы не сможете идентифицировать пакет на основе IP-адреса пользователя.
$ tcpdump -i tunl0 хост USER_IP