토렌트: Transmission

July 1, 2019

    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/MySMB/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 TLSv1.3;
            ssl_prefer_server_ciphers on;
            ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256: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가 있다. PC나 Mac에 설치하면 하나의 토렌트 프로그램처럼 사용할 수 있고, 웹 브라우저로 접속하는 것보다 다양한 기능을 이용할 수 있다. 최신 버전은 https://github.com/transmission-remote-gui/transgui/releases 에서 내려받을 수 있다.

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

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

    모바일 앱

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

     

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

Leave a comment

댓글은 관리자의 승인 이후에 게시됩니다.