Torrent: Transmission

 

Torrent

우분투 서버에 토렌트 클라이언트 프로그램을 설치하면 홈 서버에서 직접 토렌트를 다루고 파일을 주고받을 수 있다. 리눅스의 토렌트 클라이언트 프로그램으로는 트랜스미션 (Transmission) 이 대표적으로 사용된다.

 

Transmission 설치

sudo apt update
sudo apt install transmission-daemon

패키지 저장소 내용을 업데이트하고, 트랜스미션을 설치한다.

sudo mkdir -p /home/MySMB/Torrent/Watch

트랜스미션으로 전송받은 파일이 저장될 디렉토리를 생성한다. 자신이 원하는 대로 생성하면 되는데, 여기서는 전송받은 파일을 SMB 네트워크에서도 바로 접근할 수 있게 하려고 앞선 글 네트워크 파일 공유: SMB에서 지정한 SMB 디렉토리인 /home/MySMB 의 하위 경로에 Torrent 디렉토리를 생성했다. 이 Torrent 디렉토리 하위의 Watch 디렉토리는 .torrent 시드 파일을 트랜스미션에 자동으로 등록하는데 사용할 디렉토리이다.

sudo chown -R debian-transmission:debian-transmission /home/MySMB/Torrent
sudo find /home/MySMB/Torrent -type d -exec chmod 0775 {} \;
sudo find /home/MySMB/Torrent -type f -exec chmod 0664 {} \;
sudo usermod -a -G debian-transmission varins

트랜스미션은 파일을 전송받아서 생성할 때 보안상의 이유로 소유자와 소유그룹을 debian-transmission으로 생성한다. 그러므로 파일이 저장될 디렉토리 및 하위 디렉토리(-R)의 소유자와 소유그룹도 debian-transmission:debian-transmission으로 맞춰주는 것이 편하다. 하지만 이 상태만으로는 우분투 서버의 사용자 계정에게는 쓰기 권한이 없어서 이 디렉토리의 파일을 편집하거나 삭제할 수가 없다. 그래서 이 디렉토리와 하위에 있는 모든 디렉토리에 775, 모든 파일에 664 권한을 부여해서 소유그룹에 쓰기 권한을 준 다음, 우분투 서버의 사용자 계정을 (위의 예시에서는 varins) debian-transmission 그룹에 포함시키면 그룹으로서 쓰기 권한을 얻게 되어 자유롭게 파일과 디렉토리를 다룰 수 있게 된다. 그리고 아래에서 진행할 Transmission 설정에서 트랜스미션이 생성하는 디렉토리와 파일의 권한이 각각 775, 664가 되도록 마무리해주면 트랜스미션이 생성하는 모든 파일과 디렉토리를 자유롭게 사용할 수 있게 된다.

 

Transmission 설정

 

Transmission 설정 파일

sudo service transmission-daemon stop

먼저 트랜스미션의 작동을 중지한다. 지금 설정하는 값이 기본값으로 저장되도록 하려면 트랜스미션의 작동을 중지하고 설정해야 한다.

sudo nano /etc/transmission-daemon/settings.json

트랜스미션 설정 파일을 nano 편집기로 연다. 아래는 예시로 내가 설정한 값을 모두 나열한 것이고, 파란색은 설정 파일에 없던 항목을 직접 추가한 것이다.

{
    "alt-speed-down": 50,
    "alt-speed-enabled": false,
    "alt-speed-time-begin": 540,
    "alt-speed-time-day": 127,
    "alt-speed-time-enabled": false,
    "alt-speed-time-end": 1020,
    "alt-speed-up": 50,
    "bind-address-ipv4": "0.0.0.0",
    "bind-address-ipv6": "::",
    "blocklist-enabled": true,
    "blocklist-url": "http://john.bitsurge.net/public/biglist.p2p.gz",
    "cache-size-mb": 64,
    "dht-enabled": true,
    "download-dir": "/home/MySMB/Torrent",
    "download-limit": 12800,
    "download-limit-enabled": 0,
    "download-queue-enabled": false,
    "download-queue-size": 100,
    "encryption": 1,
    "idle-seeding-limit": 30,
    "idle-seeding-limit-enabled": false,
    "incomplete-dir": "/home/MySMB/Torrent",
    "incomplete-dir-enabled": false,
    "lpd-enabled": false,
    "max-peers-global": 34464,
    "message-level": 1,
    "peer-congestion-algorithm": "",
    "peer-id-ttl-hours": 6,
    "peer-limit-global": 34464,
    "peer-limit-per-torrent": 100,
    "peer-port": 51413,
    "peer-port-random-high": 65535,
    "peer-port-random-low": 49152,
    "peer-port-random-on-start": false,
    "peer-socket-tos": "default",
    "pex-enabled": true,
    "port-forwarding-enabled": false,
    "preallocation": 1,
    "prefetch-enabled": true,
    "queue-stalled-enabled": false,
    "queue-stalled-minutes": 30,
    "ratio-limit": 2,
    "ratio-limit-enabled": false,
    "rename-partial-files": true,
    "rpc-authentication-required": true,
    "rpc-bind-address": "0.0.0.0",
    "rpc-enabled": true,
    "rpc-host-whitelist": "",
    "rpc-host-whitelist-enabled": true,
    "rpc-password": "rpcpassword",
    "rpc-port": 9091,
    "rpc-url": "/transmission/",
    "rpc-username": "rpcuser",
    "rpc-whitelist": "127.0.0.1,192.168.*.*,10.10.10.*",
    "rpc-whitelist-enabled": false,
    "scrape-paused-torrents-enabled": true,
    "script-torrent-done-enabled": false,
    "script-torrent-done-filename": "",
    "seed-queue-enabled": false,
    "seed-queue-size": 100,
    "speed-limit-down": 12800,
    "speed-limit-down-enabled": false,
    "speed-limit-up": 12800,
    "speed-limit-up-enabled": false,
    "start-added-torrents": true,
    "trash-original-torrent-files": true,
    "umask": 2,
    "upload-limit": 12800,
    "upload-limit-enabled": 0,
    "upload-slots-per-torrent": 50,
    "utp-enabled": true,
    "watch-dir": "/home/VServer/Torrent/Watch",
    "watch-dir-enabled": true
}

