nfqueue 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/README +1 -2
  3. data/lib/nfqueue.rb +274 -229
  4. data/samples/packetdump.rb +21 -0
  5. metadata +53 -60
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3665707fbf433eb685f566b9bffc521b066e6d67
4
+ data.tar.gz: ddb59d9dd9094b3720dc052ea8a60a5e0368733b
5
+ SHA512:
6
+ metadata.gz: 3b7d4d82ecf55fc514b779c08e38313bfa69511c80715baba78e1dd372b967c1dbf6b070142c97b6851a3f48a6f4c5eedaa877709c28fa3653530f37dfbe1918
7
+ data.tar.gz: f83e2aaa2ed7f1d3054fea5a6c39ae17145d51284aab1255122e5eaeaec264eb4f4e9ac9fb4806952b71c1bf3e40a16e5feb445b4f1ecdac560a8e22d1925329
data/README CHANGED
@@ -3,7 +3,6 @@
3
3
  * Description of nfqueue
4
4
 
5
5
  nfqueue is a tiny wrapper around libnetfilter_queue. It allows you to do some packet filtering very simply in a Ruby environment.
6
- Network packets can either be inspected or modified on-the-fly.
7
6
 
8
7
  For example, plugging on the #0 queue:
9
8
 
@@ -12,7 +11,7 @@ require 'nfqueue'
12
11
  system('sudo iptables -A OUTPUT -p tcp --dport 80 -j NFQUEUE --queue-num 0')
13
12
 
14
13
  Netfilter::Queue.create(0) do |packet|
15
- puts "Inspecting packet #" + packet.id
14
+ puts "Inspecting packet ##{packet.id}"
16
15
 
17
16
  p packet.data
18
17
  Netfilter::Packet::ACCEPT
@@ -3,13 +3,13 @@
3
3
  =begin
4
4
 
5
5
  = File
6
- nfqueue.rb
6
+ nfqueue.rb
7
7
 
8
8
  = Author
9
- Guillaume Delugré, guillaume(at)security-labs.org
9
+ Guillaume Delugré <guillaume AT security-labs DOT org>
10
10
 
11
11
  = Info
12
- This program is free software: you can redistribute it and/or modify
12
+ This program is free software: you can redistribute it and/or modify
13
13
  it under the terms of the GNU General Public License as published by
14
14
  the Free Software Foundation, either version 3 of the License, or
15
15
  (at your option) any later version.
@@ -19,7 +19,7 @@
19
19
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
20
  GNU General Public License for more details.
21
21
 
22
- You should have received a copy of the GNU Lesser General Public License
22
+ You should have received a copy of the GNU General Public License
23
23
  along with this program. If not, see <http://www.gnu.org/licenses/>.
24
24
 
25
25
  =end
@@ -28,268 +28,313 @@
28
28
  require 'rubygems'
29
29
  require 'ffi'
30
30
  require 'socket'
31
+ require 'nfnetlink'
31
32
 
32
33
  module Netfilter
33
34
 
34
- #
35
- # This class represents a packet filtered by a Netfilter::Queue.
36
- #
37
- class Packet
35
+ #
36
+ # This class represents a packet filtered by a Netfilter::Queue.
37
+ #
38
+ class Packet
38
39
 
39
- class Timeval < FFI::Struct #:nodoc:
40
- layout :tv_sec, :ulong,
41
- :tv_usec, :ulong
42
- end
40
+ class Timeval < FFI::Struct #:nodoc:
41
+ layout :tv_sec, :ulong,
42
+ :tv_usec, :ulong
43
+ end
43
44
 
44
- class Header < FFI::Struct #:nodoc:
45
- layout :packet_id, :uint32,
46
- :hw_protocol, :uint16,
47
- :hook, :uint8
48
- end
45
+ class Header < FFI::Struct #:nodoc:
46
+ layout :packet_id, :uint32,
47
+ :hw_protocol, :uint16,
48
+ :hook, :uint8
49
+ end
49
50
 
