원래는 애플 TV로 한국에서 F1 중계를 쾌적하게 시청하기 위해 펐던 삽이었지만 이제 쿠팡플레이가 애플 TV에서도 되는 관계로 빛이 반쯤은 바란 강좌입니다.
목표
애플 TV에서 나오는 트래픽을 Wireguard VPN을 거쳐서 미국으로 보내고 싶다.
tvOS의 경우 정책상 VPN 연결을 허용하지 않아서,홈네트워크의특정인터넷트래픽을VPN을통해내보내기클리앙 미국 IP를 요구하는 F1 TV의 중계를 시청할 방법이 없습니다. 이를 해결하려면 라우터 단에서 트래픽의 경로를 조작해야 합니다.
준비물
- Dual WAN과 정책 기반 라우팅을 지원하는 라우터 (인터넷 공유기)
정책 기반 라우팅의 경우 목적지 IP의 지역, 목적지 도메인, 기타등등 여러가지가 있을 수 있겠으나 여기서는 단순히 출발지 IP에 따라 다른 WAN을 사용할 수 있는 정도면 충분합니다.
컨수머 레벨 Wi-Fi 공유기 중에 되는 것을 찾아보면,
(출처: SNB)
Asus의 경우 Merlin 펌웨어에서 Dual WAN을 지원하면 되는 것 같습니다.
(출처: 클리앙 사용기)
Synology도 RT2600ac의 경우 지원하는 것 같습니다.
Unifi Network도 지원합니다.
- VPN 라우터 역할을 할, NIC (LAN 카드)가 두개 이상 달린 서버
라우터 OS용 VM을 생성해도 되고, Wi-Fi와 RJ-45 포트가 모두 있는 라즈베리 파이를 사용해도 됩니다 (테스트는 안 해봄).
라우터 OS 설치
여기서는 VyOS를 사용합니다.
VM 위에 설치하는 경우
1. NIC 두개를 각각 브릿지 모드로 VM에 할당합니다.
2. VM에 VyOS를 설치합니다 (링크).
라즈베리 파이의 경우
이 Github 링크 를 참조하여 VyOS 이미지를 빌드 후에 설치합니다.
VPN 라우터 설정
VPN 라우터가 설치된 컴퓨터의 랜카드 중 한 쪽은 공유기의 LAN 포트와, 다른 한쪽은 WAN2 포트와 연결합니다. 이후 ifconfig 명령을 실행하여 각각의 랜카드에 부여된 장치명 (eth*) 을 확인합니다. 앞으로는 공유기의 WAN2 포트와 연결된 쪽을 eth0, LAN 포트와 연결된 쪽을 eth1이라고 하겠습니다.
라즈베리 파이의 경우
파이의 RJ-45 포트와 공유기의 WAN2 포트를 연결합니다.
이제 다음 명령어를 입력합니다.
configure# 기본 DNS 설정set system name-server '1.1.1.1'# VyOS의 SSH 접속 허용set service ssh port '22'# WAN 설정set interfaces ethernet eth0 description 'WAN'set interfaces ethernet eth0 address 'dhcp'# LAN 설정set interfaces ethernet eth1 address '10.200.0.1/24'set interfaces ethernet eth1 description 'LAN'# LAN NAT 설정set nat source rule 100 outbound-interface 'eth0'set nat source rule 100 source address '10.200.0.0/24'set nat source rule 100 translation address 'masquerade'# 인터넷 트래픽 방화벽 설정set firewall name OUTSIDE-IN default-action 'drop'set firewall name OUTSIDE-IN rule 10 action 'accept'set firewall name OUTSIDE-IN rule 10 state established 'enable'set firewall name OUTSIDE-IN rule 10 state related 'enable'set firewall name OUTSIDE-LOCAL default-action 'drop'set firewall name OUTSIDE-LOCAL rule 10 action 'accept'set firewall name OUTSIDE-LOCAL rule 10 state established 'enable'set firewall name OUTSIDE-LOCAL rule 10 state related 'enable'set firewall name OUTSIDE-LOCAL rule 20 action 'accept'set firewall name OUTSIDE-LOCAL rule 20 icmp type-name 'echo-request'set firewall name OUTSIDE-LOCAL rule 20 protocol 'icmp'set firewall name OUTSIDE-LOCAL rule 20 state new 'enable'# SSH 트래픽 방화벽 설정set firewall name OUTSIDE-LOCAL rule 30 action 'accept'set firewall name OUTSIDE-LOCAL rule 30 destination port '22'set firewall name OUTSIDE-LOCAL rule 30 protocol 'tcp'set firewall name OUTSIDE-LOCAL rule 30 state new 'enable'
# 설정한 방화벽 정책 적용set firewall interface eth0 in name 'OUTSIDE-IN'set firewall interface eth0 local name 'OUTSIDE-LOCAL'commitsaveexit
라즈베리 파이의 경우
- 위의 예시 중 eth0을 wlan0, eth1을 eth0으로 치환합니다.
- Wi-Fi에 연결하기 위해 위의 "WAN 설정" 에서 다음 명령을 추가합니다.
set interfaces wireless wlan0 type clientset interfaces wireless wlan0 address dhcpset interfaces wireless wlan0 ssid '<공유기 SSID명>'set interfaces wireless wlan0 security wpa2 passphrase '<공유기 비밀번호>'
모든 설정이 정상적으로 완료되었다면, ifconfig 명령을 실행했을때 eth0 (라즈베리 파이의 경우 wlan0) 인터페이스에는 홈 네트워크 대역의 IP 주소가, eth1 (라즈베리 파이의 경우 eth0) 에는 10.200.0.1 주소가 할당되어 있습니다.
VPN 라우터 OS에서 Wireguard 연결
다음 명령을 실행하여 VPN 라우터에서 Wireguard 터널을 생성합니다.
configureset interfaces wireguard wg1 address '<부여받은 터널 IP>'set interfaces wireguard wg1 description '<설명>'set interfaces wireguard wg1 peer '<적당한 이름>' address '<대상 WG 서버>'set interfaces wireguard wg1 peer '<적당한 이름>' port '51820'set interfaces wireguard wg1 peer '<적당한 이름>' allowed-ips '0.0.0.0/0'set interfaces wireguard wg1 peer '<적당한 이름>' public-key '<WG 서버의 공개키>'set interfaces wireguard wg1 port '51820'set interfaces wireguard wg1 private-key '<부여받은 개인키>'commitsaveexit
모든 설정이 정상적으로 완료되었다면, sudo wg 명령을 실행했을때 다음과 같은 텍스트를 볼 수 있습니다.
VPN 라우터의 모든 트래픽을 Wireguard로 보내도록 설정
다음 명령을 실행하여 VPN 라우터의 모든 LAN 트래픽을 WAN이 아닌 Wireguard 터널을 통하여 나가도록 설정합니다.
configure# Wireguard로 보낼 트래픽의 Route Table 생성, 모든 트래픽을 wg1 인터페이스에서 처리하도록 설정set protocols static table 100 route 0.0.0.0/0 interface wg1# Wireguard로 보낼 트래픽의 대상 Source Address Group 생성set firewall group address-group WG_Client address 10.200.0.0-10.200.0.255# Wireguard로 보낼 트래픽의 Policy Route 생성# eth1에서 들어오는 트래픽 중 Source가 WG_Client에 포함되는 경우 Routing Table 100 참조set policy route WG_Traffic interface 'eth1'set policy route WG_Traffic rule 10 source group address-group WG_Clientset policy route WG_Traffic rule 10 set table '100'# wg1 인터페이스의 NAT 설정set nat source rule 20 outbound-interface 'wg1'set nat source rule 20 source address '10.200.0.0/24'set nat source rule 20 translation address 'masquerade'# Wireguard 트래픽의 방화벽 설정set firewall name OUTSIDE-LOCAL rule 40 action 'accept'set firewall name OUTSIDE-LOCAL rule 40 description 'WireGuard_IN'set firewall name OUTSIDE-LOCAL rule 40 destination port '51820'set firewall name OUTSIDE-LOCAL rule 40 log 'enable'set firewall name OUTSIDE-LOCAL rule 40 protocol 'udp'set firewall name OUTSIDE-LOCAL rule 40 sourceset firewall name OUTSIDE-LOCAL rule 40 state established 'enable'set firewall name OUTSIDE-LOCAL rule 40 state related 'enable'commitsaveexit
라즈베리 파이의 경우
- 위의 예시 중 eth1을 eth0으로 치환합니다.
여기까지 모두 순조롭게 진행되었는지 확인할 수 있는 방법은 다음과 같습니다.
1. 공유기의 WAN2 포트에서 RJ-45 선을 뽑아서 아무 PC에 연결합니다.
2. PC에 10.200.0.0 대역의 IP가 할당되었는지 확인합니다.
3. PC에서 인터넷을 사용할 수 있는지 확인합니다.
4. PC의 공인 IP가 집의 IP가 아닌 VPN 서버의 IP로 인식되는지 확인합니다 (구글에 "what is my IP" 검색).
공유기 정책 라우팅 설정
위의 스크린 샷 혹은 구글 검색을 참고하여 특정 IP에서 출발하는 모든 트래픽을 WAN1이 아닌 WAN2에서 처리하도록 설정합니다.
기기에 따라 IP가 다르게 인식되는 것을 확인할 수 있습니다.