Olá RustDesk: A nova era do acesso remoto!

Olá RustDesk: A nova era do acesso remoto!

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

rustdesk-server.zip

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!

Vídeo com tutorial completo: