slitheen-proxy.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <pcap.h>
  2. #include <stdio.h>
  3. #define macaddr "08:00:27:e8:9d:d4"
  4. void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);
  5. void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet){
  6. pcap_t *handle;
  7. char errbuf[BUFSIZ];
  8. char *writedev = args;
  9. int i;
  10. handle = pcap_open_live(writedev, BUFSIZ, 1, 1000, errbuf);
  11. if (handle == NULL){
  12. fprintf(stderr, "Couldn't open device %s: %s\n", writedev, errbuf);
  13. }
  14. if((pcap_inject(handle, packet, header->len)) < 0 ){
  15. fprintf(stderr, "Error: %s\n", pcap_geterr(handle));
  16. }
  17. //printf("Wrote %d bytes.\n", bytes_written);
  18. pcap_close(handle);
  19. }
  20. int usage(void){
  21. printf("Usage: slitheen-proxy [internal network interface] [NAT interface]\n");
  22. }
  23. int main(int argc, char *argv[]){
  24. pid_t pid;
  25. char filter1[33] = "ether src host 08:00:27:e8:9d:d4";
  26. char filter2[33] = "ether src host 08:00:27:e8:9d:d4";
  27. char *dev1 = NULL; /* Device that leads to the internal network */
  28. char *dev2 = NULL; /* Device that leads out to the world */
  29. if (argc != 3) {
  30. usage();
  31. return(2);
  32. }
  33. dev1 = argv[1];
  34. dev2 = argv[2];
  35. snprintf(filter1, 33, "ether src host %s", macaddr);
  36. snprintf(filter2, 33, "ether dst host %s", macaddr);
  37. pid = fork();
  38. if (pid < 0) {
  39. fprintf(stderr, "Fork call failed.\n");
  40. return(2);
  41. }
  42. if (pid == 0) {
  43. sniff_packets(dev1, dev2, filter1);
  44. } else {
  45. sniff_packets(dev2, dev1, filter2);
  46. }
  47. return(0);
  48. }
  49. int sniff_packets(char *readdev, char *writedev, char *filter){
  50. pcap_t *handle;
  51. char errbuf[BUFSIZ];
  52. struct bpf_program fp;
  53. bpf_u_int32 mask;
  54. bpf_u_int32 net;
  55. if (pcap_lookupnet(readdev, &net, &mask, errbuf) == -1){
  56. fprintf(stderr, "Can't get netmask for device %s\n", readdev);
  57. return(2);
  58. }
  59. handle = pcap_open_live(readdev, BUFSIZ, 1, 1000, errbuf);
  60. if (handle == NULL){
  61. fprintf(stderr, "Couldn't open device %s: %s\n", readdev, errbuf);
  62. }
  63. if(pcap_datalink(handle) != DLT_EN10MB) {
  64. fprintf(stderr, "Device %s does not provide Ethernet headers - not supported\n", readdev);
  65. return(2);
  66. }
  67. if(pcap_compile(handle, &fp, filter, 0 , net) == -1){
  68. fprintf(stderr, "Couldn't parse filter %s: %s\n", filter, pcap_geterr(handle));
  69. return(2);
  70. }
  71. if (pcap_setfilter(handle, &fp) == -1) {
  72. fprintf(stderr, "Couldn't install filter %s: %s\n", filter, pcap_geterr(handle));
  73. return(2);
  74. }
  75. /*callback function*/
  76. pcap_loop(handle, -1, got_packet, writedev);
  77. /*Sniff a packet*/
  78. pcap_close(handle);
  79. return(0);
  80. }