Skip to content

Instantly share code, notes, and snippets.

@zenozeng
Created November 17, 2013 14:49
Show Gist options
  • Save zenozeng/7514266 to your computer and use it in GitHub Desktop.
Save zenozeng/7514266 to your computer and use it in GitHub Desktop.
DNS Logger
# encoding: utf-8
require 'rubygems'
require 'rubydns'
require 'yaml'
require 'socket'
require 'awesome_print'
require 'logger'
if RExec.current_user != "root"
$stderr.puts "Sorry, this command needs to be run as root!"
exit 1
end
YAML::ENGINE.yamler='syck' # 防止出现 !binary
INTERFACES = [[:udp, "0.0.0.0", 53], [:tcp, "0.0.0.0", 53]]
Name = Resolv::DNS::Name
IN = Resolv::DNS::Resource::IN
UPSTREAM = RubyDNS::Resolver.new([[:tcp, "8.8.8.8", 53]], :timeout => 1)
# UPSTREAM = RubyDNS::Resolver.new([[:udp, "10.10.0.21", 53]], :timeout => 3)
def self.run
# Start the RubyDNS server
RubyDNS::run_server(:listen => INTERFACES) do
on(:start) do
# @logger.level = Logger::DEBUG
@logger.level = Logger::WARN
end
# deny IPv6
match(/.*/, IN::AAAA) do |transaction|
transaction.failure!(:NXDomain)
end
# passthrough & log everything
match(/.*/, IN::A) do |transaction|
domain = transaction.name.to_s
transaction.passthrough!(UPSTREAM) do |reply|
unless reply.answer.nil? || reply.answer.last.nil?
address = reply.answer.last.last.address.to_s
d = YAML::load_file('log.yml') #Load
d[domain] = address #Modify
puts domain
puts address
File.write('log.yml', d.to_yaml) #Store
end
end
end
end
end
run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment