LINUX.ORG.RU

iptable правило для NFQUEUE

 , ,


0

1

Есть 2 виртуалки. Связь между ними осуществлена с помощью VirtualBox Host-only Adapter'ы, которые коннектятся на хосте.

VM1 eth0(192.168.56.2)<----->vboxnet0(192.168.56.1)<--->vboxnet0(192.168.57.1)<---->eth0(192.168.57.2) VM2

На хосте висит мой аппликейшн, который должен обрабатывать пакеты. На нем настроен ip-форвардинг. В аппликейшене самом никаких манипуляций с пакетами не делаю, возвращаю их с помощью NF_ACCEPT. Пингуя с VM2 VM1, на последней показывается, что ее пингуют, но результат обратно не приходит. В программе пакеты показываются. Правила iptables на хосте:

iptables -I FORWARD -i vboxnet1 -j NFQUEUE --queue-num 0
iptables -I FORWARD -i vboxnet0 -j NFQUEUE --queue-num 0

Если же делать INPUT/OUTPUT, то с пакетами все ок, но в программе они не кепчатся. В чем может быть проблема?

мой cb:

static int
cb (struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,
    struct nfq_data *nfa, void *data)
{
  uint32_t ip_src, ip_dst;
  struct in_addr s_ip;
  struct in_addr d_ip;
  uint16_t src_port;
  uint16_t dst_port;
  int verdict;
  int id;
  int ret;
  unsigned char *buffer;
  struct nfqnl_msg_packet_hdr *ph = nfq_get_msg_packet_hdr (nfa);
  if (ph)
    {
      id = ntohl (ph->packet_id);
      printf ("received packet with id %d ", id);
    }
  ret = nfq_get_payload (nfa, &buffer);
  ip_src = *((uint32_t *) (buffer + 12));
  ip_dst = *((uint32_t *) (buffer + 16));
  src_port = *((uint16_t *) (buffer + 20));
  dst_port = *((uint16_t *) (buffer + 22));
  s_ip.s_addr = (uint32_t) ip_src;
  d_ip.s_addr = (uint32_t) ip_dst;
  *(buffer + 26) = 0x00;
  *(buffer + 27) = 0x00;
  printf ( "source IP %s ", inet_ntoa (s_ip));
  printf ( "destination IP %s ", inet_ntoa (d_ip));
  printf ( "source port %d ", src_port);
  printf ( "destination port %d ", dst_port);
  
  //print_pkt(nfa);
  if (ret)
    {
      switch (ph->hook)
    {
    case PREROUTING:
      printf ( "inbound packet");
      break;
    case OUTPUT:
      printf ( "outbound packet");
      break;
    }
    }
  verdict = nfq_set_verdict (qh, id, NF_ACCEPT, ret, buffer);
  if (verdict)
    printf ( "verdict ok");
  return verdict;
}


Последнее исправление: Fetterless (всего исправлений: 3)

Ответ на: комментарий от mittorn

Нужен, т.к. будет еще код. Просто редактируя вопрос, случайно опубликовал его

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