#include #include #include #include #include #include #include #include #include #include #include #define MTU 1500 typedef struct ipv4 { u_int16_t tun_flags; //tun specific 16 bits u_int16_t tun_proto; //tun specific 16 bits u_int8_t version; // 4 bits u_int8_t header_length; // 4 bits u_int8_t type_of_service; // 8 bits u_int16_t total_length; //16 bits u_int16_t identification; // 16 bits u_int8_t flags; // 3 bits } ipv4_t; int create_tun(char *dev_name, int flags) { struct ifreq ifr; int fd, err; char *clonedev = "/dev/net/tun"; if ((fd = open(clonedev, O_RDWR)) < 0) { return fd; } memset(&ifr, 0, sizeof(ifr)); ifr.ifr_ifru.ifru_flags = flags; if (*dev_name) { strncpy(ifr.ifr_ifrn.ifrn_name, dev_name, IFNAMSIZ); } if ((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0) { close(fd); return err; } strcpy(dev_name, ifr.ifr_ifrn.ifrn_name); return fd; } void print_packet(u_int8_t * buf, int buf_size) { int i; printf("received %d bytes: ", buf_size); for (i = 0; i < buf_size; i++) { if (i > 0) printf(":"); printf("%02X", buf[i]); } printf("\n"); } void parse_packet(u_int8_t * buf, int buf_size) { //struct ethhdr * ethernet_header; struct iphdr *ip_header; struct udphdr *udp_header; ip_header = (struct iphdr *) (buf); if (ip_header->protocol == IPPROTO_UDP) { printf("UDP packet found\n"); printf("TTL: %d \n", ip_header->ttl); printf("Dest IP address: %s\n", inet_ntoa(*(struct in_addr *) &ip_header->daddr)); printf("Source IP address: %s\n", inet_ntoa(*(struct in_addr *) &ip_header->saddr)); udp_header = (struct udphdr *) (buf + ip_header->ihl * 4); printf("Source Port: %d\n", ntohs(udp_header->source)); printf("Dest Port: %d\n", ntohs(udp_header->dest)); if (ntohs(udp_header->dest) == 53) { printf("Found DNS packet\n"); } } return; // NULL; } int main(int argc, char **argv) { char tun_name[IFNAMSIZ]; u_int8_t buf[MTU]; int ret; //ipv4_t curr_packet; sprintf(tun_name, "tun01"); int tunfd = create_tun(tun_name, (IFF_TUN | IFF_NO_PI)); if (tunfd < 0) { fprintf(stderr, "could not allocate device tun.\n"); return (EXIT_FAILURE); } for (;;) { ret = read(tunfd, buf, MTU); parse_packet(buf, ret); } return (0); }