Skip to content

Instantly share code, notes, and snippets.

@mukaschultze
Last active August 29, 2023 04:57
Show Gist options
  • Save mukaschultze/3eab87d7c1000637b9b668f2be62bbcf to your computer and use it in GitHub Desktop.
Save mukaschultze/3eab87d7c1000637b9b668f2be62bbcf to your computer and use it in GitHub Desktop.
Acessando serviços no docker sem expor as portas publicamente

Acessando serviços no docker sem expor as portas publicamente

Expondo portas apenas no loopback

Com Docker é possível configurar um container para que ele ouça conexões à uma porta apenas em um IP por meio da opção publish, no formato ip:hostPort:containerPort. Isso impede que conexões sejam feitas por outros IPs sejam aceitas.

Se configurarmos o container para ouvir apenas no IP de loopback (127.0.0.1), nenhuma conexão feita pela internet será aceita.

Exemplo expondo a porta 27017 do container do mongo APENAS no localhost, na porta 27018:

docker run --name mongodb -d -p 127.0.0.1:27018:27017 mongo

Ou com docker-compose:

version: "3.9"

services:
  mongo:
    image: "mongo"
    restart: always
    ports:
      - "127.0.0.1:27018:27017"

Por que não expor as portas do jeito clássico (apenas -p 27018:27017)?

Expor uma porta sem definir explicitamente o IP permite que todo mundo consiga abrir uma conexão com o container por meio dela. Isso pode levar a problemas de segurança em situações onde a senhas e chaves foram exposta por acidente. Em outros casos a configuração padrão da imagem não possui senhas (como no redis), e é comum que spambots acessem o container facilmente e tenham acesso total ao container, e possivelmente ao servidor. Outro motivo para expor apenas no localhost é o fato de alguns serviços não usarem criptografia, enviando tudo em plain sight.

Usar um túnel SSH para acessar a porta remota

Com SSH é possível acessar uma porta exposta no servidor por meio da máquina local usando túneis (port forwarding) passando a flag -L.

No exemplo abaixo, a porta LOCAL_PORT vai ser acessível por meio da sua máquina local, e vai ser equivalente à porta REMOTE_PORT do servidor.

Exemplo:

export LOCAL_PORT=27019
export SERVER_PORT=27018
ssh -L $LOCAL_PORT:localhost:$SERVER_PORT SERVIDOR

Também é possível omitir a flag -L e adicionar a prop LocalForward ao arquivo ~/.ssh/config:

Host SERVIDOR
  HostName SERVIDOR
  LocalForward 27019 localhost:27018

Conectando ao servidor pela máquina local

Após abrir a conexão SSH é possível testar o mongo remoto através da URI mongodb://localhost:27019/. (Sim, localhost, a porta do seu PC).

Obviamente, essa técnica pode ser usada para acessar qualquer porta do servidor, neste caso, a imagem do mongo foi usado como exemplo pois é um caso de uso bastante comum.

Além do mais, todas as portas podem ser iguais, nos exemplos acima foram usadas portas diferentes para deixar claro onde cada uma é definida.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment