second try
[vsorcdistro/.git] / ryu / doc / source / snort_integrate.rst
1 ******************
2 Snort Intergration
3 ******************
4
5 This document describes how to integrate Ryu with Snort.
6
7 Overview
8 ========
9
10 There are two options can send alert to Ryu controller. The Option 1 is easier if you just want to demonstrate or test. Since Snort need very large computation power for analyzing packets you can choose Option 2 to separate them.  
11
12 **[Option 1] Ryu and Snort are on the same machine**
13 ::
14
15           +---------------------+
16           |      unixsock       |
17           |    Ryu  ==  snort   |
18           +----eth0-----eth1----+
19                  |       |
20     +-------+   +----------+   +-------+
21     | HostA |---| OFSwitch |---| HostB |
22     +-------+   +----------+   +-------+
23
24
25 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.
26
27
28 **[Option 2] Ryu and Snort are on the different machines**
29 ::
30
31               +---------------+
32               |    Snort     eth0--|
33               |   Sniffer     |    |
34               +-----eth1------+    |
35                      |             |
36     +-------+   +----------+   +-----------+
37     | HostA |---| OFSwitch |---| LAN (*CP) |
38     +-------+   +----------+   +-----------+
39                      |             |
40                 +----------+   +----------+
41                 |  HostB   |   |   Ryu    |
42                 +----------+   +----------+
43
44
45 **\*CP: Control Plane**
46
47 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.
48
49
50
51 Installation Snort
52 ==================
53 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.
54
55 http://www.snort.org/documents
56
57
58
59 Configure Snort
60 ===============
61 The configuration example is below:
62
63 - Add a snort rules file into ``/etc/snort/rules`` named ``Myrules.rules`` ::
64
65       alert icmp any any -> any any (msg:"Pinging...";sid:1000004;)
66       alert tcp any any -> any 80 (msg:"Port 80 is accessing"; sid:1000003;)
67
68 - Add the custom rules in ``/etc/snort/snort.conf`` ::
69
70       include $RULE_PATH/Myrules.rules
71
72 Configure NIC as a promiscuous mode. ::
73
74     $ sudo ifconfig eth1 promisc
75
76
77 Usage
78 =====
79 **[Option 1]**
80
81 1. Modify the ``simple_switch_snort.py``: ::
82
83     socket_config = {'unixsock': True}
84     # True: Unix Domain Socket Server [Option1]
85     # False: Network Socket Server [Option2]
86
87
88 2. Run Ryu with sample application: ::
89
90     $ sudo ./bin/ryu-manager ryu/app/simple_switch_snort.py
91
92 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``
93
94 3. Run Snort: ::
95
96     $ sudo -i
97     $ snort -i eth1 -A unsock -l /tmp -c /etc/snort/snort.conf
98
99 4. Send an ICMP packet from HostA (192.168.8.40) to HostB (192.168.8.50): ::
100
101     $ ping 192.168.8.50
102
103 5. You can see the result under next section.
104
105
106 **[Option 2]**
107
108 1. Modify the ``simple_switch_snort.py``: ::
109
110     socket_config = {'unixsock': False}
111     # True: Unix Domain Socket Server [Option1]
112     # False: Network Socket Server [Option2]
113
114
115 2. Run Ryu with sample application (On the Controller): ::
116
117     $ ./bin/ryu-manager ryu/app/simple_switch_snort.py
118
119 3. Run Snort (On the Snort machine): ::
120
121     $ sudo -i
122     $ snort -i eth1 -A unsock -l /tmp -c /etc/snort/snort.conf
123
124 4. Run ``pigrelay.py`` (On the Snort machine): ::
125
126     $ sudo python pigrelay.py
127
128 This program listening snort alert messages from unix domain socket and sending it to Ryu using network socket.
129
130 You can clone the source code from this repo. https://github.com/John-Lin/pigrelay
131
132
133 5. Send an ICMP packet from HostA (192.168.8.40) to HostB (192.168.8.50): ::
134
135     $ ping 192.168.8.50
136
137
138 6. You can see the alert message below: ::
139
140
141     alertmsg: Pinging...
142     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)
143
144     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)
145
146     ethernet(dst='00:23:54:5a:05:14',ethertype=2048,src='00:23:54:6c:1d:17')
147
148
149     alertmsg: Pinging...
150     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)
151
152     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)