Forwarding requests UDPSocket
I have a basic ruby program, that listens on a port (53), receives the data and then sends to another location (Google DNS server - 220.127.116.11). 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 '18.104.22.168', 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 of connect
- You're not receiving any data from the socket talking to 22.214.171.124
- 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, '126.96.36.199', 53 send_data conn.recv 4096 end end EM.run do EM.open_datagram_socket '0.0.0.0', 53, DNSServer end