LINUX.ORG.RU

Сообщения Fetterless

 

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

Форум — Development

Есть 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
()

Модификация проходящего траффика

Форум — Admin

Есть ноутбук, подключенный к интернету через wlan0. В нем также присутствует Ethernet адаптер, через который он раздает интернет другому ноуту. Как я могу организовать поток пакетов через свое приложение, в котором я буду обрабатывать эти пакеты, если нужно (шифровка, модификация и т.п), либо просто пропускать далее? Видел решение на FreeBSD с помощью ipfw и DIVERT сокетов. Но там он встроен в ядро и ipfw дефолтный, по-этому работает быстро и как надо. В Linux на ум приходят только 2 решения:

  • заюзать IP-aliasing + iptables, что, ИМНО, как-то не очень
  • сделать это с помощью netmap-ipfw. Он тоже билдится в ядро и работает очень шустро.

Или есть другие более элегантные решения, которые работать будут также шустро?

  • UPD1: обрабатывать нужно ВЕСЬ траффик.
  • UPD2: netmap работает достаточно быстро или все же нужно для этого писать свой модуль ядра?

 , , , ,

Fetterless
()

RSS подписка на новые темы