설치

[Torrent만 VPN 적용] haugene/transmission-openvpn 설치

본 장에서는 ExpressVPN을 이용한 방법으로 설명을 합니다. 설명이 부족한 부분은 아래 공식 홈페이지를 참고하세요.

공식홈페이지 : https://haugene.github.io/docker-transmission-openvpn/

Github : https://github.com/haugene/docker-transmission-openvpn

ExpressVPN이 아닌 다른 VPN을 이용하신다면 아래 링크를 참고하여 Yaml 문장을 수정해 주시면 됩니다.

  1. Supported Providers : https://haugene.github.io/docker-transmission-openvpn/supported-providers/
    environment의 OPENVPN_PROVIDER 변수에 사용하시는 "Provider Name"의 "Config Value (OPENVPN_PROVIDER)" 값을 찾아 입력하시면 됩니다.
  2. OpenVPN Config : https://github.com/haugene/vpn-configs-contrib
    1) openvpn 디렉토리로 이동합니다.
    2) 해당되는 VPN Provider 디렉토리로 이동합니다.
    3) environment의 OPENVPN_CONFIG 변수에 원하시는 지역의 config 파일명을 입력합니다. (.ovpn은 생략 후 파일명만 입력 합니다.)
  3. VPN 계정인증 : 각 VPN Provider마다 인증하는 방식이 다릅니다. VPN 제공사의 설명을 참고하세요.

먼저 볼륨을 Mapping할 디렉트로를 생성합니다. 이 디렉토리로 Torrent 파일을 올리고, 다운로드 경로가 설정 됩니다.

제 경우 "/volume2/Transmission" 이라는 디렉토리를 생성하고, 하위에 "config"와 "data" 디렉토리를 생성 합니다.

mkdir /volume2/Transmission
mkdir /volume2/Transmission/config
mkdir /volume2/Transmission/data

아래와 같이 "docker-compose.yml" 파일을 작성합니다.

version: '3.3'
services:
    transmission-openvpn:
        restart: always
        cap_add:
            - NET_ADMIN
        volumes:
            - '/volume2/Transmission/data/:/data' # incomplete, completed, torrentfile 디렉토리 볼륨입니다.
            - '/volume2/Transmission/config/:/config' # json, log와 같이 config 파일이 있는 볼륨입니다.
        environment:
            - OPENVPN_PROVIDER=EXPRESSVPN # 사용하시는 VPN Provider 입니다. 위 본문을 참고하세요.
            - OPENVPN_USERNAME=[설명1] # VPN Provider에서 요구하는 방식을 따르셔야 합니다.
            - OPENVPN_PASSWORD=[설명1] # VPN Provider에서 요구하는 방식을 따르셔야 합니다.
            - OPENVPN_CONFIG=my_expressvpn_south_korea_-_2_udp # 한국 서버를 예제로 합니다. .opvn은 생략하고 입력합니다.
            - OPENVPN_OPTS=--inactive 3600 --ping 10 --ping-exit 60 # 킬스위치 기능입니다.
            - LOCAL_NETWORK=192.168.1.0/24 # 사용하는 네트워크 대역대로 변경이 필요합니다. 예제는 192.168.1.*의 대역대를 가정했습니다.
            - CREATE_TUN_DEVICE=true
            - TZ=Asia/Seoul
            - HEALTH_CHECK_HOST=google.com
            - TRANSMISSION_WEB_UI=flood-for-transmission # 스킨 옵션 입니다. 가장 유명한 flood-for-transmission 스킨을 예제로 합니다.
            - PUID=1026 #ssh에서 'id 계정명'으로 맞는 값을 찾아 입력
            - PGID=100 #ssh에서 'id 계정명'으로 맞는 값을 찾아 입력
            - TRANSMISSION_WATCH_DIR_ENABLED=true
            - TRANSMISSION_WATCH_DIR=/data/torrentfile # 이 위치에 .torrent 파일을 넣으면 자동으로 다운로드가 시작되고 원본 파일은 .added로 변경 됩니다.
            # 아래는 보안 옵션 입니다. Nginx Proxy Manager 접속 인증 같은 별도 접속 인증을 사용하신다면 생략을 권장 드립니다.
            # 이유는 잦은 인증과정에서 브라우저 쿠키에 문제가 생겨 가끔 브라우저의 쿠키 초기화가 필요하기 때문입니다.
            #- TRANSMISSION_RPC_AUTHENTICATION_REQUIRED=true
            #- TRANSMISSION_RPC_USERNAME=webgui_id
            #- TRANSMISSION_RPC_PASSWORD=webgui_pw
            #- TRANSMISSION_RPC_HOST_WHITELIST="127.0.0.1,192.168.1.*"
        logging:
            driver: json-file
            options:
                max-size: 10m
        ports:
            - '9091:9091'
        image: haugene/transmission-openvpn

