Hello, I have the following TCP server written in Ruby. However, client.peeraddr[3]
always returns a bogon IP address: 172.16.1.138
. I assume Fly.io is masking the IP address. Is there a way to get the actual client IP address?
require 'socket'
require 'eventmachine'
require 'rest-client'
require 'logger'
@logger = Logger.new($stdout)
EM.run do
acceptor = TCPServer.open('0.0.0.0', 8080)
fds = [acceptor]
@logger.info 'Server started'
EM.add_periodic_timer(0.1) do
if ios = IO.select(fds, [], [], 0)
reads = ios.first
reads.each do |client|
if client == acceptor
client, sockaddr = acceptor.accept
client_ip = client.peeraddr[3] # Extract the client's external IP address
@logger.info "Someone connected to server from IP: #{client_ip}. Adding socket to fds."
fds << client
elsif client.eof?
@logger.info 'Client disconnected'
fds.delete(client)
client.close
else
data = client.gets("\n").chomp
@logger.info 'Received input...'
@logger.info data
@logger.info 'Contacting the online server...'
begin
# DO STUFF
puts "\n"
fds.delete(client)
client.close
@logger.info 'Answered client and closed connection'
next
rescue StandardError => e
@logger.error "Error: #{e.message}"
client.puts "Error: #{e.message}"
end
end
end
end
end
end
my fly.toml looks like this instead:
app = 'myapp'
primary_region = 'ams'
[build]
[[services]]
protocol = "tcp"
internal_port = 8080
[[services.ports]]
port = 8080
[[vm]]
memory = '512mb'
cpu_kind = 'shared'
cpus = 1
[checks]
[checks.tcp_check]
grace_period = "30s"
interval = "15s"
port = 8080
timeout = "10s"
type = "tcp"