Daemon de transmissão sobre OpenVPN

20

Recentemente, adquiri um BeagleBone Black, no qual instalei o Ubuntu usando esse método . Tudo funcionou até agora. Quero usar meu BeagleBone como uma caixa de torrent, mas não quero fazê-lo diretamente na minha conexão com a Internet (acho que meu ISP não vai gostar) - então comprei uma assinatura VPN de um servidor europeu . Eu conectei manualmente meu laptop a esta VPN antes e execute a Transmission. Eu sei que a conexão VPN funciona no Ubuntu e o host fornece informações de configuração para o OpenVPN. Irritantemente, a natureza dinâmica do endereço IP atribuído significa que ele mudaria com frequência; portanto, quando eu usava meu laptop com a VPN, definia manualmente o endereço de escuta em Transmission para o valor necessário.

Idealmente, eu gostaria da seguinte configuração:

  • A transmissão é executada apenas pela VPN e é proibida a execução de torrents na conexão WAN normal
  • Somente o tráfego direcionado à transmissão será aceito ou enviado através da VPN, todo o tráfego não solicitado será descartado
  • A transmissão usa a porta apropriada para escutar, com base no endereço IP atribuído
  • O OpenVPN inicia automaticamente na inicialização, que posteriormente inicia a transmissão
  • A GUI da web da transmissão pode ser acessada pela LAN e, possivelmente, pela Internet a partir da minha conexão WAN (ou seja, não através da VPN)
seanlano
fonte
3
Auto-respostas não são ruins. Não peça desculpas por eles. Você também não tem que explicar isso é o que você está fazendo embora ... É um comportamento encorajado
RobotHumans
De acordo com @hbdgaf. Não precisa se desculpar. Ótimo trabalho em todas as frentes.
21815 JakeGould #

Respostas:

23

Nota: (22/02/2016) Percebi que essa configuração vaza consultas DNS para os rastreadores de torrent através da WAN normal, em vez de enviá-la pela VPN. Estou investigando como consertar isso. Mas continuarei executando minha configuração, pois a conexão em si usa a VPN corretamente.


Atualização: notei que, quando defino o Transmission para download durante a noite no Beaglebone, o uso da CPU chega a 100% depois de um tempo. Parece que isso não acontece depois da mesma quantidade de tempo; às vezes, tudo fica bem a noite toda; outras, depois de 10 minutos. Ele também pode se recuperar pausando todos os torrents e aguardando que a carga da CPU volte ao normal e iniciando novamente. Eu ainda estou investigando. Uma solução alternativa pode ser pausar e retomar torrents periodicamente, embora não seja uma solução muito boa. Observe que esse problema se aplica apenas ao Beaglebone e provavelmente a outros dispositivos ARM. Eu nunca tive esse problema em uma CPU x86.


Introdução

Eu desenvolvi e testei esta solução para o Ubuntu 14.04, rodando em um BeagleBone Black. O provedor de VPN que estou usando é chamado ibVPN . No entanto, ele deve funcionar com qualquer hardware suportado (ou seja, em um computador x86 "normal"), com qualquer provedor de VPN compatível com OpenVPN - e provavelmente deve funcionar para a 14.10 ou posterior. Em algum momento, acredito que o Ubuntu usará o SystemD para inicialização, o que significa que os scripts do Upstart usados ​​aqui precisarão ser migrados. Atualização: Jonas Kalderstam tem uma resposta abaixo para usar o SystemD. Também estou assumindo que o ufw está sendo usado como firewall, se você estiver usando algo diferente, os comandos ufw aqui precisarão ser alterados.

Suponho que todo o trabalho seja feito através de uma conexão SSH com o sistema, embora funcionasse tão bem se digitado em um terminal físico.

Este é um tutorial bastante longo, leia tudo primeiro e verifique se você está confortável com o que fará.

Também notei que a transmissão não se liga adequadamente a um endereço IP para o envio de dados UPnP / NAT-PMP - ou seja, dados torrent passam corretamente pela VPN, mas se o encaminhamento de porta UPnP estiver ativado, a transmissão solicitará o encaminhamento da porta do roteador local , não através da VPN do servidor VPN. Por isso, fiz o script Upstart desativar o encaminhamento de porta, pois pode parecer que funcionou, mas não funcionou. Deve ser possível usar o iptables e o iproute para forçar todo o tráfego do usuário de transmissão debian através da VPN, mas ainda estou analisando isso. Também deveria funcionar se a rota padrão fosse alterada para enviar todos os dados da Internet por meio da VPN, mas eu não queria fazer isso porque também utilizava esse servidor para outras coisas, e isso também faria com que todas as atualizações do sistema passassem pelo VPN.Esta pergunta tem mais informações se você realmente deseja que o UPnP funcione através da VPN . Atualização: falk0069 tem uma dica fantástica abaixo para ajudar a incentivar o UPnP através da VPN.

