Centos7

HAProxy:無法切換到透明模式?

  • August 29, 2019

我目前正在以透明模式設置 HAProxy,因為它應該在不支持 PROXY 協議的軟體節點之間平衡,想要終止 SSL 本身並執行其自己的基於 IP 的安全性。

我已經瀏覽了每一個搜尋結果和如何設置我能找到的透明模式的指南,雖然它看起來很簡單,但它似乎根本不起作用。

Base 是 CentOS 7 最小安裝,HAProxy 以 root 身份執行。它是後端伺服器的預設網關,已載入 TPROXY 並設置了必要的防火牆規則和網路設置。

使用tcpdump,我可以看到進出後端伺服器的所有流量都通過 HAProxy,但數據包中的源 IP 根本沒有被替換。順便說一句,就我所見,與後端的通信和負載平衡工作完美。

haproxy.cfg:

global
   log         127.0.0.1 local0 debug
   chroot      /var/lib/haproxy
   pidfile     /var/run/haproxy.pid
   maxconn     4000
   daemon
   stats socket /var/lib/haproxy/stats uid hatop gid hatop mode 0600

defaults
   mode                    tcp
   log                     global
   option                  tcplog
#   option                  dontlognull
   option                  redispatch
   retries                 3
   timeout queue           1m
   timeout connect         10s
   timeout client          1m
   timeout server          1m
   timeout check           10s
   maxconn                 3000
   balance                 leastconn

frontend f_general_plain
   bind 10.1.1.20:80 transparent       # HTTP
   bind 10.1.1.20:465 transparent      # SMTP
   bind 10.1.1.20:587 transparent      # Submission
   bind 10.1.1.20:143 transparent      # IMAP
   bind 10.1.1.20:5229 transparent     # Groupware
   bind 10.1.1.20:32002 transparent    
   bind 10.1.1.20:5222 transparent     # XMPP
   bind 10.1.1.20:5223 transparent 
   default_backend b_general_plain

backend b_general_plain
   stick-table type ip size 1m expire 10h
   stick on src
   source 0.0.0.0 usesrc clientip
   server iw1 10.1.1.16 
   server iw2 10.1.1.17 

frontend f_general_ssl
   bind 10.1.1.20:443 transparent      # HTTPS
   bind 10.1.1.20:465 transparent      # SMTPS
   bind 10.1.1.20:993 transparent      # IMAPS
   default_backend b_general_ssl

backend b_general_ssl
   stick on src table b_general_plain
   source 0.0.0.0 usesrc clientip
   server iw1 10.1.1.16
   server iw2 10.1.1.17 

frontend f_smtp
   bind 10.1.1.20:25 transparent
   default_backend b_smtp

backend b_smtp
   stick on src table b_general_plain
   option smtpchk EHLO balancer.example.com
   source 0.0.0.0 usesrc clientip
   server iw1 10.1.1.16:25 check
   server iw2 10.1.1.17:25 check

/etc/sysctl.conf

net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.accept_redirects = 1
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.default.accept_source_route = 1

/etc/firewalld/direct.xml - firewalld 幾乎沒有任何其他設置,只是打開必要的埠等。根據 iptables -t mangle -vL,DIVERT 鏈確實被使用了。

<?xml version="1.0" encoding="utf-8"?>
<direct>
<chain ipv="ipv4" table="mangle" chain="DIVERT"/>
<rule  ipv="ipv4" table="mangle" chain="PREROUTING" priority="0">-p tcp -m socket -j DIVERT</rule>
<rule  ipv="ipv4" table="mangle" chain="DIVERT" priority="0">-j MARK --set-mark 1</rule>
<rule  ipv="ipv4" table="mangle" chain="DIVERT" priority="1">-j ACCEPT</rule>
</direct>

ip規則:

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

ip route 顯示表 100:

local default dev lo scope host

lsmod | grep -i tproxy

xt_TPROXY              17327  0 
nf_defrag_ipv6         35104  3 xt_socket,xt_TPROXY,nf_conntrack_ipv6
nf_defrag_ipv4         12729  3 xt_socket,xt_TPROXY,nf_conntrack_ipv4

unname -a

Linux balancer 3.10.0-957.12.1.el7.x86_64 #1 SMP Mon Apr 29 14:59:59 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

haproxy -vv

HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <willy@haproxy.org>

Build options :
 TARGET  = linux2628
 CPU     = generic
 CC      = gcc
 CFLAGS  = -O2 -g -fno-strict-aliasing -DTCP_USER_TIMEOUT=18
 OPTIONS = USE_LINUX_TPROXY=1 USE_GETADDRINFO=1 USE_ZLIB=1 USE_REGPARM=1 USE_OPENSSL=1 USE_PCRE=1

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

Encrypted password support via crypt(3): yes
Built with zlib version : 1.2.7
Compression algorithms supported : identity, deflate, gzip
Built with OpenSSL version : OpenSSL 1.0.2k-fips  26 Jan 2017
Running on OpenSSL version : OpenSSL 1.0.2k-fips  26 Jan 2017
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports prefer-server-ciphers : yes
Built with PCRE version : 8.32 2012-11-30
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.

“這不是 iptables。”

“它不可能是 iptables。”

這是iptables。畢竟,防火牆配置的其餘部分省略了錯誤。不要遵循隨機指南,因為您面臨著設置一些可行的東西的壓力。如果您正在尋找類似的問題:上面的配置對我來說非常好。

弄清楚這一點的一大幫助是停止服務,在 shell 中執行相同的命令strace -f並查看它做了什麼。您應該看到一個bind()帶有您要綁定的 IP(clientip或手動指定一個)的 IP,包括一個套接字號。該套接字號隨後應用於連接到後端伺服器。

引用自:https://serverfault.com/questions/980615