메인 항목으로

Apple TV (BTV) 설정

Unifi OS 8.x로 오면서 igmpproxy라는 옵션이 제공 됩니다. 기본적으로 igmpproxy을 활성화하면 IPTV 시청이 가능해지나 현재 기능이 잘 동작하지 않아 TV는 나오지만 지속적으로 끊어지는 문제가 발생 됩니다. (채널 변경 시 5분마다 멈춤)

이런 문제점 때문에 일단 이 기능을 비활성화하고, igmpproxy 데몬을 이용한 방법을 설명합니다.

IPTV9.jpg

1. VLAN 생성

  • "Network > 설정 > 네트워크"에서 "새로운 가상 네트워크"를 누릅니다. 네트워크 이름을 지정하고 사용할 IP 대역 정보를 넣어줍니다. 밑부분 IGMP Snooping, 멀티테스크 DNS는 체크해 줍니다.

    IPTV1.jpg

2. 멀티캐스트 DNS 및 IGMP Snooping 설정 확인

  • VLAN ID (5)에 IPTV가 생성 됐음을 확인하고, 아래와 같이 설정을 합니다.

    IPTV2.jpg


3. 방화벽 규칙 설정 #1 (IPTV Mulicast 허용)

"네트워크 > 보안 > 방화벽 규칙"으로 이동하여 항목 만들기를 눌러줍니다.

  • 유형 : 인너넷 인
  • 이름 : Allow IPTV Mulicast
  • 작업 : 수락
  • 프로토콜 : TCP 및 UDP
  • 소스 : "주소그룹" 옆 신규를 누른 후  프로필 이름을 "BTV"로 넣고 IPv4 주소.서브넷에 "192.168.0.0/16"를 넣고 만들기를 눌러줍니다. "주소그룹"에서 BTV를 선택 합니다.
  • 목적지 : "주소그룹" 옆 신규를 누른 후  프로필 이름을 "IGMP"로 넣고 IPv4 주소.서브넷에 "224.0.0.0/4"를 넣고 만들기를 눌러줍니다. "주소그룹"에서 IGMP를 선택 합니다.
  • 고급 : 일치상태는 전부 체크하고, IPSec은 "일치하지 않음"을 선택 후 "규칙 추가"를 눌러 줍니다.

    IPTV3.jpg

4. 방화벽 규칙 설정 #2 (IGMP Traffic 허용)

다시 "네트워크 > 보안 > 방화벽 규칙"으로 이동하여 항목 만들기를 눌러줍니다.

  • 유형 : 인터넷 로컬
  • 이름 : Allow IGMP Traffic
  • 작업 : 수락
  • 프로토콜 : "사전 정의 이전" 체크를 풀고, IGMP를 선택해 줍니다.
  • 소스 : 아무것도 건들지 않음
  • 목적지 : 아무것도 건들지 않음
  • 고급 : 일치상태는 전부 체크하고, IPSec은 "일치하지 않음"을 선택 후 "규칙 추가"를 눌러 줍니다.

    IPTV8.jpg


5. igmpproxy 데몬 설치

UDM Pro에 ssh 접속을 해야 합니다. ssh 접속은 UniFi OS의 "Console Settings"에서 Advanced에 있는 SSH를 체크 후 비밀번호를 생성해 주면 접속할 수 있습니다.



1) 터미널 프로그램에서 호스트 192.168.1.1 (포트는 기본 22), id는 root, password는 위에서 입력한 값을 넣어 ssh 접속을 합니다.
2) igmpproxy를 설치해 줍니다.

cd /mnt
mkdir data
mkdir data/igmpproxy
cd /mnt/data/igmpproxy
curl -Lo igmpproxy https://raw.githubusercontent.com/peacey/udm-telus/main/igmpproxy
curl -Lo igmpproxy.conf https://raw.githubusercontent.com/peacey/udm-telus/main/igmpproxy.conf
chmod +x igmpproxy

3) 먼저 각 포트별 값 확인을 위해 아래 명령을 실행 합니다.

ifconfig
  • 여기서 brXX가 VLAN 식별자이고, ethXX는 LAN돠 WAN 포트 번호 입니다.
  • upstream과 downstream 포트를 찾아야 하는데 합니다.
  • upstream의 경우 RJ45 WAN이면 eh8이고 SFP WAN이면 eh9 입니다.
  • downstream의 경우 brXX 쪽에서 부여하신 IP 범위 값으로 해당 포트 값을 찾아 줍니다. 제 경우 192.168.33.1 이므로 br5가 해당 포트임을 확인 할 수 있습니다.

4) igmpproxy.conf를 수정해 줍니다. (손쉬운 수정을 위해 nano를 sudo apt install nano 명령어로 설치해 줍니다. 설치된 nano는 재부팅하면 자동 삭제 되며, 일회성으로만 사용 가능합니다.)

nano /mnt/data/igmpproxy/igmpproxy.conf
  • nano를 설치하지 않을 시 vi로 수정하시면 됩니다. (사용 방법은 생략)
  • upstream 부분을 eh8로 수정 합니다.
  • downstream 부분을 br5로 수정합니다.
  • 작성 후 ctrl + x를 눌러 빠져나와 y를 눌러 저장해 줍니다.
  •  nano를 사용하지 않고 기본 vi를 사용할 경우  "vi /mnt/data/igmpproxy/igmpproxy.conf" 실행 후 ESC를 눌러 명령 모드로 진입 > i를 눌러 수정 모드에서 내용을 수정 후 다시 ESC를 누른 후 :wq로 저장 후 종료하시면 됩니다. 
  • 작성된 예제는 아래와 같습니다.
