iptables libiptc: как удалить правило - PullRequest
0 голосов
/ 15 ноября 2018

Моя filter цепочка INPUT таблицы имеет одно правило:

$ sudo iptables -L INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  anywhere             dns.quad9.net        tcp dpt:5000 /* A test rule */

Почему этот код не удаляет это правило?

extern "C" {
#include <libiptc/libiptc.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter/xt_comment.h>
}
#include <iostream>
#include <cstring>
using namespace std;

int main() {
  auto h = iptc_init("filter");
  if (h == 0) {
    std::cout << "iptc_init failed\n";
    return 0;
  }
  for(auto chain = iptc_first_chain(h); chain; chain = iptc_next_chain(h)) {
    if (strcmp(chain, "INPUT")) {
      continue;
    }
    std::cout << "Chain: " << chain << "\n";
    for(auto rule = iptc_first_rule("INPUT", h); rule; rule = iptc_next_rule(rule, h)) {
      size_t size = rule->next_offset;
      uint8_t *mask = new uint8_t[size];
      memset(mask, 0xff, size);
      iptc_delete_entry(chain, rule, mask, h);
    }
  }
}

$ g++ -fpermissive iptctest.cc -o  iptctest -liptc -lip4tc
$ sudo ./iptctest
Chain: INPUT
$ sudo iptables -L INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  anywhere             dns.quad9.net        tcp dpt:5000 /* A test rule */

Вызов iptc_delete_entry возвращает 0 (сбой) с errno, установленным на 2 (ENOENT - такого правила не существует).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...