Instalando e configurando o OpenVPN

Eu recomendo que você tente fazer sua conexão VPN funcionar usando o Ubuntu antes de tentar fazê-la funcionar aqui - ou seja, em um desktop. Isso confirmará que você possui a configuração correta e reduzirá o tempo gasto na depuração.

Primeiro, instale os pacotes necessários

sudo apt-get install openvpn

Em seguida, crie um diretório para armazenar os arquivos de configuração. Estou usando / opt / ibVPN, pois esse é o provedor que estou usando. Mude para o que quiser.

sudo mkdir /opt/ibVPN

A primeira coisa a fazer neste novo diretório é criar o arquivo de configuração para executar o cliente VPN. O ibVPN fornece um arquivo de configuração básico para usuários do Linux, que eu apenas copiei e colei.

cd /opt/ibVPN
sudo vim config.ovpn

Copie e cole sua versão editada no vim, usando as configurações do seu provedor de VPN. (FYI, cole no terminal Ubuntu é Ctrl+Shift+V) Você deve conseguir isso com seu provedor de VPN.

remote 888.888.888.888 1194 udp      #This address will be different for you
client
dev tap1
resolv-retry infinite
script-security 3 system
explicit-exit-notify 3
persist-key
mute-replay-warnings
ca ibvpn.com.crt
comp-lzo
verb 3
mute 20
ns-cert-type server
fragment 1300
route-delay 2
reneg-sec 0
max-routes 5000
link-mtu 1578

auth-user-pass pass
auth-nocache
persist-tun
route-noexec
lport 1195
lladdr 00:FF:11:AA:BB:CC
route-up "/opt/home/openvpn/route-up.sh"
down "/opt/home/openvpn/down.sh"

Para aqueles que não estão familiarizados com o vim, pressione Insert para digitar ou colar texto e pressione Escape e digite :wq para salvar e sair. Obviamente, você não precisa usar o vim - qualquer editor de texto funcionará.

Explicarei rapidamente esse arquivo de configuração: As primeiras 18 linhas especificam as configurações específicas a serem usadas com o servidor, elas vieram do ibVPN - as suas provavelmente serão ligeiramente diferentes se você tiver um provedor diferente. As próximas linhas são opções modificadas que eu especifiquei.

  • Se o seu arquivo de configurações tiver linhas auth-user*, comente-as. Para que essa configuração funcione automaticamente, precisamos ter um arquivo com o nome de usuário e a senha - portanto, verifique se a senha que você escolheu para o provedor de VPN é forte, aleatória e exclusiva.

  • O auth-user-pass passcomando diz ao OpenVPN para procurar um arquivo chamado passpara ler o usuário e a senha.

  • auth-nocache remove a senha da memória, o que pode aumentar um pouco a segurança se você estiver preocupado com isso.

  • persist-tun tentará manter o mesmo endereço IP do servidor se sua conexão cair, o que, esperamos, significa menos inicialização e parada do Transmission-daemon.

  • route-noexecdiz ao cliente OpenVPN para não usar automaticamente as rotas fornecidas pelo servidor - o que puxaria todo o tráfego da rede pela VPN. Apenas queremos enviar tráfego de torrent, portanto, precisaremos usar diferentes configurações de roteamento.

  • lport 1195 diz ao cliente OpenVPN para usar a porta 1195 em vez de 1194 - no meu caso, também quero executar um servidor OpenVPN no mesmo dispositivo, e o servidor precisará usar a porta 1194. Mesmo se você não estiver executando um servidor OpenVPN, não dói fazer essa mudança.

  • Alterei a linha dev tappara dev tap1, para forçar o dispositivo virtual a ser tap1 em vez de ser atribuído pelo OpenVPN, novamente por causa da execução de um servidor OpenVPN separado. Mesmo se você não estiver executando um servidor VPN, essa alteração não deve importar. Os scripts do firewall foram escritos para uso tap1, portanto, se você preferir usar outro dispositivo, lembre-se de alterá-los quando apropriado.

  • lladdr 00:FF:11:AA:BB:CC diz ao OpenVPN para atribuir a interface de toque a esse endereço MAC, o que pode ser útil para as regras de firewall do iptables.

  • route-upe downexecute scripts para iniciar e parar o Transmission-daemon, conforme necessário - estes são necessários aqui porque são executados com variáveis ​​de ambiente que contêm informações sobre a conexão, necessárias para ligar corretamente a Transmission ao endereço IP e à porta corretos.

