Transmission-OpenVPN 도커 트랜스미션을 VPN 설정으로 안전하게 사용하는 방법!

Transmission-OpenVPN 도커 트랜스미션을 VPN 설정으로 안전하게 사용하는 방법!

목차

Popular BitTorrent Client Transmission Now Available For Windows -  MSPoweruser

대표적인 Torrent(토렌트) 다운로드 클라이언트인 Transmission(트랜스미션)에 외부로부터 좀 더 안전한 환경인 VPN을 적용해보도록 하겠습니다.

왜 트랜스미션과 같은 P2P 서비스에는 반드시 VPN이 필요한지 궁금하신 분들도 계실겁니다.

Torrent downloads and distributions for IP 152.70.239.244
Detailed statistic for torrent downloads and distributions for IP address 152.70.239.244

트랜스미션의 경우 다운로드 완료 후 시드를 유지하지 않는다고 해서 안전하다고 생각하시면 곤란합니다.

많은 토렌트 사용자들이 자신의 P2P 활동이 실제로 얼마나 공개적인지 알지 못하고 있는데, 위처럼 iknowwhatyoudownload 같은 사이트에서 쉽게 내가 다운로드 받은 파일들이 조회가 가능합니다.

다른 사람이 파일을 다운로드할 수 있는 네트워크의 일부인 P2P는 모든 활동이 공개적으로 IP 주소로 추적 될 수 있습니다.

이처럼 내가 다운로드 받은 파일 목록이 너무나 쉽게 노출된다는 것과 더불어 이를 통해 잠재적인 불법 다운로드에 대한 책임이 생긴다는 문제가 있습니다.

NordVPN도 2년 라이센스를 구매했으니 이제 이와 같은 문제들을 피해야 할 시간입니다.

가장 궁금했던 부분은 역시나 컨테이너에 과연 VPN이 적용되었다는 걸 어떻게 사용자가 체크가 가능한가?

만약 VPN이 끊어지면 바로 대처가 가능할까? 라는 부분이었는데 의외로 단순히 컨테이너 IP를 확인하면 되는 것이라 김빠지게 간단했습니다.

추가로 VPN 연결을 나스에 별도의 네트워크로 추가할 것인지 도커 컨테이너에만 적용할 것인지도 알아보며 상당한 고민이 있었습니다.

직접 설정해보니 필요하다면 얼마든지 다른 서비스들을 추가할 수 있기 때문에 개인용 나스에 VPN 네트워크를 직접 붙여 놓았을 때의 장점

도커 컨테이너로 관리하는 편리함을 저울질 했으나 결국 필요가 없다는 생각에 컨테이너에 적용하는 방법을 소개합니다.

1. NordVPN을 사용하기 좋은 트랜스미션 프로젝트를 찾아서..

GitHub - haugene/docker-transmission-openvpn: Docker container running Transmission torrent client with WebUI over an OpenVPN tunnel
Docker container running Transmission torrent client with WebUI over an OpenVPN tunnel - GitHub - haugene/docker-transmission-openvpn: Docker container running Transmission torrent client with WebU…

먼저 트랜스미션과 OpenVPN을 각각 연동하는 방법도 있습니다만, 이미 유연하게 연동해 놓은 가장 쉬운 트랜스미션 확장의 경우 위 프로젝트가 유명했습니다.

개발자의 깃허브에서 설정을 참고하여 도커허브에서 적용할 이미지를 찾아보았습니다.

  1. haugene/transmission-openvpn
  2. haugene/transmission-openvpn-proxy

도커허브에는 헷갈리게도 위 개발자가 만든 두 개의 컨테이너가 나타나는데 가장 사용자 다운로드 pull 수가 많은 haugene/transmission-openvpn 을 사용하겠습니다.

두번째 프록시 버전은 별도 Nginx 웹 프록시등을 사용할 때 쓰이는 이미지로 링크 내 설명이 100% 동일해서 오히려 사용자에게 혼란만 주고 있었습니다.

transmission-openvpn-proxy 이미지는 트랜스미션 설치 후 아래에서 좀 더 자세히 다루겠습니다.

2. Portainer를 이용한 Stack 배포

먼저 가장 많이 사용하고 계실 도커 관리용 Web UIPortainer(포테이너)를 기준으로 간단하게 설치를 진행해보겠습니다.

본디 docker-compose.yml 등의 설정 파일을 이용해 배포하는 도커의 compose(컴포즈) 플러그인의 기능을 포테이너에선 Stacks 라는 이름으로 제공하고 있습니다.

일반적인 도커 컴포즈와 마찬가지로 Edit이나 Update 등의 기능을 모두 제공하기 때문에 docker-compose.yml 형식으로 배포할 때 요긴하게 사용이 가능합니다.

좌측 Stacks 메뉴에서 상단의 Add stack을 눌러줍니다.

(1) 스택의 이름을 정해줍니다.

(일종의 컨테이너 그룹 명 같은 것으로 아무거나 해주셔도 되며 제 경우 trans-vpn으로 입력했습니다.)

(2) compose 형식의 내용을 에디터에 직접 입력이 가능합니다.

docker-compose.yml

version: '3.3'
services:
  # OpenVPN 을 지원하는 트랜스미션 컨테이너
  transmission-openvpn:
    cap_add:
      - NET_ADMIN
    volumes:
      - '[직접입력]/data:/data' # 기본 데이터 경로
      - '[직접입력]/config:/config' # 설정파일 경로
      - '[직접입력]/download:/data/completed' # 토렌트 다운로드 완료 경로
      - '[직접입력]/incomplete:/data/incomplete' # 디스크 수명을 위한 임시다운로드 경로
      - '[직접입력]/watch:/data/watch' # 토렌트 파일 자동 감시 경로
    environment:
      - OPENVPN_PROVIDER=NORDVPN # VPN 벤더
      - OPENVPN_CONFIG=us.socks.nordhold.net
      - NORDVPN_COUNTRY=US # 기본 지역은 미국 https://api.nordvpn.com/v1/servers/countries 에서 선택 가능
      - NORDVPN_CATEGORY=legacy_p2p # 토렌트 P2P로 설정 https://api.nordvpn.com/v1/servers/groups 내 P2P는 1개뿐
      - NORDVPN_PROTOCOL=tcp # VPN에 사용할 프로토콜 기본은 tcp지만 udp도 사용가능
      - NORDVPN_SERVER=sg460.nordvpn.com # 사용할 VPN 서버 FQDN을 설정하고, API 권장 사항을 무시하고, 서버의 구성 파일을 다운로드
      - OPENVPN_USERNAME=[직접입력] # NordVPN 서비스 아이디
      - OPENVPN_PASSWORD=[직접입력] # NordVPN 서비스 비밀번호
      - OPENVPN_OPTS=--inactive 3600 --ping 10 --ping-exit 60 # 인터넷 연결이 끊어지면 컨테이너 강제종료(킬스위치)
      - TRANSMISSION_SCRAPE_PAUSED_TORRENTS_ENABLED=false # 다운로드가 없을 때 최대 절전 모드 해제,VPN 끊김방지
      - LOCAL_NETWORK=192.168.0.0/16 # 로컬 서브넷 대역, 공유기에 따라 다름
      - TRANSMISSION_RPC_AUTHENTICATION_REQUIRED=true # 보안을 위해 로그인 필수
      - TRANSMISSION_RPC_USERNAME=[직접입력] # 웹UI 로그인 아이디
      - TRANSMISSION_RPC_PASSWORD=[직접입력] # 웹UI 로그인 비밀번호
      - PUID=1000 # 리눅스에서 id 를 입력시 나타나는 유저, 환경에 따라 다름
      - PGID=100 # 마찬가지로 groups 입력시 나타나는 그룹, 환경에 따라 다름
      - TZ=Asia/Seoul # 국내 타임존으로 설정
      #- TRANSMISSION_WEB_UI=combustion # 기본으로 테마 중 모바일 사용성 좋음
      #- TRANSMISSION_WEB_HOME=/config/ui/web # 별도의 커스텀 UI 적용시, 반드시 경로에 파일이 존재해야함
      - OVERRIDE_DNS_1=8.8.8.8 # 구글 1차 DNS 적용
      - OVERRIDE_DNS_2=8.8.4.4 # 구글 2차 DNS 적용
      #- TRANSMISSION_SCRIPT_TORRENT_DONE_ENABLED=true # 전송 완료 후 스크립트 실행 여부
      #- TRANSMISSION_SCRIPT_TORRENT_DONE_FILENAME=/config/transmission-home/done.sh # 전송 완료 sh 파일 경로 (사전에 경로 마운트 필요)

    logging:
      driver: json-file
      options:
          max-size: 10m # log 파일의 용량을 10m로 제한
    ports:
      - '39091:9091' # 본인이 원하는 포트로 매핑
    image: haugene/transmission-openvpn:5.1.0
    restart: always # 컨테이너가 종료되면 항상 재시작하도록 설정

위 설정 파일을 웹 에디터에 넣고 위 설정파일의 [직접입력] 항목들을 사용하실 서버의 환경에 맞게 모두 수정해줍니다.

제 설정을 복사해서 만든 것이라 불필요한 볼륨의 경우 빼버리셔도 무관하겠습니다.

최근 업데이트가 잦아진건지 해당 컨테이너의 버전의 경우

개발자가 개발용으로 라즈베리파이 같은 ARM 기반으로 제작하고 있는 것으로 보입니다.

Docker

dockerhub의 태그를 보면 상황에 따라 latest 태그의 플랫폼에서 linux/AMD64 버전이 뒤늦게 올라오고 있으니 직접 참고해서 선정하는 것이 좋겠습니다.

아쉽게도 image 항목의 버전 표기를 빼거나 명시하지 않으면 자주 플랫폼 오류가 발생합니다.

따라서 사용하시는 CPU에 따라 일반적인 X86 기반의 나스환경이라면 직접 최신 버전을 이미지 옆에 : 이후로 명시해주셔야하겠습니다.

YAMLlint - The YAML Validator
Validate, Verify and Reformat your YAML documents, optimized for Ruby on Rails

추가로 compose 설정 파일의 경우 YAML 이 익숙하지 않으신 경우라면 중간에 탭문자가 들어가는 등, 수정하다가 쉽게 문법을 틀리실 수 있어 골치아픈 경우가 많습니다.

위 사이트에서 몇번째 줄에 문제가 있는지 쉽게 Validation을 할 수 있으니 참고하세요.

다음으로 컨테이너의 필수 설정 항목인 NordVPN 의 접속 정보인 서비스 아이디가 필요합니다.

NordVPN 서비스 아이디 확인하기

https://my.nordaccount.com/ko/dashboard/nordvpn/manual-configuration/

도커 컨테이너 같은 별도 서비스 등을 목적으로 사용하는 경우 로그인에 사용했던 일반 노드 VPN 아이디와 비밀번호를 사용하지 않습니다.

서비스 용 계정이 별도로 필요하며 메뉴의 위치는 NordVPN 사이트에 로그인을 먼저 진행하신 뒤 좌측 메뉴의 서비스 > NordVPN 입니다.

위 페이지에서 서비스 용으로 사용할 NordVPN 수동설정 버튼을 찾으실 수 있습니다.

보안을 위해 이메일 인증을 진행하니 NordVPN 수동설정 버튼을 눌러주시면 나타나는 위 사진의 수동 설치 화면으로 이동합니다.

위 화면의 사용자 이름비밀번호가 도커 컨테이너에서 실제로 사용할 아이디와 비밀번호가 되겠습니다.

그 외에도 주요 설정은 위 예제를 참고하실 수 있습니다.

추가로 트랜스미션과 같은 P2P 서비스는 NORDVPN_CATEGORY 항목이 반드시 legacy_p2p로 설정되어야 문제가 없습니다.

현재 설정 파일의 예시에는 미국(US)를 기준으로 세팅되어 있으니 필요하다면 수정하도록 합니다.

1. TRANSMISSION_WEB_UI=combustion
2. TRANSMISSION_WEB_UI=kettu
3. TRANSMISSION_WEB_UI=transmission-web-control
4. TRANSMISSION_WEB_UI=flood-for-transmission
5. TRANSMISSION_WEB_UI=shift

다음은 위 compose 설정 파일의 내용 중 #으로 주석 처리된, 테마 관련 환경 변수인 TRANSMISSION_WEB_UI=combustion 을 한번 주목할 필요가 있습니다.

기본적으로 transmisson-openvpn 컨테이너는 총 5가지의 테마를 지원하고 있습니다.

원하는 테마를 선택해서 환경 변수로 넘겨주시면 손쉽게 테마 구성이 가능합니다.

보통은 transmission-web-control 테마가 인기가 가장 많습니다만, 모바일에서 사용하기 좋아 보이는 combustion 테마도 상당히 괜찮았습니다.

Transmissionic 테마 수동 설치

GitHub - 6c65726f79/Transmissionic: Remote for Transmission Daemon
Remote for Transmission Daemon. Contribute to 6c65726f79/Transmissionic development by creating an account on GitHub.

트랜스미션의 경우 개인적으로 여러분께 적극 추천하는 테마가 있습니다.

바로 위 깃허브 링크에서 다운로드 받을 수 있는 Transmissionic 이라는 테마입니다.

좌우 클릭을 구별한 메뉴 및 추가 서버를 연동하는 확장성도 편리하고 모바일 및 데스크톱에서 큼직한 반응형 UI로 사용성이 매우 좋습니다.

몹시 추천하는 테마이니 직접 다운로드하셔서 한번 써보시는 것을 추천합니다.

제 경우 나스에서 트랜스미션을 운용하고 있어 사전에 매핑된 config 폴더 하위로 테마인 ui 폴더를 복사해주었습니다.

이렇게 하면 TRANSMISSION_WEB_HOME=/config/ui/web 환경 변수로 직접 테마 경로를 간단하게 수동으로 지정할 수 있습니다.

마지막으로 여러분의 서버 상황에 맞게 웹 에디터 상에서 설정 파일의 수정이 모두 완료되었다면 아래의 Deploy this stack을 눌러 컨테이너의 배포를 진행하겠습니다.

스택을 배포하면 위 사진처럼 그룹명-transmission-openvpn-1 이라는 컨테이너가 새롭게 나타납니다.

위 사진에는 sock5 기반의 단테 프록시 서버가 추가되어 있는 모습인데 이는 transmision-openvpn의 확장 관련해서 따로 다루도록 할테니 일단 무시해줍니다.

설정에 문제가 없으셨다면 정상 실행된 컨테이너의 로그를 확인해보겠습니다.

마지막 행에 Inintialization Sequence Completed 로 끝나는 구동 성공 로그가 찍혀 있으실 겁니다.

위 문구 자체가 VPN 로그인등의 작업에 전혀 문제가 없다는 뜻이니 짝짝짝! 성공입니다.

그렇다면 이제 정말 VPN이 적용된 것인지 확인해보러 가겠습니다.

3. 트랜스미션 컨테이너에 NordVPN 적용 여부 확인

공식 사이트의 가이드를 보니 도커 컨테이너 내부로 쉘을 이용해 curl 명령어만 한번 던지면 확인이 가능하다고 합니다.

docker exec <container-name> curl --silent "http://ipinfo.io/ip"

리눅스에서는 위 명령어를 통해 몹시 간단하게 확인이 가능했습니다.

갑자기 서버에 ssh라도 붙어야 할 것 같지만 더욱 쉬운 방법이 있습니다.

ssh로 붙어볼 필요도 없이 포테이너에서 지원하는 콘솔 기능을 이용하면 바로 확인이 가능합니다.

컨테이너 목록에서 Quick ActionsExec Console 아이콘을 눌러줍니다.

Command는 기본 값인 /bin/bash로 두고 아래의 Connect 버튼을 눌러 컨테이너의 쉘로 연결하도록 하겠습니다.

curl http://ipinfo.io/ip

위 명령어를 포테이너 콘솔에 복사해서 붙여 넣기로 입력해줍니다.

다음 줄에 본래 공유기 상단의 공인 IP가 나타나야 할 자리에 왠 뜬금없는 IP가 나타나면 정상적으로 VPN에 연결되어 있는 것입니다.

다른 컨테이너에서 위 명령어를 동일하게 입력해보시면 이번엔 공유기에서 확인 가능한 공인 IP가 나타납니다.

따라서 현재 정상적으로 트랜스미션 컨테이너에 VPN이 적용되었다고 확신할 수 있습니다.

완벽하군요!

4. VPN이 적용된 트랜스미션의 역방향 프록시 적용 (외부 접속)

이제 VPN이 본격적으로 동작하면서 여러분의 컨테이너는 외부에서는 쉽게 접속할 수 없는 환경이 되었습니다.

단순히 공유기의 포트 포워딩 기능만을 사용하신다면 실제 호스트를 찾지 못하고 외부 접속 시 타임아웃이 되어 위처럼 페이지를 찾지 못한다는 화면을 보시게 될 것입니다.

외부에서 접근할 때엔 이미 VPN으로 IP가 변경되었기 때문에 VPN 업체가 호스트에 포트라도 열어주지 않는 이상 접근할 수 없습니다.

클라우드 플레어의 제로 트러스트 서비스인 Tunnel 이라던가, 프록시 서버인 Nginx Proxy Manager 등의 대체 수단들로 간단히 해결이 가능하지 않을까요?

하지만 두 경우 모두 개인용 도메인을 따로 구매해야 한다는 전재에서 이미 매리트가 떨어지겠습니다.

(물론 이미 개인 도메인을 사용 중이신 분들이라면 도메인에 엮는 방법이 가장 편리합니다.)

VPN and Networking - docker-transmission-openvpn

그래서 이를 해결하기 위해서는 외부 접속을 위해 내부에서 별도의 Reverse Proxy (역방향 프록시) 서버를 추가하는 작업이 필요합니다.

포스트 초반의 DockerHub에서 두 번째로 인기가 많았던 바로 그 이미지, transmission-openvpn-proxy 가 드디어 등장할 차례입니다.

그렇다면 역방향 프록시는 어떻게 적용할 수 있는지 살펴 보겠습니다.

version: '3.3'
services:
  # OpenVPN 을 지원하는 트랜스미션 컨테이너
  transmission-openvpn:
    cap_add:
      - NET_ADMIN
    volumes:
      - '[직접입력]/data:/data' # 기본 데이터 경로
      - '[직접입력]/config:/config' # 설정파일 경로
      - '[직접입력]/download:/data/completed' # 토렌트 다운로드 완료 경로
      - '[직접입력]/incomplete:/data/incomplete' # 디스크 수명을 위한 임시다운로드 경로
      - '[직접입력]/watch:/data/watch' # 토렌트 파일 자동 감시 경로
    environment:
      - OPENVPN_PROVIDER=NORDVPN # VPN 벤더
      - OPENVPN_CONFIG=us.socks.nordhold.net
      - NORDVPN_COUNTRY=US # 기본 지역은 미국 https://api.nordvpn.com/v1/servers/countries 에서 선택 가능
      - NORDVPN_CATEGORY=legacy_p2p # 토렌트 P2P로 설정 https://api.nordvpn.com/v1/servers/groups 내 P2P는 1개뿐
      - NORDVPN_PROTOCOL=tcp # VPN에 사용할 프로토콜 기본은 tcp지만 udp도 사용가능
      - NORDVPN_SERVER=sg460.nordvpn.com # 사용할 VPN 서버 FQDN을 설정하고, API 권장 사항을 무시하고, 서버의 구성 파일을 다운로드
      - OPENVPN_USERNAME=[직접입력] # NordVPN 서비스 아이디
      - OPENVPN_PASSWORD=[직접입력] # NordVPN 서비스 비밀번호
      - OPENVPN_OPTS=--inactive 3600 --ping 10 --ping-exit 60 # 인터넷 연결이 끊어지면 컨테이너 강제종료(킬스위치)
      - TRANSMISSION_SCRAPE_PAUSED_TORRENTS_ENABLED=false # 다운로드가 없을 때 최대 절전 모드 해제,VPN 끊김방지
      - LOCAL_NETWORK=192.168.0.0/16 # 로컬 서브넷 대역, 공유기에 따라 다름
      - TRANSMISSION_RPC_AUTHENTICATION_REQUIRED=true # 보안을 위해 로그인 필수
      - TRANSMISSION_RPC_USERNAME=[직접입력] # 웹UI 로그인 아이디
      - TRANSMISSION_RPC_PASSWORD=[직접입력] # 웹UI 로그인 비밀번호
      - PUID=1000 # 리눅스에서 id 를 입력시 나타나는 유저, 환경에 따라 다름
      - PGID=100 # 마찬가지로 groups 입력시 나타나는 그룹, 환경에 따라 다름
      - TZ=Asia/Seoul # 국내 타임존으로 설정
      #- TRANSMISSION_WEB_UI=combustion # 기본으로 테마 중 모바일 사용성 좋음
      #- TRANSMISSION_WEB_HOME=/config/ui/web # 별도의 커스텀 UI 적용시, 반드시 경로에 파일이 존재해야함
      - OVERRIDE_DNS_1=8.8.8.8 # 구글 1차 DNS 적용
      - OVERRIDE_DNS_2=8.8.4.4 # 구글 2차 DNS 적용
      #- TRANSMISSION_SCRIPT_TORRENT_DONE_ENABLED=true # 전송 완료 후 스크립트 실행 여부
      #- TRANSMISSION_SCRIPT_TORRENT_DONE_FILENAME=/config/transmission-home/done.sh # 전송 완료 sh 파일 경로 (사전에 경로 마운트 필요)
    ports:
      - '39091:9091' # 본인이 원하는 포트로 매핑
    image: haugene/transmission-openvpn
    restart: always # 컨테이너가 종료되면 항상 재시작하도록 설정
    logging:
      driver: json-file
      options:
          max-size: 10m # log 파일의 용량을 10m로 제한
  
  # OpenVPN 을 지원하는 트랜스미션 컨테이너의 역방향 프록시(DDNS등으로 외부 접속 시 사용)
  transmission-openvpn-proxy:
    image: haugene/transmission-openvpn-proxy
    container_name: transmission-openvpn-proxy
    restart: unless-stopped
    links: 
      - transmission-openvpn:transmission # 연동할 컨테이너명 입력 (링크명은 반드시 transmission)
    ports:
      - [외부 트랜스 미션 포트]:8080 # 기본 포트를 원하는 트랜스미션 외부 포트로 전달 /transmission/rpc/
    depends_on:
      - transmission-openvpn
    logging:
      driver: json-file
      options:
        max-size: 10m # log 파일의 용량을 10m로 제한

​위 예제가 역방향 프록시 서버가 추가된 전체 compose.yml 내용으로 천천히 다시 한번 살펴보도록 하겠습니다.

아래쪽에 새로운 서비스로 transmission-openvpn-proxy 가 중간에 선언한 links로 연결된 모습입니다.

