· 톺아보기

PC/모바일

홈 네트워크의 특정 인터넷 트래픽을 VPN을 통해 내보내기

RB20 ·

조회 24,162 · 공감 16 · 댓글 16

원래는 애플 TV로 한국에서 F1 중계를 쾌적하게 시청하기 위해 펐던 삽이었지만 이제 쿠팡플레이가 애플 TV에서도 되는 관계로 빛이 반쯤은 바란 강좌입니다.

 

목표

애플 TV에서 나오는 트래픽을 Wireguard VPN을 거쳐서 미국으로 보내고 싶다.

tvOS의 경우 정책상 VPN 연결을 허용하지 않아서, 미국 IP를 요구하는 F1 TV의 중계를 시청할 방법이 없습니다. 이를 해결하려면 라우터 단에서 트래픽의 경로를 조작해야 합니다.


준비물

- Dual WAN과 정책 기반 라우팅을 지원하는 라우터 (인터넷 공유기)

정책 기반 라우팅의 경우 목적지 IP의 지역, 목적지 도메인, 기타등등 여러가지가 있을 수 있겠으나 여기서는 단순히 출발지 IP에 따라 다른 WAN을 사용할 수 있는 정도면 충분합니다.


컨수머 레벨 Wi-Fi 공유기 중에 되는 것을 찾아보면,

1609169128874.png

(출처: SNB)

Asus의 경우 Merlin 펌웨어에서 Dual WAN을 지원하면 되는 것 같습니다.


4ca39114f11e9f.png

(출처: 클리앙 사용기)

Synology도 RT2600ac의 경우 지원하는 것 같습니다.


Screenshot 2023-05-01 at 4.31.14 PM.png

Unifi Network도 지원합니다.


- VPN 라우터 역할을 할, NIC (LAN 카드)가 두개 이상 달린 서버

라우터 OS용 VM을 생성해도 되고, Wi-Fi와 RJ-45 포트가 모두 있는 라즈베리 파이를 사용해도 됩니다 (테스트는 안 해봄).


라우터 OS 설치

여기서는 VyOS를 사용합니다.

VM 위에 설치하는 경우

1. NIC 두개를 각각 브릿지 모드로 VM에 할당합니다.

Screenshot 2023-05-01 at 4.42.26 PM.png

Screenshot 2023-05-01 at 4.42.37 PM.png

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 명령을 실행했을때 다음과 같은 텍스트를 볼 수 있습니다.

Screenshot 2023-05-01 at 5.08.58 PM.png

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에서 처리하도록 설정합니다.


IMG_0118 copy.jpg

기기에 따라 IP가 다르게 인식되는 것을 확인할 수 있습니다.

댓글 16

  1. 짐농 · · 공감 1
    삽으로 지하 15층까지 뚫으신 것 같습니다.ㄷㄷ
    스크랩 해뒀다가 써먹어야 겠네요. 감사합니다.
  2. 하늘목장 · · 공감 3
    강좌 잘봤습니다

    그런데 이 어려운걸..iPtime이 해냈더라구요…

    Iptime 공유기에
    Wireguard client 기능이 있습니다 (23.04.20 도입)
    여기에 WG 서버에 연결을 하고

    클라이언트 사용관리에서
    전체연결 혹은 특정연결(mac,ip등) 을 WG에 태워보낼수 있습니다

    오늘 써봤는데 기존 l2tp대비 속도 약 2배정도 나오더라구요 매우만족중입니다 ㅎㅎ
  3. Paper_7 ·
    @하늘목장님 혹시 어떤 모델 구입하셨는지 공유가능할까요?
  4. 하늘목장 ·
    @Paper_7님

    저는 A8004T-XR 이랑 A3004NS-M 쓰고 있습니다.

    https://iptime.com/iptime/?page_id=16&uid=25213&mod=document

    위 공지에 나온 14.20 펌웨어 받은 공유기들 모두 가능합니다

    다만 이게 4.21에 나온거라 버그가 좀 있네요
    근시일내로 크리티컬한건 다 잡히리라 봅니다
  5. RB20 · · 공감 1
    @하늘목장님 헐! 그렇군요. Unifi도 해당 기능이 추가됐지만 OpenVPN만 지원을 해서 삽을 뜬건데... ㅠㅠ
  6. 1398 · · 공감 1
    @하늘목장님
    본문글 감탄하면서 봤는데 아이피타임 펌웨어 지원이(특히 클라이언트별 설정) 더 감탄스럽내요.
  7. 소리탐정 · · 공감 1
    @하늘목장님 이걸로 아마존프라임으로 볼 수 있겠네요
    그럼 spotv보다 싸겠네요
  8. 백기사 ·
    asus 순정 펌웨어도 vpn fusion이라고 해서 특정 디바이스만 wireguard나 openvpn 태울 수 있습니다.
  9. 진짜메뚜기 ·
    asus 순정 롬도 dual wan 될 거에요 제품마다 다른가 보네요
    (저는 RT-AX3000 사용중인데 관련 메뉴를 본 것 같네요)
  10. 잇힝잇힝 ·
    @진짜메뚜기님 맞습니디. 같은 모델 사용 중인데 순장 펌에도 있습니다.
  11. JK7761 ·
    좋은 정보 감사합니다
  12. 없다고요우 ·
    와 이게 되네요 ㄷㄷㄷ
  13. yoonseungju ·
    간단하게 요약하면 ’서브넷 나눠서 루트 테이블에서 해당 서브넷 소속된 친구들은 vpn 인터페이스로 보냈다‘ 군요.


    vpn기능 지원하는 저렴한 공유기를 기존 공유기에 접속 하고 ap 모드로 내부망을 하나 더 만든 후에 거기에다 vpn 접속 설정하고 애플티비만 연결 시키면 dhcp까지 까지 자동으로 잡아주니 복잡한 설정없이도 비슷한 구성이 가능할 것 처럼 보이네요. (단, 공유기 두대의 서브넷은 겹치면 안되니 한대는 서브넷을 변경 할 수 있는 기능이 있으면 좋을 것 같습니다. )
  14. __ei ·
    해외에 살다보니
    도메인 기반으로 라우팅할 수 있는 기능이 필요했었습니다. 그런데 대부분 ip로만 라우팅 구성이 가능하더군요.
    그래서 이런저런 펌웨어 전전하다가 asus라우터용 토마토 펌웨어를 깔았던 기억이 나네요.

    토마토에 Openvpn클라이언트 세팅을 보면 도메인 기반으로 라우팅 옵션이 있습니다.
  15. yoonseungju ·
    @__ei님
    L7 은 L3 보다 기능상 더 복잡하기도 하고 성능부하가 크거든요. 기본적으로 레이턴시 손해도 많고 고부하시에 심각하게 느려지는 경우를 경험하실 수 있습니다.
  16. 민둔 ·
    저도 미국살아서 한국 VPN연결할 일이 많은데, Asus VPN Fusion 기능으로 특정 기기들만 한국VPN에 물려서 쓰고있습니다

팁과강좌 최근 글

팁과강좌 목록 더 보기