HAProxy Lua не может добавить действие на - PullRequest
1 голос
/ 04 мая 2020

У меня есть lua скрипт для haproxy, который проверяет ip в белом списке, и мне нужно добавить это в конфигурацию haproxy. Мне нужно сделать это по TCP-соединению, и, как говорится в сообщении haproxy blog - я могу это сделать.

tcp-request connection <action>
tcp-request content <action>
tcp-response content <action>
http-request <action>
http-response <action>

Но если я использую tcp-request connection lua.checkip - haproxy не может начинаться с сообщение об ошибке:

haproxy[9384]: [ALERT] 124/000121 (9384) : parsing [/etc/haproxy/haproxy.cfg:42] : 'tcp-request connection' expects 'accept', 'reject', 'track-sc0' ... 'track-sc2', 'sc-inc-gpc0(*)', 'sc-inc-gpc1(*)', 'sc-set-gpt0(*)', 'set-src', 'set-src-port', 'set-dst', 'set-dst-port', 'silent-drop' in frontend 'haproxy_rserve' (got 'lua.checkip').

Но я могу использовать tcp-request content lua.checkip, и это работает.

Насколько Я понимаю, что эти две функции должны иметь различия, и для меня лучшее решение - connetion или я могу использовать content? Я пытаюсь создать высоконагруженную систему, поэтому я бы не хотел облажаться на этапе настройки.

Эти строки я пытаюсь добавить в интерфейс:

tcp-request inspect-delay 5s
tcp-request connection lua.checkip
tcp-request connection reject if { var(req.blocked) -m bool }

1 Ответ

1 голос
/ 06 мая 2020

Взгляд на источник показывает, что регистрация действия Lua tcp-req действительно только для контента, и нет способа зарегистрировать действие Lua для соединения:

        if (strcmp(lua_tostring(L, -1), "tcp-req") == 0)
            tcp_req_cont_keywords_register(akl);
        else if (strcmp(lua_tostring(L, -1), "tcp-res") == 0)
            tcp_res_cont_keywords_register(akl);
        else if (strcmp(lua_tostring(L, -1), "http-req") == 0)
            http_req_keywords_register(akl);
        else if (strcmp(lua_tostring(L, -1), "http-res") == 0)
            http_res_keywords_register(akl);
        else
            WILL_LJMP(luaL_error(L, "Lua action environment '%s' is unknown. "
                                    "'tcp-req', 'tcp-res', 'http-req' or 'http-res' "
                                    "are expected.", lua_tostring(L, -1)));

Функция, которую нужно вызвать, это tcp_req_conn_keywords_register, но, к сожалению, она не выставлена ​​на Lua. Единственные пользователи этой функции предназначены для некоторых жестко закодированных действий в proto_tcp. c и stick_table. c:

static struct action_kw_list tcp_req_conn_actions = {ILH, {
        { "set-src",      tcp_parse_set_src_dst },
        { "set-src-port", tcp_parse_set_src_dst },
        { "set-dst"     , tcp_parse_set_src_dst },
        { "set-dst-port", tcp_parse_set_src_dst },
        { "silent-drop",  tcp_parse_silent_drop },
        { /* END */ }
}};

INITCALL1(STG_REGISTER, tcp_req_conn_keywords_register, &tcp_req_conn_actions);
static struct action_kw_list tcp_conn_kws = { { }, {
        { "sc-inc-gpc0", parse_inc_gpc0, 1 },
        { "sc-inc-gpc1", parse_inc_gpc1, 1 },
        { "sc-set-gpt0", parse_set_gpt0, 1 },
        { /* END */ }
}};

INITCALL1(STG_REGISTER, tcp_req_conn_keywords_register, &tcp_conn_kws);

Однако, Еще раз у меня есть две хорошие новости:

  • Если вы можете поместить свой белый список в файл, вы можете использовать tcp-request connection reject unless { src -f /etc/haproxy/whitelist.lst } вместо необходимости вообще использовать Lua.
  • Ничто не выскакивает из меня как критическая причина того, что это не может быть поддержано с Lua, поэтому его можно будет добавить в будущий выпуск.
...