# OpenVPN 을 지원하는 트랜스미션 컨테이너의 역방향 프록시(DDNS등으로 외부 접속 시 사용)
  transmission-openvpn-proxy:
    image: haugene/transmission-openvpn-proxy:5.1.0
    container_name: openvpn-transmission-proxy
    restart: unless-stopped
    links: 
      - transmission-openvpn:transmission # 연동할 컨테이너명 입력 (링크명은 반드시 transmission)
    ports:
      - [트랜스미션 포트 입력]:8080 # 8080 기본 포트를 원하는 트랜스미션 외부 포트로 전달
    depends_on:
      - transmission-openvpn
    logging:
      driver: json-file
      options:
        max-size: 10m # log 파일의 용량을 10m로 제한

좀 더 보기 쉽게 추가된 내용만 한번 잘라내서 보겠습니다.

위 처럼 transmission-openvpn-proxy 컨테이너를 추가하고 기본 포트인 8080 포트를 원하는 포트로 변경해주시면 쉽게 역방향 프록시가 가능합니다.

주의 사항으로는 위 트랜스미션 포트 입력 항목은 당연하게도 기존에 이미 사용 중인 포트는 지정할 수 없습니다.

버전의 경우 transmission-openvpn 컨테이너와 동일하게 부여되기 때문에 같은 버전(예:5.1.0)을 사용합니다.

이제 직접 compose.yml 형식으로 작성한 Stack의 수정을 위해 다시 포테이너로 이동하겠습니다.

포테이너의 Stacks 메뉴로 이동해서 트랜스미션 Stack 이름을 클릭해줍니다.

화면 상단의 Editor 탭을 클릭해주시면 기존에 배포된 Stack의 수정이 가능합니다.

먼저 말씀드린 주의 사항처럼 예를 들어 트랜스미션이 현재 39091 포트로 구동 중이라면, 역방향 프록시로 사용할 포트는 39092등으로 서로 겹치지 않는 포트로 전달 해주셔야 합니다.

수정을 완료하면 아래의 Update the stack 버튼을 눌러 재배포를 진행합니다.

이제 포트 포워딩을 적용하시고 위 Stacks에서 설정한 포트로 브라우저에서 연결해주시면 외부에서도 문제 없이 정상적으로 접근이 가능하게 되었습니다.

최소한의 보안을 위해서 여러분은 트랜스미션의 로그인 기능을 반드시 사용하시는 것이 좋겠습니다.

본래는 config 폴더 아래의 settings.json 파일을 수정해서 rpc 로그인 기능을 활성화해야 하지만, 위 설정파일로 작업하셨다면 아이디와 비밀번호를 이미 환경변수로 추가하셨을겁니다.

만약에 프록시한 주소로 트랜스미션에 한번에 접근이 되지 않는다면 포트 포워딩한 URL 뒤에 /transmission/rpc/ 를 한번 붙여보시길 바랍니다.

5. 트랜스미션 파일 다운로드 완료 시 done.sh 스크립트 실행

- TRANSMISSION_SCRIPT_TORRENT_DONE_ENABLED=true # 전송 환료후 sh 실행
- TRANSMISSION_SCRIPT_TORRENT_DONE_FILENAME=/config/transmission-home/done.sh # 전송 완료 sh 파일 경로 (사전에 경로 마운트 필요)
- TRANSMISSION_UMASK=0
- TRANSMISSION_BLOCKLIST_ENABLED=true # 토렌트 블랙리스트 적용
- TRANSMISSION_BLOCKLIST_URL=https://github.com/Naunter/BT_BlockLists/raw/master/bt_blocklists.gz

트랜스미션 전송 완료 후 동작하는 스크립트의 경우 간단하게 환경 변수로 예제가 나와있지 않아 종전처럼 직접 settings.json 을 수정해야하나 싶었습니다.

그러나 다행히도 별도로 위 예제처럼 환경변수를 지원하고 있었습니다.

트랜스 미션 전송 완료후 제거하거나 블랙리스트를 적용 하기 위해선 위처럼 환경변수(ENV)DONE_ENABLEDDONE_FILE 항목을 적용하시면 되겠습니다.

다운로드 완료 시 동작시킬 done.sh파일의 경우는 직접 작성이 필요합니다.

포테이너의 Stack으로 입력한 compose 내용상에서 volume 으로 추가해, 접근 가능한 경로로 마운트하셔야합니다.

저는 기본 트랜스미션 홈 폴더인 config 경로를 사용했습니다.

보통 DONE 쉘은 토렌트 다운로드 완료시 시딩을 중지하고 목록에서 삭제하는 등의 다음과 같은 동작을 하고 있습니다.

  1. 트랜스미션 다운로드 작업이 끝나면 시딩을 종료하고 자동으로 목록에서 삭제합니다.
  2. 텔레그램 메세지로 봇을 이용해 사용자에게 알립니다.
  3. Plex 미디어 서버 라이브러리를 새로고침합니다.