No meu caso, eu tinha um certificado de servidor do provedor VPN - que também precisa estar no mesmo diretório que o arquivo de configuração.

sudo vim /opt/ibVPN/ibvpn.com.crt

Copie e cole isso ou mova-o via SCP ou SSHFS.

-----BEGIN CERTIFICATE-----
MIIDeDCCAuGgAwIBAgIJAMVKgpjMPUfxMA0GCSqGSIb3DQEBBQUAMIGFMQswCQYD
VQQGEwJVUzELMAkGA1UECBMCQ0ExFTATBgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMG
A1UEChMMRm9ydC1GdW5zdG9uMRgwFgYDVQQDEw9Gb3J0LUZ1bnN0b24gQ0ExITAf
BgkqhkiG9w0BCQEWEm1lQG15aG9zdC5teWRvbWFpbjAeFw0xMDA3MjExOTU5MzVa
Fw0yMDA3MTgxOTU5MzVaMIGFMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFTAT
BgNVBAcTDFNhbkZyYW5jaXNjbzEVMBMGA1UEChMMRm9ydC1GdW5zdG9uMRgwFgYD
VQQDEw9Gb3J0LUZ1bnN0b24gQ0ExITAfBgkqhkiG9w0BCQEWEm1lQG15aG9zdC5t
eWRvbWFpbjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAz23m3BXY5Asiw8Dx
T4F6feqsp+pIx6ivftTniyUCbSAxI1J1s1x75DzxmUpIwPu5xavzgPXgZr8FT81X
JGqF9km4AE95iddJawKx0wNgdTo7GximQq9rw0dsQIB5hZZQ9TJwHC3VOnmEic5A
OawKOCybMcRs8saLakZOgh7Xc+UCAwEAAaOB7TCB6jAdBgNVHQ4EFgQUeRhE2N4l
XwL4H1dbjkZ4ou6fj3AwgboGA1UdIwSBsjCBr4AUeRhE2N4lXwL4H1dbjkZ4ou6f
j3ChgYukgYgwgYUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEBxMM
U2FuRnJhbmNpc2NvMRUwEwYDVQQKEwxGb3J0LUZ1bnN0b24xGDAWBgNVBAMTD0Zv
cnQtRnVuc3RvbiBDQTEhMB8GCSqGSIb3DQEJARYSbWVAbXlob3N0Lm15ZG9tYWlu
ggkAxUqCmMw9R/EwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQASt0pl
WzVseQLTNM8Mlgw4ZnGAv/x2xnijmMqrkE+F7pnaOicGpxgCfMKzjZuJu0TNJqF2
fibE7GhMdomD4dLFgIu8Wb5E7iQ1CSBEOGumRhK8qCsDzjr7WXUdhqA6Xvo+ylU6
DMzy0Wn3NNvfGC+qxOgybYCJwDnVPi0CEDSbzQ==
-----END CERTIFICATE-----

Obviamente, se você não estiver usando uma conta ibVPN, seu certificado será diferente.

Vamos agora criar o arquivo de senha:

sudo vim /opt/ibVPN/pass

A primeira linha deve ser o nome de usuário completo e a segunda linha deve ser a senha. Esse deve ser o único conteúdo deste arquivo.

[email protected]
myBIGstrongpassword1234567890

Também precisamos garantir as permissões nesse arquivo, ou o OpenVPN não será iniciado.

sudo chmod 400 pass

Isso tornará o arquivo somente leitura e apenas para o proprietário (ou seja, nenhum outro usuário poderá lê-lo)

Esses comandos criarão os arquivos a serem executados na inicialização e os definirão para serem executáveis ​​somente pela raiz.

sudo touch route-up.sh
sudo touch down.sh
sudo chmod 700 route-up.sh
sudo chmod 700 down.sh

Neste ponto, provavelmente é uma boa ideia testar se a conexão VPN realmente funciona. Inicie a conexão com:

sudo openvpn --cd /opt/ibVPN --config config.ovpn

Você verá avisos de que os comandos externos para cima e para baixo não puderam ser executados, mas não se preocupe com isso. Se funcionar, você verá Initialization Sequence Completedno terminal. Pressione Control+Cpara finalizar a conexão. Se não funcionar, você terá que investigar por que não e corrigi-lo antes de continuar. Descobri que algumas vezes eram necessárias algumas tentativas para começar a trabalhar. Verifique se o seu arquivo de senha está correto. Existem muitos recursos excelentes na Internet sobre o OpenVPN, então dê uma olhada.

Neste ponto, provavelmente é mais fácil avançar para colocar a Transmission em funcionamento. Depois de ter certeza de que a VPN e a transmissão podem ser executadas separadamente, elas podem ser combinadas.

Instalando e configurando a transmissão

Instale os pacotes necessários:

sudo apt-get install transmission-daemon

Por padrão, a transmissão será executada automaticamente na inicialização. Como eventualmente usaremos o OpenVPN para iniciar a transmissão, queremos desativar isso. Para fazer isso, edite o arquivo de configuração para o Transmission-daemon

sudo vim /etc/default/transmission-daemon

E altere a seguinte linha para ler:

ENABLE_DAEMON=0

Agora a transmissão não inicia na inicialização.

Vamos agora criar um diretório para as configurações de Transmissão residirem e para os torrents baixados. Isso pressupõe que você já configurou algum tipo de disco e está montado em / media / arm-disk /. Por questões de segurança, o daemon será executado por seu próprio usuário, e não como root ou como "ubuntu". Um novo usuário é criado pelo instalador para o daemon de transmissão, "debian-transmission". Esse usuário precisa possuir a pasta que criamos e ter acesso de leitura e gravação ao local de armazenamento dos torrents que estão sendo baixados.

sudo mkdir /opt/transmission
sudo chown debian-transmission:debian-transmission /opt/transmission
sudo mkdir /media/arm-disk/torrents-complete
sudo chown debian-transmission:debian-transmission /media/arm-disk/torrents-complete
sudo mkdir /media/arm-disk/torrents-incomplete
sudo chown debian-transmission:debian-transmission /media/arm-disk/torrents-incomplete

Agora precisamos iniciar a transmissão, apenas brevemente, para que ele crie o arquivo de configurações que precisamos:

sudo -u debian-transmission -g debian-transmission /usr/bin/transmission-daemon --config-dir /opt/transmission --foreground

Este comando inicia o daemon de transmissão como o usuário da transmissão do debian, instrui-o a usar o diretório / opt / transmission para os arquivos de configurações e instrui-o a continuar em execução em primeiro plano. Depois de alguns segundos, pressione Control+Cpara finalizar. Agora podemos editar o arquivo de configurações.

sudo -u debian-transmission vim /opt/transmission/settings.json

Agora precisamos mudar para as seguintes linhas de seus padrões para ler:

"download-dir": "/media/arm-disk/torrents-complete",

"incomplete-dir": "/media/arm-disk/torrents-incomplete",

"incomplete-dir-enabled": true,

"rpc-whitelist": "127.0.0.1,192.168.1.*",

Salvar e sair (Escape, digite: wq e pressione Enter)

As duas edições do meio permitirão o uso do diretório "incompleto", separando os torrents finalizados dos inacabados. Isso não é completamente necessário, mas pessoalmente acho extremamente útil. A última edição permite que a GUI da web seja acessada por qualquer computador na LAN (supondo que sua sub-rede LAN seja 192.168.1.0, modifique-a se for diferente).

Agora é uma boa ideia rodar o Transmission novamente, para ver se funciona e pode realmente baixar um torrent. Usaremos uma janela do navegador da web para acessar a GUI e adicionar um torrent. Primeiro, vamos permitir o acesso à GUI da web através do firewall da LAN e, em seguida, execute o daemon de transmissão novamente.

sudo ufw allow in from 192.168.0.0/16 to any port 9091
sudo -u debian-transmission -g debian-transmission /usr/bin/transmission-daemon --config-dir /opt/transmission --foreground

Visite este URL no Firefox (ou em qualquer navegador que você preferir): http://XXX.XXX.XXX.XXX:9091 , onde XXX é substituído pelo endereço do seu servidor na LAN (por exemplo, 192.168.1.10). Encontre um torrent para download, por exemplo, Big Buck Bunny em 1080p60hz. Este é um curta-metragem gratuito, disponível legalmente para download gratuito. Na GUI de transmissão, clique no botão "Abrir Torrent" e cole este link (ou qualquer outro torrent que você desejar) na primeira caixa. Então pressione "Upload". Se a transmissão estiver funcionando corretamente, o torrent começará a baixar. Se isso não acontecer, você precisará descobrir o motivo antes de continuar. Existem muitos recursos disponíveis na Internet para usar o daemon de transmissão. Também pode ser que o torrent que você escolheu não esteja funcionando, tente alguns outros primeiro.

Quando o download estiver concluído, pressione Control+Cna janela do terminal para parar o daemon de transmissão.

Configurar transmissão de ligação à interface VPN

Agora vamos criar um script Upstart, que será usado para iniciar a transmissão quando a VPN estiver pronta.

sudo mv /etc/init/transmission-daemon.conf /etc/init/transmission-daemon.conf.bak

Não se preocupe se isso reclamar, é apenas para fazer um backup do arquivo Upstart, se ele existir - ele pode não ter. Vamos abrir o vim para editar o novo:

sudo vim /etc/init/transmission-daemon.conf

Cole isso no editor:

description "transmission-daemon, attached to OpenVPN tunnel tap1"

start on transmission-daemon-start
stop on runlevel [!2345] or transmission-vpn-down

# This includes the information from OpenVPN into this environment

export LOCAL_IP
env PORT=51413

# give time to send info to trackers
kill timeout 30

# Run as unprivileged user
setuid debian-transmission
setgid debian-transmission

# Start transmission again if it stops for some reason
respawn
# If transmission stops 5 times in a minute, give up trying to respawn it
respawn limit 5 60

exec /usr/bin/nice -15 /usr/bin/transmission-daemon --config-dir /opt/transmission --bind-address-ipv4 $LOCAL_IP --peerport $PORT --no-portmap --foreground

Salve e feche o vim. ( Escape, digite :wq). Novamente, abra o vim:

sudo vim /etc/init/transmission-up.conf

E cole este:

description "Script to create firewall and routing rules for transmission-daemon"

start on transmission-vpn-up

# This includes the information from OpenVPN into this environment
export VPN_GATEWAY
export LOCAL_IP
env PORT=51413

task

script
    # Set up IP route, firewall rules
    # It doesn't matter if they already exist, they will be skipped
    /sbin/ip route add default via $VPN_GATEWAY dev tap1 table 200
    /sbin/ip rule add from $LOCAL_IP table 200
    /sbin/ip route flush cache
    /usr/sbin/ufw insert 1 reject out on eth0 from any port $PORT
    /usr/sbin/ufw insert 1 reject in on eth0 to any port $PORT
    /usr/sbin/ufw insert 1 deny in on tap1 to any
    /usr/sbin/ufw insert 1 allow in on tap1 to any port $PORT proto udp

    # Start the actual transmission-daemon process, in a separate task so that unprivileged user/group can be set
    /sbin/initctl emit transmission-daemon-start LOCAL_IP=$LOCAL_IP

end script

Mais uma vez, salve e feche o vim. ( Escape, digite :wq). Finalmente:

sudo vim /etc/init/transmission-down.conf

Cole isto:

description "Script to remove firewall rules for transmission-daemon"

start on runlevel [!2345] or stopping openvpn-transmission
env PORT=51413

task

script
    # Take down IP route, firewall rules
    # It doesn't really matter if they don't get taken down, but this will be cleaner
    /usr/sbin/ufw delete reject out on eth0 from any port $PORT
    /usr/sbin/ufw delete reject in on eth0 to any port $PORT
    /usr/sbin/ufw delete deny in on tap1 to any
    /usr/sbin/ufw delete allow in on tap1 to any port $PORT proto udp

    /sbin/ip route flush cache

end script

Esses scripts dizem ao Upstart para ouvir o sinal "transmissão-vpn-up". O script "conversion-up.conf" configura as regras de roteamento necessárias para enviar tráfego do endereço VPN local por meio da interface VPN e define o firewall para permitir o tráfego da VPN para a porta de escuta de Transmissão. O tráfego direcionado para a porta de escuta da transmissão a partir da interface normal da LAN está bloqueado. O script "transmission-daemon.conf" inicia a transmissão-daemon com as configurações necessárias para vinculá-lo ao endereço IP da VPN. Observe que este comando também garantirá que o UPnP / NAT-PMP esteja desativado - veja minha observação no topo sobre encaminhamento de porta. O "nice -15" define a Transmission para ter uma prioridade mais baixa, que eu achei útil ao usar o BeagleBone de especificação inferior - às vezes a Transmission pode consumir recursos, o que atrasa o sistema. Pelo menos com baixa prioridade, tarefas mais importantes do sistema ainda podem ser executadas. O script "conversion-down.conf" removerá as regras de firewall quando a VPN for parada. Três scripts diferentes são usados ​​para que o daemon de transmissão possa ser executado como um usuário sem privilégios, mas as regras do firewall podem ser executadas como raiz.

