Eu escrevi um servidor Perl simples que escuta em uma porta/soquete TCP, aceitando conexões. Agora eu me pergunto:
Ao querer implementar o controle de acesso baseado em endereço, é possível verificar o endereço do peer que solicita uma conexão antes de aceitá-la?
Se possível, eu poderia rejeitar a solicitação de conexão (espero) em vez de aceitar a conexão e fechá-la imediatamente novamente.
A conexão TCP/IP é estabelecida pelo kernel e então seu aplicativo começa a trabalhar com a conexão.
A única maneira de filtrar/prevenir conexões desnecessárias é usando um firewall de kernel. Você não especificou seu sistema operacional, mas no Linux será iptables/nftables.
Não é realmente uma resposta, mas algumas dicas longas demais para comentários:
No MacOS X
man accept
diz:(ênfase minha)
Não consigo encontrar mais detalhes em
man recvmsg
ouman getsockopt
sobreman tcp
esse tópico.No Debian,
man accept
diz:IMHO, o único que pode fornecer mais informações seria
epoll
.Mas mesmo que você consiga obter as informações, não tenho certeza de como você rejeitaria a conexão se não gostar dela.
Provavelmente é melhor fazer a filtragem no nível da pilha/firewall da rede (iptables e amigos).
Não reivindico nenhum conhecimento em Perl - mas suspeito que não seja possível. Para controlar o acesso a um servidor eu restringiria (em ordem de preferência):
Dado que a facilidade de restringir por configuração do host não existe atualmente, aparentemente escolher isso como ponto de partida parece incomum.
Supondo que 1 e 2 acima não sejam uma opção, sugiro usar wrappers TCP do seu código Perl. Isso deve permitir que você comece a trabalhar com alterações mínimas de código e, ao mesmo tempo, aproveite um mecanismo flexível, padrão e robusto para controle de acesso à rede. Veja também https://metacpan.org/pod/Net::TCPwrappers
Acredito que também seja possível aplicar wrappers tcp ajustando o LD_LIBRARY_PATH em tempo de execução (ou seja, sem nenhuma alteração de código), mas não consegui encontrar referência a isso em uma pesquisa rápida no Google.
O protocolo de controle de transmissão não é usado para controle de acesso.
Aconselho você a verificar o TLS https://en.m.wikipedia.org/wiki/Transport_Layer_Security
Além disso, dê uma olhada nos ganchos de entrada do firewall do netfilter. Você pode descartar e rejeitar pares indesejados.