Túneis SSH: acesso remoto seguro e encaminhamento de porta
SSH é um protocolo de comunicação que nos permite acessar hosts remotos e transferir dados com segurança em redes inseguras, graças a conexões criptografadas. Usando a técnica de tunelamento SSH, podemos encaminhar o tráfego TCP de e para uma máquina local, contornando as restrições do firewall. Neste tutorial, aprendemos a diferença entre túneis SSH locais e remotos e como criá-los.
Neste tutorial você aprenderá:
- Qual é a diferença entre um túnel SSH local e um remoto
- Como criar túneis SSH locais e remotos
Criando um túnel SSH local
Ao usar um túnel SSH local, podemos encaminhar qualquer tráfego de uma determinada porta TCP na máquina local para um determinado endereço e porta de host remoto. Isto pode ser útil quando queremos acessar um serviço que não pode ser acessado diretamente de nossa rede, mas pode ser acessado de outra máquina. Aqui está um exemplo: suponha que haja uma instância do servidor Apache em execução em uma máquina que não seja acessível de uma rede externa, mas apenas de outros hosts dentro de sua própria rede privada. O IP local desta máquina é 192.168.1.6
. Nele, o servidor web Apache está escutando na porta 80.
Embora não possamos acessar a máquina diretamente pela Internet, podemos estabelecer uma conexão SSH com outra máquina que esteja na mesma rede privada e possa ser acessada externamente usando o FQDN serverone.mydomain.com
:
Ao criar um túnel SSH local, podemos acessar a página web servida pelo Apache na máquina remota, como se estivesse rodando em nossa máquina, e escutando na porta 8000
. Para criar o túnel local, invocamos o cliente ssh
com a opção -L
, e passamos os mapeamentos de hosts como argumento, usando a seguinte sintaxe:
[local-address]:local-port:remote-address:remote-port
O endereço local é opcional: se não fornecermos um, a porta encaminhada estará disponível em todas as interfaces. Neste caso seremos explícitos e usaremos 192.168.0.39
. Para criar o túnel, executamos:
$ ssh -N -L 192.168.0.39:8000:192.168.1.6:80 user@serverone.mydomain.com
Você pode notar que usamos a opção -N
no comando acima: isso é necessário para especificar que não queremos executar nenhum comando, mas queremos apenas estabelecer uma conexão com o servidor remoto. Uma vez estabelecida a conexão, poderemos acessar o conteúdo servido pelo Apache no servidor remoto privado, abrindo nosso navegador e navegando até http://192.168.0.39:8000.
Criando um túnel SSH remoto
Um túnel SSH remoto, ou “reverso”, funciona na direção oposta de um túnel local. Ao usar um túnel SSH remoto, podemos especificar que as conexões para um determinado endereço remoto e porta TCP devem ser encaminhadas para um host e porta local. Qual é a situação em que podemos querer criar um túnel SSH remoto?
Suponhamos que estamos desenvolvendo um site, então temos uma instância do servidor web Apache rodando em nosso notebook, escutando na porta 80
. O endereço IP local da nossa máquina é, mais uma vez: 192.168.0.39
. Como a máquina está protegida por um firewall NAT, ela não pode ser acessada do mundo externo. Porém, de vez em quando, queremos poder mostrar a terceiros como está a evolução do nosso projeto, sem expor diretamente o serviço. Como podemos alcançar nosso objetivo? Poderíamos criar um túnel SSH remoto!
Nós nos conectamos via SSH ao servidor acessível publicamente, que, ao lado da porta 22
, expõe também a porta 8888
para o mundo exterior. Com o túnel SSH remoto, encaminhamos todo o tráfego TCP que ocorre naquela porta, para a porta 80
em nossa máquina, que é a porta que nosso servidor web Apache local está escutando. O cliente de terceiros poderá ver as páginas servidas por nossa instância de servidor web local em http://serverone.mydomain.com:8888:
Como queremos permitir que clientes externos acessem uma porta encaminhada via SSH, para que nosso túnel funcione, precisamos garantir que a opção GatewayPorts
esteja definida como “sim” na configuração do servidor SSH. A diretiva geralmente é comentada na linha 88 do arquivo /etc/ssh/sshd_config
:
#AllowTcpForwarding yes
GatewayPorts yes
#X11Forwarding no
Para que a mudança tenha efeito, precisamos reiniciar o serviço ssh:
$ sudo systemctl restart sshd
Agora, para criar o túnel SSH remoto, em nossa máquina local, executamos ssh com a opção -R
e passamos os mapeamentos host-porta:
[remote-address]remote-port:local-address:local-port
Onde, “endereço-remoto” e “porta-remota” são, respectivamente, o endereço e a porta em que o cliente poderá acessar o serviço, enquanto “endereço-local” e “porta-local”, são o endereço local e porta que o servidor está escutando. Para criar o túnel remoto, executamos:
$ ssh -N -R serverone.mydomain.com:8888:192.168.0.39:80 user@serverone.mydomain.com
Pensamentos finais
Neste tutorial, aprendemos a diferença entre túneis SSH locais e remotos e vimos como criá-los no Linux. Os túneis locais são úteis quando queremos acessar um serviço que não pode ser acessado diretamente pela Internet; em vez disso, usando túneis remotos, podemos permitir que outra pessoa acesse um serviço em execução em nossa máquina local, mesmo que esteja protegido por um firewall NAT.