주요 옵션을 살펴보면 아래와 같다.

download-dir  → 트랜스미션으로 전송 받은 파일이 저장되는 기본 디렉토리
incomplete-dir  → 다운로드 중인 파일이 머무는 디렉토리
incomplete-dir-enabled  → incomplete-dir을 사용할지 여부. false로 지정하면 download-dir을 사용한다.
peer-port  → 트랜스미션이 파일 전송에 사용하는 포트
rpc-authentication-required  → 외부에서 트랜스미션에 접속하는 rpc 기능을 사용할 때 ID/비밀번호 인증을 사용할지 여부
rpc-enabled  → rpc 기능을 사용할지 여부. false로 지정하면 우분투 서버 상에서 명령어로만 트랜스미션을 다룰 수 있다.
rpc-password  → rpc로 접속할 때 사용할 비밀번호
rpc-port  → rpc로 접속할 때 사용할 포트
rpc-url  → rpc로 접속할 때 사용할 주소
rpc-username  → rpc로 접속할 때 사용할 사용자명 (ID)
rpc-whitelist  → rpc에 접속할 수 있는 IP 주소
rpc-whitelist-enabled  → rpc-whitelist를 사용할지 여부
start-added-torrents  → 토렌트가 트랜스미션에 등록되면 전송을 자동으로 시작할지 여부
trash-original-torrent-files  → 토렌트가 트랜스미션에 등록되면 .torrent 시드 파일을 자동으로 삭제할지 여부
umask  → 트랜스미션이 생성하는 디렉토리와 파일의 권한. 2로 지정하면 디렉토리에 775, 파일에 664 권한이 부여된다.
watch-dir  → 이 항목을 추가하고 여기서에 지정한 디렉토리에 .torrent 시드 파일을 넣으면 자동으로 트랜스미션에 등록된다.
watch-dir-enabled  → watch-dir 기능을 사용할지 여부

예시를 참고해서 자신에게 맞는 내용으로 바꾸고, 빨간색/파란색 부분 이외에 전송 속도나 다른 기능들에 관한 항목은 Transmission 웹사이트의 설명을 참고해서 설정한다. 각 항목은 끝에 ,를 넣어서 서로를 구분하지만 마지막 항목의 끝에는 ,가 없음을 유의하고, 설정이 끝났으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

 

방화벽 설정

sudo iptables -A INPUT -p tcp -m tcp --dport 51413 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp --dport 51413 -j ACCEPT

sudo iptables -A INPUT -p tcp -m tcp --dport 9091 -j ACCEPT

peer-portrpc-port 항목에서 지정한 포트를 iptables 방화벽에서 열어준다. (기본적인 방화벽 세팅은 앞선 글 우분투 서버 기본 설정에서 완료했다.)

sudo netfilter-persistent save
sudo netfilter-persistent reload

iptables 방화벽 설정을 저장하고 리로드한다. (iptables-persistent는 앞선 글 우분투 서버 기본 설정에서 설치했다.)

 

포트 포워딩

라우터 (인터넷 공유기) 를 사용하고 있다면 포트 포워딩 기능을 이용해서 peer-port 항목에 지정한 포트를 TCP 및 UDP 모두 홈 서버 컴퓨터로 향하도록 포워딩한다.

 

Transmission 시작

sudo service transmission-daemon start

설정이 완료되었으면 트랜스미션을 작동시킨다.

 

 

Transmission 접속

 

기본 접속

트랜스미션은 우분투 서버 상에서 명령어로 다룰 수도 있고, rpc-enabledtrue로 설정했다면 웹 브라우저로 접속해서 GUI 환경을 이용할 수도 있다. 기본적으로는 내부 네트워크에서 http 프로토콜로 GUI 환경에 접속할 수 있는 상태이고, 웹 브라우저로 http://서버내부IP:9091에 접속해서 로그인하면 트랜스미션을 사용할 수 있다. 포트 번호 9091rpc-port 항목에서 지정한 포트 번호이다.

 