Agora vamos voltar às configurações do OpenVPN e editar os scripts "route-up" e "down" para acionar o início e a parada do script de transmissão.

sudo vim /opt/ibVPN/route-up.sh

Cole isso no vim:

#! /bin/bash

/sbin/initctl emit transmission-vpn-up VPN_GATEWAY=$route_vpn_gateway LOCAL_IP=$ifconfig_local

Tudo o que esse script faz é dizer ao Iniciante que o daemon de transmissão deve iniciar e fornece as informações necessárias para conectar à conexão VPN.

sudo vim /opt/ibVPN/down.sh

Novamente, mais colagem:

#! /bin/bash

/sbin/initctl emit transmission-vpn-down

Esse script é ainda mais simples - sinaliza para a transmissão-daemon parar.

Nesse momento, é provavelmente uma boa idéia garantir que o proprietário de toda a pasta de configuração da VPN seja o usuário raiz - uma vez que esses scripts são executados como raiz, qualquer pessoa que possa alterá-los pode executar o que quiser como usuário raiz.

sudo chown root:root -R /opt/ibVPN
sudo chmod 700 -R /opt/ibVPN
sudo chmod 400 /opt/ibVPN/pass

Agora, isso significa que apenas o usuário root pode modificar ou visualizar as configurações de conexão VPN.

OK, estamos quase terminando! Vamos testar se nossa configuração está funcionando até agora:

sudo openvpn --cd /opt/ibVPN --config config.ovpn

Conecte-se novamente à GUI da web da transmissão e retome o torrent existente ou adicione um novo. Deve ser capaz de fazer o download, talvez depois de alguns minutos de espera pelos colegas. Uma maneira bacana que encontrei de testar se está funcionando ou não é examinar o iftop. Instale o iftop e execute:

sudo apt-get install iftop
sudo iftop -i tap1

Essa tela mostrará todas as conexões em execução na VPN. Se o seu torrent estiver baixando e estiver usando corretamente a VPN, haverá muitos endereços IP e nomes de host aqui. Veja também iftop para a conexão LAN:

sudo iftop -i eth0

Aqui você deve ver uma grande quantidade de tráfego para um único endereço IP, sendo o servidor VPN e, em seguida, apenas o tráfego mínimo para outros dispositivos de LAN - supondo que você não esteja executando outros serviços no seu BeagleBone.

Você pode confirmar que a VPN está funcionando seguindo estas instruções .
Este site permite que você baixe um torrent para ver o endereço IP que outros colegas usam para se conectar a você - se tudo estiver funcionando, será o endereço IP da VPN e não o seu próprio endereço IP da WAN.

Se você estiver com problemas, poderá ver o log de erros do Upstart fazendo:

sudo tail -f /var/log/upstart/transmission-daemon.log

Em uma janela separada do terminal / SSH, tente executar o comando tail ao iniciar a conexão VPN como acima e procure por mensagens de erro. Espero que você possa resolver o problema vendo as mensagens de erro, se não tiver uma escavação na Internet ou postar um comentário.

Configure tudo para iniciar automaticamente

Se você estiver satisfeito com a emissão manual do comando para iniciar o túnel do OpenVPN ou desejar fazê-lo com seu próprio script, estará pronto. Mas eu queria que ele iniciasse na inicialização, então criei outro script Upstart para iniciar o OpenVPN.

sudo vim /etc/init/openvpn-transmission.conf

Esta é a última coisa que temos que colar!

description "OpenVPN client, with attached transmission-daemon"

start on started networking
stop on runlevel [!2345] or stopped networking

# Give time for Transmission to send info to trackers, wait for graceful close
kill timeout 45

# Start the OpenVPN tunnel again if it stops for some reason
respawn
# If it stops 5 times in a minute, give up trying to respawn it
respawn limit 5 60


exec openvpn --cd /opt/ibVPN --config config.ovpn

post-stop script
    # Pause for a few seconds, before exiting
    /bin/sleep 3s
end script

Tudo isso é esperar que o sistema sinalize que a rede está pronta e, em seguida, iniciará o túnel OpenVPN - que, por sua vez, iniciará a transmissão. Quando o sistema é desligado ou se a rede é desativada por algum motivo, o Upstart remove as regras do firewall e fecha o daemon de transmissão. Simples! Isso continuará a funcionar após uma reinicialização também, agora você está pronto.

