我正在尝试使用 ubuntu 18.04 在 amazon EC2 上设置透明 HAproxy 负载均衡器。我让 HAproxy 在非透明模式下工作,所以现在我尝试添加透明模式所需的更改,但出现了503 Service Unavailable No server is available to handle this request.
错误。
另一个问题是后端服务器位于另一个 EC2 帐户中。我之所以提到这一点,是因为我看到一些教程建议更改 VPC 配置、子网和路由表中的内容。在我的问题中,后端服务器和 HAproxy 不在同一个帐户中,因此肯定不在同一个子网/VPC 中。
我已在亚马逊 EC2 仪表板中禁用负载平衡器实例的“操作 > 网络 > 更改源/目标检查”。
代理服务器
# 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 损坏:
# 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 <[email protected]>
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
你知道我尝试做的事情是否可行吗?我遗漏了什么吗?如果您需要我添加更多信息,请告诉我
答案1
iptables -L -t mangle
•(现已修复)除非您要查找匹配的数据包计数器,否则不要这样做。与以下情况相比,这绝对不是人性化的输出:
iptables-save -t mangle
• 对于透明代理,有TRPOXY
目标。不确定您是否在使用它(“感谢” iptables -L
),但以防万一:看起来您错过了它。
•(现已修复)我在您提供的摘录中找不到“透明绑定”。请查看haproxy 透明模式下的官方手册:
前端 ft_application 绑定 1.1.1.1:80 透明
• 您正在使用备用路由表,但其中是否安装了任何路由?
答案2
透明模式需要 HAproxy 服务器作为后端服务器的网关。
后端服务器看到来自客户端 IP 的数据包,因此它们通过默认网关(互联网)进行响应。
当HAproxy作为网关时,它将拦截互联网数据包并进行透明代理。