EdgeRouter - EdgeRouter와 USG 사이에서 IPsec 경로기반 (VTI) 사이트 투 사이트 VPN 구성하기

download at 2017-08-30T17:43:02Z origin

 Overview


이 문서는 EdgeRouter와 고정 라우팅을 사용한 UniFi 보안 게이트웨이 (USG) 를 사용하여 경로 기반 사이트 투 사이트 IPsec VPN을 구성하는 방법에 대하여 서술합니다.

경로 기반 VPN은 가상 터널 인터페이스와 라우팅 엔트리의 사용에 따라 특징 지을 수 있습니다. 이에 반해 정책 기반 VPN은 로컬, 원격지 서브넷의 정의에 따라서 타입이 달라지게 됩니다. 이 문서에서는 고정 라우팅을 사용하지만, 터널에 OSPF를 사용하는 등의 동적 라우팅 프로토콜도 사용이 가능합니다.

book_25x25.png NOTES & REQUIREMENTS: EdgeOS 1.9.7 이상의 펌웨어가 설치된 모든 EdgeRouter 모델에서 적용 가능합니다. 커맨드라인 인터페이스와 UniFi 컨트롤러, 기본 네트워킹에 대한 지식이 요구됩니다. 해당 주제에 대한 내용은 관련 문서 섹션의 문서를 확인하시기 바랍니다.

이 문서에서 사용한 장비:

UniFi 보안 게이트웨이 (USG)

  • 피어의 테스트 클라이언트 (Host1 and Server1)

Table of Contents


  1. 네트워크 다이어그램
  2. Steps: 경로 기반 VPN
  3. Steps: USG VPN
  4. Steps: 테스팅 및 검증
  5. 관련 문서

네트워크 다이어그램


맨위로 가기

네트워크 토폴로지는 아래와 같으며, EdgeRouter와 USG에서 사용한 인터페이스는 다음과 같습니다:

ER-X

  1. eth0 (WAN) - 203.0.113.1
  2. eth1 (LAN) - 192.168.1.1/24
  3. vti0 -

 USG

  1. gi0/0 (WAN) - 192.0.2.1
  2. gi0/1 (LAN) - 172.16.1.1/24
  3. vti64 -

image1.png


Steps: 경로 기반 VPN


맨위로 가기

라우팅과 인터페이스 설정은 이미 완료했으며, 서로 통신이 가능하다고 가정합니다.

IPsec과 관련있는 UDP 포트와 프로토콜은 다음과 같습니다:

  1. UDP 500 (IKE)
  2. ESP (프로토콜 50)
  3. UDP 4500 (NAT-T)

VPN 타입은 IPsec 터널의 고정 VTI(IPIP 캡슐화)로 명명합니다. 패킷이 VTI 인터페이스 (vti0)를 통해서 라우팅 되고, IPsec에 의하여 암호화 됨을 의미합니다. 고정 갸ㅕㅇ로는 사이트 사이에서 라우팅 기능을 가속하기 위해 사용합니다.

ER 환경설정을 수행하고 USG VPN 환경설정을 진행합니다.

www.png  GUI STEPS: 라우터의 웹 관리 포탈(GUI)로 접속합니다.

1. IPsec 피어와 ER 보안 설정을 정의합니다. (<secret>을 원하는 비밀번호로 변경합니다.)

VPN > IPsec Site-to-Site > +Add Peer

  • 고급 옵션 보기
  • NAT에서 방화벽을 자동으로 열고, 제외하기
Peer: 192.0.2.1
Description: IPsec
Local IP: 203.0.113.1 (needs to be the local public IP address, not any)
Encryption: AES-256
Hash: SHA1
DH Group: 14
Pre-shared Secret: <secret>
Local subnet: 192.168.1.0/24 (does not matter because it will be removed later)
Remote subnet: 172.16.1.0/24 (does not matter because it will be removed later)

info_i_25x25.png

Note

경로 기반 VTI 구성은 현제 동적 피어 주소와 동적 DNS를 사용한 전체 주소 도메인 네임 (FQDN)을 지원하지 않습니다. VTI 종단은 이미 알고 있는 IP로의 연결이 필요합니다. local-address any, peer 0.0.0.0와 같은 주소는 동작하지 않습니다.