50
- class HardwareAddress < FFI::Struct #:nodoc:
51
- layout :hw_addrlen, :uint16,
52
- :__pad, :uint16,
53
- :hw_addr, [:uint8, 8]
54
- end
51
+ class HardwareAddress < FFI::Struct #:nodoc:
52
+ layout :hw_addrlen, :uint16,
53
+ :__pad, :uint16,
54
+ :hw_addr, [:uint8, 8]
55
+ end
55
56
 
56
- DROP = 0
57
- ACCEPT = 1
58
- STOLEN = 2
59
- QUEUE = 3
60
- REPEAT = 4
61
- STOP = 5
57
+ DROP = 0
58
+ ACCEPT = 1
59
+ STOLEN = 2
60
+ QUEUE = 3
61
+ REPEAT = 4
62
+ STOP = 5
62
63
 
63
- attr_reader :id
64
- attr_writer :data
64
+ attr_reader :id
65
+ attr_writer :data
65
66
 
66
- def initialize(nfad) #:nodoc:
67
- @nfad = nfad
67
+ def initialize(nfad) #:nodoc:
68
+ @nfad = nfad
68
69
 
69
- phdr = Queue.nfq_get_msg_packet_hdr(nfad)
70
- hdr = Header.new(phdr)
70
+ phdr = Queue.nfq_get_msg_packet_hdr(nfad)
71
+ hdr = Header.new(phdr)
71
72
 
72
- @id = [ hdr[:packet_id] ].pack("N").unpack("V")[0]
73
- end
73
+ @id = [ hdr[:packet_id] ].pack("N").unpack("V")[0]
74
+ end
74
75
 
75
- #
76
- # The packet timestamp.
77
- #
78
- def timestamp
79
- ptv = FFI::MemoryPointer.new :pointer
80
- tv = Timeval.new(ptv)
81
- if Queue.nfq_get_timestamp(@nfad, ptv) < 0
82
- 0
83
- else
84
- Time.at(tv[:tv_sec])
85
- end
86
- end
76
+ #
77
+ # The packet timestamp.
78
+ #
79
+ def timestamp
80
+ ptv = FFI::MemoryPointer.new :pointer
81
+ tv = Timeval.new(ptv)
82
+ if Queue.nfq_get_timestamp(@nfad, ptv) < 0
83
+ 0
84
+ else
85
+ Time.at(tv[:tv_sec])
86
+ end
87
+ end
87
88
 
88
- #
89
- # The index of the device the queued packet was received via.
90
- # If the return index is 0, the packet was locally generated or the input interface is not known (ie. POSTROUTING?).
91
- #
92
- def indev
93
- Queue.nfq_get_indev(@nfad)
94
- end
89
+ #
90
+ # The index of the device the queued packet was received via.
91
+ # If the return index is 0, the packet was locally generated or the input interface is not known (ie. POSTROUTING?).
92
+ #
93
+ def indev
94
+ Queue.nfq_get_indev(@nfad)
95
+ end
95
96
 
96
- #
97
- # The index of the physical device the queued packet was received via.
98
- # If the returned index is 0, the packet was locally generated or the physical input interface is no longer known (ie. POSTROUTING).
99
- #
100
- def phys_indev
101
- Queue.nfq_get_physindev(@nfad)
102
- end
97
+ #
98
+ # The name of the interface this packet was received through.
99
+ #
100
+ def indev_name
101
+ get_interface_name(self.indev)
102
+ end
103
103
 
104
- #
105
- # The index of the device the queued packet will be sent out.
106
- # It the returned index is 0, the packet is destined for localhost or the output interface is not yet known (ie. PREROUTING?).
107
- #
108
- def outdev
109
- Queue.nfq_get_outdev(@nfad)
110
- end
104
+ #
105
+ # The index of the physical device the queued packet was received via.
106
+ # If the returned index is 0, the packet was locally generated or the physical input interface is no longer known (ie. POSTROUTING).
107
+ #
108
+ def phys_indev
109
+ Queue.nfq_get_physindev(@nfad)
110
+ end
111
111
 
