У меня есть следующий код Ruby на сервере:
#!/usr/bin/env ruby
require "socket"
require "openssl"
cert_path = Dir["/etc/letsencrypt/live/example.com/fullchain.pem"].first
key_path = Dir["/etc/letsencrypt/live/example.com/privkey.pem"].first
chain_path = Dir["/etc/letsencrypt/live/example.com/chain.pem"].first
context = OpenSSL::SSL::SSLContext.new
context.cert = OpenSSL::X509::Certificate.new( File.read( cert_path ))
context.key = OpenSSL::PKey::RSA.new( File.read( key_path ))
context.extra_chain_cert = [ OpenSSL::X509::Certificate.new( File.read( chain_path )) ]
port = 4444
t = TCPServer.new( port )
s = OpenSSL::SSL::SSLServer.new( t, context )
begin
r = s.accept
rescue
# get client ip here
p r.methods.sort
end
Я могу нормально подключиться к серверу с помощью этой команды:
curl https://example.com:4444
Если я специально вызвал ошибку, напримерэто (обратите внимание, что http вместо https):
curl http://example.com:4444
Тогда я не могу получить IP-адрес клиента откуда-либо, потому что соединение уже закрыто. Я получаю атаки со многими подобными запросами, и я хотел бы защитить эти IP-адреса брандмауэром, только мне понадобятся адреса для этого. Любая идея, как получить IP-адрес удаленного клиента, который вызвал ошибку? Перехват исключения и печать объекта ошибки не содержит полезной информации. Спасибо.