Seminário on-line aberto: “SSH / NC / Socat: dicas e truques”

Bom dia a todos!

Na próxima semana, lançaremos o próximo grupo de Administradores Linux , em conexão com o qual realizamos vários eventos. Uma delas é uma lição aberta sobre o tópico “SSH / NC / Socat: dicas e truques”. Nela lembramos o que é ssh, sua história e missão. Examinamos várias opções para seu uso: remoto, encaminhamento de porta local, cópia segura, proxy de meias, proxy reverso. Na verdade, tentamos os utilitários nc e socat em um laboratório virtual.

O webinar foi conduzido pelo experiente administrador de sistemas Vladimir Drozdetsky , desenvolvedor de infraestrutura da letundra.com, exposcan.ru, crispmessenger.com.

Trazemos à sua atenção uma descrição detalhada do evento passado.


Lembre-se do que é SSH

SSH (Secure Shell) é um "shell seguro", um protocolo de rede no nível do aplicativo. Permite controlar remotamente o sistema operacional e encapsular conexões TCP (por exemplo, para transferir arquivos). Em sua funcionalidade, o SSH é semelhante aos protocolos Telnet e rlogin; no entanto, difere deles porque criptografa todo o tráfego, incluindo as senhas transmitidas. A especificação do protocolo SSH-2 está contida na RFC 4251.

Vejamos os vários usos do SSH, padrão e não padrão. O suporte a seguir nos ajudará com isso:



O estande apresenta quatro máquinas virtuais que estão atrás do firewall. Executaremos todas as ações da máquina Nó-1.

Criando uma chave SSH

Para usar a chave SSH, você deve primeiro criá-la. Para isso, um utilitário especial é adequado, absolutamente em qualquer distribuição Linux:

ssh-keygen -t RSA -N otuslinux -f ~/.ssh/otus 

  • -t - qual algoritmo de criptografia usar;
  • -N - chave de criptografia (um argumento conveniente se você precisar criar uma chave sem criptografia e respostas a várias solicitações do ssh-keygen);
  • -f - em qual arquivo salvar a chave.

Configurações SSH ssh-server

Para mais trabalho, você precisará editar o arquivo / etc / ssh / sshd_config e reiniciar o servidor ssh. Aqui você deve prestar atenção às seguintes opções:

RSAAuthentication yes (se a autenticação RSA é permitida);
PubkeyAuthentication yes (se a autenticação por chave é permitida);
AuthorizedKeysFile %h/.ssh/authorized_keys (caminho para a parte pública da chave);
PasswordAuthentication yes (se a autenticação é permitida).

Para copiar a chave para o servidor, faça o seguinte:

ssh-copy-id -i /path/to/pub/key user@server (copie a parte pública da chave no servidor remoto, a chave pública será copiada no caminho para o arquivo% h / .ssh / allowed_keys)

Para não inserir a chave de criptografia novamente sempre que conectar um servidor remoto, podemos usar o ssh-agent. Para fazer isso:

eval $(ssh-agent -s) (eval faz parte do POSIX. Sua interface também pode ser um shell. A chave do agente será armazenada na forma descriptografada).

ssh-add ~/.ssh/our_private_key (Adicione uma chave privada).

Nesse caso:

  • -i - indica a localização da chave pública;
  • usuário - nome de usuário no servidor remoto;
  • servidor - IP ou DNS do servidor de destino.

Para facilitar a conexão com um servidor remoto, podemos descrever os parâmetros de conexão no arquivo ssh config, localizado no caminho ~ / .ssh / config

Assim, obtemos o seguinte arquivo de configuração SSH:

 Host myserver HostName ip/hostname Port 22/??? User username IdentityFile ~/.ssh/id_rsa 

Tudo é simples aqui:

  • Host - o nome da nossa conexão;
  • HostName - nome do servidor;
  • Porta - porta ssh
  • Usuário - nome de usuário;
  • IdentityFile - chave ssh.

SSH SCP

Vamos seguir em frente. A maneira mais fácil de usar o SSH é copiar o arquivo de uma máquina para o controle remoto. Para fazer isso, use o utilitário SCP (Secure Copy Protocol). Com ele, você pode copiar um diretório ou arquivo de um servidor local para um servidor remoto ou vice-versa:

scp test.txt username@server:/some/directory (Copiando um arquivo do servidor local para o servidor remoto).
scp username@server:test.txt /some/directory (Copiando um arquivo de um servidor remoto para um local).
scp -r dir_name username@server:/some/directory (Copiando uma pasta do servidor local para o controle remoto).

Aqui:

  • nome de usuário - nome de usuário;
  • servidor - endereço do servidor;
  • / some / server - o diretório em que copiamos;
  • dir_name - nome da pasta;
  • -r - use recursivamente.

Túnel SSH, proxy

Agora, vejamos a opção de encaminhar uma porta com um controle remoto para a máquina local. Tomemos o caso clássico como exemplo, ou seja, quando temos um "guarda de segurança maligna" e um servidor com um aplicativo da Web, as portas ssh e https estão olhando para o mundo e realmente queremos nos conectar ao servidor MySQL.

Então:

ssh -f -N -L 9906:127.0.0.1:3306 user@server (Apenas nosso caso com o MySQL)

Como resultado, podemos conectar à porta local 9906 com o cliente mysql e acessar nosso servidor de "segurança".

ssh -D 8080 -q -C -N -f servername (Proxying tráfego através de SOCKS através da porta 8080)

Com este comando, criamos um servidor proxy socks5 usando ssh. Para verificar seu desempenho, podemos usar o seguinte comando:

 curl -x socks5h://server-with-proxy:8080 https://test.domain 

Um exemplo clássico de encaminhamento de porta usando ssh é quando o servidor ao qual você deseja se conectar fica atrás do nat. O comando a seguir nos ajudará a conectar-se a esse servidor:

ssh -f -N -R 2255:localhost:22 username@servername (encaminhando de um servidor remoto para um local).

No servidor remoto, a porta 2255 será aberta, que será redirecionada para a porta 22 do nosso servidor para o nat. Para se conectar a um servidor, podemos usar o comando:

 ssh -p 2255 username@localhost 

Observe que:

  • -f - envia ssh para segundo plano;
  • -N - não execute o comando no host remoto;
  • -L - encaminha a porta local (porta local: máquina local: porta remota);
  • -R - porta na máquina remota;
  • -q - modo silencioso;
  • -D - define o roteamento dinâmico local das portas no nível do aplicativo;
  • -C - solicitação de compactação de dados.

Netcat (nc)

Nossa próxima parada é o Netcat, um utilitário Unix que permite estabelecer conexões TCP e UDP, receber dados de lá e transferi-los. Apesar de sua utilidade e simplicidade, esse utilitário não está incluído em nenhum padrão e não é fornecido com nenhum kit de distribuição. Por conseguinte, tem de ser instalado manualmente.

Um dos recursos interessantes do Netcat (nc) é a capacidade de verificar portas:

nc -vn ipaddress 22 (varredura de porta única);
nc -v ipaddress 10-55 (varredura do intervalo de portas);
nc -l 4444 (abra e ouça a porta 4444);
nc servername 4444 (nós nos conectamos ao servidor na porta desejada).

Depois de abrir a porta e conectar a ela, temos uma pequena sala de bate-papo na rede =).

A seguir, consideramos a possibilidade de transferir arquivos usando o utilitário nc. Para fazer isso, o seguinte comando nos ajudará:

cat test_file | pv -b | nc -l 4444 cat test_file | pv -b | nc -l 4444 (abra a porta e transfira o arquivo para ele através do canal, o utilitário pv com a opção -b é usado para exibir o progresso da transferência de arquivos em bytes).

nc servername 4444 | pv -b > filename nc servername 4444 | pv -b > filename (nos conectamos ao servidor para receber o arquivo, pv -b é usado da mesma maneira).

Podemos complicar nosso pipe adicionando arquivamento de arquivos rapidamente:

tar -czf - /path/to/ | pv -b | nc -l 4444 tar -czf - /path/to/ | pv -b | nc -l 4444 (arquivando pastas em tempo real e enviando);
n c servername 4444 | pv -b > file.tar.gz c servername 4444 | pv -b > file.tar.gz ( c servername 4444 | pv -b > file.tar.gz o arquivo c servername 4444 | pv -b > file.tar.gz ).

Um recurso não muito óbvio do nc é criar apenas um servidor http.

 while true; do nc -lp 80 < index.html; done 

Observe que, para usar a porta 80, você deve ter privilégios de root.

Observe também que:

  • -l - indica o modo operacional de escuta;
  • -n - não use consultas DNS;
  • -v - saída detalhada.

Socat

Também é um utilitário útil que permite estabelecer conexões TCP entre máquinas, portas de encaminhamento, etc. Ele trabalha com o princípio do Netcat: abre duas conexões bidirecionais, pode transferir dados, fluxos, etc. No entanto, possui um recurso interessante. Por exemplo, usando Socat, podemos mapear portas COM para portas TCP, etc.

Exemplos de trabalho Socat:

socat -u FILE:file_name TCP-LISTEN:5778,reuseaddr # send file;
socat -u TCP:192.168.1.48:5778 STDOUT | pv -r > file_name socat -u TCP:192.168.1.48:5778 STDOUT | pv -r > file_name # get file;
socat TCP-LISTEN:80,fork TCP:ubuntunode-4:80 # redireciona a porta do servidor remoto para a porta local;
socat TCP-LISTEN:1234,reuseaddr EXEC:/bin/bash # Abrir shell remoto =);
socat - TCP:server_with_remote_shell:1234 # Conecte-se ao shell remoto do servidor remoto.

Descriptografia pequena:

  • -u - uso do modo unidirecional;
  • ARQUIVO - indica que estamos usando o arquivo;
  • TCP-LISTEN - ouça a porta TCP;
  • reuseaddr - permite que outros soquetes se comuniquem com o mesmo endereço, mesmo que seja usado;
  • fork - depois que a conexão é estabelecida, o canal é processado no processo filho;
  • TCP é o tipo de conexão.

Devo assistir a versão em vídeo agora?

Claro que sim, porque na descrição tudo é apresentado de forma abstrata. Além disso, os tópicos do webinar são descritos em mais detalhes, além de alguns deles fornecerem exemplos adicionais e opções de implementação. Portanto, se você estiver interessado neste tópico, analise a lição aberta na íntegra e repita todas as etapas de Vladimir Drozdetsky para obter a máxima assimilação do material. E não se esqueça de deixar seus comentários.

Nós, por sua vez, não nos despedimos e convidamos você para o curso Administrador Linux !

Source: https://habr.com/ru/post/pt437114/


All Articles