Новое создание nftable с помощью libnftnlLinux

Ответить
Anonymous
 Новое создание nftable с помощью libnftnl

Сообщение Anonymous »

Мне нужна помощь в настройке libnftnl с помощью libmnl.
Здесь я пытаюсь создать новую таблицу в nftables, используя libnftnl(1.2.4) и libmnl(1.0.4).
По какой-то причине mnl_cb_run возвращает ошибку с именем «Неверный аргумент».
Я не уверен как это решить. Я добавил такие атрибуты, как table_name и Family.

mnl_socket_sento завершается успешно, и mnl_socket_recvfrom также завершается успешно, но mnl_cb_run не работает.

Таблица также не создается в nftable.
Код, использованный для создания таблицы:
int nftablehandler_create_table(char* table_name, int family){
struct mnl_socket *sock = mnl_socket_open(NETLINK_NETFILTER);
if (!sock) {
log_info("Error: mnl_socket_open failed");
return -1;
}
if (mnl_socket_bind(sock, 0, MNL_SOCKET_AUTOPID) < 0) {
log_info("Error: mnl_socket_bind failed");
mnl_socket_close(sock);
return -1;
}
struct nftnl_table *t;
struct nl_msg *msg = nfnlmsg_alloc_simple( NFNL_SUBSYS_NFTABLES,NFT_MSG_NEWTABLE,NLM_F_CREATE | NLM_F_ACK | NLM_F_EXCL,NFPROTO_INET,0);
struct nlmsghdr *nlh;
char buf[MNL_SOCKET_BUFFER_SIZE];
uint32_t seq, portid;
int err;
static uint32_t seq_counter = 0;
nlh = nlmsg_hdr(msg);
t = nftnl_table_alloc();
if (!t) {
log_info("Error: Could not allocate table structure.\n");
return -1;
}
nftnl_table_set_str(t, NFTNL_TABLE_NAME, table_name);
nftnl_table_set_u32(t, NFTNL_TABLE_FAMILY, family);

// 3. Generate unique seq and get portid
portid = mnl_socket_get_portid(sock);
seq = ++seq_counter; // Generate unique sequence

// 4. Build the Netlink message (passing seq AND portid)
nlh = nftnl_table_nlmsg_build_hdr(
buf,
NFT_MSG_NEWTABLE,
family,
NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK | NLM_F_REQUEST,
seq
);
if (!nlh) {
log_info("Error: Could not build table message header.\n");
nftnl_table_free(t);
return -1;
}

nftnl_table_nlmsg_build_payload(nlh,t);

// 5. Send the message
err = mnl_socket_sendto(sock, nlh, nlh->nlmsg_len);
if (err < 0){
log_info("[ERROR][NFTABLE][TABLE CREATION FAILED - SEND][TABLE NAME: %s]",table_name);
nftnl_table_free(t);
return err;
}

// 6. Receive the ACK/Error response
err = mnl_socket_recvfrom(sock, buf, sizeof(buf));
if (err < 0){
log_info("[ERROR][NFTABLE][TABLE CREATION FAILED - RECV][TABLE NAME: %s]",table_name);
nftnl_table_free(t);
return err;
}

mnl_socket

// 7. Process the received message (using local portid for filtering)
err = mnl_cb_run(buf, err, seq, mnl_socket_get_portid(sock), nft_error_cb, NULL);
if (err < 0){
log_info("[ERROR][NFTABLE][CALLBACK FAILED / KERNEL ERROR][TABLE NAME: %s][ERROR: %s]%d",table_name,strerror(errno),errno);
// Note: nft_error_cb should have logged the specific kernel error
nftnl_table_free(t);
return err;
}

// Success
log_info("[INFO][NFTABLE][TABLE CREATION SUCCESSFUL][TABLE NAME: %s] [error %d]",table_name,err);
nftnl_table_free(t);
return 0;
}


Функция обратного вызова:
static int nft_error_cb(const struct nlmsghdr *nlh, void *data)
{
log_info("[DEBUG] nft_error_cb invoked");
struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh);

if (err->error == 0) {
// ACK success
return MNL_CB_STOP;
}

log_info("[KERNEL ERROR] errno=%d (%s)",
-err->error,
strerror(-err->error));

return MNL_CB_ERROR;
}

Вызов функции:
int family = NFPROTO_INET;

int res = nftablehandler_create_table(strdup("test_table"),family);
if(res < 0){
log_info("nftable failed");
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... h-libnftnl
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»