위와 같은 작업을 처리하고자 한다면, 아래처럼 done.sh을 작성해서 처리가 가능합니다.

#!/bin/sh
# telegram configuration"
SERVER="[트랜스미션_내부_IP]:[트랜스미션포트_예_39091] --auth [트랜스미션_아이디]:[트랜스미션_비밀번호]"
# telegram token
TOKEN='[텔레그램봇_토큰_abc:abcdefg_등의_포맷'
# telegram CHAT_ID
CHAT_ID="[텔레그램_챗_아이디]"
URL='https://api.telegram.org/bot'$TOKEN
MSG_URL=$URL'/sendMessage?chat_id='

sleep 1s

# torrent remove

TORRENTLIST=`transmission-remote $SERVER --list | sed -e '1d;$d;s/^ *//' | cut -s -d " " -f 1`
for TORRENTID in $TORRENTLIST

do
DL_COMPLETED=`transmission-remote $SERVER --torrent $TORRENTID --info | grep "Percent Done: 100%"`
STATE_STOPPED=`transmission-remote $SERVER --torrent $TORRENTID --info | grep "State: Seeding\|Stopped\|Finished\|Idle"`
if [ "$DL_COMPLETED" ] && [ "$STATE_STOPPED" ]; then
transmission-remote $SERVER --torrent $TORRENTID --remove

# telegram message send
curl --data-urlencode "text=$TR_TORRENT_NAME 파일의 토렌트 다운로드가 완료되었습니다." "$MSG_URL"$CHAT_ID"&"

# plex refresh Library
sleep 2m # 파일 후처리 시간을 고려해 2분 일시 정지
curl -H "X-Plex-Token:[플렉스_X_토튼]" "http://[플렉스_내부_IP]:32400/library/sections/1/refresh"

fi
done

스크립트의 경우 인터넷 상에서 쉽게 구할 수 있는 형태라 구조는 아마도 익숙하실겁니다.

위 사진처럼 트랜스미션 홈 폴더에 함께 done.sh을 위치시켰습니다.

다만 스크립트 파일은 파일은 실행 권한이 따로 필요하기 때문에 단순히 Copy해서는 사용할 수 없으니, 쉘에서 권한을 조정해 줄 필요가 있습니다.

포테이너에서 ssh로 바로 접근하기가 굉장히 쉬운데 컨테이너명 우측의 exec console을 실행해줍니다.

쉘은 기본 값인 /bin/bash로 두시고 그대로 아래의 Connect 버튼을 눌러 ssh로 접근합니다.

cd /config/transmission-home/

만약 저와 같이 config 경로에 스크립트를 두셨다면 위처럼 cd 명령어로 이동하겠습니다.

만약 별도로 마운트 하셨다면 마찬가지로 해당하는 폴더로 이동해줍니다.

chmod a+x done.sh

다음은 트랜스미션 완료 스크립트에 chmod 명령어로 실행 권한을 부여합니다.

마지막으로 ls -al 명령어로 제대로 적용되었는지 권한 확인이 가능합니다.

파일 좌측에 표시되는 문구에 실행 권한 인 x가 추가 되었는지 확인한다면 완료입니다.

6. VPN 적용 후 성능 테스트 및 후기

만약 내부 IP가 아닌 클라우드 플레어와 같은 서비스의 터널을 통해 도메인을 사용하시는 경우라면 내부 프록시 서버가 이미 있는 것이나 마찬가지입니다.

따로 VPN이 붙어있는 컨테이너라고 해서 별도의 설정이 필요하지 않습니다.

단순히 내부 아이피(또는 localhost) : 포트로 매핑만 하도록 하겠습니다.

이제 직접 로컬에서 IP 뒤호로 설정해둔 포트 번호만 뒤로 붙여서 트랜스미션에 접속해보겠습니다.

위 설정 파일을 수정해서 만드셨다면 미리 설정해둔 트랜스미션의 로그인 기능이 활성화 되셨을겁니다.

설정된 웹 UI 아이디와 비밀번호를 입력하면 로그인이 가능하실 겁니다.

로그인을 진행하면 메인화면으로 진입합니다.

만약 위처럼 테마를 설정하셨다면 설정하신 테마에 맞는 화면이 나타날겁니다.

Jackett등을 혹시 몰라 추가해 두었으나 간단하게 Radarr 를 통해 테스트를 진행하도록 하겠습니다.

먼저 설정에 다운로드 클라이언트로 새로 만든 VPN이 적용된 트랜스미션을 추가해주었습니다.

주력으로 토렌트가 아닌 유즈넷을 사용하고 있어 일단 잠시 유즈넷을 후순위로 밀어두고 토렌트를 우선하도록 수정해 테스트를 진행했습니다.

