Torrent profissa: gerenciamento remoto e servidor de compartilhamento 24hs

O Transmission é um cliente de torrent bastante conhecido no mundo GNU/Linux. Entretanto, há muitas pessoas que desconhecem que ele pode ser usado como um serviço (daemon) subindo sempre que a máquina está ligada e sem necessitar de interface gráfica para gerenciá-lo (pode ser gerenciado remotamente via browser, cli, gtk, etc.).

Se combinamos o serviço do Transmission com um Raspberry Pi baratinho, temos um servidor de compartilhar cultura 24 horas por dia que pode ser acessado remotamente via browser e gastando um ínfimo de energia.

A única “carência” do daemon do Transmission é que o mesmo só suporta protocolo HTTP, ou seja, sua senha para gerenciar os torrents trafega em text plain. Coloquei carência entre “” pq é uma opção dos desenvolvedores, os mesmos consideram que seu dever é fazer um cliente de torrent eficiente, a parte da criptografia pode ser feita com mais qualidade e segurança usando algum software complementar. No nosso caso, garantiremos uma conexão segura implementando HTTPS via servidor Nginx.

Veremos primeiro como configurar o daemon Transmission e, opcionalmente, como aplicar HTTPS à conexão remota via Nginx.

Obs: Nesse tutorial é usado o Debian Jessie. Provavelmente pode ser aplicado à outras distros Debian like sem muita adaptação.

Subindo seu próprio transmission-daemon

0. Instalação

Instale o daemon do Transmission:

1
# apt-get install transmission-daemon

Junto com o daemon é instalado o pacote transmission-cli, que possibilita interagir com o daemon desde o prompt. Entretanto, o mesmo pode ser ignorado porque é possível gerenciar o daemon desde o browser (ou cliente gráfico como o transmission-remote-gtk).

1. Configuração

1.1. Arquivos do transmission-daemon

Os arquivos referentes ao daemon estão localizados no dir /var/lib/transmission-daemon em sistemas Debian. Temos, principalmente, os seguintes diretórios/arquivos:

  • downloads/: Dir padrão p/ download de torrent (definiremos outro).
  • info/settings.json: Arquivo de configuração (link p/ /etc/transmission-daemon/settings.json)
  • info/stats.json: Arquivo que reúne estatísticas da sessão (como quantia de download/upload).
  • info/torrents: Armazena os arquivos .torrent adicionados para download.
  • info/resume: Armazena info. sobre downloads em andamanento (partes baixadas, path, etc.).

1.2. Editando settings.json:

O arquivo com todas as configurações é settings.json. Editar o mesmo provavelmente exigirá permissões de root.

Recomendo que seja criado uma cópia da versão original, por via das dúvidas :D.

O arquivo utiliza a sintaxe JSON. É uma sintaxe muito fácil de ser lida, mas que exige atenção ao editar. Qualquer ,, : ou " fora do lugar e o daemon não subirá. Ajuda bastante usar um parser online como esse aqui, onde você pode colar seu arquivo de configuração e ver se colocou algo fora do lugar que viola a sintaxe.

Atenção: Após a instalação, o daemon estará em execução e ao parar de executar, sobrescreverá qualquer mudança que possa ter ocorrido em settings.json enquanto estava rodando. Por isso, devemos parar o daemon:

1
# systemctl stop transmission-daemon

Verifique se o daemon realmente parou:

1
# systemctl status transmission-daemon

Maõs à obra!

O arquivo settings.json original vem com diversas configurações padrões. Alterei menos de 20 linhas e dessas eram realmente necessárias menos de 10. Começarei pelas que acho mais relevantes e citarei 4 à parte que considero menos interessantes mas que podem ser úteis para pessoas com roteadores mais fracos que podem ficar sobrecarregados por muitas conexões abertas pelo Transmission.

