Ubuntu 上的透明 HAproxy(亚马逊 EC2)

Ubuntu 上的透明 HAproxy(亚马逊 EC2)

我正在尝试使用 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作为网关时,它将拦截互联网数据包并进行透明代理。

相关内容