Como usar socat para redirecionar e tunelar portas no Linux

1. Introdução ao socat: O canivete suíço de redirecionamento de portas

O socat (SOcket CAT) é uma ferramenta de linha de comando poderosa e versátil para estabelecer conexões bidirecionais entre dois endpoints. Diferente do netcat, que se limita a conexões TCP/UDP simples, o socat suporta uma ampla variedade de protocolos, incluindo TCP, UDP, Unix sockets, pipes, PTY, SSL/TLS e até mesmo dispositivos de rede. Enquanto o ssh oferece tunelamento criptografado, o socat fornece flexibilidade incomparável para cenários complexos de redirecionamento.

Instalação do socat

Para instalar o socat nas principais distribuições Linux:

# Debian/Ubuntu
sudo apt update && sudo apt install socat

# RHEL/CentOS/Fedora
sudo yum install socat
# ou
sudo dnf install socat

# Arch Linux
sudo pacman -S socat

Sintaxe básica

A estrutura fundamental do socat é:

socat [opções] <endereço1> <endereço2>

Onde cada endereço segue o formato tipo:parâmetros, como TCP-LISTEN:8080 ou TCP-CONNECT:localhost:80.

2. Redirecionamento simples de portas locais

O uso mais básico do socat é redirecionar uma porta local para outra. Por exemplo, para encaminhar a porta 8080 para a porta 80:

socat TCP-LISTEN:8080,fork TCP-CONNECT:localhost:80

Este comando cria um listener na porta 8080. Quando uma conexão chega, o socat a encaminha para localhost:80 (servidor web). A opção fork permite que múltiplas conexões simultâneas sejam tratadas.

Exemplo prático: redirecionamento de porta para serviço interno

Suponha que um serviço MySQL esteja rodando na porta 3306, mas você deseja expô-lo em uma porta diferente:

socat TCP-LISTEN:3307,fork TCP-CONNECT:localhost:3306

Agora, clientes podem conectar-se a localhost:3307 e serão redirecionados ao MySQL na porta 3306.

3. Tunelamento de portas entre hosts remotos

O socat pode criar túneis entre duas máquinas, expondo serviços locais em hosts remotos. Por exemplo, para expor um serviço rodando na máquina local (porta 8080) em uma máquina remota (porta 9090):

Na máquina remota (servidor que receberá as conexões):

socat TCP-LISTEN:9090,fork TCP-CONNECT:localhost:8080

Na máquina local (onde o serviço realmente roda):

socat TCP-LISTEN:8080,fork TCP-CONNECT:ip_do_servidor_remoto:9090

Isso cria um túnel bidirecional. Para aceitar múltiplas conexões simultâneas, a opção fork é essencial.

Túnel reverso (expondo serviço local para remoto)

Para expor um serviço local a um host remoto sem acesso direto:

No host local:

socat TCP-LISTEN:8080,fork TCP-CONNECT:ip_remoto:9090

No host remoto:

socat TCP-LISTEN:9090,fork TCP-CONNECT:localhost:8080

Agora, qualquer conexão ao host remoto na porta 9090 será redirecionada ao serviço local na porta 8080.

4. Trabalhando com protocolos não-TCP: UDP e Unix sockets

Redirecionamento UDP

O socat também lida com tráfego UDP. Para redirecionar pacotes UDP da porta 5000 para a porta 6000:

socat UDP-LISTEN:5000,fork UDP-CONNECT:localhost:6000

Tunelamento entre Unix sockets e TCP

Muitos serviços de banco de dados (como PostgreSQL) usam sockets Unix. Para expor um socket Unix via TCP:

socat TCP-LISTEN:5432,fork UNIX-CONNECT:/var/run/postgresql/.s.PGSQL.5432

Isso permite que clientes remotos conectem-se ao PostgreSQL via TCP na porta 5432, enquanto o serviço local usa um socket Unix.

5. Criptografia e segurança em túneis com socat

O socat suporta criptografia via OpenSSL. Para criar um túnel criptografado:

No servidor (com certificado auto-assinado):

socat OPENSSL-LISTEN:443,cert=server.pem,fork TCP-CONNECT:localhost:80

No cliente:

socat TCP-LISTEN:8080,fork OPENSSL-CONNECT:ip_servidor:443

Para gerar um certificado auto-assinado:

openssl req -new -x509 -days 365 -nodes -out server.pem -keyout server.pem

Limitações: O socat não gerencia autenticação de usuários como o SSH. Para cenários seguros, o SSH tunneling (ssh -L) é mais adequado, pois oferece autenticação integrada e compressão.

6. Combinações avançadas: socat com pipes, exec e depuração

Redirecionamento para comandos externos

O socat pode conectar-se a comandos via EXEC ou SYSTEM. Por exemplo, um servidor de eco simples:

socat TCP-LISTEN:7777,fork EXEC:/bin/cat

Isso cria um servidor que ecoa qualquer dado recebido.

Proxy com logs detalhados

Para monitorar o tráfego em um proxy, use opções de depuração:

socat -d -d -v TCP-LISTEN:8080,fork TCP-CONNECT:google.com:80

A opção -d -d ativa logs detalhados, e -v exibe o conteúdo dos pacotes.

7. Exemplos práticos do dia a dia no Linux

Proxy reverso simples para servidor web local

socat TCP-LISTEN:80,fork TCP-CONNECT:localhost:8080

Redireciona todas as requisições HTTP da porta 80 para um servidor rodando na porta 8080.

Contornando firewalls restritivos

Se um firewall bloqueia a porta 22 (SSH), mas permite a porta 443:

socat TCP-LISTEN:443,fork TCP-CONNECT:localhost:22

Agora, conexões SSH podem ser feitas via porta 443.

Túnel persistente com systemd

Crie um serviço systemd para manter o túnel ativo:

[Unit]
Description=Proxy socat para serviço interno

[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:3307,fork TCP-CONNECT:localhost:3306
Restart=always
User=nobody

[Install]
WantedBy=multi-user.target

Salve em /etc/systemd/system/socat-proxy.service e ative:

sudo systemctl enable --now socat-proxy

8. Boas práticas e solução de problemas comuns

Gerenciamento de múltiplos processos socat

Para listar e matar processos socat:

# Listar processos
ps aux | grep socat

# Matar todos os processos socat
pkill socat

Erros frequentes

  • Conflito de porta: Certifique-se de que a porta não está em uso: sudo lsof -i :8080
  • Permissões negadas: Use sudo para portas abaixo de 1024
  • Timeouts: Aumente o timeout com -t <segundos> (ex.: -t 30)

Alternativas ao socat

  • ssh -L: Melhor para túneis criptografados com autenticação
  • ncat: Versão moderna do netcat, mais simples
  • iptables: Para redirecionamento em nível de kernel (mais eficiente, mas menos flexível)

Referências