I have a basic ruby program, that listens on a port (53), receives the data and then sends to another location (Google DNS server - 8.8.8.8). The responses are not going back to their original destination, or I'm not forwarding them correctly.
Here is the code. NB I'm using EventMachine
require 'rubygems'
require 'eventmachine'
module DNSServer
def post_init
puts 'connected'
end
def receive_data(data)
# Forward all data
conn = UDPSocket.new开发者_运维知识库
conn.connect '8.8.8.8', 53
conn.send data, 0
conn.close
p data.unpack("H*")
end
def unbind
puts 'disconnected'
end
end
EM.run do
EM.open_datagram_socket '0.0.0.0', 53, DNSServer
end
Any thoughts as to why or tips to debug, would be most appreciated.
The obvious problems are:
- UDP comms are usually connectionless, use the 4 argument version of
send
instead ofconnect
- You're not receiving any data from the socket talking to 8.8.8.8
- You're not sending any data back (
#send_data
) to the original client
This seems to work:
require 'socket'
require 'rubygems'
require 'eventmachine'
module DNSServer
def receive_data(data)
# Forward all data
conn = UDPSocket.new
conn.send data, 0, '8.8.8.8', 53
send_data conn.recv 4096
end
end
EM.run do
EM.open_datagram_socket '0.0.0.0', 53, DNSServer
end
精彩评论