summaryrefslogtreecommitdiffhomepage
path: root/doc/source/snort_integrate.rst
diff options
context:
space:
mode:
Diffstat (limited to 'doc/source/snort_integrate.rst')
-rw-r--r--doc/source/snort_integrate.rst152
1 files changed, 152 insertions, 0 deletions
diff --git a/doc/source/snort_integrate.rst b/doc/source/snort_integrate.rst
new file mode 100644
index 00000000..f6b593d7
--- /dev/null
+++ b/doc/source/snort_integrate.rst
@@ -0,0 +1,152 @@
+******************
+Snort Intergration
+******************
+
+This document describes how to integrate Ryu with Snort.
+
+Overview
+====
+
+**[Option 1] Ryu and Snort are on the same machine**
+::
+
+ +---------------------+
+ | unixsock |
+ | Ryu == snort |
+ +----eth0-----eth1----+
+ | |
+ +-------+ +----------+ +-------+
+ | HostA |---| OFSwitch |---| HostB |
+ +-------+ +----------+ +-------+
+
+
+The above depicts Ryu and Snort architecture. Ryu receives Snort alert packet via **Unix Domain Socket** . To monitor packets between HostA and HostB, installing a flow that mirrors packets to Snort.
+
+
+**[Option 2] Ryu and Snort are on the different machines**
+::
+
+ +---------------+
+ | Snort eth0--|
+ | Sniffer | |
+ +-----eth1------+ |
+ | |
+ +-------+ +----------+ +-----------+
+ | HostA |---| OFSwitch |---| LAN (*CP) |
+ +-------+ +----------+ +-----------+
+ | |
+ +----------+ +----------+
+ | HostB | | Ryu |
+ +----------+ +----------+
+
+
+**\*CP: Controller Plane**
+
+The above depicts Ryu and Snort architecture. Ryu receives Snort alert packet via **Network Socket** . To monitor packets between HostA and HostB, installing a flow that mirrors packets to Snort.
+
+
+
+Installation Snort
+====
+Snort is an open source network intrusion prevention and detectionsystem developed by Sourcefire. If you are not familiar with installing/setting up Snort, please referto snort setup guides.
+
+http://www.snort.org/docs
+
+
+
+Configure Snort
+====
+The configuration example is below:
+
+- Add a snort rules file into ``/etc/snort/rules`` named ``Myrules.rules`` ::
+
+ alert icmp any any -> any any (msg:"Pinging...";sid:1000004;)
+ alert tcp any any -> any 80 (msg:"Port 80 is accessing"; sid:1000003;)
+
+- Add the custom rules in ``/etc/snort/snort.conf`` ::
+
+ include $RULE_PATH/Myrules.rules
+
+Configure NIC as a promiscuous mode. ::
+
+ $ sudo ifconfig eth1 promisc
+
+
+Usage
+====
+**[Option 1]**
+
+1. Modify the ``simple_switch_snort.py``: ::
+
+ socket_config = {'unixsock': True}
+ # True: Unix Domain Socket Server [Option1]
+ # False: Network Socket Server [Option2]
+
+
+2. Run Ryu with sample application: ::
+
+ $ sudo ./bin/ryu-manager ryu/app/simple_switch_snort.py
+
+The incoming packets will all mirror to **port 3** which should be connect to Snort network interface. You can modify the mirror port by assign a new value in the ``self.snort_port = 3`` of ``simple_switch_snort.py``
+
+3. Run Snort: ::
+
+ $ sudo -i
+ $ sudo snort -i eth1 -A unsock -l /tmp -c /etc/snort/snort.conf
+
+4. Send an ICMP packet from HostA (192.168.8.40) to HostB (192.168.8.50): ::
+
+ $ ping 192.168.8.50
+
+5. You can see the result under next section.
+
+
+=====
+
+**[Option 2]**
+
+1. Modify the ``simple_switch_snort.py``: ::
+
+ socket_config = {'unixsock': False}
+ # True: Unix Domain Socket Server [Option1]
+ # False: Network Socket Server [Option2]
+
+
+2. Run Ryu with sample application (On the Controller): ::
+
+ $ sudo ./bin/ryu-manager ryu/app/simple_switch_snort.py
+
+3. Run Snort (On the Snort machine): ::
+
+ $ sudo -i
+ $ sudo snort -i eth1 -A unsock -l /tmp -c /etc/snort/snort.conf
+
+4. Run ``unsock2nwsock.py`` (On the Snort machine): ::
+
+ $ sudo python unsock2nwsock.py
+
+This program listening snort alert messages from unix domain socket and sending it to Ryu using network socket.
+
+You can clone the script over here. https://gist.github.com/John-Lin/9408ab716df57dbe32ca
+
+
+5. Send an ICMP packet from HostA (192.168.8.40) to HostB (192.168.8.50): ::
+
+ $ ping 192.168.8.50
+
+
+6. You can see the alert message below: ::
+
+
+ alertmsg: Pinging...
+ icmp(code=0,csum=19725,data=echo(data=array('B', [97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 97, 98, 99, 100, 101, 102, 103, 104, 105]),id=1,seq=78),type=8)
+
+ ipv4(csum=42562,dst='192.168.8.50',flags=0,header_length=5,identification=724,offset=0,option=None,proto=1,src='192.168.8.40',tos=0,total_length=60,ttl=128,version=4)
+
+ ethernet(dst='00:23:54:5a:05:14',ethertype=2048,src='00:23:54:6c:1d:17')
+
+
+ alertmsg: Pinging...
+ icmp(code=0,csum=21773,data=echo(data=array('B', [97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 97, 98, 99, 100, 101, 102, 103, 104, 105]),id=1,seq=78),type=0)
+
+ ipv4(csum=52095,dst='192.168.8.40',flags=0,header_length=5,identification=7575,offset=0,option=None,proto=1,src='192.168.8.50',tos=0,total_length=60,ttl=64,version=4)