리버스 프록시 접속

내부/외부 네트워크 어디에서든 GUI 환경의 Transmission을 이용하려면 우분투 서버에 운영 중인 웹 서버를 이용해서 리버스 프록시를 구성한다. 여기서는 기존에 운영 중인 Nginx 웹 서버가 있다고 가정하고 설명한다.

"rpc-url": "/transmission/",

앞서 트랜스미션 설정 파일의 rpc-url 항목에 지정한 내용이 접속 주소의 일부가 되는데, 최종적으로 https://example.com/transmission 형태의 주소가 된다. 도메인 뒷부분의 transmission을 변경하고 싶다면 rpc-url 항목에서 변경한다. 변경할 때에는 트랜스미션을 먼저 중지하고 변경해야 변경한 내용이 기본값으로 저장된다.

그다음 Nginx 웹 서버에 리버스 프록시를 구성하는데,

        location /transmission {
                client_max_body_size 0;
                proxy_pass http://127.0.0.1:9091;
                proxy_http_version 1.1;
                proxy_pass_header X-Transmission-Session-Id;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

이 내용을 서버 블록에 추가하면 된다. 빨간색 transmission은 앞서 트랜스미션 설정의 rpc-url 항목에 지정한 것을 기재한다. 포트 번호 9091rpc-port 항목에서 지정한 포트 번호이다. client_max_body_size 0; 설정은 Nginx를 통해서 업로드하는 파일의 크기 제한을 없애는 설정으로, .torrent 시드 파일을 업로드할 때 크기 제한을 없애준다.

앞선 글 웹 서버: Nginx에서 설정한 example.com의 서버 블록을 기준으로 보면,

sudo nano /etc/nginx/sites-available/example.com

example.com 서버 블록 파일을 nano 편집기로 열어서

server {
        listen 80 default_server;

        server_name example.com www.example.com;

        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl http2 default_server;

        server_name example.com www.example.com;

        root /var/www/example.com/html;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;

        ssl_protocols TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256;
        ssl_ecdh_curve secp384r1;
        ssl_session_timeout 10m;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 1.1.1.1 1.0.0.1 valid=300s;
        resolver_timeout 5s;

        add_header Strict-Transport-Security max-age=31536000;
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";

        index index.html index.htm;

        location / {
                try_files $uri $uri/ =404;
        }

        location /transmission {
                client_max_body_size 0;
                proxy_pass http://127.0.0.1:9091;
                proxy_http_version 1.1;
                proxy_pass_header X-Transmission-Session-Id;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

}

이렇게 server { } 블록에 추가하는데, 이 예시의 서버 블록은 https 보안 연결만을 허용하는 구성이므로 listen 443 영역에 추가한다. 완료했으면 Ctrl키와 x키를 동시에 눌러 nano 편집기를 빠져나오면서 저장한다.

sudo nginx -t
sudo systemctl restart nginx

변경한 서버 블록이 적용되도록 Nginx 기본 문법을 검사한 뒤 Nginx를 재시작한다.

이제 어디에서든 https://example.com/transmission 에 접속하면 트랜스미션을 사용할 수 있다.

 

Transmission Remote GUI

웹 브라우저로 접속하는 기능을 데스크톱 컴퓨터 프로그램 형태로 구현한 Transmission Remote GUI가 있다. PC나 Mac에 설치하면 하나의 토렌트 프로그램처럼 사용할 수 있고, 웹 브라우저로 접속하는 것보다 다양한 기능을 이용할 수 있다. 최신 버전은 https://github.com/transmission-remote-gui/transgui/releases 에서 내려받을 수 있다.

tgui-01.png

내부 네트워크에서 접속할 때에는 원격 호스트에 홈 서버 컴퓨터의 내부 IP 주소를 입력하고, 포트rpc-port 항목에서 지정한 포트 번호를 입력한다. RPC 경로는 비워두거나 아무것이나 입력해도 상관없다.

tgui-02.png

리버스 프록시를 구성하고 도메인을 사용해서 접속한다면, 원격 호스트에 도메인을 입력하고, Nginx 서버 블록에 설정된 대로 포트에는 443을 입력하고, SSL 사용에 체크한다. RPC 경로에는 rpc-url 항목에서 지정한 내용을 입력한다.

 

모바일 앱

안드로이드 앱은 여러 가지가 있는데 Transmission Remote 앱이 사용하기 괜찮았다. iOS에는 현재 Transmission 접속 앱이 없으므로 웹 브라우저로 접속해서 이용한다.

 

본 글의 저작권은 작성자 Varins에게 있습니다.
Varins의 사전 서면 동의 없이는 본 글의 전부 또는 일부를 무단으로 전재, 게시, 배포하는 것을 금지합니다.

코멘트 없음
맨위로