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

Прозрачный HAproxy на ubuntu (amazon EC2)

Я пытаюсь настроить прозрачный балансировщик нагрузки HAproxy с помощью ubuntu 18.04 на amazon EC2. Я заставил HAproxy работать в непрозрачном режиме, поэтому сейчас я пытаюсь добавить изменения, необходимые для прозрачного режима, но получаю 503 Service Unavailable No server is available to handle this request. ошибка.

Дополнительная проблема заключается в том, что внутренние серверы находятся в другой учетной записи EC2. Я упоминаю об этом, потому что в каком-то учебном пособии, которое я видел, рассказывается об изменении конфигурации VPC, подсетей и таблиц маршрутизации. В моей проблеме внутренние серверы и HAproxy не находятся в одной учетной записи, поэтому определенно не в одной подсети / VPC.

Я отключил «Действия> Сеть> Проверить источник / адресат» для экземпляра балансировщика нагрузки на панели управления amazon EC2.

TPROXY

# grep TPROXY /boot/config-4.15.0-10*
/boot/config-4.15.0-1021-aws:CONFIG_NETFILTER_XT_TARGET_TPROXY=m
/boot/config-4.15.0-1031-aws:CONFIG_NETFILTER_XT_TARGET_TPROXY=m

Мне нужно было вручную активировать xt_TPROXY в ядре:

# sudo modprobe -v xt_TPROXY
insmod /lib/modules/4.15.0-1021-aws/kernel/net/netfilter/xt_TPROXY.ko

# lsmod | grep -i tproxy
xt_TPROXY              20480  0
nf_defrag_ipv6         36864  3 nf_conntrack_ipv6,xt_socket,xt_TPROXY
nf_defrag_ipv4         16384  3 xt_socket,nf_conntrack_ipv4,xt_TPROXY
x_tables               40960  10 iptable_mangle,ip_tables,iptable_filter,xt_mark,xt_socket,xt_TPROXY,xt_recent,ip6table_filter,xt_conntrack,ip6_tables

haproxy.cfg:

global
daemon
log /dev/log local4
maxconn 40000
ulimit-n 81000

defaults
log global
contimeout 4000
clitimeout 42000
srvtimeout 43000

listen http1
bind *:80 transparent
mode http
option http-server-close
option forwardfor
source 0.0.0.0 usesrc clientip
balance roundrobin
server http1_1 123.123.123.123:80 cookie http1_1 check inter 2000 rise 2 fall 3

Сеть:

# cat /proc/sys/net/ipv4/conf/lo/rp_filter
0
# sysctl net.ipv4.ip_nonlocal_bind
net.ipv4.ip_nonlocal_bind = 1
# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

iptable mangle:

# iptables-save -t mangle
# Generated by iptables-save v1.6.1 on Tue Jan  1 15:35:54 2019
*mangle
:PREROUTING ACCEPT [216:12398]
:INPUT ACCEPT [30415:1434643]
:FORWARD ACCEPT [12:608]
:OUTPUT ACCEPT [57979:5590669]
:POSTROUTING ACCEPT [57991:5591277]
:DIVERT - [0:0]
-A PREROUTING -p tcp -m socket -j DIVERT
-A DIVERT -j MARK --set-xmark 0x6f/0xffffffff
-A DIVERT -j ACCEPT
COMMIT

Версия HAproxy (скомпилирована с USE_LINUX_TPROXY):

# /usr/bin/haproxy -vv
HA-Proxy version 1.5-dev7 2011/09/10
Copyright 2000-2011 Willy Tarreau <w@1wt.eu>

Build options :
  TARGET  = linux26
  CPU     = generic
  CC      = gcc
  CFLAGS  = -O2 -g -fno-strict-aliasing
  OPTIONS = USE_LINUX_TPROXY=1 USE_STATIC_PCRE=1

Default settings :
  maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200

Encrypted password support via crypt(3): yes

Available polling systems :
     sepoll : pref=400,  test result OK
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result OK
Total: 4 (4 usable), will use sepoll.

Это результаты при запуске HAproxy с -d вариант. Регистрирует входящий запрос, но нет HTTP/1.1 200 OK ответ от внутреннего сервера, как в непрозрачном случае:

# /usr/bin/haproxy -d -f /etc/haproxy.cfg
Available polling systems :
     sepoll : pref=400,  test result OK
      epoll : pref=300,  test result OK
       poll : pref=200,  test result OK
     select : pref=150,  test result OK
Total: 4 (4 usable), will use sepoll.
Using sepoll() as the polling mechanism.
00000001:http1.accept(0004)=0006 from [111.222.333.111:54270]
00000002:http1.accept(0004)=0007 from [111.222.333.111:54269]
00000002:http1.clireq[0007:ffff]: GET /mytest.php HTTP/1.1
00000002:http1.clihdr[0007:ffff]: Host: example.com
00000002:http1.clihdr[0007:ffff]: Connection: keep-alive
00000002:http1.clihdr[0007:ffff]: Cache-Control: max-age=0
00000002:http1.clihdr[0007:ffff]: Upgrade-Insecure-Requests: 1
00000002:http1.clihdr[0007:ffff]: User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
00000002:http1.clihdr[0007:ffff]: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
00000002:http1.clihdr[0007:ffff]: Accept-Encoding: gzip, deflate
00000002:http1.clihdr[0007:ffff]: Accept-Language: en-US,en;q=0.9,he;q=0.8,es;q=0.7
00000001:http1.clicls[0006:ffff]
00000001:http1.closed[0006:ffff]

список правил IP

0:      from all lookup local
32765:  from all fwmark 0x6f lookup 100
32766:  from all lookup main
32767:  from all lookup default

Есть идеи, возможно ли то, что я пытаюсь сделать? Я что-нибудь упускаю? Если вам нужно, чтобы я добавил дополнительную информацию, дайте мне знать

iptables -L -t mangle

• (Исправлено) Не ​​делайте этого, если вы не ищете совпадающие счетчики пакетов. Это абсолютно не дружественный к человеку результат по сравнению с:

iptables-save -t mangle

• Для прозрачного прокси есть TRPOXY цель. Не уверен, используете ли вы его или нет (спасибо iptables -L) но на всякий случай: похоже, вам его не хватает.

• (Исправлено) Я не нахожу «прозрачной привязки» в приведенных вами отрывках. Проверьте официальное руководство по haproxy в прозрачном режиме:

frontend ft_application
  bind 1.1.1.1:80 transparent

• Вы используете альтернативную таблицу маршрутизации, но установлены ли в ней какие-либо маршруты?

Для прозрачного режима требуется, чтобы сервер HAproxy был шлюзом для внутренних серверов.

Внутренние серверы видят пакеты, поступающие с IP-адреса клиента, поэтому они отвечают через шлюз по умолчанию - Интернет.

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