title: Filter packets in network stack while sniffing packets on Linux?
body: <p>I have a question for the Low-level networking/Linux gurus,</p>
  
  <p>I have to build two tools for a security project at my university. The first tool is an ARP Poisonning attacker which will poison the ARP cache from a remote host in order to retrieve the data he is sending to another host. I wrote this tool in C using RAW sockets and it works perfectly, i am able to intercept the data transmitted from a host A to a host B and from the host B back to the host A.</p>
  
  <p>The problem comes when writing the second tool which is a sniffer whose purpose is to read/edit/drop packets coming from host A or host B. I imagined a system where when I spot a packet coming from one of those hosts, my program will ask me if I want to let this packet pass, if I want to modify it or if I simply want to drop it. I activated the IP forwarding in linux using </p>
  
  <pre><code>sysctl -w net.ipv4.ip_forward=1
  </code></pre>
  
  <p>and i am able to read all the data travelling between the two hosts. But i don't know how to edit/drop those packets since it is the role of linux's network stack to manage the input and the output of the packets coming from my network interface. I'm acting only as a passive attacker if you want.</p>
  
  <p>My first idea was to disable the ip forwarding and manage the routing of the packets myself. But when I disable the ip forwarding, I am simply not able to get any data coming from A or B, this is because the linux's network stack drops automatically the packets in kernel mode which IP address is not destined to my computer.</p>
  
  <p>I tried then to activate the promiscuous mode, but this was unecessary since this mode only operates on the physical layer (sees if the target MAC address in the Ethernet received packet matches the MAC address on the local interface). So basically, <em>promiscuous mode</em> helps us to avoid the <em>physical filter</em> of the linux's stack but not the <em>logical</em> one (the target IP address in the packet I am receiving is B's IP address and not mine, so linux's network stack simply drops the packet).</p>
  
  <p>So my question is, how can I manage to edit the packets I am receiving and send them back or simply dropping them if I want to. I know this is a tricky question, I have made some research to find the solution on my own but I didn't find a satisfying answer.</p>
  
  <p>I know there is a solution with <em>iptables</em>, we can ask him to let pass some packets from a certain IP address, but I don't want a solution involving a third-party tool, I want to encapsulate everything in my program.</p>
  
  <p>For information, the development environment is Linux/Ubuntu Kernel 3.0.0-16, and everything is made using the C language.</p>