Para interagir com a transmissão, use a GUI da web como fizemos durante a fase de configuração. Também é possível tornar a GUI acessível pela Internet, configurando o encaminhamento de porta. Existem muitos tutoriais sobre como fazer isso, então não vou repeti-lo aqui.

Quanto a obter os downloads concluídos do BeagleBone, estou usando o NFS. Posso obter velocidades de cópia de cerca de 8 MB / s através da LAN do BeagleBone para o meu computador desktop - o que é muito bom para um dispositivo de baixa potência. O Ubuntu fornece algumas informações úteis para configurar isso.

seanlano
fonte
Uau! Quanto tempo você gastou procurando por todas essas coisas?
Ismael Miguel
Haha, um bom tempo. Eu já havia feito isso antes em um roteador DD-WRT e, quando estava fazendo o mesmo no BeagleBone, pensei em escrever isso para não esquecer como fazê-lo. : D
seanlano 10/02
1
Você também deve ler o seguinte: unix.stackexchange.com/questions/88693/… (É uma ótima resposta.) Isso irá ajudá-lo, tenho certeza disso.
Ismael Miguel
3
Acabei de perceber, depois de configurar meu servidor DNS para usar o OpenDNS e examinar as estatísticas, que essa configuração vaza o DNS pela conexão WAN normal . Vou investigar mais para ver se consigo consertar isso. Continuarei funcionando de qualquer maneira, já que a conexão em si é através da VPN - mas não é o ideal.
Seanlano
1
@seanlano Obrigado por trazer isso à nossa atenção. Deixe-nos saber se / quando você encontrar uma correção.
Winterflags 7/03/16
7

Acabei de trabalhar com o SystemD, então pensei em compartilhar. Coloquei todos os meus scripts, configurações e certificados no mesmo diretório ao qual me referirei como/etc/openvpn/myprovider

Configuração do OpenVPN

Isso depende da sua VPN específica, mas uma diferença da configuração do @ seanlano é que eu só uso um route-upscript. Portanto, o que você precisa, além de sua configuração fornecida , são as seguintes:

route-noexec
route-up "/etc/openvpn/myprovider/transmission-route-up.sh"

Onde você coloca o transmission-route-up.shscript onde quiser. Observe a ausência de um downscript. (Minha VPN já estava usando um script inativo personalizado, por isso teria conflito de qualquer maneira).

/etc/openvpn/myprovider/transmission-route-up.sh:

#!/bin/sh

# Print environment variables for transmission's benefit
printenv > /etc/openvpn/myprovider/vpn.env


# Set up VPN routes
ip route add default via $route_vpn_gateway dev $dev table 10

ip rule add from $ifconfig_local/32 table 10
ip rule add to $route_vpn_gateway/32 table 10

ip route flush cache


# Add firewall rules
iptables -A INPUT -i $dev -p udp --dport 24328 -j ACCEPT
iptables -A INPUT -i $dev -p tcp --dport 24328 -j ACCEPT

iptables -A OUTPUT -o $dev -p udp --sport 24328 -j ACCEPT
iptables -A OUTPUT -o $dev -p tcp --sport 24328 -j ACCEPT

A primeira linha, o printenv, é importante. Coloque-o onde quiser, e depois será usado no serviço SystemD. Coloco-o no mesmo diretório da minha configuração de VPN.

Substitua 24328 por qualquer porta que seu daemon de transmissão escute. Eu uso iptables (usando Debian), então você provavelmente pode substituir essas linhas pelas linhas ufw da configuração do @ seanlano.

Serviço SystemD VPN

Este é o serviço que inicia automaticamente a VPN para nós. Verifique se o caminho para o openvpn está correto em sua máquina e se o caminho para o arquivo de configuração também está correto. Você deve especificar caminhos completos nos serviços SystemD.

/etc/systemd/system/my-vpn.service:

[Unit]
Description=VPN connection
After=network.target

[Service]
Type=forking
PIDFile=/var/run/openvpn/vpn.pid
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/myprovider --config /etc/openvpn/myprovider/myconfig.ovpn --daemon --writepid /var/run/openvpn/vpn.pid

[Install]
WantedBy=multi-user.target

Ative o serviço VPN com:

systemctl enable my-vpn.service

E teste com:

systemctl start my-vpn.service
systemctl status my-vpn.service

Se estiver iniciado / funcionando, você está bem.

SystemD transmissão-daemon.service

Este script requer o serviço vpn, portanto, se o vpn cair, o daemon de transmissão também ficará inoperante. Isso é útil se o vpn for reiniciado e você obtiver um novo endereço IP, porque a transmissão precisará reiniciar e religar novamente, o que deve ser tratado automaticamente. Observe que usamos as variáveis ​​de ambiente que imprimimos no route-upscript anteriormente.

