netw.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. {
  25. struct ifreq ifr;
  26. int fd, err;
  27. char *clonedev = "/dev/net/tun";
  28. if ((fd = open(clonedev, O_RDWR)) < 0) {
  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. close(fd);
  38. return err;
  39. }
  40. strcpy(dev_name, ifr.ifr_ifrn.ifrn_name);
  41. return fd;
  42. }
  43. void print_packet(u_int8_t * buf, int buf_size)
  44. {
  45. int i;
  46. printf("received %d bytes: ", buf_size);
  47. for (i = 0; i < buf_size; i++) {
  48. if (i > 0)
  49. printf(":");
  50. printf("%02X", buf[i]);
  51. }
  52. printf("\n");
  53. }
  54. void parse_packet(u_int8_t * buf, int buf_size)
  55. {
  56. //struct ethhdr * ethernet_header;
  57. struct iphdr *ip_header;
  58. struct udphdr *udp_header;
  59. ip_header = (struct iphdr *) (buf);
  60. if (ip_header->protocol == IPPROTO_UDP) {
  61. printf("UDP packet found\n");
  62. printf("TTL: %d \n", ip_header->ttl);
  63. printf("Dest IP address: %s\n",
  64. inet_ntoa(*(struct in_addr *) &ip_header->daddr));
  65. printf("Source IP address: %s\n",
  66. inet_ntoa(*(struct in_addr *) &ip_header->saddr));
  67. udp_header = (struct udphdr *) (buf + ip_header->ihl * 4);
  68. printf("Source Port: %d\n", ntohs(udp_header->source));
  69. printf("Dest Port: %d\n", ntohs(udp_header->dest));
  70. if (ntohs(udp_header->dest) == 53) {
  71. printf("Found DNS packet\n");
  72. }
  73. }
  74. return; // NULL;
  75. }
  76. int main(int argc, char **argv)
  77. {
  78. char tun_name[IFNAMSIZ];
  79. u_int8_t buf[MTU];
  80. int ret;
  81. //ipv4_t curr_packet;
  82. sprintf(tun_name, "tun01");
  83. int tunfd = create_tun(tun_name, (IFF_TUN | IFF_NO_PI));
  84. if (tunfd < 0) {
  85. fprintf(stderr, "could not allocate device tun.\n");
  86. return (EXIT_FAILURE);
  87. }
  88. for (;;) {
  89. ret = read(tunfd, buf, MTU);
  90. parse_packet(buf, ret);
  91. }
  92. return (0);
  93. }