sábado, 11 de abril de 2009

Usando seu servidor Openfire através da Internet

Já recebi vários e-mails de pessoas que conseguiram fazer seus servidores Openfire funcionarem perfeitamente na rede local, mas que com o passar do tempo tem a necessidade de que os mesmos possam ser utilizados via Internet, mas não sabem o que precisa ser feito para resolver tal situação.

Assim, resolvi escrever esse post, discutindo alguns métodos e requerimentos para que isso funcione corretamente.

Existem três cenários que são os mais comuns (pelo que tenho percebido):
  • O Servidor Openfire está rodando no mesmo servidor que o roteador/firewall.
  • O Servidor Openfire está rodando em um outro servidor dentro da rede interna mas o mesmo não possui um IP "público". Saiba mais sobre IPs de redes privadas aqui.
  • O Servidor Openfire está rodando em outro servidor da rede interna, mas o mesmo possui um IP "público".
Em todos os casos citados existem premissas básicas para que o acesso via Internet funcione:
  1. O domínio configurado no Openfire deve ser resolvido via DNS, tanto na rede interna quanto na Internet. Já vi várias pessoas que configuram o domínio como o IP do servidor na rede interna. Isso obviamente impede o uso via Internet, pois tal IP não é roteável. O mais indicado é que você use um nome como jabber.dominio.com.br, e que esse nome seja resolvido ou para o IP "público" do roteador/firewall ou para o IP do Servidor Openfire, caso ele possui um IP "público". Nos casos onde se usa ADSL com IP dinâmico, uma dica é registrar um DNS dinâmico no no-ip ou no dyndns e depois pedir a empresa que cuida de seu DNS para configurar o jabber.dominio.com.br para ser um CNAME desse nome registrado.
  2. Em quaisquer das situações será necessário alterar as políticas de firewall de sua rede. Estou partindo do princípio que você tem acesso ao firewall de sua rede. Como trabalho com Linux, estou também supondo que você tenha conhecimento da ferramenta iptables.
  3. Caso você use um link ADSL, o ideal é que você tenha um modem que funcione em bridge, e que sua operadora utilize o protocolo PPPoE. Assim você poderá se livrar do NAT no modem, e não será necessário configurar o mesmo. Caso não seja seu caso, tal post não tem intenção de debater configurações de modens, por isso consulte a documentação de seu equipamento. Cabe citar que o fato de não ser PPPoE não quer dizer que não vá funcionar, mas sim que isso poderá envolver outros passos e técnicas que não serão discutidos aqui, para que seu acesso externo funcione.

Caso 1 - O Servidor Openfire está rodando no mesmo servidor que é o roteador/firewall.

Nessa situação, basta apenas liberar o acesso de entrada das portas que serão necessárias em seu servidor. Supondo que o domínio do Openfire configurado seja jabber.dominio.com.br você pode fazer isso com os seguintes comandos:
# XMPP e XMPP SSL
iptables -A INPUT -d jabber.dominio.com.br -p tcp --dport 5222:5223 -j ACCEPT
# Server 2 Server
iptables -A INPUT -d jabber.dominio.com.br -p tcp --dport 5269 -j ACCEPT
Caso 2 - O Servidor Openfire está rodando em um outro servidor dentro da rede interna mas o mesmo não possui um IP "público".

Supondo que seu servidor Openfire esteja rodando na rede interna no IP 192.168.0.10, e que o domínio do Openfire configurado seja jabber.dominio.com.br podemos usar as seguintes regras pra desviar todo o tráfego vindo para as portas XMPP para o destino.
iptables -A FORWARD -d jabber.dominio.com.br -p tcp --dport 5222:5223 -j ACCEPT
iptables -A FORWARD -d jabber.dominio.com.br -p tcp --dport 5269 -j ACCEPT

iptables -t nat -A PREROUTING -d jabber.dominio.com.br -p tcp --dport 5222:5223 -j DNAT --to-destination 192.168.0.10
iptables -t nat -A PREROUTING -d jabber.dominio.com.br -p tcp --dport 5269 -j DNAT --to-destination 192.168.0.10
Caso 3 - O Servidor Openfire está rodando em outro servidor da rede interna, mas o mesmo possui um IP "público".

Supondo que seu servidor Openfire esteja rodando em um servidor que tem IP "público" (mas que não é o mesmo servidor roteador/firewall) e que o domínio do Openfire configurado seja jabber.dominio.com.br e ainda que esse nome resolva para o IP do servidor que roda o Openfire, podemos usar as seguintes regras pra aceitar todo o tráfego vindo para as portas XMPP do mesmo.
iptables -A FORWARD -d jabber.dominio.com.br -p tcp --dport 5222:5223 -j ACCEPT
iptables -A FORWARD -d jabber.dominio.com.br -p tcp --dport 5269 -j ACCEPT