/etc/systemd/system/transmission-daemon.service:

[Unit]
Description=Transmission BitTorrent Daemon Under VPN
After=network.target my-vpn.service
Requires=my-vpn.service

[Service]
User=debian-transmission
Type=notify
EnvironmentFile=/etc/openvpn/vpn.env
ExecStart=/usr/bin/transmission-daemon -f --log-error --bind-address-ipv4 $ifconfig_local --rpc-bind-address 0.0.0.0 --no-portmap
ExecReload=/bin/kill -s HUP $MAINPID

[Install]
WantedBy=multi-user.target

Habilitá-lo

systemctl enable transmission-daemon.service

E comece

systemctl start transmission-daemon.service

Quando você reinicia, tudo deve iniciar automaticamente (em ordem!). Observe que o uso Type=simpleno serviço vpn causa alguns problemas no tempo de ordenação de scripts, portanto, recomendo o uso forking.

Você pode especificar um endereço IP real para o rpc-bind-addresscaso você queira ser mais restritivo (este é o endereço de escuta da GUI da web, que não deve ser o seu VPN-ip). E se você deseja executar a transmissão com bom desempenho, basta alterar a ExecStartlinha e adicionar /usr/bin/nice -n15ao início.

Manipulação de alterações de endereço

Uma coisa que notei ao longo do tempo é que, se por algum motivo a conexão vpn receber um novo endereço IP, a transmissão ainda estará vinculada ao endereço antigo e deixará de funcionar. E simplesmente systemctl restart transmission-daemon.servicenão serve. Ele precisa parar completamente e começar do zero.

Não sei por que, mas, por esse motivo, adicionei as seguintes linhas ao meu root crontab ( sudo crontab -e):

# m h  dom mon dow   command
0 6 * * * /bin/systemctl stop my-vpn.service; /bin/systemctl start my-vpn.service
1 6 * * * /bin/systemctl stop transmission-daemon.service; /bin/systemctl start transmission-daemon.service
Jonas Kalderstam
fonte
Apenas por interesse, isso também está sendo executado em um BeagleBone? Em caso afirmativo, você vê problemas de desempenho com a transmissão? Além disso, excelente redação. :)
seanlano
Ah não. Está sendo executado na minha máquina de desktop normal e não notei nenhum problema lá.
Jonas Kalderstam
Justo. Funciona bem para mim em uma máquina Intel, eu esperava poder fazer uma caixa de torrent barata com um processador ARM - mas, aparentemente, não é assim.
Seanlano 13/05
Confira rtorrent. É muito PERFORMANT
Jonas Kalderstam
Obrigado, eu irei. Outras coisas funcionam bem na caixa ARM, então talvez o rtorrent funcione corretamente.
Seanlano 16/05
3

Notei que você mencionou que a transmissão não passa pela VPN para UPnP / NAT-PMP. Percebi isso também e criei um patch para a transmissão, para que ele honre a configuração de endereço de ipv4 de ligação para UPnP. O NAT-PMP é um pouco mais difícil de implementar, pois você precisa determinar o gateway padrão. O UPnP é o principal que está sendo usado atualmente, no entanto, portanto é provavelmente bom o suficiente. Registrei isso como um bug no site trac.transmissionbt e forneci o patch. Espero que seja incorporado em uma versão futura. https://trac.transmissionbt.com/ticket/5990

Outra opção agora, se você não deseja recompilar, é executar manualmente o upnpc a partir do pacote miniupnpc. Por exemplo

sudo apt-get install miniupnpc
upnpc -m 10.10.10.51 -a 10.10.10.51 51515 51515 TCP
upnpc -m 10.10.10.51 -a 10.10.10.51 51515 51515 UDP

Onde 10.10.10.51 é o seu IP da VPN e 51515 é a porta TCP / UDP solicitada.

Não sei por quanto tempo o encaminhamento é bom. Além disso, você pode usar a opção '-d' para remover sua porta ao desconectar. Descobri que, se não o fizer, não poderei obter a mesma porta novamente se fizer login novamente na VPN.

Felicidades

falk0069
fonte
Passei anos tentando encontrar uma solução como essa, gostaria de ter encontrado miniupnpc! E espero que o patch seja mesclado e esse problema seja corrigido para sempre. Enquanto isso, definitivamente tentarei usar sua dica útil.
Seanlano 10/09/2015