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

Как найти реальный IP-адрес, на который IPVS направляет виртуальный IP-адрес

Я пытаюсь найти проблемный сервер, скрывающийся за виртуальным 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, у вас есть несколько вариантов, чтобы попытаться решить эту проблему.

  • Проверьте ведение журнала на целевых серверах в поисках запроса (не очень точно, но в большинстве случаев это покрывает счет)
  • Если ваш целевой сервер отвечает заголовками (например, apache или ftp), просто добавьте новый настраиваемый заголовок, например X-Served-by или намек в приветственном заголовке
  • Активируйте ведение журнала на ldirectord, ведение журнала немного неясно, но я уверен, что оно будет полезно, просто добавьте в свой ldirectord.cf logfile="/var/log/ldirectord.log" в глобальных опциях

Лучше всего будет запустить tcpdump на реальных серверах, чтобы увидеть, куда идет ваш запрос.

Попался. LVS-TUN прослушивает виртуальный интерфейс на предмет адреса клиента, потому что пакеты инкапсулированы, вы не сможете идентифицировать пакет на основе IP-адреса пользователя.

$ tcpdump -i tunl0 хост USER_IP