원래는 애플 TV로 한국에서 F1 중계를 쾌적하게 시청하기 위해 펐던 삽이었지만 이제 쿠팡플레이가 애플 TV에서도 되는 관계로 빛이 반쯤은 바란 강좌입니다.
목표
애플 TV에서 나오는 트래픽을 Wireguard VPN을 거쳐서 미국으로 보내고 싶다.
tvOS의 경우 정책상 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' commit save exit
라즈베리 파이의 경우
- 위의 예시 중 eth0을 wlan0, eth1을 eth0으로 치환합니다.
- Wi-Fi에 연결하기 위해 위의 "WAN 설정" 에서 다음 명령을 추가합니다.
set interfaces wireless wlan0 type client set interfaces wireless wlan0 address dhcp set 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 터널을 생성합니다.
configure
set 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 '<부여받은 개인키>'
commit
save
exit
모든 설정이 정상적으로 완료되었다면, 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_Client
set 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 source
set firewall name OUTSIDE-LOCAL rule 40 state established 'enable'
set firewall name OUTSIDE-LOCAL rule 40 state related 'enable'
commit
save
exit
라즈베리 파이의 경우
- 위의 예시 중 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가 다르게 인식되는 것을 확인할 수 있습니다.
스크랩 해뒀다가 써먹어야 겠네요. 감사합니다.
그런데 이 어려운걸..iPtime이 해냈더라구요…
Iptime 공유기에
Wireguard client 기능이 있습니다 (23.04.20 도입)
여기에 WG 서버에 연결을 하고
클라이언트 사용관리에서
전체연결 혹은 특정연결(mac,ip등) 을 WG에 태워보낼수 있습니다
오늘 써봤는데 기존 l2tp대비 속도 약 2배정도 나오더라구요 매우만족중입니다 ㅎㅎ
저는 A8004T-XR 이랑 A3004NS-M 쓰고 있습니다.
https://iptime.com/iptime/?page_id=16&uid=25213&mod=document
위 공지에 나온 14.20 펌웨어 받은 공유기들 모두 가능합니다
다만 이게 4.21에 나온거라 버그가 좀 있네요
근시일내로 크리티컬한건 다 잡히리라 봅니다
본문글 감탄하면서 봤는데 아이피타임 펌웨어 지원이(특히 클라이언트별 설정) 더 감탄스럽내요.
그럼 spotv보다 싸겠네요
(저는 RT-AX3000 사용중인데 관련 메뉴를 본 것 같네요)
vpn기능 지원하는 저렴한 공유기를 기존 공유기에 접속 하고 ap 모드로 내부망을 하나 더 만든 후에 거기에다 vpn 접속 설정하고 애플티비만 연결 시키면 dhcp까지 까지 자동으로 잡아주니 복잡한 설정없이도 비슷한 구성이 가능할 것 처럼 보이네요. (단, 공유기 두대의 서브넷은 겹치면 안되니 한대는 서브넷을 변경 할 수 있는 기능이 있으면 좋을 것 같습니다. )
도메인 기반으로 라우팅할 수 있는 기능이 필요했었습니다. 그런데 대부분 ip로만 라우팅 구성이 가능하더군요.
그래서 이런저런 펌웨어 전전하다가 asus라우터용 토마토 펌웨어를 깔았던 기억이 나네요.
토마토에 Openvpn클라이언트 세팅을 보면 도메인 기반으로 라우팅 옵션이 있습니다.
L7 은 L3 보다 기능상 더 복잡하기도 하고 성능부하가 크거든요. 기본적으로 레이턴시 손해도 많고 고부하시에 심각하게 느려지는 경우를 경험하실 수 있습니다.