Commit 105689f1 authored by Cool Fire's avatar Cool Fire

Initial commit. Could be improved by parsing the backend server request and...

Initial commit. Could be improved by parsing the backend server request and splicing in the original port numbers.
parents
#!/usr/local/bin/ruby19
require 'socket'
# Address and port to listen on.
# Normally this is your WAN address.
addr = '80.112.131.85'
port = 113
# Create listen server
server = TCPServer.new( addr, port )
# Forward request to NAT'ed server
def forwardrequest( host, p1, p2 )
begin
# Create new socket to NAT'ed server
s = TCPSocket.new( host, 113 )
# Send request to NAT'ed server
s.puts "#{p1}, #{p2}"
return s.gets
rescue Exception => e
return nil
end
end
# Look up function for NAT table
def natlookup( p1, p2 )
# Execute shell command to get NAT table
nattable = %x(pfctl -ss | egrep '(>.*>|<.*<)')
# Search NAT table for matching enties
if( nattable =~ /tcp (.+):(.+) -> (.+):#{p1} -> (.+):#{p2} / )
server = $1
p1 = $2.to_i
return [server, p1, p2]
else
return nil
end
end
# Main server loop
loop do
# New client connected
client = server.accept
# Read request from socket
input = client.gets
input.strip!
sane = true
p1 = 0
p2 = 0
# Check if it's something that looks like an ident response
if( input =~ /^(\d+)(|\s),(|\s)(\d+)$/ )
p1 = $1.to_i
p2 = $3.to_i
else
sane = false
end
# Sanity check on port number
if( p1 < 1 || p1 > 65535 || p2 < 1 || p2 > 65535 )
sane = false
end
# Send generic error for stuff that does not look like ident requests
if(!sane)
client.puts "#{input}:ERROR:NO-USER"
client.close
next
end
# Do NAT table lookup
n = natlookup( p1, p2 )
# Check if there was a NAT table entry
if( n.nil? )
client.puts "#{input}:ERROR:NO-USER"
client.close
next
end
# Forward request to NAT'ed server
result = forwardrequest( n[0], n[1], n[2] )
# Show result to client
if( result.nil? )
client.puts "#{input}:ERROR:NO-USER"
client.close
next
end
client.puts result
# Close connection and wait for the next request
client.close
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment