Почему не работает haproxy tcp при прокси через себя - PullRequest
1 голос
/ 08 января 2020

Чтобы обойти проверки работоспособности, где требуется SNI при использовании TCP, у меня есть следующее, какие виды работ

listen website
  bind :10003
  mode tcp

  server website_proxy_aws localhost:14001  check fall 3 rise 2
  server website_proxy_dc  localhost:14002  check fall 3 rise 2

listen website_proxy_aws
  bind :14001
  mode tcp
  option httpchk HEAD / HTTP/1.1\r\nHost:\ website-lb.domain.com
  server website_proxy_svc_aws internal-alb.eu-west-1.elb.amazonaws.com:80 check sni req.hdr(Host) verify none fall 3 rise 2 weight 2

listen website_proxy_do
  bind :14002
  mode tcp
  option httpchk HEAD  / HTTP/1.1\r\nHost:\ website-lb.domain.com
  server ivendiwebsite_proxy_svc_dc do-website-lb.domain.com:443 check ssl sni req.hdr(Host) verify none  fall 3 rise 2 weight 2

Теперь, если website_proxy_do не работает, он кажется красным для слушателя website_proxy_do в страница статистики. Но слушатель website кажется зеленым для обоих.

Я думаю, что есть простое объяснение того, что я делаю здесь неправильно.

(я знаю, что в этом примере я Можно использовать одно прослушивание, так как хост одинаков для обоих. Мне просто интересно, почему слушатель веб-сайта предположительно выполняет проверку tcp, но не может подтвердить, что неработающий сайт не работает)

1 Ответ

0 голосов
/ 14 января 2020

Я понял, на что ты смотришь. Прежде чем ответить, я хотел бы добавить, как я воспроизвел проблему, чтобы легко было сказать, что мы находимся на одной странице.

Это мои слушатели HAProxy, реплицированные аналогично тому, что вы сделали.

listen port_33306
   bind :33306
   mode tcp
   server local-tunnel localhost:23306 check


listen port_23306
   bind :23306
   mode tcp
   server mysql-tunnel localhost:13306 check

Я туннелировал MySQL, работающий на Авроре, используя socat на порте 13306, это очень помогло бы понять, в чем проблема.

Так вот как это выглядит

localhost:33306 => localhost:23306 => localhost:13306 => myaurora.aws-aurora-blah-blah.com:3306

Прямо сейчас, вот как выглядит мой netstat

robot@proxy:~$ netstat -tulpn
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name                    
tcp        0      0 0.0.0.0:13306           0.0.0.0:*               LISTEN      3465/socat          
tcp        0      0 0.0.0.0:23306           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:33306           0.0.0.0:*               LISTEN      -                   

А вот так выглядит моя haproxy?stats страница.

enter image description here

Теперь я переношу этот socat туннель TCP-порта 13306 в Аврору, так как вы сказали, что он нарушит поток и покажет слушателю port_23306 красным на моей странице haproxy?stats, потому что порт 13306 больше не существует.

enter image description here

Итак, пока здесь у нас нет аналогичных выходов, а теперь вопрос в том, почему слушатель port_33306 остается зеленым, а port_23306 не проверяет.

Сейчас это то, что мой * 10 40 * выглядит так.

robot@proxy:~$ netstat -tulpn
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name                    
tcp        0      0 0.0.0.0:23306           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:33306           0.0.0.0:*               LISTEN      -                   

Как вы можете видеть, туннель socat для порта 13306 не существует, так как я убил процесс, и слушатель проверяет localhost:13306. Даже если соединение не существует, HAProxy оставил привязку порта открытой, оставив порт 23306 для связи, если я запустил туннель, он, очевидно, снова станет зеленым, не перезапуская мой HAProxy.

Из-за этого 23306 открыт, и слушатель в port_33306, который связывает порт 33306 с localhost:23306, проверяет только на 23306 и не выполняет более глубоких проверок дерева, если 23306 подключен к какому-либо процессу или нет ,

Следовательно, мы можем видеть слушателя port_33306 все еще зеленым, поскольку он проверяет порт 23306, и пока слушатель port_23306 красный, поскольку привязка 23306 открыта и готова к подключению к чему-либо но проверка выполняется на порту 13306, который не открыт, поэтому проверки работоспособности проходят для порта 23306, но не для 13306.

Трудно объяснить в точных терминах и все, но я попробовал.

Надеюсь, это поможет.

...