Acredito que com as dicas acima você consiga fazer com que seu servidor Openfire possa ser usado pela Internet. Caso seu cenário seja diferente, ou você tenha alguma dúvida, fique à vontade para postar nos comentários.

Até a próxima.

11 comentários:

  1. Boa dica, eu estou usando a 4 meses o serviço
    http://www.dnsexit.com/ e com ele estou conseguindo hospedar com endereço dinãmico sem problemas rodando no ubuntu 8.04 server, o bom dele que tem um pequeno script que atualiza seu ip cada vêz que reinicia o serviço, vc pode fazer o registro do dns direto no registro.br no caso

    ResponderExcluir
  2. meu problema é o seguinte tenho o openfire num servidor linux e tenho um ip no servidor linux para acesso externo porem quando os clientes externos vao acessar a audio conferencia da prblema no firewall

    ResponderExcluir
  3. O seu IP de Internet está no próprio servidor Openfire e ele está direto na Internet (ou seja, o firewall dele é local) ?

    []s

    ResponderExcluir
  4. Marcelo veja se pode me ajudar, o caso que mais se enquadra no meu é o caso 2, servidor na rede interna sem ip publico. Minha duvida é a seguinte o servidor que esta rodando é empresa.local diferente do dominio da internet empresa.com.br.
    nesse caso como publicar o CNAME no registro.br ?

    ResponderExcluir
  5. Olá.

    Como você já está com o servidor em produção eu faria tal alteração da seguinte forma:

    * Configure o domínio no Openfire como xmpp.empresa.com.br (os JIDs dos usuários vão se alterar para user@xmpp.empresa.com.br, e tu vai ter de ajustar os contatos (roster) no DB - é o mais rápido e prático).

    * Crie uma entrada em seu DNS que aponte o xmpp.empresa.com.br como sendo CNAME do seu endereço que é resolvido no seu IP da internet (isso deve ser feito no servidor DNS autoritativo da tua zona).

    * Configure o seu servidor que contém o IP da internet para redirecionar os pacotes das portas 5222, 5223 e 5269 para o IP interno do seu servidor Openfire.

    * Altere seus clientes (internos e externos) para conectarem no servidor em xmpp.empresa.com.br.

    []s

    ResponderExcluir
  6. Bom dia Marcelo, excelente topico!
    Comecei a utilizar o open fire mas em ambiente windows.
    Atualmente ja tenho um TS configurado, atraves do dyndns com o nome empresa.dyndns.org , atraves deste endereço eu acesso o TS interno aqui na empresa que tenho o plugin do DYNDNS instalado.

    Minha duvida é a seguinte: Posso instalar o plugin do DYNDNS em outro servidor e configurar no OPENFIRE o endereço empresa.dyndns.org?

    Vc tem algum tutorial para windows?Como posso configurar o SPARK para que quando criar um novo usuario ja apareça todos os demais na lista de contatos sem que seja necessario o usuario adicionar um por um??

    ResponderExcluir
  7. Você precisa que o IP que responde pelo endereço empresa.dyndns.org também responda pelas portas do Openfire (5222,5223 e principalmente 5269).

    Se o IP vai ficar direto no servidor ou se você vai usar NAT é outra questão. Mas como você já tem o IP em outro servidor creio que terá de fazer um redirecionamento de porta para teu servidor Openfire.

    Infelizmente não tenho nada para Windows para te enviar.

    Com relação ao Spark, o que você precisa pode ser resolvido com Grupos do Openfire. Crie grupos e coloque os usuários dentro. Depois quando o usuário logar, ele automaticamente verá todos os usuários de seu grupo.

    []s

    ResponderExcluir
  8. Boa Tarde Marcelo,
    Minha aplicação está funcionando, porém fui habilitar voz e não está funcionando. Minha situação se aplica ao caso 2. Já liberei na filter as portas 3478 e 3479 (Primária e Secundária no stun)... tem alguma idéia?

    ResponderExcluir
  9. Olá.

    Infelizmente nunca precisei utilizar os recursos de voz então não tenho como te dar alguma dica a respeito.

    []s

    ResponderExcluir
  10. Ola Marcelo, a minha necessidade é liberar o acesso externo apenas para alguns usuarios do openfire é possivel fazer isso ? conexoes vindas da rede interna todos os usuarios se conectao ao servidor openfire ja na rede externa (internet) penas os usuarios que forem necessarios.... obrgido desde ja

    ResponderExcluir
  11. Tche,

    nunca ouvi falar de tal recurso para o Openfire, mas talvez alguem tenha desenvolvido um plugin para isso.

    Se o mesmo existir voce podera encontra-lo nos foruns da comunidade do Openfire no site da Ignite Realtime.

    []s

    ResponderExcluir