LINUX.ORG.RU
решено ФорумAdmin

Прозрачный haproxy не работает

 , ,


0

1

Что пытаюсь сделать: Пропустить трафик на 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)

И всё... Что дальше делать - не знаю... :(

★★★★★

Ставь в haproxy хедер X-Forwarded-For или любой другой на твой выбор, и в nginx логируй его содержимое. И зачем тебе haproxy и nginx одновременно?

unicorne
()
Ответ на: комментарий от unicorne

Затем, что там не только nginx будет висеть. Думал это очевидно. Я показал лишь минимальный пример.

atrus ★★★★★
() автор топика
Ответ на: комментарий от atrus

В том, что там будет висеть, тоже можно обрабатывать кастомный хедер. Ну, по крайней мере, так будет проще всего :)

unicorne
()
Ответ на: комментарий от unicorne

Не все могут получить кастомные хедеры.
И вообще, другие могут настроить по нормальному, а - я?

atrus ★★★★★
() автор топика
Ответ на: комментарий от atrus

Меня берут сомнения, что кто-то решал такую задачу через tproxy. Даже если решали, то наверняка какие-то детали отличались от твоего случая, поэтому так просто не зашло.

unicorne
()

Вот, смотри, как надо правильно использовать TPROXY:

https://blog.cloudflare.com/how-we-built-spectrum/

Не вижу, как оно может подойти для случая «пропустить трафик через одно приложение, потом послать в другое».

unicorne
()
Ответ на: комментарий от atrus

Там haproxy на отдельном сервере, не твой случай. Но, в принципе, ты можешь попробовать запустить приложение в докере, а haproxy поставить на хост.

unicorne
()
Ответ на: комментарий от unicorne

Хм... Это мысль. Позже попробую.

atrus ★★★★★
() автор топика

Короче, я сдался. Делаю врезку в https.

atrus ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.