123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #include <linux/if.h>
- #include <linux/if_tun.h>
- #include <fcntl.h>
- #include <sys/ioctl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <linux/ip.h>
- #include <linux/udp.h>
- #include <arpa/inet.h>
- #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);
- }
|