Encaminhamento de porta, ou port fowarding ou ainda tunelamento significam a mesma coisa e é um mecanismo no SSH para direcionar o acesso da máquina ssh cliente para a máquina ssh servidor ou vice-versa por meio do direcionamento de portas.
Entendendo melhor, imagina que você pode usar seu pc chamado de A para acessar o pc B que está do outro lado do mundo. Saiba que através do tunelamento você poderá acessar os serviços do pc B, sigo mais, se o pc B estiver na mesma rede do pc C, você poderá acessar o C da seguinte forma A–>B–>C
A que acessa C através do B.
Vamos pensar melhor ainda, imagina que você tenha acesso ao pc B e o C é o roteador da rede local do B. Logicamente que ninguém teria acesso à página de configuração do roteador C estando bem longe. Mas você poderá acessar, de forma segura, a página de configuração do roteador C através do pc B. Tudo isso sem precisar abrir portas no firewall.
Pode encaminhar uma porta em sua máquina local para o servidor web da intranet corporativa, para a porta IMAP de um servidor de correio interno, para as portas 445 e 139 de um servidor de arquivos local, para uma impressora, para um repositório de controle de versão ou para quase qualquer outro sistema em a rede interna. Frequentemente, a porta é encapsulada em uma porta SSH em uma máquina interna.
Ainda mais, tunelamento poder ser usado para,
- adicionar criptografia a aplicativos legados, passando por firewalls
- abrir backdoors na rede interna de suas máquinas domésticas
- ser abusado por hackers e malware para abrir o acesso da Internet à rede interna
Vamos conhecer mais sobre tunelamento e falarmos sobre Local forwarding(encaminhamento local) e remote forwarding(encaminhamento remoto).
Forwarding Local com SSH
Vamos começar praticando. A sintaxe geral do comando é a seguinte:
ssh -L [portalocal]:[hostremoto]:[portaremota] [usuario]@[servidor]
Vamos supor que o servidor remoto tem o IP 10.40.3.8 e que há outro na mesma rede com o IP 10.40.3.9
Quero que ao acessar 10.40.3.8 na porta 8080 seja redirecionado para a 10.40.3.9 na porta 80 e assim conseguir acessar uma página web sem precisar abrir porta no firewall.
ssh -L 8080:10.40.3.9:80 maria@10.40.3.8
Agora, vamos supor que a porta acima é de um serviço web, basta então acessar abrir o navegador e acessar http://localhost:8080 ou http://127.0.0.1:8080 que você será redirecionado para o outro pc.
O encaminhamento local é usado para encaminhar uma porta da máquina cliente para a máquina servidora. Basicamente, o cliente SSH escuta as conexões em uma porta configurada e, quando recebe uma conexão, faz um túnel da conexão para um servidor SSH. O servidor se conecta a uma porta de destino configurada, possivelmente em uma máquina diferente do servidor SSH.
Usos típicos para encaminhamento de porta local incluem:
- Sessões de tunelamento e transferências de arquivos através de servidores de salto(jumper server)
- Conectando-se a um serviço em uma rede interna de fora
- Conectando-se a um compartilhamento de arquivo remoto pela Internet
No OpenSSH, o encaminhamento de porta local é configurado usando a opção -L:
ssh -L 80:servidorLocal:80 servidorRemoto
Este exemplo abre uma conexão com o servidor de salto servidorRemoto e encaminha qualquer conexão da porta 80 na máquina local para a porta 80 em servidorLocal.
Por padrão, qualquer pessoa (mesmo em máquinas diferentes) pode se conectar à porta especificada na máquina cliente SSH. No entanto, isso pode ser restrito a programas no mesmo host, fornecendo um endereço de ligação(bind address):
ssh -L 127.0.0.1:80:servidorLocal:80 servidorRemoto
A opção LocalForward no arquivo de configuração do cliente OpenSSH pode ser usada para configurar o encaminhamento sem precisar especificá-lo na linha de comando.
Remote Forwarding com SSH
No OpenSSH, os encaminhamentos de porta SSH remota são especificados usando a opção -R. Por exemplo:
ssh -R 8080:localhost:80 publico.servidor
Isso permite que qualquer pessoa no servidor remoto se conecte à porta TCP 8080 no servidor remoto. A conexão será então encapsulada de volta para o host do cliente e o cliente fará uma conexão TCP para a porta 80 no host local. Qualquer outro nome de host ou endereço IP pode ser usado em vez de localhost para especificar o host ao qual se conectar.
Este exemplo específico seria útil para fornecer a alguém externo acesso a um servidor da Web interno. Ou expor um aplicativo da Web interno à Internet pública. Isso pode ser feito por um funcionário trabalhando em casa ou por um invasor.
Por padrão, o OpenSSH permite apenas conectar-se a portas remotas encaminhadas do host do servidor. No entanto, a opção GatewayPorts no arquivo de configuração do servidor sshd_config pode ser usada para controlar isso. As seguintes alternativas são possíveis:
GatewayPorts no
Isso evita a conexão com portas encaminhadas de fora do computador servidor.
GatewayPorts yes
Isso permite que qualquer pessoa se conecte às portas encaminhadas. Se o servidor estiver na Internet pública, qualquer pessoa na Internet poderá se conectar à porta.
GatewayPorts clientspecified
Isso significa que o cliente pode especificar um endereço IP a partir do qual as conexões com a porta são permitidas. A sintaxe para isso é:
ssh -R 52.194.1.73:8080:localhost:80 host147.aws.examplo.com
Neste exemplo, apenas conexões do endereço IP 52.194.1.73 para a porta 8080 são permitidas.
O OpenSSH também permite que a porta remota encaminhada seja especificada como 0. Nesse caso, o servidor alocará dinamicamente uma porta e a reportará ao cliente. Quando usado com a opção -O forward, o cliente imprimirá o número da porta alocada na saída padrão.