Взгляд на источник показывает, что регистрация действия 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, поэтому его можно будет добавить в будущий выпуск.