iptable правило для NFQUEUE
Есть 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;
}