112
- #
113
- # The index of the physical device the queued packet will be sent out.
114
- # If the returned index is 0, the packet is destined for localhost or the physical output interface is not yet known (ie. PREROUTING).
115
- #
116
- def phys_outdev
117
- Queue.nfq_get_physoutdev(@nfad)
118
- end
112
+ #
113
+ # The name of the physical interface this packet was received through.
114
+ #
115
+ def phys_indev_name
116
+ get_interface_name(self.phys_indev)
117
+ end
119
118
 
120
- #
121
- # The source hardware address.
122
- #
123
- def hw_addr
124
- phw = Queue.nfq_get_packet_hw(@nfad)
125
- return nil if phw.null?
119
+ #
120
+ # The index of the device the queued packet will be sent out.
121
+ # It the returned index is 0, the packet is destined for localhost or the output interface is not yet known (ie. PREROUTING?).
122
+ #
123
+ def outdev
124
+ Queue.nfq_get_outdev(@nfad)
125
+ end
126
126
 
127
- hw = HardwareAddress.new(phw)
128
- hw[:hw_addr][0, hw[:hw_addrlen]]
129
- end
127
+ #
128
+ # The name of the interface this packet will be routed to.
129
+ #
130
+ def outdev_name
131
+ get_interface_name(self.outdev)
132
+ end
130
133
 
131
- #
132
- # The packet contents.
133
- #
134
- def data
135
- if @data.nil?
136
- pdata = FFI::MemoryPointer.new(:pointer, 1)
137
- size = Queue.nfq_get_payload(@nfad, pdata)
138
- if size < 0
139
- raise QueueError, "nfq_get_payload has failed"
134
+ #
135
+ # The index of the physical device the queued packet will be sent out.
136
+ # If the returned index is 0, the packet is destined for localhost or the physical output interface is not yet known (ie. PREROUTING).
137
+ #
138
+ def phys_outdev
139
+ Queue.nfq_get_physoutdev(@nfad)
140
140
  end
141
+
142
+ #
143
+ # The name of the physical interface this packet will be routed to.
144
+ #
145
+ def phys_outdev_name
146
+ get_interface_name(self.phys_outdev)
147
+ end
148
+
149
+ #
150
+ # The source hardware address.
151
+ #
152
+ def hw_addr
153
+ phw = Queue.nfq_get_packet_hw(@nfad)
154
+ return nil if phw.null?
155
+
156
+ hw = HardwareAddress.new(phw)
157
+ hw_addrlen = [ hw[:hw_addrlen] ].pack('v').unpack('n')[0]
158
+ hw[:hw_addr].to_ptr.read_bytes(hw_addrlen)
159
+ end
160
+
161
+ #
162
+ # The packet contents.
163
+ #
164
+ def data
165
+ if @data.nil?
166
+ pdata = FFI::MemoryPointer.new(:pointer, 1)
167
+ size = Queue.nfq_get_payload(@nfad, pdata)
168
+ if size < 0
169
+ raise QueueError, "nfq_get_payload has failed"
170
+ end
141
171
 
142
- @data = pdata.read_pointer.read_string(size)
143
- else
144
- @data
145
- end
146
- end
147
- end
148
-
149
- #
150
- # Class representing a Netfilter Queue.
151
- #
152
- class QueueError < Exception; end
153
- class Queue
154
- extend FFI::Library
155
-
156
- ffi_lib 'libnetfilter_queue'
157
-
158
- attach_function 'nfq_open', [], :pointer
159
- attach_function 'nfq_open_nfnl', [:pointer], :pointer
160
- attach_function 'nfq_close', [:pointer], :int
161
- attach_function 'nfq_bind_pf', [:pointer, :uint16], :int
162
- attach_function 'nfq_unbind_pf', [:pointer, :uint16], :int
163
- attach_function 'nfq_nfnlh', [:pointer], :pointer
164
- attach_function 'nfq_fd', [:pointer], :int
165
- callback :nfq_callback, [:pointer, :pointer, :pointer, :buffer_in], :int
166
- attach_function 'nfq_create_queue', [:pointer, :uint16, :nfq_callback, :buffer_in], :pointer
167
- attach_function 'nfq_destroy_queue', [:pointer], :int
168
- attach_function 'nfq_handle_packet', [:pointer, :buffer_in, :int], :int
169
- attach_function 'nfq_set_mode', [:pointer, :uint8, :uint32], :int
170
- attach_function 'nfq_set_queue_maxlen', [:pointer, :uint32], :int
171
- attach_function 'nfq_set_verdict', [:pointer, :uint32, :uint32, :uint32, :buffer_in], :int
172
- attach_function 'nfq_set_verdict_mark', [:pointer, :uint32, :uint32, :uint32, :uint32, :buffer_in], :int
173
-
174
- attach_function 'nfq_get_msg_packet_hdr', [:pointer], :pointer
175
- attach_function 'nfq_get_nfmark', [:pointer], :uint32
176
- attach_function 'nfq_get_timestamp', [:pointer, :pointer], :int
177
- attach_function 'nfq_get_indev', [:pointer], :int
178
- attach_function 'nfq_get_physindev', [:pointer], :int
179
- attach_function 'nfq_get_outdev', [:pointer], :int
180
- attach_function 'nfq_get_physoutdev', [:pointer], :int
181
- attach_function 'nfq_get_packet_hw', [:pointer], :pointer
182
- attach_function 'nfq_get_payload', [:pointer, :pointer], :int
183
-
184
- module CopyMode
185
- NONE = 0
186
- META = 1
187
- PACKET = 2
172
+ @data = pdata.read_pointer.read_bytes(size)
173
+ else
174
+ @data
175
+ end
176
+ end
177
+
178
+ private
179
+
180
+ def get_interface_name(index)
181
+ iface = Netfilter::Netlink.interfaces[index]
182
+ if iface
183
+ iface[:name]
184
+ end
185
+ end
188
186
  end
189
187
 
190
188
  #
191
- # Creates a new Queue at slot _qnumber_.
189
+ # Class representing a Netfilter Queue.
192
190
  #
193
- def initialize(qnumber, mode = CopyMode::PACKET)
194
- @conn_handle = Queue.nfq_open
195
- raise QueueError, "nfq_open has failed" if @conn_handle.null?
196
-
197
- if Queue.nfq_unbind_pf(@conn_handle, Socket::AF_INET) < 0
198
- close
199
- raise QueueError, "nfq_unbind_pf has failed"
200
- end
191
+ class QueueError < Exception; end
192
+ class Queue
193
+ extend FFI::Library
194
+
195
+ begin
196
+ ffi_lib 'libnetfilter_queue'
197
+ rescue LoadError => exc
198
+ STDERR.puts(exc.message)
199
+ STDERR.puts "Please check that libnetfilter_queue is installed on your system."
200
+ abort
201
+ end
202
+
203
+ attach_function 'nfq_open', [], :pointer
204
+ attach_function 'nfq_open_nfnl', [:pointer], :pointer
205
+ attach_function 'nfq_close', [:pointer], :int
206
+ attach_function 'nfq_bind_pf', [:pointer, :uint16], :int
207
+ attach_function 'nfq_unbind_pf', [:pointer, :uint16], :int
208
+ attach_function 'nfq_nfnlh', [:pointer], :pointer
209
+ attach_function 'nfq_fd', [:pointer], :int
210
+ callback :nfq_callback, [:pointer, :pointer, :pointer, :buffer_in], :int
211
+ attach_function 'nfq_create_queue', [:pointer, :uint16, :nfq_callback, :buffer_in], :pointer
212
+ attach_function 'nfq_destroy_queue', [:pointer], :int
213
+ attach_function 'nfq_handle_packet', [:pointer, :buffer_in, :int], :int
214
+ attach_function 'nfq_set_mode', [:pointer, :uint8, :uint32], :int
215
+ attach_function 'nfq_set_queue_maxlen', [:pointer, :uint32], :int
216
+ attach_function 'nfq_set_verdict', [:pointer, :uint32, :uint32, :uint32, :buffer_in], :int
217
+ attach_function 'nfq_set_verdict_mark', [:pointer, :uint32, :uint32, :uint32, :uint32, :buffer_in], :int
218
+
219
+ attach_function 'nfq_get_msg_packet_hdr', [:pointer], :pointer
220
+ attach_function 'nfq_get_nfmark', [:pointer], :uint32
221
+ attach_function 'nfq_get_timestamp', [:pointer, :pointer], :int
222
+ attach_function 'nfq_get_indev', [:pointer], :int
223
+ attach_function 'nfq_get_physindev', [:pointer], :int
224
+ attach_function 'nfq_get_outdev', [:pointer], :int
225
+ attach_function 'nfq_get_physoutdev', [:pointer], :int
226
+ attach_function 'nfq_get_packet_hw', [:pointer], :pointer
227
+ attach_function 'nfq_get_payload', [:pointer, :pointer], :int
228
+
229
+ module CopyMode
230
+ NONE = 0
231
+ META = 1
232
+ PACKET = 2
233
+ end
234
+
235
+ #
236
+ # Creates a new Queue at slot _qnumber_.
237
+ #
238
+ def initialize(qnumber, mode = CopyMode::PACKET)
239
+ @conn_handle = Queue.nfq_open
240
+ raise QueueError, "nfq_open has failed" if @conn_handle.null?
241
+
242
+ if Queue.nfq_unbind_pf(@conn_handle, Socket::AF_INET) < 0
243
+ close
244
+ raise QueueError, "nfq_unbind_pf has failed"
245
+ end
201
246
 
202
- if Queue.nfq_bind_pf(@conn_handle, Socket::AF_INET) < 0
203
- close
204
- raise QueueError, "nfq_unbind_pf has failed"
205
- end
206
-
207
- @qhandle = Queue.nfq_create_queue(@conn_handle, qnumber, method(:callback_handler), nil)
208
- if @qhandle.null?
209
- close
210
- raise QueueError, "nfq_create_queue has failed" if @qhandle.null?
211
- end
212
-
213
- set_mode(mode)
214
- end
247
+ if Queue.nfq_bind_pf(@conn_handle, Socket::AF_INET) < 0
248
+ close
249
+ raise QueueError, "nfq_unbind_pf has failed"
250
+ end
251
+
252
+ @qhandle = Queue.nfq_create_queue(@conn_handle, qnumber, method(:callback_handler), nil)
253
+ if @qhandle.null?
254
+ close
255
+ raise QueueError, "nfq_create_queue has failed" if @qhandle.null?
256
+ end
257
+
258
+ set_mode(mode)
259
+ end
215
260
 
216
- #
217
- # Changes the copy mode for the queue.
218
- #
219
- def set_mode(mode, range = 0xffff_ffff)
220
- if Queue.nfq_set_mode(@qhandle, mode, range) < 0
221
- raise QueueError, "nfq_set_mode has failed"
222
- end
261
+ #
262
+ # Changes the copy mode for the queue.
263
+ #
264
+ def set_mode(mode, range = 0xffff_ffff)
265
+ if Queue.nfq_set_mode(@qhandle, mode, range) < 0
266
+ raise QueueError, "nfq_set_mode has failed"
267
+ end
223
268
 
224
- self
225
- end
269
+ self
270
+ end
226
271
 
