메인 항목으로

Apple TV (BTV) 설정

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

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

IPTV9.jpg

1. VLAN 생성

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

    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