EdgeRouter - EdgeRouter와 Cisco ISR 간의 IPsec 경로 기반 사이트 투 사이트 VPN

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

 Overview


이 문서는 EdgeRouter와 Cisco ISR 사이에서 고정 라우팅을 사용하여 경로 기반 사이트 투 사이트 IPsec VPN을 구성하는 방법에 대하여 서술합니다.

경로 기반 VPN은 가상 터널 인터페이스와 라우팅 엔트리의 사용에 따라서 특징지을 수 있습니다. 경로 기반 VPN과 달리 정책 기반 VPN은 로컬, 원격 서브넷 정의에 따라서 달라기재 됩니다. 이 문서의 예제는 고정 라우팅에 집중하며, OPSF를 터널에 사용하여 동적 라우팅 프로토콜을 사용할 수도 있습니다.

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

이 문서에서 사용한 장비:

- Cisco ISR

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

Table of Contents


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

네트워크 다이어그램


맨위로 가기

EdgeRouter와 Cisco ISR에서 사용하는 인터페이스와 네트워크 토폴로지 정보는 아래와 같습니다:

ER-X

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

 Cisco ISR

  1. gi0/0 (WAN) - 192.0.2.1
  2. gi0/1 (LAN) - 172.16.1.1/24
  3. tun0 - 10.255.12.2/30

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 환경설정을 수행하고 ISR 환경설정을 진행합니다.

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

  1. 환경설정 모드로 진입합니다.
configure
  1. 방화벽 룰 자동생성을 허용하고, NAT에서 발생한 IPsec 트래픽을 제외합니다.
set vpn ipsec auto-firewall-nat-exclude enable
  1. IKE 프로포절 (P1)과 보안 설정을 생성합니다.
set vpn ipsec ike-group FOO0 lifetime 86400
set vpn ipsec ike-group FOO0 proposal 1 dh-group 14
set vpn ipsec ike-group FOO0 proposal 1 encryption aes256
set vpn ipsec ike-group FOO0 proposal 1 hash sha256
  1. ESP 프로포절 (P2)과 보안 설정을 생성합니다.
set vpn ipsec esp-group FOO0 lifetime 43200
set vpn ipsec esp-group FOO0 pfs disable
set vpn ipsec esp-group FOO0 proposal 1 encryption aes128
set vpn ipsec esp-group FOO0 proposal 1 hash md5

info_i_25x25.png

Note

이 예제에서 보안 설정은 VPN 성능, 지속성, 보안을 극대화하기위해 선택하였습니다. IKE 프로포절은 보안 (AES256 + SHA256)에 주안점을 두고, ESP 프로포절은 성능 (AES128 + MD5)에 주안점을 두었습니다. 보안 설정으로 어떤 설정을 선택하던지, 단계 1 (P1)와 단계 2 (P2)는 양쪽 커넥션에 동일하게 설정해야 합니다.

5. 피어 주소와 미리 공유할 키를 정의합니다. (<secret>은 원하는 패스워드로 변경합니다.)

set vpn ipsec site-to-site peer 192.0.2.1 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer 192.0.2.1 authentication pre-shared-secret <secret>
set vpn ipsec site-to-site peer 192.0.2.1 description IPsec
  1. 사이트 투 사이트 VPN 커넥션의 로컬 소스 주소 (퍼블릭 IP)를 정의합니다.
set vpn ipsec site-to-site peer 192.0.2.1 local-address 203.0.113.1

info_i_25x25.png

Note

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

7. IKE 프로포절을 사이트 투 사이트 커넥션에 연결합니다.

set vpn ipsec site-to-site peer 192.0.2.1 ike-group FOO0
  1. 사이트 투 사이트를 VTI 인터페이스와 연결하고, ESP 프로포절과 연결합니다.
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)

10. VPN이 사용할 VTI를 생성하고 IP 주소를 부여합니다.

set interfaces vti vti0 address 10.255.12.1/30

info_i_25x25.png

Note

RFC1918 IP 주소를 터널 인터페이스에 사용하는 것을 강력히 권장합니다. IP주소는 라우터 어디에도 존재하지 않아야하며 라우팅 테이블에도 존재하지 않아야 합니다.

  1. (선택사항) VTI 인터페이스의 MTU 세팅 값을 낮춥니다.
set interfaces vti vti0 mtu 1400

info_i_25x25.png

Note

GRE 터널과 달리, VTI 인터페이스는 24 바이트의 추가 IPsec 오버헤드가 존재하지 않습니다. MTU는 자동으로 IPsec 오버헤드 만큼 낮추게 됩니다. 일부의 경우에는 커넥션 (HTTPS와 SSH와 같은)이 터널을 통해서 구성하다 실패할 수도 있습니다. 이러한 경우에는 터널의 MTU 값을 낮추는 것을 고려해볼 수 있습니다. 1400은 단편화를 막는 좋은 시작점이 될 수 있습니다. 구성 사례에 맞추어서 적절하게 값을 조정해야합니다.

  1. VTI를 포인팅하는 원격 서브넷을 위한 라우팅 엔트리를 생성합니다.
set protocols static interface-route 172.16.1.0/24 next-hop-interface vti0
  1. IPsec 터널을 제거합니다.
delete vpn ipsec site-to-site peer 192.0.2.1 tunnel 1
  1. IPsec 피어 설정을 VTI 인터페이스와 연결합니다.
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: Cisco ISR VPN


맨위로 가기

IOS의 최신 버전과 장비에 인터넷이 연결되어있음을 확인하십시오. Cisco의 사이트 투 사이트 VPN 커넥션은 다음 IPsec 문서를 기준으로 합니다. IPsec Virtual Tunnel Interfaces

CLI_circle.png  CLI STEPS: IOS의 커맨드라인 인터페이스에 접속합니다.

  1. 환경설정 모드로 진입합니다.
configure terminal

2. IKE 정책(ISAKMP)을 생성하고, EdgeRouter의 보안정책과 매칭합니다.

crypto isakmp policy 100
 encr aes 256
 hash sha256
 authentication pre-share
 group 14
 lifetime 86400

3. EdgeRouter의 보안정책과 맞는 IPsec 트랜스폼 셋을 생성합니다 (IPsec_TS)

crypto ipsec transform-set IPsec_TS esp-aes 128 esp-md5-hmac
  1. 피어 주소와 미리 공유할 키 값을 정의합니다. (<secret> 값을 원하는 값으로 정의합니다.)
crypto isakmp key <secret> address 203.0.113.1
  1. P2 시간 동안 IPsec 프로파일 (IPsec_PF)을 생성하고 IPsec 트랜스폼 셋과 연결합니다.
crypto ipsec profile IPsec_PF
 set transform-set IPsec_TS
 set security-association lifetime seconds 43200

6. 터널 인터페이스(tun)를 생성하고 IPsec 프로파일과 연결합니다. 시작지/목적지 주소를 터널 모드에 정의합니다.

interface tun0
 ip address 10.255.12.2 255.255.255.252
 tunnel source gi0/0
 tunnel destination 203.0.113.1
 tunnel protection ipsec profile IPsec_PF
 tunnel mode ipsec ipv4
  1. tun0 인터페이스의 MTU 값을 낮춥니다.
interface tun0
 ip mtu 1400
  1. 스타트업 환경설정에 변경내역을 작성합니다.
copy running-config startup-config

테스팅 및 검증


맨위로 가기

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. ER 외부 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. IPsec 보안 설정을 확인하고 ISR의 통계치를 확인합니다:

show crypto isakmp sa
IPv4 Crypto ISAKMP SA
dst             src             state          conn-id status
192.0.2.1       203.0.113.1     QM_IDLE           1002 ACTIVE

show crypto isakmp sa detail
IPv4 Crypto ISAKMP SA
C-id  Local           Remote          I-VRF  Status Encr Hash   Auth DH Lifetime Cap.
1002  192.0.2.1       203.0.113.1            ACTIVE aes  sha256 psk  14 23:58:38

show crypto engine connections active
Crypto Engine Connections
  ID  Type    Algorithm           Encrypt  Decrypt LastSeqN IP-Address
   5  IPsec   AES+MD5                   0        3        3 192.0.2.1
   6  IPsec   AES+MD5                   3        0        0 192.0.2.1
1002  IKE     SHA256+AES256             0        0        0 192.0.2.1

show crypto ipsec sa
interface: Tunnel0
   Crypto map tag: Tunnel0-head-0, local addr 192.0.2.1

  protected vrf: (none)
  local  ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0)
  remote ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0)
  current_peer 203.0.113.1 port 500
    PERMIT, flags={origin_is_acl,}
   #pkts encaps: 22, #pkts encrypt: 22, #pkts digest: 22
   #pkts decaps: 36, #pkts decrypt: 36, #pkts verify: 36
   #pkts compressed: 0, #pkts decompressed: 0
   #pkts not compressed: 0, #pkts compr. failed: 0
   #pkts not decompressed: 0, #pkts decompress failed: 0
   #send errors 0, #recv errors 0

    local crypto endpt.: 192.0.2.1, remote crypto endpt.: 203.0.113.1
    path mtu 1500, ip mtu 1500, ip mtu idb GigabitEthernet0/0
    current outbound spi: 0xCEFC9AFE(3472661246)
    PFS (Y/N): N, DH group: none

    inbound esp sas:
     spi: 0xF98EABDE(4186876894)
       transform: esp-aes esp-md5-hmac ,
       in use settings ={Tunnel, }
       conn id: 5, flow_id: SW:5, sibling_flags 80000040, crypto map: Tunnel0-head-0
       sa timing: remaining key lifetime (k/sec): (4370500/42967)
       IV size: 16 bytes
       replay detection support: Y
       Status: ACTIVE(ACTIVE)

    inbound ah sas:

    inbound pcp sas:

    outbound esp sas:
     spi: 0xCEFC9AFE(3472661246)
       transform: esp-aes esp-md5-hmac ,
       in use settings ={Tunnel, }
       conn id: 6, flow_id: SW:6, sibling_flags 80000040, crypto map: Tunnel0-head-0
       sa timing: remaining key lifetime (k/sec): (4370502/42967)
       IV size: 16 bytes
       replay detection support: Y
       Status: ACTIVE(ACTIVE)

    outbound ah sas:

    outbound pcp sas:

