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"
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.
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
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.