Что пытаюсь сделать: Пропустить трафик на nginx через haproxy на том же компе, но так, чтобы в логах nginx оставался реальный ip-адрес. Судя по записям в интернете это сверхпростая задача. Но, увы... (SELinux на время тестирования выключен.)
Вот это минимально работающий конфиг, в котором адреса остаются локальными (haproxy.conf):
frontend ssl_v4
bind *:443 transparent
mode tcp
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
default_backend nginx_v4
backend nginx_v4
mode tcp
server nginx localhost4:1443
Вот так работает. Но ip пишутся локальные. Изменяем бэкенд:
backend nginx_v4
mode tcp
source 0.0.0.0 usesrc clientip
server nginx localhost4:1443
Поскольку в ядре CentOS 8 в nftables ещё не завезли поддержку tproxy - ставим из репозитория elrepo kernel-ml (5.5.10-1.el8.elrepo.x86_64), из пакетов Fedora 31 пересобираем libnftnl-1.1.3-2.el8.x86_64.rpm и nftables-0.9.1-3.el8.x86_64.rpm. Перезапускаем - текущий фаервол работает.
Добавляем правила:
table inet filter {
chain divert {
type filter hook prerouting priority -150; policy accept;
tcp dport https tproxy to :1443 meta mark set 777 accept
}
}
Перезагружаем фаервол, добавляем маршрутизацию:
# ip rule add fwmark 777 lookup 100
# ip route add local 0.0.0.0/0 dev lo table 100
Увы, не работает. Если запустить haproxy в консоли как haproxy -d -V -f /etc/haproxy/haproxy.cfg - получим при попытке обратиться к серверу: 00000000:ssl_v4.accept(0008)=000d from [172.24.0.1:59462] ALPN=<none> 00000000:nginx_v4.clicls[000d:adfd] 00000000:nginx_v4.closed[000d:adfd] [ALERT] 080/163214 (5778) : sendmsg logger #1 failed: No such file or directory (errno=2)
И всё... Что дальше делать - не знаю... :(