show crypto ipsec profile
IPSEC profile IPsec_PF
       Security association lifetime: 4608000 kilobytes/43200 seconds
       Responder-Only (Y/N): N
       PFS (Y/N): N
       Transform sets={
               IPsec_TS:  { esp-aes esp-md5-hmac  } ,
       }
  1. 터널의 ISR 상태를 검증합니다:
show ip interface tun0
Tunnel0 is up, line protocol is up
 Internet address is 10.255.12.2/30
 MTU is 1400 bytes
Post encapsulation features: IPSEC Post-encap output classification

show interfaces tun0
Tunnel0 is up, line protocol is up
 Internet address is 10.255.12.2/30
 Tunnel source 192.0.2.1 (GigabitEthernet0/0), destination 203.0.113.1
 Tunnel protocol/transport IPSEC/IP
 Tunnel protection via IPSec (profile "IPsec_PF")

8. ISR의 P1 negotiation을 콘솔에서 디버깅합니다:

debug crypto isakmp
ISAKMP (0): received packet from 203.0.113.1 dport 500 sport 500 Global (N) NEW SA
ISAKMP: Created a peer struct for 203.0.113.1, peer port 500
ISAKMP: local port 500, remote port 500
ISAKMP:(0):atts are acceptable. Next payload is 0
ISAKMP:(0): sending packet to 203.0.113.1 my_port 500 peer_port 500 (R) MM_SA_SETUP
ISAKMP (0): received packet from 203.0.113.1 dport 500 sport 500 Global (R) MM_SA_SETUP
ISAKMP:(1001): sending packet to 203.0.113.1 my_port 500 peer_port 500 (R) MM_KEY_EXCH
ISAKMP (1001): received packet from 203.0.113.1 dport 500 sport 500 Global (R) MM_KEY_EXCH
ISAKMP:(1001):SA authentication status: authenticated
ISAKMP:(1001):SA has been authenticated with 203.0.113.1
ISAKMP:(1001):Input = IKE_MESG_INTERNAL, IKE_PHASE1_COMPLETE
ISAKMP:(1001): processing ID payload. message ID = 561157166
ISAKMP:(1001):Node 561157166, Input = IKE_MESG_FROM_PEER, IKE_QM_EXCH
ISAKMP:(1001):Node 561157166, Input = IKE_MESG_INTERNAL, IKE_GOT_SPI
ISAKMP:(1001):Node 561157166, Input = IKE_MESG_FROM_IPSEC, IPSEC_INSTALL_DONE
ISAKMP (1001): received packet from 203.0.113.1 dport 500 sport 500 Global (R) QM_IDLE
ISAKMP:(1001):Node 561157166, Input = IKE_MESG_FROM_PEER, IKE_QM_EXCH
  1. Server1 과 Host1사이에 터널을 통해 트래픽을 전송해봅니다:
sudo traceroute -n 192.168.1.10
traceroute to 192.168.1.10 (192.168.1.10), 30 hops max, 60 byte packets
1  172.16.1.1 (172.16.1.1)  1.846 ms  1.824 ms  1.812 ms
2  10.255.12.1 (10.255.12.1)  49.158 ms  53.873 ms  55.646 ms
3  192.168.1.10 (192.168.1.10)  57.799 ms *  59.623 ms

sudo traceroute -n 172.16.1.10
traceroute to 172.16.1.10 (172.16.1.10), 30 hops max, 60 byte packets
1  192.168.1.1 (192.168.1.1)  1.726 ms  1.734 ms  1.712 ms
2  10.255.12.2 (10.255.12.2)  46.268 ms  48.562 ms  49.542 ms
3  172.16.1.10 (172.16.1.10)  56.236 ms *  55.567 ms

관련 문서


맨위로 가기