Configurações para alterar em settings.json:

  • "download-dir": "/var/lib/transmission-daemon/downloads" "/dir/dos_downloads_quiridus":
    Onde colocar os downloads.
  • "port-forwarding-enabled": false true
    Habilitar encaminhamento de porta, útil para conexões atrás de NAT (comum em residências, se vc não sabe … habilite).
  • "ratio-limit": 2 5
    Taxa de compartilhamento … tás montando um server p/ torrents … aumente isso que 2 é pouco.
  • "ratio-limit-enabled": false true
    P/ aplicar a taxa de compartilhamento definida acima.
  • "rpc-password": coloque_aqui_a_senha
    Senha para acesso remoto. Não se preocupe, ela não é armazenada em texto limpo. Após iniciar o daemon, ela será substituída por um hash.
  • "rpc-username": transmission seu_user_desktop
    Login para acesso remoto. É informado com "rpc-password" para gerenciar remotamente o daemon. Pode ser mantido o username transmission, porém prefiro o username do meu usuário cotidiano.
  • "rpc-whitelist-enabled" e "rpc-whitelist"
    Usados para delimitar quais IPs podem acessar o daemon. Eu mantenho a política default (respectivamente, true e "127.0.0.1") que restringe o acesso à máquina local e realizo o acesso ao daemon a partir do Nginx instalado na máquina - ver abaixo -. Dessa forma, qualquer máquina pode acessar o Transmission (via Nginx) mas sempre utilizando HTTPS.
  • "speed-limit-up": 100 numero_desejado
    Define o limite de upload em Kbps.
  • "speed-limit-up-enabled": false true
    Define se o limite de upload está ativo.
  • "umask": 18 2
    Define as permissões de acesso com que serão criados os arquivos e diretórios dos torrents. O valor segue o padrão utilizado pelo umask mas escrito em decimal (portanto deve ser convertido para o tradicional octal do umask). O valor default é 18 (= 022 em octal) e equivale à -rw-r--r-- p/ arquivos e drwxr-xr-x p/ dirs (proibe a permissão de escrita para o grupo e outros). Eu prefiro o valor 2 (= 002 em octal, duh!) que equivale à + permissiva -rw-rw-r-- p/ arquivos e drwxrwxr-x p/ dirs (proibe apenas a permissão de escrita para outros).

As opções que considero úteis para amenizar a carga sobre o roteador (útil para roteadores com pouca memória, cujo uso de torrents pode afogá-los) são as seguintes: "max-peers-global", "peer-limit-global", "peer-limit-per-torrent" e "upload-slots-per-torrent". Não explicarei cada item, os valores são numéricos e basta diminuir para aliviar a pressão sobre o roteador. Os valores exatos são algo muito pessoal e devem ser experimentados.

O significado dessas 4 últimas opções bem como mais detalhes sobre todas as outras pode ser encontrado na documentação oficial.

1.3. Definindo permissões, etc.

O daemon é executado com o usuário debian-transmission e grupo debian-transmission. Sendo assim o diretório definido p/ download (opção "download-dir") deve ser acessível pelo usuário do daemon.

Por exemplo, altere a propriedade do diretório p/ o usuário e grupo debian-transmission:

1
# chown -R debian-transmission:debian-transmission /dir/dos_downloads_quiridus

Se você alterou o valor de umask em settings.json de 18 p/ 2, não apenas o usuário debian-transmission terá permissão de escrita como também os membros do grupo debian-transmission. Para aproveitarmos isso, precisaremos:

  • dar permissões de escrita ao dir de download tb p/ o grupo:
1
# chmod 775 /dir/dos_downloads_quiridus
  • inserir seu usuário cotidiano no grupo debian-transmission:
1
# usermod -a -G debian-transmission seu_username

Pronto, temos o dir de download com as permissões corretas p/ o usuário e grupo debian-transmission e ainda adicionamos seu usuário cotidiano ao grupo debian-transmission, permitindo a ele apagar e etc. o conteúdo desse diretório.

2. Testando/Utilizando

2.1. Testando

Reinicie o daemon:

1
# systemctl restart transmission-daemon

E acesse o daemon via browser em: 127.0.0.1:9091 (ou o IP da máquina se você liberou o acesso desde outras máquinas).

2.2. Pós-instalação

  • Via browser, vá em Settings, Network e verifique se a porta do torrent (por padrão, 51413) está aberta para à internet. Se não estiver, você deve liberar em seu roteador de casa (foge do escopo desse post, busque pela web :D). Caso não faça isso, a velocidade dos torrents ficará comprometida.

  • Se a interface via browser acusar erros de permissão de escrita, verifique se o usuário debian-transmission realmente possui as permissões de escrita e leitura adequadas para o diretório definido p/ download.

2.2.1. Problema da execução precoce do transmission-daemon

