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 é SSHSSH (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-serverPara 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 SCPVamos 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, proxyAgora, 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.
SocatTambé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 !