Olá RustDesk: A nova era do acesso remoto!
O RustDesk é um software de acesso e controle remoto de código aberto, escrito principalmente em Rust, que permite a manutenção de computadores e outros dispositivos à distância. Ele é uma alternativa ao TeamViewer e AnyDesk, com a vantagem de ser de código aberto e não depender de ferramentas adicionais como VPNs ou redirecionamentos de porta, mesmo atrás de firewalls ou NATs.
Requisitos mínimos
- 01 vCPU
- 01 GB RAM
- 30 GB DISK
- 01 IPv4 Público
- Linux (Ubuntu, Debian e etc)
Melhorando o seu BASH (Opcional)
Para melhorar seu bash e personalizar, siga os próximos passos:
# apt-get update && apt-get upgrade
# nano script.sh
Agora copie o código abaixo e cole dentro do nosso arquivo "script.sh".
#!/bin/bash
# Instalação de pacotes necessários
apt install vim bash-completion fzf grc -y
# Configurações do bash.bashrc para autocompletar extra
{
echo ''
echo '# Autocompletar extra'
echo 'if ! shopt -oq posix; then'
echo ' if [ -f /usr/share/bash-completion/bash_completion ]; then'
echo ' . /usr/share/bash-completion/bash_completion'
echo ' elif [ -f /etc/bash_completion ]; then'
echo ' . /etc/bash_completion'
echo ' fi'
echo 'fi'
} >> /etc/bash.bashrc
# Configurações do vim
sed -i 's/"syntax on/syntax on/' /etc/vim/vimrc
sed -i 's/"set background=dark/set background=dark/' /etc/vim/vimrc
# Configurações do .vimrc
cat <<EOF >/root/.vimrc
set showmatch " Mostrar colchetes correspondentes
set ts=4 " Ajuste tab
set sts=4 " Ajuste tab
set sw=4 " Ajuste tab
set autoindent " Ajuste tab
set smartindent " Ajuste tab
set smarttab " Ajuste tab
set expandtab " Ajuste tab
"set number " Mostra numero da linhas
EOF
# Configurações do .bashrc
{
sed -i "s/# export LS_OPTIONS='--color=auto'/export LS_OPTIONS='--color=auto'/" /root/.bashrc
sed -i 's/# eval "`dircolors`"/eval "`dircolors`"/' /root/.bashrc
sed -i 's/# eval "$(dircolors)"/eval "$(dircolors)"/' /root/.bashrc
sed -i "s/# alias ls='ls \$LS_OPTIONS'/alias ls='ls \$LS_OPTIONS'/" /root/.bashrc
sed -i "s/# alias ll='ls \$LS_OPTIONS -l'/alias ll='ls \$LS_OPTIONS -l'/" /root/.bashrc
sed -i "s/# alias l='ls \$LS_OPTIONS -lA'/alias l='ls \$LS_OPTIONS -lha'/" /root/.bashrc
echo '# Para usar o fzf use: CTRL+R' >> ~/.bashrc
echo 'source /usr/share/doc/fzf/examples/key-bindings.bash' >> ~/.bashrc
echo "alias grep='grep --color'" >> /root/.bashrc
echo "alias egrep='egrep --color'" >> /root/.bashrc
echo "alias ip='ip -c'" >> /root/.bashrc
echo "alias diff='diff --color'" >> /root/.bashrc
echo "alias tail='grc tail'" >> /root/.bashrc
echo "alias ping='grc ping'" >> /root/.bashrc
echo "alias ps='grc ps'" >> /root/.bashrc
echo "PS1='\${debian_chroot:+(\$debian_chroot)}\[\033[01;31m\]\u\[\033[01;34m\]@\[\033[01;33m\]\h\[\033[01;34m\][\[\033[00m\]\[\033[01;37m\]\w\[\033[01;34m\]]\[\033[01;31m\]\\$\[\033[00m\] '" >> /root/.bashrc
} >> /root/.bashrc
# Troca para o usuário root
su -
Vamos tornar o nosso arquivo "script.sh" um executável.
# chmod +x script.sh
Perfeito, agora basta executar!
# ./script.sh
Instalação Docker
Procederemos com a instalação do docker
# curl -fsSL https://get.docker.com | bash
Inicialize o modo Swarm
# docker swarm init
Agora vamos criar a nossa interface de rede do docker.
# docker network create --driver=overlay production
Instalação do Traefik
Crie seu arquivo de composição do Docker com as configurações para realizar a instalação do Traefik.
# nano traefik.yaml
Adicione (Lembre-se, ajuster seu e-mail):
services:
traefik:
image: traefik:v3.1
command:
#- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entryPoints.web.address=:80"
- "--entryPoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
#- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
- "--certificatesresolvers.letsencrypt.acme.email=seuemail@gmail.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/etc/traefik/letsencrypt/acme.json"
deploy:
placement:
constraints:
- node.role == manager
labels:
- "traefik.enable=true"
- "traefik.http.middlewares.redirect-https.redirectscheme.scheme=https"
- "traefik.http.middlewares.redirect-https.redirectscheme.permanent=true"
- "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
- "traefik.http.routers.http-catchall.entrypoints=web"
- "traefik.http.routers.http-catchall.middlewares=redirect-https@docker"
- "traefik.http.routers.http-catchall.priority=1"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "vol_certificates:/etc/traefik/letsencrypt"
ports:
- target: 80
published: 80
mode: host
- target: 443
published: 443
mode: host
- target: 8080
published: 8080
mode: host
networks:
- production
volumes:
vol_shared:
external: true
name: volume_swarm_shared
vol_certificates:
external: true
name: volume_swarm_certificates
networks:
production:
external: true
name: production
Execute o comando Docker
# docker stack deploy --prune --resolve-image always -c traefik.yaml traefik
Instalação do Portainer
Crie seu arquivo de composição do Docker com as configurações para realizar a instalação do Portainer.
# nano portainer.yaml
Adicione (Lembre-se, ajuste seu DNS):
services:
portainer:
image: portainer/portainer-ce:latest
command: -H unix:///var/run/docker.sock
restart: always
networks:
- production
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
labels:
# Frontend
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`portainer.meudominio.com.br`)"
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.services.frontend.loadbalancer.server.port=9000"
- "traefik.http.routers.frontend.service=frontend"
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# Edge
- "traefik.http.routers.edge.rule=Host(`edge.meudominio.com.br`)"
- "traefik.http.routers.edge.entrypoints=websecure"
- "traefik.http.services.edge.loadbalancer.server.port=8000"
- "traefik.http.routers.edge.service=edge"
- "traefik.http.routers.edge.tls.certresolver=letsencrypt"
networks:
production:
external: true
name: production
volumes:
portainer_data:
external: true
name: portainer_data
Execute o comando Docker
# docker stack deploy --prune --resolve-image always -c portainer.yaml portainer
Firewall
Libere as portas abaixo pois elas são efetivamente necessárias para este Tutorial.
- 21115:21115 # ID Server - NAT type test
- 21116:21116 # ID Server - TCP hole punching
- 21116:21116/udp # ID Server - ID registration and heartbeat
- 21117:21117 # ID Server - Web client
- 21118:21118 # Relay Server - Relay services
- 21119:21119 # Relay Server - Web client
Volumes - RustDesk
Você precisa criar os dois volumes manualmente no Portainer, conforme abordamos no vídeo.
rustdesk_db
rustdesk_data
Gerar a “GenKeyPair”
Para gerar o par de chaves pelo RustDesk, execute o seguinte comando:
# docker run --rm --entrypoint /usr/bin/rustdesk-utils rustdesk/rustdesk-server-s6:latest genkeypair > temp.txt
awk '/Public Key:/ {print $3}' temp.txt > /var/lib/docker/volumes/rustdesk_data/_data/id_ed25519.pub
awk '/Secret Key:/ {print $3}' temp.txt > /var/lib/docker/volumes/rustdesk_data/_data/id_ed25519
rm temp.txt
Copiar as chaves e Criar as “Secrets” no Docker
Vamos criar as Secrets dentro do Docker para podermos fazer o “Deploy” do RustDesk Server.
# cat /var/lib/docker/volumes/rustdesk_data/_data/id_ed25519.pub | docker secret create key_pub - && cat /var/lib/docker/volumes/rustdesk_data/_data/id_ed25519 | docker secret create key_priv -
Instalação RustDesk
Crie seu arquivo de composição do Docker com as configurações para realizar a instalação do RustDesk Server.
Navegue até “Stack” no seu Portainer.
Clique sobre “+ Add Stack”.
Agora de um nome para sua Stack, por padrão vamos colocar “rustdesk-server”.
E no campo “Web editor”, adicione (Lembre-se, ajuste o DNS):
version: '3.7'
services:
rustdesk_server:
image: rustdesk/rustdesk-server-s6:latest
volumes:
- rustdesk_db:/db
- rustdesk_data:/data
ports:
- 21115:21115
- 21116:21116
- 21116:21116/udp
- 21117:21117
- 21118:21118
- 21119:21119
networks:
- production
secrets:
- key_pub
- key_priv
environment:
- RELAY=rustdesk.meudominio.com.br:21117
- ENCRYPTED_ONLY=1
- DB_URL=/db/db_v2.sqlite3
- RUST_LOG=debug
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
volumes:
rustdesk_db:
external: true
rustdesk_data:
external: true
secrets:
key_pub:
external: true
key_priv:
external: true
networks:
production:
external: true
Material de Apoio (Download) ❌ DESATUALIZADO
Versionamento:
- 24/04/2024 - v1 - Primeira versão;
- 29/07/2024 - v2 - Corrigido problemas de versão e também contado com apoio do Fernando Henrique R. para corrigir!