Skip to content

Instantly share code, notes, and snippets.

@le0pard
Created October 1, 2020 13:59
Show Gist options
  • Save le0pard/b52b9b124a66e6ea26ba6511be5c8ac4 to your computer and use it in GitHub Desktop.
Save le0pard/b52b9b124a66e6ea26ba6511be5c8ac4 to your computer and use it in GitHub Desktop.
Proxy DNS with debug
# frozen_string_literal: true
require 'socket'
require 'resolv'
class DNSServer
attr_reader :port, :ttl
def initialize(port: 5300, ttl: 60, records: {})
@port = port
@ttl = ttl
# DNS Database
@records = records
end
def run
puts "Starting DNS Server on port #{@port} ..."
::Socket.do_not_reverse_lookup = true
@socket = UDPSocket.new
@socket.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_REUSEADDR, 1)
@socket.bind('localhost', port)
@run = true
# Try/Catch
begin
while @run
packet, addr = @socket.recvfrom(65535)
if (packet.length == 0)
break
end
sock2 = ::UDPSocket.new()
sock2.send(packet, 0, '1.1.1.1', 53)
packet2, addr2 = sock2.recvfrom(65535)
sock2.close()
real_response = Resolv::DNS::Message.decode(packet2)
real_response.each_question { |name, typeclass|
puts "each_question: #{name} - #{typeclass}"
}
real_response.each_answer { |name, ttl, data|
puts "each_answer: #{name} - #{ttl} - #{data}"
# case data
# when Resolv::DNS::Resource::IN::A
# end
}
real_response.each_authority { |name, ttl, data|
puts "each_authority: #{name} - #{ttl} - #{data}"
}
# request = Resolv::DNS::Message.decode(packet)
# message = ::Resolv::DNS::Message.new(SecureRandom.random_number(2**16))
# message.rd = 1
# message.id = request.id
# message.add_question 'example.com.', Resolv::DNS::Resource::IN::A
# response_packet = message.encode()
# @socket.send(response_packet, 0, addr[3], addr[1])
@socket.send(real_response.encode(), 0, addr[3], addr[1])
end
rescue Interrupt
puts 'Got Interrupt !'
ensure
if @socket
@socket.close
puts 'Socket Closed !'
end
puts 'Quiting..'
end
end
end
records = {
'example.com.' => [Resolv::DNS::Resource::IN::A, '1.2.3.4'],
'google.com.' => [Resolv::DNS::Resource::IN::MX, 'example.com']
}
DNSServer.new(ttl: 120, records: records).run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment