Cavando Túneis por Fama e Fortuna (e um pouco de persistência)
setembro 27th, 2006 | by Aldrin Leal |(E chorando enquanto um meio de vida!)
Sério: Desde que descobri como fazê-los, boa parte do meu trabalho hoje envolve criar túneis. Agora, Antes que você pense que virei garimpeiro em Serra Pelada, é melhor que eu explique: No Secure Shell, uma feature pouco conhecida por 95% dos usuários (os outros caem na chamada regra dos 5%) é o conceito de túnel. Em que consiste? Bem, vamos começar do início:
- ssh (Secure Shell) é um protocolo e o nome dado a uma suite de programas que, entre outras coisas, permitem que você acesse hosts remotos na internet, sob a benção da criptografia e seu feitor maior, São Bruce Schneier;
- Não apenas sessões interativas, a la telnet. O ssh, a maneira que foi desenhado, também permite que você execução de comandos remotamente. A grande verdade é que o ssh tem mais de rsh do que de telnet. Espiritualmente falando, é claro, pois o mesmo busca *NÃO* herdar os clássicos problemas de segurança que o rsh possui. E existem ótimas soluções que tomam partido disto;
- Além disso, ssh permite multiplexação de conexões, na forma de túneis estáticos, túneis X11, e túneis dinâmicos, que são proxies SOCKS (o que é denominado de túnel dinâmico, em PuTTY-nês). O túnel estático, por sua vez, é o simples redirecionamento de uma porta em um host para outro host;
- E finalmente, através dos seus subsistemas, podemos usar o ssh para transferir
pornografia, pirataria, e músicaarquivos. Oremos;
Ok, tá complicando, então, é hora de esboçar um estudo de caso. E, se você gazetou a aula de Internet Protocol e não entende de tunneling SSH, confira aqui e principalmente aqui, respectivamente.
Parte I: O Problema:
Hora de desenhar. No meu dia-a-dia, eu lido com várias máquinas. Segue uma mini-topologia da rede doméstica (obrigado, seu Visio!). Clique pra poder enxergar mais de perto, se você não está em dia com seu oculista, é claro:
Como você percebe, é muita máquina. E o pior: Inicialmente, todas elas estavam ocultas através de NAT, tornando impossível o acesso a elas exceto quando mediante configuração de repasse de portas ao router (e tomando cuidado com algumas delicadezas da Telemar). Porém, em algumas situações extremas, o acesso administrativo (i.e., capacidade de modificar um dispositivo) inexiste (i.e., existe um firewall e/ou algum router que você não possui autonomia, principalmente fora de casa). E agora, Jalaska?!?
(Letrinhas Miúdas na tela, ao fundo: Nenhum Comediante do Pânico vindo do Ceará foi machucado durante a elaboração desta foto)
Fico devendo uma ode ao ZeroConf, mas espero fazer isto nos próximos meses. Mas, pra quem não sabe, ZeroConf é a maneira mais inteligente e interoperável de se publicar e negociar não apenas endereços de rede, como hostnames *E* os serviços que sua máquina possui. Interoperável, pois Linux, BSD, e Windows são iguais. Curioso, pensando que veio da Apple, mas é tudo a mais completa verdade. Se bem que, Mac OS X é um FreeBSD.
(Aqui, deixo um recado: The power to serve, criançada! Pois os BSD são garanhões num prado aonde o Linux ainda é pônei.)
Parte II: A Pergunta Cicarelli
Definindo o problema, temos o seguinte enunciado:
Qual a melhor maneira de acessar todos os PCs na rede, de forma centralizada e acessível via internet, porém sem abrir as pernas no quesito Segurança? Como um biquini: Sendo prático e revelando coisas sugestivas, porém escondendo o que realmente faz a diferença!
Além disso, é importante termos isto enquanto serviço (a la BitVise Tunnelier, exceto que aqui não tem bandeja pra guardar), pois assim, teremos a persistência da memória.
(Aldrin Leal avisa: Pintores Cubistas não foram machucados na elaboração deste post!)
Parte III: A resposta:
SSH enquanto protocolo primário de acesso, e túneis ssh para fornecer serviços. E autossh + autenticação SSH via PKI (Pares de Chave Pública / Privada) e scripts colando toda esta turma. E um pouco de ZeroConf e DynDNS para fazer a cola das peças.
(Nota: Boa parte do Pulo do Gato está na Dinâmica entre o SSH, autossh, e start-stop-daemon!)
Parte IV: O Caminho para a resposta:
Configurem seus Servidores SSH, as usual. Ter domínio no PuTTY e no BitVise Tunnelier também ajuda. Se você usa Windows, aprender o Cygwin e o seu servidor OpenSSH também ajuda. Configurem também autenticação baseada em chave e, por favor, as testem.
Em paralelo, nas máquinas atrás de DSL, configurem vínculos dyndns ou configurem o do bind (dica: Usem dyndns e nos seus registros DNS, criem ponteiros CNAME. Na dúvida, leia o DNS-HOWTO do TLDP).
Parte V: A super-cola-bonder-da-estrela.
Requisitos: Domínio de Shell Scripting, Argumentos SSH, e um bocado de troubleshooting. Principalmente, bolas para poder ler a manpage do start-stop-daemon e do ssh.
Estude e analise este script. Modifique de acordo com as suas necessidades. Lave, Enxágue e Repita. YMMV:
=====8<=====8<=====8<=====8<=====8<=====8< CORTE AQUI =====8<=====8<=====8<=====8<=====8<=====8<
#!/bin/sh
### BEGIN INIT INFO
# Provides: tunnel
# Default-Start: 2 3 4 5
# Default-Stop: S 0 1 6
# Short-Description: autossh tunneling
# Description: Sets up an autossh Tunnel
#
### END INIT INFO
set -e
PATH=/sbin:/bin:/usr/bin:/usr/sbin:/u/gl/glastops/Prod/bin
export PATH
AUTOSSH_DEBUG=true
if [ ! -x "$DAEMON" ]; then
DAEMON=/usr/bin/autossh
fi
if [ ! -x "$SSD" ]; then
SSD=/sbin/start-stop-daemon
fi
NAME=”autossh”
DESC=”autossh tunneling”
PID=$HOME/run/$NAME.pid
REMUSER=user@host
# REMKEY é o caminho pra sua chave privada
REMKEY=/home/aldrin/.ssh/homeproxy_rsa
# man ssh para maiores dicas sobre este argumento. Não se preocupe, não cai na prova.
ARGS=”-M2002 -C4 -i $REMKEY -gNR220:127.0.0.1:22 -R3389:aldrin.local:3389 -v $REMUSER”
# start up the tunnels
start() {
echo -n ”Starting $DESC: $NAME”
$SSD –start –chuid aldrin -bm –pidfile $PID –exec $DAEMON – $ARGS || echo -n ”: Failed.”
echo ”.”
}
# stop the tunnels
stop() {
echo -n ”Stopping $DESC: $NAME”
$SSD –stop –pidfile $PID
echo ”.”
}
# restart the tunnels
restart(){
stop
start
}
# show some sort of status
status() {
if [ -r $PID ]; then
/bin/kill -0 `cat $PID` 2>&1 >/dev/null && exit 0;
else
echo ”PidFile $PID nao existe.”;
fi
exit 1;
}
# see how we were called
case ”$1″ in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
status)
status
;;
*)
echo $”Usage: %0 {start|stop|status|restart|reload}”
exit 1
esac
=====8<=====8<=====8<=====8<=====8<=====8< CORTE AQUI =====8<=====8<=====8<=====8<=====8<=====8<
Parte VI: E o Resultado final?
Um tunnel Persistente, auto-ishtartado pelo /etc/init.d. Pra colar no startup, update-rc.d e chkconfig são seus amigos.
Que ninja!
You must be logged in to post a comment.