netw.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include <linux/if.h>
  2. #include <linux/if_tun.h>
  3. #include <fcntl.h>
  4. #include <sys/ioctl.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #include <linux/ip.h>
  10. #include <linux/udp.h>
  11. #include <arpa/inet.h>
  12. #define MTU 1500
  13. typedef struct ipv4 {
  14. u_int16_t tun_flags; //tun specific 16 bits
  15. u_int16_t tun_proto; //tun specific 16 bits
  16. u_int8_t version; // 4 bits
  17. u_int8_t header_length; // 4 bits
  18. u_int8_t type_of_service; // 8 bits
  19. u_int16_t total_length; //16 bits
  20. u_int16_t identification; // 16 bits
  21. u_int8_t flags; // 3 bits
  22. } ipv4_t;
  23. int create_tun(char *dev_name, int flags){
  24. struct ifreq ifr;
  25. int fd, err;
  26. char *clonedev = "/dev/net/tun";
  27. if ((fd = open(clonedev, O_RDWR)) < 0)
  28. {
  29. return fd;
  30. }
  31. memset(&ifr, 0, sizeof(ifr));
  32. ifr.ifr_ifru.ifru_flags = flags;
  33. if(*dev_name) {
  34. strncpy(ifr.ifr_ifrn.ifrn_name, dev_name, IFNAMSIZ);
  35. }
  36. if((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0)
  37. {
  38. close(fd);
  39. return err;
  40. }
  41. strcpy(dev_name, ifr.ifr_ifrn.ifrn_name);
  42. return fd;
  43. }
  44. void print_packet(u_int8_t* buf, int buf_size) {
  45. int i;
  46. printf("received %d bytes: ", buf_size);
  47. for (i = 0; i < buf_size; i++)
  48. {
  49. if (i > 0) printf(":");
  50. printf("%02X", buf[i]);
  51. }
  52. printf("\n");
  53. }
  54. void parse_packet(u_int8_t *buf, int buf_size) {
  55. //struct ethhdr * ethernet_header;
  56. struct iphdr * ip_header;
  57. struct udphdr * udp_header;
  58. ip_header = (struct iphdr*)(buf);
  59. if (ip_header->protocol == IPPROTO_UDP)
  60. {
  61. printf("UDP packet found\n");
  62. printf("TTL: %d \n",ip_header->ttl);
  63. printf("Dest IP address: %s\n", inet_ntoa( *(struct in_addr*)&ip_header->daddr));
  64. printf("Source IP address: %s\n", inet_ntoa( *(struct in_addr*)&ip_header->saddr));
  65. udp_header = (struct udphdr *) (buf + ip_header->ihl*4);
  66. printf("Source Port: %d\n", ntohs(udp_header->source));
  67. printf("Dest Port: %d\n", ntohs(udp_header->dest));
  68. if (ntohs(udp_header->dest) == 53)
  69. {
  70. printf("Found DNS packet\n");
  71. }
  72. }
  73. return;// NULL;
  74. }
  75. int main (int argc, char** argv) {
  76. char tun_name[IFNAMSIZ];
  77. u_int8_t buf[MTU];
  78. int ret;
  79. //ipv4_t curr_packet;
  80. sprintf(tun_name, "tun01");
  81. int tunfd = create_tun(tun_name, (IFF_TUN | IFF_NO_PI));
  82. if (tunfd < 0) {
  83. fprintf(stderr, "could not allocate device tun.\n");
  84. return(EXIT_FAILURE);
  85. }
  86. for (;;) {
  87. ret = read(tunfd, buf, MTU);
  88. parse_packet(buf, ret);
  89. }
  90. return (0);
  91. }