Se ao ligar a máquina o transmission-daemon sobe antes mesmo do GNU/Linux montar o disco rígido onde estão os dados dos torrents … o transmission não encontrará os arquivos e a atividade dos mesmos ficará paralisada até reiniciarmos o daemon.

A solução para evitar esse problema é fazer o transmission-daemon subir após montar os discos.

A questão é que tive problemas em fazer o daemon obedecer minha vontade na combinação Debian+SystemD. Portanto, a minha solução foi na base da grosseria: alterei o script de execução local (que roda por último) para invocar um script que reinicia o daemon do transmission após 60 segundos. Dessa forma, eliminei o problema de forma burra porém eficaz.

Vejamos minha solução ignorante (se souber forma melhor p/ Debian+SystemD avisa nos comentários):

Crie o arquivo /usr/local/bin/lazy-transmission-daemon.sh com o seguinte conteúdo:

1
2
3
#!/bin/sh
sleep 60s
systemctl restart transmission-daemon

Torne-o executável:

1
# chmod +x /usr/local/bin/lazy-transmission-daemon.sh

Adicione em /etc/rc.local a linha “/usr/local/bin/lazy-transmission-daemon.sh &“ que invoca nosso novo script no final do boot:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/usr/local/bin/lazy-transmission-daemon.sh &

exit 0

Protegendo seu transmission-daemon com HTTPS (Nginx)

Usaremos o Nginx para criar um servidor proxy reverso que recebe conexões sobre HTTPS e redireciona para o daemon do Transmission. Isso fará com que a senha e as informações trafeguem entre o client remoto e o servidor de forma criptografada, sendo descriptografadas apenas para trafegar localmente no servidor (entre Nginx e Transmission daemon).

0. Instalação do Nginx

Instale o Nginx:

1
# apt-get install nginx

1. Configuração do Nginx

Diferente do daemon do Transmission, os arquivos de configuração não são sobrescritos quando o Nginx acaba de executar. Sendo assim, podemos editar o arquivo e simplesmente reiniciar o serviço do Nginx (que já estará em execução automaticamente após a instalação).

Crie o arquivo /etc/nginx/sites-enabled/transmission com o seguinte conteúdo:

1
2
3
4
5
6
7
8
9
10
11
12
server {
server_name transmission;
listen 8080 default_server ssl;
ssl_certificate /etc/nginx/trans.crt;
ssl_certificate_key /etc/nginx/trans.key;

access_log /var/log/nginx/transmission.access.log;

location / {
proxy_pass http://localhost:9091;
}
}

O arquivo é bem auto-explicativo. Criaremos um servidor proxy reverso que escutará requisições na porta 8080 usando criptografia e reencaminhará essa requisições para o servidor em http://localhost:9091 (o daemon do Transmission).

A explicação detalhada da configuração do Nginx foge ao escopo do post mas na seção de links há documentação sobre o mesmo.

Por fim, gere o certificado utilizado pelo Nginx:

1
# openssl req -x509 -nodes -new -keyout /etc/nginx/trans.key -out /etc/nginx/trans.crt

E reinicie o serviço:

1
# systemctl restart nginx

2. Testando/Utilizando

Acesse o Transmission normalmente via https://seu_ip:8080. Agora a senha e os dados relativos ao gerenciamento do daemon do Transmission trafegarão de forma segura pela Internet.

Veja a tela do cliente para browsers do Transmission rodando sobre HTTPS:

Dicas

  • Em seu computador pessoal utilize o software livre transmission-remote-gtk ao invés do browser. É mais prático que usar o browser, oferecendo uma experiência semelhante à programas de torrent tradicionais.
    • Obs: O transmission-remote-gtk atualmente possui bugs abertos relativos à problemas em conectar em serviços usando HTTPS (como o #267). Por hora, estou usando ele apenas quando estou na rede local, acessando diretamente o daemon (sem HTTPS). Para acessar diretamente o daemon, devo adicionar a rede local no whitelist: "rpc-whitelist": "127.0.0.1, 192.168.*.*"
  • Em seu Android, utilize o software livre Transdroid ao invés do browser. Assim, fica fácil mandar baixar algo do busão e chegar em casa com o download completo.

Arquivos

Seguem arquivos que talvez ajudem os que se percam na explicação:

Transmission

Nginx

Bônus