227
- #
228
- # Sets the maximum number of elements in the queue.
229
- #
230
- def set_max_length(len)
231
- if Queue.nfq_set_queue_maxlen(@qhandle, len) < 0
232
- raise QueueError, "nfq_queue_maxlen has failed"
233
- end
272
+ #
273
+ # Sets the maximum number of elements in the queue.
274
+ #
275
+ def set_max_length(len)
276
+ if Queue.nfq_set_queue_maxlen(@qhandle, len) < 0
277
+ raise QueueError, "nfq_queue_maxlen has failed"
278
+ end
234
279
 
235
- self
236
- end
280
+ self
281
+ end
237
282
 
238
- #
239
- # Processes packets in the queue, passing them through the provided callback.
240
- #
241
- def process(&callback)
242
- @callback = callback
283
+ #
284
+ # Processes packets in the queue, passing them through the provided callback.
285
+ #
286
+ def process(&callback)
287
+ @callback = callback
243
288
 
244
- fd = Queue.nfq_fd(@conn_handle)
245
- raise QueueError, "nfq_fd has failed" if fd < 0
289
+ fd = Queue.nfq_fd(@conn_handle)
290
+ raise QueueError, "nfq_fd has failed" if fd < 0
246
291
 
247
- io = IO.new(fd)
248
- while data = io.sysread(4096)
249
- Queue.nfq_handle_packet(@conn_handle, data, data.size)
250
- end
251
- end
292
+ io = IO.new(fd)
293
+ while data = io.sysread(4096)
294
+ Queue.nfq_handle_packet(@conn_handle, data, data.size)
295
+ end
296
+ end
252
297
 
253
- #
254
- # Close the queue.
255
- #
256
- def destroy
257
- LibNetfilterQueue.nfq_destroy_queue(@qhandle)
258
- close
259
- end
298
+ #
299
+ # Close the queue.
300
+ #
301
+ def destroy
302
+ Queue.nfq_destroy_queue(@qhandle)
303
+ close
304
+ end
260
305
 
261
- #
262
- # Creates a new Queue with the provided callback.
263
- # The queue will be automatically destroyed at return.
264
- #
265
- def self.create(qnumber, mode = CopyMode::PACKET, &callback)
266
- queue = self.new(qnumber, mode)
267
- queue.process(&callback)
268
- queue.destroy
269
- end
306
+ #
307
+ # Creates a new Queue with the provided callback.
308
+ # The queue will be automatically destroyed at return.
309
+ #
310
+ def self.create(qnumber, mode = CopyMode::PACKET, &callback)
311
+ queue = self.new(qnumber, mode)
312
+ queue.process(&callback)
313
+ queue.destroy
314
+ end
270
315
 
271
- private
316
+ private
272
317
 
273
- def callback_handler(qhandler, nfmsg, nfad, data) #:nodoc:
274
- packet = Packet.new(nfad)
275
- verdict = @callback[packet]
318
+ def callback_handler(qhandler, nfmsg, nfad, data) #:nodoc:
319
+ packet = Packet.new(nfad)
320
+ verdict = @callback[packet]
276
321
 
277
- data = packet.data
278
-
279
- Queue.nfq_set_verdict(
280
- qhandler,
281
- packet.id,
282
- verdict,
283
- data.size,
284
- data
285
- )
286
- end
322
+ data = packet.data
323
+
324
+ Queue.nfq_set_verdict(
325
+ qhandler,
326
+ packet.id,
327
+ verdict,
328
+ data.size,
329
+ data
330
+ )
331
+ end
287
332
 
288
- def close #:nodoc:
289
- Queue.nfq_close(@conn_handle)
290
- end
333
+ def close #:nodoc:
334
+ Queue.nfq_close(@conn_handle)
335
+ end
291
336
 
292
- end
337
+ end
293
338
  end
294
339
 
295
340
  __END__
@@ -299,9 +344,9 @@ __END__
299
344
  system('sudo iptables -A OUTPUT -p tcp --dport 80 -j NFQUEUE --queue-num 0')