image4

CLI_circle.png CLI STEPS: 커맨드라인 인터페이스에 접속합니다. GUI의 CLI 버튼을 사용하거나 PuTTY와 같은 프로그램을 사용합니다.

  1. 환경설정 모드로 진입합니다.
configure
  1. IPsec VPN 피어 환경설정을 확인합니다. (관련된 결과만 아래에 표시하였습니다.)
show vpn
ipsec {
   site-to-site {
       peer 192.0.2.1 {
           local-address 203.0.113.1
           tunnel 1 {
               esp-group FOO0
               local {
                   prefix 192.168.1.0/24
               }
               remote {
                   prefix 172.16.0.0/22
               }
           }
...
  1. IPsec 터널을 제거합니다.
delete vpn ipsec site-to-site peer 192.0.2.1 tunnel 1
  1. VPN이 사용할 VTI를 생성합니다. (이 인터페이스는 IP 주소를 정의할 필요가 없습니다.)
set interfaces vti vti0

info_i_25x25.png

Note

GRE 터널과 달리, VTI 인터페이스는 24 바이트의 추가 IPsec 오버헤드가 존재하지 않습니다. MTU는 자동으로 IPsec 오버헤드 만큼 낮추게 됩니다. 이 MTU 값을 set interfaces vti vti0 mtu <mtu-value>명령어를 사용하여 조정 할 수 있습니다.

  1. VTI로 향할 원격 서브넷 라우팅 엔트리를 생성합니다.
set protocols static interface-route 172.16.1.0/24 next-hop-interface vti0
  1. 이전에 생성한 VTI 인터페이스와 IPsec 피어 설정을 연결합니다.
set vpn ipsec site-to-site peer 192.0.2.1 vti bind vti0
set vpn ipsec site-to-site peer 192.0.2.1 vti esp-group FOO0
  1. (선택사항) IPsec 오프로딩 기능을 활성화하여 ESP 성능을 향상합니다.
set system offload ipsec enable (this requires a reboot to become active)
  1. 변경사항을 커밋합니다.
commit
  1. 환경설정을 저장합니다.
save

Steps: USG VPN


맨위로 가기

가장 최신 버전의 UniFi를 사용하고, 장치가 인터넷에 접근 가능하도록 확인하십시오.

www.png  GUI STEPS: UniFi 컨트롤러 웹 관리 포털에 접속합니다.

1. USG에 퍼블릭 IP를 부여합니다.

Devices > USG > Configuration > WAN
Connection Type: Static IP
IP address: 192.0.2.1
Preferred DNS: 192.0.2.2
Subnet Mask: 255.255.255.252
Router: 192.0.2.2

image6

  1. LAN 네트워크를 수정하거나 기본 설정대로 진행합니다. (시나리오에 따라서 다릅니다.)
Settings > Networks > LAN > edit
Name: LAN
Purpose: Corporate
Parent Interface: LAN
Gateway/Subnet: 172.16.1.1/24
DHCP Server: Enable
DHCP Range: 172.16.1.10 - 172.16.1.150

image7

3. IPsec에서 사용할 새로운 네트워크를 생성합니다. (<secret>을 원하는 패스워드로 변경합니다.)

  • 고급 옵션 보기
  • Dynamic Routing 체크하기
  • Perfect Forward Secrecy (PFS) 체크하기
Settings > Networks > + Create New Network
Name: IPsec
Purpose: Site-to-Site VPN
VPN Type: IPsec VPN
Enabled: Enable this Site-to-Site VPN
Remote Subnets: 192.168.1.0/24
Peer IP: 203.0.113.1
Local WAN IP: 192.0.2.1
Pre-Shared Key: <secret>
IPsec Profile: Customized

Advanced Options
Key Exchange Version: IKEv1
Encryption: AES-256
HASH: SHA1
DH Group: 14
PFS: Enable Perfect Forward Secrecy
Dynamic Routing: Enabled (check)

image8


테스팅 및 검증


맨위로 가기

IPsec VPN을 설정하고, 커넥션/상태를 다음 명령어를 통해서 검증합니다.

  1. IPsec 보안 설정과 ER 상태를 검증합니다:
show vpn ipsec sa
peer-192.0.2.1-tunnel-vti: #4, ESTABLISHED, IKEv1, 24d45792c4976ca4:f4b8de413b632a7c
 local  '203.0.113.1' @ 203.0.113.1
 remote '192.0.2.1' @ 192.0.2.1
 AES_CBC-256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
 established 13s ago, reauth in 85578s
 peer-192.0.2.1-tunnel-vti: #1, INSTALLED, TUNNEL, ESP:AES_CBC-128/HMAC_MD5_96
   installed 13 ago, rekeying in 42249s, expires in 43187s
   in  cf09bc59,    500 bytes,     5 packets,     5s ago
   out 769b07da,    500 bytes,     5 packets,     5s ago
   local  0.0.0.0/0
   remote 0.0.0.0/0

sudo ipsec statusall
Status of IKE charon daemon (strongSwan 5.2.2, Linux 3.10.14-UBNT, mips):
 uptime: 22 minutes, since Mar 12 09:34:36 2017
 malloc: sbrk 376832, mmap 0, used 272632, free 104200
 worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 8
Listening IP addresses:
 203.0.113.1
 192.168.1.1
 10.255.12.1
Connections:
peer-192.0.2.1-tunnel-vti:  203.0.113.1...192.0.2.1  IKEv1
peer-192.0.2.1-tunnel-vti:   local:  [203.0.113.1] uses pre-shared key authentication
peer-192.0.2.1-tunnel-vti:   remote: [192.0.2.1] uses pre-shared key authentication
peer-192.0.2.1-tunnel-vti:   child:  0.0.0.0/0 === 0.0.0.0/0 TUNNEL
Routed Connections:
peer-192.0.2.1-tunnel-vti{1}:  ROUTED, TUNNEL
peer-192.0.2.1-tunnel-vti{1}:   0.0.0.0/0 === 0.0.0.0/0
Security Associations (1 up, 0 connecting):
peer-192.0.2.1-tunnel-vti[4]: ESTABLISHED 74 seconds ago, 203.0.113.1[203.0.113.1]...192.0.2.1[192.0.2.1]
peer-192.0.2.1-tunnel-vti[4]: IKEv1 SPIs: 24d45792c4976ca4_i f4b8de413b632a7c_r*, pre-shared key reauthentication in 23 hours
peer-192.0.2.1-tunnel-vti[4]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
peer-192.0.2.1-tunnel-vti{1}:  INSTALLED, TUNNEL, ESP SPIs: cf09bc59_i 769b07da_o
peer-192.0.2.1-tunnel-vti{1}:  AES_CBC_128/HMAC_MD5_96, 500 bytes_i (5 pkts, 66s ago), 500 bytes_o (5 pkts, 66s ago)
peer-192.0.2.1-tunnel-vti{1}:   0.0.0.0/0 === 0.0.0.0/0

2. ER IPsec strongSwan 설정을 확인합니다:

sudo cat /etc/ipsec.conf
# generated by /opt/vyatta/sbin/vpn-config.pl

config setup

conn %default
       keyexchange=ikev1

conn peer-192.0.2.1-tunnel-vti
       left=203.0.113.1
       right=192.0.2.1
       leftsubnet=0.0.0.0/0
       rightsubnet=0.0.0.0/0
       ike=aes256-sha256-modp2048!
       keyexchange=ikev1
       ikelifetime=86400s
       esp=aes128-md5!
       keylife=43200s
       rekeymargin=540s
       type=tunnel
       compress=no
       authby=secret
       mark=9437185
       auto=route
       keyingtries=%forever
#conn peer-192.0.2.1-tunnel-vti

3. 외부 WAN 인터페이스를 통해서 입력되는 IKE 트래픽을 캡쳐합니다:

sudo tcpdump -i eth0 -n udp dst port 500
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 203.0.113.1.500 > 192.0.2.1.500: isakmp: phase 1 I ident
IP 192.0.2.1.500 > 203.0.113.1.500: isakmp: phase 1 R ident
IP 203.0.113.1.500 > 192.0.2.1.500: isakmp: phase 1 I ident[E]
IP 192.0.2.1.500 > 203.0.113.1.500: isakmp: phase 1 R ident[E]
IP 203.0.113.1.500 > 192.0.2.1.500: isakmp: phase 2/others I oakley-quick[E]
IP 192.0.2.1.500 > 203.0.113.1.500: isakmp: phase 2/others R oakley-quick[E]

info_i_25x25.png

Note

실시간 캡쳐의 결과이므로 아무런 결과가 보이지 않는다면 클라이언트에서 트래픽을 생성하지 못하거나, 트래픽 업스트림이 차단되었을 수도 있습니다.

4. ER IPsec VPN 로그를 확인합니다:

sudo swanctl --log
[IKE] initiating Main Mode IKE_SA peer-192.0.2.1-tunnel-1[1] to 192.0.2.1
[ENC] generating ID_PROT request 0 [ SA V V V V ]
[NET] sending packet: from 203.0.113.1[500] to 192.0.2.1[500] (160 bytes)
[NET] received packet: from 192.0.2.1[500] to 203.0.113.1[500] (108 bytes)
[ENC] parsed ID_PROT response 0 [ SA V ]
[IKE] received NAT-T (RFC 3947) vendor ID
[ENC] generating ID_PROT request 0 [ KE No NAT-D NAT-D ]
[ENC] parsed ID_PROT response 0 [ KE No V V V V NAT-D NAT-D ]
[ENC] generating ID_PROT request 0 [ ID HASH N(INITIAL_CONTACT) ]
[ENC] parsed ID_PROT response 0 [ ID HASH ]
[IKE] IKE_SA peer-192.0.2.1-tunnel-1[1] established between 203.0.113.1[203.0.113.1]...192.0.2.1[192.0.2.1]
[ENC] generating QUICK_MODE request 561157166 [ HASH SA No ID ID ]
[ENC] parsed QUICK_MODE response 561157166 [ HASH SA No ID ID N((24576)) ]
[IKE] CHILD_SA peer-192.0.2.1-tunnel-vti{1} established with SPIs cad56e88_i 86968a35_o and TS 0.0.0.0/0 === 0.0.0.0/0

info_i_25x25.png

Note

실시간 캡쳐 결과이므로 출력이 보이지 않는다면, 트래픽이 방화벽을 통해서 허용되었는지 확인하십시오. 다른 방법으로는 show vpn log | no-more명령어를 통해서 전체 IPsec 로그 히스토리를 확인할 수 있습니다.

5. 터널을 통해서 전송된 트래픽을 캡쳐해보고, 터널의 ER 상태를 확인합니다:

show interfaces vti vti0
vti0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN group default
   link/ipip 203.0.113.1 peer 192.0.2.1
   inet 10.255.12.1/30 scope global vti0
      valid_lft forever preferred_lft forever

   RX:  bytes    packets     errors    dropped    overrun      mcast
         1600         19          0          0          0          0
   TX:  bytes    packets     errors    dropped    carrier collisions
         1332         14          0          0          0          0

show interfaces vti vti0 capture
IP 172.16.1.10 > 192.168.1.10: ICMP echo request, id 12993, seq 18, length 64
IP 192.168.1.10 > 172.16.1.10: ICMP echo reply, id 12993, seq 18, length 64
IP 172.16.1.10 > 192.168.1.10: ICMP echo request, id 12993, seq 19, length 64
IP 192.168.1.10 > 172.16.1.10: ICMP echo reply, id 12993, seq 19, length 64

6. Server1과 Host1 사이에서 터널을 통해 트래픽을 주고 받아봅니다:

ping 192.168.1.10
PING 192.168.1.10 (192.168.1.10) 56(84) bytes of data.
64 bytes from 192.168.1.10: icmp_seq=1 ttl=63 time=45.9 ms
64 bytes from 192.168.1.10: icmp_seq=2 ttl=63 time=45.2 ms
64 bytes from 192.168.1.10: icmp_seq=3 ttl=63 time=45.5 ms

ping 172.16.1.10
PING 172.16.1.10 (172.16.1.10) 56(84) bytes of data.
64 bytes from 172.16.1.10: icmp_seq=1 ttl=63 time=43.9 ms
64 bytes from 172.16.1.10: icmp_seq=2 ttl=63 time=44.1 ms
64 bytes from 172.16.1.10: icmp_seq=3 ttl=63 time=44.4 ms

관련 문서


맨위로 가기