만일 VPN Provider가 mullvad 일때는 아래를 yaml에 추가해 줍니다.

        sysctls:
            - "net.ipv6.conf.all.disable_ipv6=0"

[주의] 다운로드 디렉토리는 위 예제와 같이 "/data" 하나만 볼륨으로 맵핑하셔야 합니다. "/data" 볼륨하나만 맵핑해도 아래의 3개의 하위 디렉토리가 자동으로 생성됩니다. 만일 "completed"와 "incomplete"를 따로 볼륨으로 맵핑하신다면, 다운로드 완료 시 "incomplete"에서 "completed"로 이동과정이 copy (완료 후 소스 delete)로 동작되고, copy 과정에서 transmission 랙이 발생 됩니다.
data_dir.jpg

[설명1] ExpressVPN 계정코드

OPENVPN_USERNAME : ExpressVPN 사용자명
OPENVPN_PASSWORD : ExpressVPN 비밀번호

이 값은 ExpressVPN 아래와 같이 확인 할 수 있습니다.

ex_vpn1.png

ex_vpn2.png

ex_vpn3.png

[설명2] LOCAL_NETWORK : 사용하시는 네트워크 대역대를 입력 합니다. 여러개 일 경우 "," 여러개를 지정할 수 있습니다.

예제 : "192.168.1.0/24" (CIDR 값을 사용해야 합니다.)

Docker를 실행 합니다.

docker-compose up -d

Transmission이 사용하는 IP가 정상적으로 VPN을 통한 IP인지 확인하기 위해 도커쉘에 접속해 아래 명령을 입력합니다.

curl ifconfig.me

설치를 마치면 "/volume1/Transmission/data" 디렉토리가 아래와 같이 구성 됐음을 확인 할 수 있습니다.

"completed" : 다운로드가 끝난 파일이 옮겨지는 디렉토리 입니다.
"incomplete" : 다운로드가 진행 중인 파일이 있는 디렉토리 입니다.
"torrentfile" : Transmission이 Watch 중인 디렉토리로 ".torrent" 파일을 이 디렉토리로 위치 시 바로 다운로드가 시작 됩니다.

data_dir.jpg

다운로드 후 목록에서 자동 삭제하고 텔레그램 봇으로 다운로드 완료 상태를 안내하기 위해 작성한 스크립트로 다른장에서 별도 설명 드리겠습니다.

설치가 완료되면 "IP:9091"로 접속 합니다.

trans_gui.png

보안 옵션 미적용시 관리 페이지의 외부 노출이 걱정될 경우 Nginx Proxy Manager의 Proxy Host를 통해

"Access List"에 인증정보를 넣어 접속시에 2차 인증 절차를 추가하실 수 있습니다.

wetty_auth.png

[NAS 전체 VPN 적용] 시놀로지 NAS VPN 적용 방법

VPN 설정

시놀로지 NAS기준 ExpressVPN을 가정한 방법을 설명 합니다.

1. DSM에 접속해 "제어판 > 네트워크 > 네트워크 인터페이스"로 들어가 "생성"을 누릅니다.

NAS_VPN1.jpg

2. "VPN 프로파일 생성"을 선택하고 OpenVPN 항목을 선택 합니다.

NAS_VPN2.jpg

3.아래와 같이 값을 입력하고 .ovpen에 VPN 제공사에서 다운받은 원하시는 지역의 .opvn 파일을 업로드 합니다.

NAS_VPN3.jpg

4. 아래와 같이 고급 설정 값을 선택해 줍니다.

NAS_VPN4.jpg

5. "제어판 > 네트워크 > 네트워크 인터페이스"에 들어가보면 아래와 같이 VPN  프로파일이 생성됐음을 확인할 수 있으며 상단의 "연결"을 클릭합니다.

NAS_VPN5.jpg

자동 재연결 설정

이제 킬스위치 (VPN이 끊어질 시 자동 재연결)을 설정할 차례 입니다.

아래 내용으로 "killswitch.sh" 파일을 생성하고, DSM의 작업스케줄러에서 "생성", "예약된 작업", "사용자 정의 스크립트"로 들어가서 아래의 "bash /경로값/killswitch.sh"를 입력해 줍니다. (주기는 5분 주기로 설정해 줍니다.)

#-------------------------------------------------------------------------------
#  네트워크 작동 여부 확인
#-------------------------------------------------------------------------------
ping -c 1 8.8.8.8
if [ "$?" == "0" ] ; then
  echo "네트워크가 정상 작동중입니다." >> log.txt
else
  echo "네트워크가 정상 작동하지 않습니다. VPN 재연결을 시도합니다." >> log.txt
  if [[ -f /usr/syno/etc/synovpnclient/l2tp/l2tpclient.conf ]]; then
L2TP_CONFIG=$(cat /usr/syno/etc/synovpnclient/l2tp/l2tpclient.conf)
else
L2TP_CONFIG=""
fi

