M. Buil
M. Buil

Reputation: 569

Can I intercept network packets with a raw socket (not only sniff)?

This is my first time using raw sockets (yes, I need to use them as I must modify a field inside a network header) and all the documentation or tutorials I read describe a solution to sniff packets but that is not exactly what I need. I need to create a script which intercepts the packet, process it and sends it further to the destination, i.e. the packets should not reach the destination unless my script decides to.

In order to learn, I created a small prototype which detects pings and just prints "PING". I would expect ping not to work as I intercept the packets and I don't include the logic to send them to its destination. However ping is working (again, it seems as it is just sniffing/mirroring packets). My goal is that the ping packets are "trapped" in my script and I don't know how to do that. This is what I do in my current python script (I avoid writing how I do the decode for simplicity)

sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
sock.bind((eth0, 0))
packet = sock.recvfrom(65565)
decode_eth(packet)
decode_ip(packet)

if (ipheader.ip_proto == 1):
            print("\nPING")

Can somebody explain how can I achieve my goal or point me to the right documentation?

Upvotes: 3

Views: 3132

Answers (2)

SuB
SuB

Reputation: 2547

I suppose that your Linux box is configured as a router (not a bridge). The packet will pass through your Linux because you have enabled IP Forwarding. So there are two solution:

Solution 1:

Disable IP Forwarding and then receive the packet from one interface and do the appropriate task (forwarding to another interface or dropping it).

Solution 2:

Use NetFilterQueue.

Install it on your Linux box (Debian/Ubuntu in my example):

apt-get install build-essential python-dev libnetfilter-queue-dev

Use iptables to send packets coming from input interface (eth0 in my example):

iptables -I INPUT -i eth0 -j NFQUEUE --queue-num 1

Run this script to handle packets forwarded to the Queue No.1 :

from netfilterqueue import NetfilterQueue

def print_and_accept(pkt):
    print pkt
    pkt.accept()

nfqueue = NetfilterQueue()
nfqueue.bind(1, print_and_accept)
try:
    nfqueue.run()
except KeyboardInterrupt:
    print

Note that pkt.drop() cause dropping the packet. Also you should accept/drop every packet.

Upvotes: 0

Ton Plooij
Ton Plooij

Reputation: 2641

Your description seems to be different from what your title suggest. My understanding is that you want to receive, modify and possibly drop incoming network packets. And this is to be done on Linux. In that case I suggest you use a netfilter prerouting hook, which will make things a lot simpler (and likely more stable). Netfilter is well documented, a nice overview including information related to your requirements can be seen here. The important function to use is nf_register_hook(), read the answer to this question to get an idea of how to set things up.

Upvotes: 2

Related Questions