토렌트 사이트에서 토렌트 파일을 다운받는 장면을 넣을 순 없으니 사전에 설정해둔 다운로드 관리자인 Overseerr 를 이용하겠습니다.

이미 Radarr가 연동된 상태이기 때문에 Overseerr에서 적당한 영화를 하나 다운로드 요청합니다.

오래된 해외 영화 파일로 테스트를 진행해보니 속도가 무려 47.5Mb/s 정도가 나옵니다.

이 정도면 왠만한 파일들은 모두 안심해도 될 정도로 상당히 속도는 빠르다고 볼 수 있겠습니다.

혹시 US로 설정된 VPN 덕에 해외 자료만 빠른가 싶어서, 다음은 국내 자료를 테스트 하기 위해 마찬가지로 다운로드 관리자인 Tsharp 컨테이너를 이용해보겠습니다.

이번엔 유명 국내 예능 자료의 다운로드를 시도해보았습니다.

트랜스미션에 VPN이 적용되었음에도 대략 60 ~ 70Mb/s 정도로 굉장히 빠르게 다운로드가 진행됩니다.

역시나 유료 서비스인 NordVPN의 품질 덕분에 느려질까 무서워서, 감히 트랜스미션에 적용하지 못할 일은 없겠습니다.

앞으로 2년간 VPN을 통해 안전하게 트랜스미션의 사용이 가능한 환경이 구축이 모두 완료되었습니다.

우리의 안전을 위해!? VPN을 적용했으나 당연히 속도가 상당히 떨어질 것이란 예상을 했었습니다.

단순히 단독 컨테이너에 적용해서 그런지 몰라도 부족함 없는 훌륭한 속도를 보여주고 있습니다.

특이하게도 과거 와레즈와 유사한 원리로 동작하는 유즈넷 같은 경우 바로 체감이 될 정도로 속도가 반토막으로 떨어졌습니다.

주력으로 사용 중인 SABNzbd 같은 유즈넷 다운로더의 경우, 전송 속도가 눈에 띄게 떨어지는 것을 확인했습니다.

사용 중인 유즈넷 프로바이더인 뉴스데몬에서 해당 파일에만 문제일 수 있겠다 싶어 약 일주일간 모니터링을 진행했지만, 아쉽지만 여전히 동일 커넥션 수로 약 절반 정도의 속도 하락이 있습니다.

아쉽지만 보통 유즈넷 업체가 최대 50개 커넥션을 허용하니 커넥션 수를 좀 더 늘려주는 방향으로 완화는 가능했습니다.

그리고 아쉽게도 아직 VPN이 어떤 이유로든 끊어졌을때 컨테이너를 종료(킬) 하는 것은 문제 없이 잘 동작합니다.

그러나 다시 자동으로 트랜스미션을 재기동하는 대책이 없는 상황입니다.

별도로 OpenVPN을 재연결 하는 설정만 간단하게 처리가 되면 완벽할텐데 일단 당장은 정리가 되질 않고 있습니다.

Docker(도커) 컨테이너의 헬스체크와 자동 재시작, AutoHeal(오토힐) 적용 방법
안전한 토렌트 사용을 위해 NordVPN을 사용중으로 이쪽 계통에서는 사실상 올인원에 가까운 transmission-openvpn 컨테이너를 사용하고 있습니다.

관련해서 포럼들을 찾아보자면 크론탭부터 별별 꼼수들이 난무하고 있기 때문에 가장 무난한 방법을 찾아보고 있습니다.

우선 공식 가이드에는 AutoHeal(오토힐)을 추천하고 있었으며 사용 방법의 경우 위 포스트를 참고해보시길 바랍니다.

Transmission-OpenVPN 컨테이너의 편리한 설정, 다른 서비스들을 VPN과 함께 나누어 쓰는 방법!
VPN 관련 도커 프로젝트 중 transmission-openvpn 컨테이너는 OpenVPN 서버를 품고 있어 트랜스미션을 VPN 안에서 안전하게 이용할 수 있도록 도와주는 편리한 이미지입니다.

다음에는 각종 토렌트 자료를 인덱싱 해오는 Jackett 과 같은 VPN이 필요한 컨테이너들도 트랜스미션에 세팅해둔 OpenVPN 네트워크를 함께 한번의 로그인으로 사용하고 싶습니다.

도커의 네트워크로 연동해서 한꺼번에 여러 컨테이너에 VPN을 적용하는 방법에 대해 다루어 보겠습니다.

비정기로 발행되는 추천 포스트를 이메일로 받아 보실 수 있습니다.

특별한 추천 포스트를 바로 이메일로 받아보세요. 물론 무료입니다!
좋아요! 받은 편지함을 확인하고 구독을 확인하려면 링크를 클릭하십시오.
오류! 유효한 이메일 주소를 입력하십시오!