2007-01-22 14:43:50 +01:00
|
|
|
# This plugin checks if the client is listed in DNSBLs (DNS Blackhole Lists).
|
|
|
|
# These are lists of IP addresses misbehaving. There are many DNSBLs, some are more
|
|
|
|
# aggressive than others. More information at http://en.wikipedia.org/wiki/DNSBL
|
|
|
|
#
|
|
|
|
# This plugin will perform one DNS request per client per blocklist.
|
|
|
|
# This plugin will deny service to clients those blocklists have listed.
|
|
|
|
# Whether any of this is acceptable is up to you.
|
|
|
|
#
|
|
|
|
# mailto:joost@spacebabies.nl
|
|
|
|
# License: MIT License, like Rails.
|
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
|
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
|
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
|
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
#
|
2008-12-16 07:40:30 +01:00
|
|
|
# Version 1.3
|
2007-01-22 14:43:50 +01:00
|
|
|
# http://www.spacebabies.nl/dnsbl_check
|
2010-03-01 02:23:37 +01:00
|
|
|
#
|
|
|
|
# Modified by Jacques Distler, to give a more informative (and valid) response (2/28/2010).
|
2007-01-22 14:43:50 +01:00
|
|
|
require 'resolv'
|
|
|
|
|
|
|
|
module DNSBL_Check
|
|
|
|
$dnsbl_passed ||= []
|
2010-03-01 02:23:37 +01:00
|
|
|
DNSBLS = {'bl.spamcop.net' => 'http://www.spamcop.net/w3m?action=checkblock&ip=',
|
|
|
|
'sbl-xbl.spamhaus.org' => 'http://www.spamhaus.org/query/bl?ip='}
|
2007-01-22 14:43:50 +01:00
|
|
|
|
|
|
|
private
|
|
|
|
# Filter to check if the client is listed. This will be run before all requests.
|
|
|
|
def dnsbl_check
|
2008-12-16 07:40:30 +01:00
|
|
|
return true if respond_to?(:logged_in?) && logged_in?
|
2007-01-22 14:43:50 +01:00
|
|
|
return true if $dnsbl_passed.include? request.remote_addr
|
|
|
|
|
|
|
|
passed = true
|
2010-03-01 02:23:37 +01:00
|
|
|
ban_help = ''
|
2007-01-22 14:43:50 +01:00
|
|
|
threads = []
|
|
|
|
request.remote_addr =~ /(\d+).(\d+).(\d+).(\d+)/
|
|
|
|
|
|
|
|
# Check the remote address against each dnsbl in a separate thread
|
2010-03-01 02:23:37 +01:00
|
|
|
DNSBLS.each_key do |dnsbl|
|
2007-01-22 14:43:50 +01:00
|
|
|
threads << Thread.new("#$4.#$3.#$2.#$1.#{dnsbl}") do |host|
|
|
|
|
logger.warn("Checking DNSBL #{host}")
|
|
|
|
addr = Resolv.getaddress("#{host}") rescue ''
|
|
|
|
if addr[0,7]=="127.0.0"
|
|
|
|
logger.info("#{request.remote_addr} found using DNSBL #{host}")
|
2010-03-01 06:51:33 +01:00
|
|
|
ban_help << "\n<p>See <a href='#{DNSBLS[dnsbl]}#{request.remote_addr}'>here</a> for more information.</p>"
|
2007-01-22 14:43:50 +01:00
|
|
|
passed = false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
threads.each {|thread| thread.join(2)} # join threads, but use timeout to kill blocked ones
|
|
|
|
|
|
|
|
# Add client ip to global passed cache if no dnsbls objected. else deny service.
|
|
|
|
if passed
|
2008-12-16 07:40:30 +01:00
|
|
|
# $dnsbl_passed = $dnsbl_passed[0,99].unshift request.remote_addr
|
|
|
|
$dnsbl_passed.push request.remote_addr
|
2007-01-22 14:43:50 +01:00
|
|
|
logger.warn("#{request.remote_addr} added to DNSBL passed cache")
|
|
|
|
else
|
2010-03-01 06:51:33 +01:00
|
|
|
render( :text => "<p>Access denied. Your IP address, #{request.remote_addr}, was found on one or more DNSBL" +
|
|
|
|
" blocking list(s).</p>#{ban_help}", :status => 403, :layout => 'error', :locals => {:raw => true})
|
2007-01-22 14:43:50 +01:00
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|