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