TPROXY Não funciona com o HAProxy, Ubuntu 14.04

2

Estou tentando usar o HAProxy como um proxy totalmente transparente usando o TPROXY no Ubuntu 14.04. O HAProxy será configurado no primeiro servidor com eth0 111.111.250.250 e eth1 10.111.128.134 . O único servidor balanceado tem eth1 e eth0 também. eth0 é a interface de rede voltada para o público, enquanto eth1 é para a rede privada em que ambos os servidores estão.

Problema: Consigo me conectar diretamente à porta do servidor balanceado 1234 (via eth1 ), mas não consigo acessar o servidor balanceado via porta Haproxy 1234 (que redireciona para 1234 via %código%). Estou perdendo alguma coisa nessa configuração?

Removendo a linha eth0 de source 0.0.0.0 usesrc clientip , o haproxy funciona, mas não de forma transparente.

No servidor HAProxy

O kernel atual é /etc/haproxy/haproxy.cfg . 3.13.0-24-generic é usado, o que eu assumo suporta TPROXY mas não tenho certeza de como verificar.

O kernel parece ter suporte TPROXY:

# grep TPROXY /boot/config-3.13.0-24-generic 
CONFIG_NETFILTER_XT_TARGET_TPROXY=m

O HAProxy foi compilado com suporte TPROXY:

haproxy -vv
HA-Proxy version 1.5.3 2014/07/25
Copyright 2000-2014 Willy Tarreau <[email protected]>

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

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

Encrypted password support via crypt(3): yes
Built without zlib support (USE_ZLIB not set)
Compression algorithms supported : identity
Built without OpenSSL support (USE_OPENSSL not set)
Built with PCRE version : 8.31 2012-07-06
PCRE library supports JIT : no (USE_PCRE_JIT not set)
Built with transparent proxy support using: IP_TRANSPARENT IPV6_TRANSPARENT IP_FREEBIND

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

Em iptables v1.4.21 , configurei uma porta para ter as seguintes opções:

listen test1235 :1234
    mode tcp
    option tcplog
    balance leastconn
    source 0.0.0.0 usesrc clientip

    server balanced1 10.111.163.76:1234 check inter 5s rise 2 fall 4 weight 4

As seguintes regras /etc/haproxy/haproxy.cfg foram adicionadas

iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 111
iptables -t mangle -A DIVERT -j ACCEPT
ip rule add fwmark 111 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
sudo ip route flush cache

e

echo 1 >/proc/sys/net/ipv4/ip_forward

No servidor balanceado

Em iptables , configurei o gateway para /etc/networking/interfaces como a caixa HAProxy eth1 e reiniciei a rede.

auto eth0 eth1
iface eth0 inet static
        address 111.111.250.250
        netmask 255.255.224.0
        gateway 111.131.224.1
        dns-nameservers 8.8.4.4 8.8.8.8 209.244.0.3
iface eth1 inet static
        address 10.111.163.76
        netmask 255.255.0.0
        gateway 10.111.128.134

10.111.128.134 dá:

default via 111.111.224.1 dev eth0 
10.111.0.0/16 dev eth1  proto kernel  scope link  src 10.111.163.76 
111.111.224.0/19 dev eth0  proto kernel  scope link  src 111.111.250.250 
    
por Nyxynyx 20.08.2014 / 06:19

1 resposta

2

Acredito que seu problema pode estar relacionado a não ter regras de encaminhamento ou nat, mas você precisa de regras avançadas que direcionem o tráfego entre eth0 < - > eth1.

ou seja:

Chain FORWARD (policy ACCEPT 7601 packets, 661K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  18M   47G ACCEPT     all  --  eth1  eth0    0.0.0.0/0            0.0.0.0/0           
  17M 2922M ACCEPT     all  --  eth0  eth1    0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

Além disso, uma coisa que me deixou tossindo antes foi especificar o dispositivo de interface na tabela mangle quando estou usando vários dispositivos:

Chain PREROUTING (policy ACCEPT 35M packets, 50G bytes)
 pkts bytes target     prot opt in     out     source               destination         
  59M   52G divert     tcp  --  eth1      *       0.0.0.0/0            0.0.0.0/0            socket

Onde eth1 não deve ser especificado porque estamos usando eth0 / eth1 ou mesmo bond0 & eth1.

Por fim, você quer ter certeza de ter regras natting, por exemplo:

Chain POSTROUTING (policy ACCEPT 1420K packets, 85M bytes)
 pkts bytes target     prot opt in     out     source               destination         
1K  494M PUBLICSNAT     all  --  *      eth1    0.0.0.0/0            0.0.0.0/0           

Chain PUBLICSNAT (1 references)
 pkts bytes target     prot opt in     out   source             destination         
1K  494M SNAT       all  --  *      eth1  10.1.1.0/24         0.0.0.0/0        to:8.8.8.8-8.8.8.10
 1K  336K RETURN     all  --  *      *     0.0.0.0/0            0.0.0.0/0           
    
por 28.10.2016 / 06:05