300
345
 
301
346
  Netfilter::Queue.create(0) do |packet|
302
- puts packet.id
347
+ puts packet.id
303
348
 
304
- p packet.data
305
- Netfilter::Packet::ACCEPT
349
+ p packet.data
350
+ Netfilter::Packet::ACCEPT
306
351
  end
307
352
 
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'nfqueue'
4
+
5
+ def mac_address(packet)
6
+ hw_addr = packet.hw_addr
7
+ return '??:??:??:??:??:??' if hw_addr.nil?
8
+
9
+ hw_addr.unpack('C*').map{|c| "%02x" % c}.join(':')
10
+ end
11
+
12
+ Netfilter::Queue.create(0) do |packet|
13
+ puts "New packet ##{packet.id} from interface #{packet.indev_name}"
14
+ puts "Ethernet address: #{mac_address(packet)}"
15
+
16
+ puts
17
+ puts packet.data.unpack('H*')[0]
18
+ puts '--'
19
+
20
+ Netfilter::Packet::ACCEPT
21
+ end
metadata CHANGED
@@ -1,85 +1,78 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: nfqueue
3
- version: !ruby/object:Gem::Version
4
- hash: 21
5
- prerelease: false
6
- segments:
7
- - 1
8
- - 0
9
- - 1
10
- version: 1.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.2
11
5
  platform: ruby
12
- authors:
13
- - "Guillaume Delugr\xC3\xA9"
6
+ authors:
7
+ - Guillaume Delugré
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2011-05-30 00:00:00 +02:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2014-12-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
23
21
  prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nfnetlink
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
27
31
  - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
33
34
  type: :runtime
34
- version_requirements: *id001
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
35
41
  description: |
36
42
  nfqueue is a tiny wrapper around libnetfilter_queue. It allows you to very simply intercept and modify network traffic in a Ruby environment.
37
- Network packets can either be inspected or modified on-the-fly.
38
-
39
- email: guillaume at security-labs dot org
43
+ email: guillaume AT security-labs DOT org
40
44
  executables: []
41
-
42
45
  extensions: []
43
-
44
46
  extra_rdoc_files: []
45
-
46
- files:
47
- - README
47
+ files:
48
48
  - COPYING
49
+ - README
49
50
  - lib/nfqueue.rb
50
- has_rdoc: true
51
- homepage:
52
- licenses:
53
- - GPL-3
51
+ - samples/packetdump.rb
52
+ homepage: http://code.google.com/p/ruby-nfqueue
53
+ licenses:
54
+ - GPL
55
+ metadata: {}
54
56
  post_install_message:
55
57
  rdoc_options: []
56
-
57
- require_paths:
58
+ require_paths:
58
59
  - lib
59
- required_ruby_version: !ruby/object:Gem::Requirement
60
- none: false
61
- requirements:
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
62
  - - ">="
63
- - !ruby/object:Gem::Version
64
- hash: 3
65
- segments:
66
- - 0
67
- version: "0"
68
- required_rubygems_version: !ruby/object:Gem::Requirement
69
- none: false
70
- requirements:
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ requirements:
71
67
  - - ">="
72
- - !ruby/object:Gem::Version
73
- hash: 3
74
- segments:
75
- - 0
76
- version: "0"
77
- requirements:
78
- - Support for NFQUEUE in your kernel, libnetfilter_queue installed and Ruby FFI
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements:
71
+ - Support for NFQUEUE in your Linux kernel, libnetfilter_queue installed and Ruby
72
+ FFI
79
73
  rubyforge_project:
80
- rubygems_version: 1.3.7
74
+ rubygems_version: 2.2.2
81
75
  signing_key:
82
- specification_version: 3
76
+ specification_version: 4
83
77
  summary: nfqueue is a simple wrapper around libnetfilter_queue using FFI.
84
78
  test_files: []
85
-