홈 서버 만들기 13. Torrent: Transmission

May 10, 2018

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

Transmission 설치

sudo apt-get update
sudo apt-get install transmission-daemon

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

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

트랜스미션으로 전송받은 파일이 저장될 디렉토리를 생성한다. 자신이 원하는 대로 생성하면 되는데, 여기서는 전송받은 파일을 SMB 네트워크에서도 바로 접근할 수 있게 하려고 앞서 05. 네트워크 파일 공유에서 지정한 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 설정

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 방화벽에서 열어준다. (기본적인 방화벽 세팅은 03. 우분투 서버 18.04 LTS 기본 설정에서 완료했다.)

sudo netfilter-persistent save
sudo netfilter-persistent reload

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

인터넷 공유기 포트 포워딩

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

Transmission 시작

sudo service transmission-daemon start

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

 

Transmission 접속

웹 브라우저 – http 접속

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

인터넷 공유기에서 rpc-port에 지정한 포트 번호를 홈 서버 컴퓨터로 포워딩 한다면 공인 IP 주소나 도메인으로도 접속할 수 있는데, http 프로토콜을 사용해야 하므로 해당 도메인에 https로 리턴하는 설정이 적용되어 있다면 접속이 안 될 수 있다. 이때에는 인터넷 공유기에서 포트 포워딩을 하지 말고, 우분투 서버에서 운영 중인 웹 서버을 이용해서 프록시를 구성하면 https 프로토콜로 어디에서든 접속할 수 있다. 여기서는 기존에 운영 중인 Nginx 웹 서버가 있다고 가정하고 설명한다.

웹 브라우저 – https 접속: Nginx 프록시

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

앞서 트랜스미션 설정의 rpc-url 항목에 지정한 내용이 https 접속 주소의 일부가 되는데, 최종적으로 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;
	}

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

서버 블록에 이 내용을 추가하는 위치는 listen 443 영역이다. 앞선 글 08. 웹 서버에서 설정한 example.com의 서버 블록을 기준으로 보면,

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

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

server {
	listen 80;

	server_name example.com www.example.com;

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

server {
	listen 443 ssl http2;

	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_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-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 8.8.8.8 8.8.4.4 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;
	}
}

이렇게 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 에서 내려받을 수 있다.

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

 

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

 

모바일 앱

안드로이드 앱은 여러 가지가 있는데 Transmission Remote 앱이 사용하기 괜찮았다. iOS 앱은 마땅한 것이 없지만 웹 브라우저로 접속해도 괜찮았다.

 

방화벽 삭제

만일 https 프록시로 구성한 도메인으로만 접속한다면, 앞서 iptables 방화벽에서 열어주었던 rpc-port 포트는 방화벽 규칙에서 삭제해도 된다.

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

sudo netfilter-persistent save
sudo netfilter-persistent reload

-D 옵션을 사용하면 항목이 삭제된다. 삭제 후에는 iptables 방화벽을 저장하고 리로드한다.

 

 

홈 서버 만들기 목차 
https://varins.com/category/server

01. 하드웨어 구성과 전기 요금
02. 우분투 서버 18.04 LTS 설치
03. 우분투 서버 18.04 LTS 기본 설정
04. 파일 복원: Btrfs 스냅샷
05. 네트워크 파일 공유: Samba (SMB)
06. Dynamic DNS: 구글 도메인 + ddclient
07. SSL/TLS 인증서: Let's Encrypt (Wildcard)
08. 웹 서버: Nginx, 서버 블록, https 보안연결
09. 웹사이트: php + MariaDB + WordPress
10. 서버 모니터링: Monitorix + Nginx Proxy
11. FTPS: vsftpd
12. VPN: IKEv2 (strongSwan)
13. Torrent: Transmission
14. 클라우드 스토리지: Nextcloud (Nginx, MariaDB)
15. 온라인 오피스: 온리오피스 (Docker, Nginx)
16. 트랜스코딩: Plex
17. VNC RDP 클라이언트: Guacamole (Docker, Nginx)
18. 가상 머신: QEMU-KVM + libvirt + virt-install
19. 시스템 업그레이드: i3 8300T, 970 EVO 전력 사용량
20. 서버 모니터링: netdata + Nginx Proxy

Leave a comment

Your email address will not be published. Required fields are marked *

Prev Post Next Post