if [[ -f /usr/syno/etc/synovpnclient/openvpn/ovpnclient.conf ]]; then
OPENVPN_CONFIG=$(cat /usr/syno/etc/synovpnclient/openvpn/ovpnclient.conf)
else
OPENVPN_CONFIG=""
fi

if [[ -f /usr/syno/etc/synovpnclient/pptp/pptpclient.conf ]]; then
PPTP_CONFIG=$(cat /usr/syno/etc/synovpnclient/pptp/pptpclient.conf)
else
PPTP_CONFIG=""
fi

#-------------------------------------------------------------------------------
#  설정 파일 확인
#-------------------------------------------------------------------------------

# 설정 파일 연결
CONFIGS_ALL="$L2TP_CONFIG $OPENVPN_CONFIG $PPTP_CONFIG"

# VPN 프로필 개수 확인
CONFIGS_QTY=$(echo "$CONFIGS_ALL" | grep -e '\[l' -e '\[o' -e '\[p' | wc -l)

# VPN 프로필이 하나일 때만 작동하도록 하기
if [[ $CONFIGS_QTY -eq 1 ]]; then
echo "[I] 1개의 VPN 프로필이 있음. 계속 진행..."
elif [[ $CONFIGS_QTY -gt 1 ]]; then
echo "[E] $CONFIGS_QTY 개의 VPN 프로필이 있음. 이 스크립트는 1개의 VPN 프로필까지만 지원이 가능함. 종료..."
exit 1
else
echo "[W] VPN 프로필이 존재하지 않음. VPN 프로필 생성 필요. 종료..."
exit 1
fi

#-------------------------------------------------------------------------------
#  변수 설정
#-------------------------------------------------------------------------------

PROFILE_ID=$(echo $CONFIGS_ALL | cut -d "[" -f2 | cut -d "]" -f1)
PROFILE_NAME=$(echo "$CONFIGS_ALL" | grep -oP "conf_name=+\K\w+")
PROFILE_RECONNECT=$(echo "$CONFIGS_ALL" | grep -oP "reconnect=+\K\w+")

if [[ $(echo "$CONFIGS_ALL" | grep '\[l') ]]; then
PROFILE_PROTOCOL="l2tp"
elif [[ $(echo "$CONFIGS_ALL" | grep '\[o') ]]; then
PROFILE_PROTOCOL="openvpn"
elif [[ $(echo "$CONFIGS_ALL" | grep '\[p') ]]; then
PROFILE_PROTOCOL="pptp"
fi
/usr/syno/bin/synovpnc kill_client
sleep 20
echo conf_id=$PROFILE_ID > /usr/syno/etc/synovpnclient/vpnc_connecting
echo conf_name=$PROFILE_NAME >> /usr/syno/etc/synovpnclient/vpnc_connecting
echo proto=$PROFILE_PROTOCOL >> /usr/syno/etc/synovpnclient/vpnc_connecting
/usr/syno/bin/synovpnc connect --id=$PROFILE_ID
sleep 20

#-------------------------------------------------------------------------------
#  VPN 연결 여부 다시 확인
#-------------------------------------------------------------------------------

if [[ $(/usr/syno/bin/synovpnc get_conn | grep Uptime) ]]; then
echo "[I] VPN이 성공적으로 재접속됨. 종료..." >> log.txt
exit 1
else
echo "[E] VPN 재접속에 실패. 종료..." >> log.txt
exit 1
fi
sleep 20
echo conf_id=$PROFILE_ID > /usr/syno/etc/synovpnclient/vpnc_connecting
echo conf_name=$PROFILE_NAME >> /usr/syno/etc/synovpnclient/vpnc_connecting
echo proto=$PROFILE_PROTOCOL >> /usr/syno/etc/synovpnclient/vpnc_connecting
/usr/syno/bin/synovpnc connect --id=$PROFILE_ID
sleep 20
fi

외부 DSM 접속 허용

VPN 외부에서 DSM에 접속하기 위해서는 아래와 같이 다중게이트웨이 설정이 필요합니다.

1. DSM에 접속해 "제어판 > 네트워크 > 일반"으로 들어가 "고급설정"을 선택 합니다.

NAS_VPN6.jpg

2. "다중 게이트웨이 활성화"를 체크 합니다.

NAS_VPN7.jpg

3. NAS의 IPv4를 DHCP가 아닌 수동으로 IP를 설정해 줍니다. 예를 들어 제 경우 "192.168.1.200"으로 설정했습니다.

NAS_VPN8.jpg

4. "제어판 > 네트워크 > 일반"에서 기본 게이트웨이 옆 "편집"을 눌러줍니다.

NAS_VPN9.jpg

5. "서비스 순서"를 보면 사용하는 네트워크와 VPN네트워크가 보입니다. 순서를 조정해 VPN네트워크가 상단해 위치하게 조정합니다. 반드시 상단에 있어야 VPN 뒤에 실제 사용 네트워크를 위치시킬 수 있습니다.