quickleave

# upstream = modem interface
phyint eth8 upstream ratelimit 0 threshold 1
        altnet 0.0.0.0/0;

# lan interface of iptv device
phyint br5 downstream ratelimit 0 threshold 1
        altnet 0.0.0.0/0;

# disable all unused interfaces
phyint lo disabled
phyint eth9 disabled
  • 작성한 문장이 잘 동작되는지 확인 합니다. 정상 작동을 확인하고 Ctrl + c로 종료 합니다.
./igmpproxy -ndv ./igmpproxy.conf

6. igmpproxy 데몬 실행 

./igmpproxy ./igmpproxy.conf
  • 데몬을 중지 시키는 방법은 아래와 같습니다.
    1) ps aux로 igmp.conf의 PID 값을 확인 합니다. (PID 값을 알고 있다면 ps aux | grep PID로 확인)
    2) kill -9 PID로 중지시킵니다. (-9는 즉시 중지 옵션입니다.)  

7. Apple TV 네트워크 VLAN 설정

  • "Network > 포트"에서 Apple TV를 찾아 들어갑니다.

IPTV6.jpg

  • 기본 VLAN/네트워크를 IPTV로 변경해 줍니다.

    IPTV7.jpg

  • Apple TV를 재기동하면 IPTV VLAN에서 DHCP IP를 받아 옵니다.

8. 자동 시작 스크립트

UDM Pro를 재부팅 시 igmproxy 자동 시작 스트립트는 아래와 같습니다.

먼저 UDM Boot Script를 설치해야 합니다. (https://github.com/unifi-utilities/unifios-utilities)

1. 1.6.3 이상

curl -fsL "https://raw.githubusercontent.com/unifi-utilities/unifios-utilities/HEAD/on-boot-script/remote_install.sh" | /bin/sh

2. 2.4.x 이상

curl -fsL "https://raw.githubusercontent.com/unifi-utilities/unifios-utilities/HEAD/on-boot-script-2.x/remote_install.sh" | /bin/bash

설치를 하고 "/data/on_boot.d"로 이동 후 자동시작 스크립트를 작성하시면 됩니다.

cd /data/on_boot.d
curl -Lo 99-run-igmpproxy.sh https://raw.githubusercontent.com/peacey/udm-telus/main/run-igmpproxy.sh 
chmod +x 99-run-igmpproxy.sh

auto_start.jpg

UnifiOS가 4.x로 올라가면서 더이상 위에 기술된 자동시작 스크립트가 동작하지 않습니다.

어쩔수 없이 다른 서버에서 Unifi의 상태값을 체크해 igmpproxy가 시행되지 않았을 시 시작시켜주는 스크립트를 작성하였습니다.

1. 가정

  1. Unifi 게이트웨이
    1) IP : 192.168.1.1
    2) ID : root
    3) PW : pass@me
  2. 명령을 내릴 서버
    1) IP : 192.168.10.200
    2) ID : myadmin
    3) PW : pass@me

2. "192.168.10.200"에서 "192.168.1.1"로 ssh명령을 내리기 위해서는 ssh 키생성 및 복제가 필요합니다. "192.168.10.200"에 공개 ssh 키를 생성합니다.

ssh-keygen -t rsa -b 2048

제 경우 ssh 키 생성 시 그냥 엔터를 눌러 공개키를 생성 했습니다.

이제 이 공개 키 값을 복사해야 합니다.

cat ~/.ssh/id_rsa.pub

화면에 나오는 값을 복사해 줍니다.

이제 원격지에 복사된 ssh 키 값을 복사해줄 차례입니다.

ssh root@192.168.1.1

"root"는 예제이며 사용하는 ID를 넣고 접속하시고, "~/.ssh"로 이동합니다.

cd ~/.ssh

해당 디렉토리가 없을 경우 아래와 같이 생성해 주시면 됩니다.

mkdir -p ~/.ssh
chmod 700 ~/.ssh

이제 공개 키를 추가해 줍니다.

echo "복사한 공개 키" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

위 단계를 거치면 "192.168.10.200"에서 "192.168.1.1"로 비밀번호 없이 ssh 접속이 가능해 집니다.

"192.168.10.200" 서버에 아래 sh 스크립트를 만들고 저장해 줍니다.

#!/bin/bash

UNIFI_SERVER="192.168.1.1"
UNIFI_USER="root"

CHECK_PROCESS_CMD="sudo ps aux | grep 'igmpproxy.conf' | grep -v grep"
START_PROCESS_CMD="sudo nohup /mnt/data/igmpproxy/igmpproxy /mnt/data/igmpproxy/igmpproxy.conf &"

ssh ${UNIFI_USER}@${UNIFI_SERVER} << EOF

if ${CHECK_PROCESS_CMD}; then
  echo "igmpproxy.conf 프로세스가 이미 실행 중입니다. 명령을 스킵합니다."
else
  echo "igmpproxy.conf 프로세스가 실행되지 않았습니다. 실행합니다."
  ${START_PROCESS_CMD}
fi
EOF

제 경우 시놀로지와 UnRAID에서 이 스크립트를 자동 스케줄러로 등록해 실행해 주었습니다.

1. igmpproxy가 이미 실행되고 있을때

igmp1.jpg

2. igmpproxy가 실행되고 있지 않을때

igmp2.jpg

ps aux로 실행한 결과 입니다. 잘 실행되고 있습니다.

igmp3.jpg