Permitindo Soquetes através do Yast FireWall

1

Versão resumida: Como eu permito que o Firewall do Yast em um servidor Linux permita que os soquetes se conectem com uma porta selecionada aleatoriamente (por os)?

Versão mais longa: Uma parte do meu programa java maior tem um cliente se conectando ao servidor usando sockets. A conexão inicial é feita em uma porta específica com um ConnectionManager, que fornece ao cliente uma porta e uma senha para conexão. A maneira que eu escolhi originalmente a porta foi através de uma lista de portas (todas acima de 49152) que eu permiti no firewall. Percebi que essa nova conexão funcionaria aleatoriamente ou recusaria a conexão. Eu concluí que as portas que estavam sendo fechadas ou usadas por outra coisa (tentou desligar o firewall, não ajudaram).

Em seguida, foi sugerido que eu deixasse o sistema escolher a porta, não especificando o número da porta (usando 0 como por este construtor: JavaDoc ). Isso escolheu uma porta livre, que funciona perfeitamente quando o firewall está inativo. No entanto, o firewall bloqueia a conexão e o tempo limite do cliente.

Existe alguma maneira de configurar o firewall do Yast para permitir os soquetes, sem superexposição do servidor? Ou posso / devo especificar um intervalo de números de porta para o java escolher um aberto, e permitir essas portas?

NOTA: Eu originalmente perguntei isso em stackoverflow e foi sugerido para postar aqui. É exatamente o mesmo: StackQuestion .

    
por Ryan 21.07.2011 / 21:49

2 respostas

2

As conexões TCP podem ser identificadas exclusivamente pela combinação de IP de origem, porta de origem, IP de destino e porta de destino. Um bom exemplo é um servidor web - todos estão se conectando a ele na porta 80, mas é capaz de manter todas essas conexões para a mesma porta simultaneamente porque o IP e a porta de origem são diferentes para cada um.

O que eu estou chegando aqui é que você está reinventando a roda abrindo uma porta de escuta distinta para cada cliente de conexão. O melhor exemplo de um protocolo que se comporta da mesma maneira é o FTP de modo passivo. Alguns firewalls funcionam bem com ele apenas por causa da profunda inspeção de pacotes - há código em vigor na inspeção de protocolo devido à necessidade de abrir a porta alta, mas é uma solução alternativa específica para algo que é considerado uma maneira "legada" de fazer coisas.

Eu recomendaria o uso de uma única porta para todo o tráfego de entrada do cliente, que é uma forma muito mais amigável de firewall de permitir conexões de cliente - tanto do seu lado quanto do cliente, onde as políticas de firewall podem ter alto destino portas bloqueadas. Se isso não é uma preocupação e você especificar um intervalo de portas e apenas deixar todos eles através do firewall, apenas certifique-se de que nada mais está escutando neles.

    
por 21.07.2011 / 22:47
0

No lado do YaST - você não precisa fazer isso, você pode usar diretamente o iptables para permitir / negar portas. Uma abordagem melhor seria abrir a porta certa em Java - seja percorrendo um intervalo e testando cada um até obter êxito (o bind lançará uma exceção, se alguém estiver usando a porta) e, em seguida, abrir o intervalo no firewall.

Outra abordagem seria (é questão de programador, melhor para SO :)) usar um pool de soquetes, que seu aplicativo usará. Existe um bom exemplo no Koders.

    
por 21.07.2011 / 22:33