EdgeRouter - EdgeRouter와 Cisco ASA 사이의 IPsec 정책 기반 사이트 투 사이트 VPN 구성하기¶
download at 2017-08-30T17:42:11Z origin
Overview
이 문서는 EdgeRouter와 Cisco ASA 사이에서의 정책 기반 사이트 투 사이트 IPsec VPN 을 구성하는 방법에 대하여 서술합니다.
정책 기반 VPN 은 로컬, 원격지 서브넷 정의에 따라서 특징지을 수 있습니다. 정책 기반 VPN 타입과 달리 경로 기반 VPN은 가상 터널 인터페이스 (VTI)와 라우팅 엔트리 사용도에 따라서 특징 지을 수 있습니다.
NOTES & REQUIREMENTS: EdgeOS 1.9.7 이상의 펌웨어가 설치된 모든 EdgeRouter 모델에서 적용 가능합니다. 커맨드라인 인터페이스와 Cisco ASA, 상급 네트워킹에 대한 지식이 요구됩니다. 해당 주제에 대한 내용은 관련 문서 섹션의 문서를 확인하시기 바랍니다.
이 문서에서 사용한 장비:
- Cisco ASA
- 피어의 테스트 클라이언트 (Host1 and Server1)
Table of Contents
네트워크 다이어그램
EdgeRouter와 Cisco ASA에서 사용하는 인터페이스와 네트워크 토폴로지 정보는 아래와 같습니다:
ER-X
- eth0 (WAN) - 203.0.113.1
- eth1 (LAN) - 192.168.1.1/24
Cisco ASA
- gi0/0 (WAN) - 192.0.2.1
- gi0/1 (LAN) - 172.16.1.1/24
Steps: 정책 기반 VPN
라우팅과 인터페이스 설정은 이미 완료했으며, 서로 통신이 가능하다고 가정합니다.
IPsec과 관련있는 UDP 포트와 프로토콜은 다음과 같습니다:
- UDP 500 (IKE)
- ESP (프로토콜 50)
- UDP 4500 (NAT-T)
생성할 VPN 타입은 정책 기반 VPN이며, 원격지, 로컬 서브넷을 사용하며 해당 서브넷 정보가 없으면 프록시 ID를 사용합니다. 이 값들은 정확하게 두 피어간에 일치해야하며, 서로 동일한 내용을 가지고 있어야합니다. 터널을 통해서 미리 정해진 프록시 ID에서 전송 가능합니다. ER 예제에서는 192.168.1.0/24 가 LAN에서 존재하며, Cisco에서는 172.16.1.0/24를 사용합니다.
ER 환경설정을 수행하고 ASA 환경설정을 진행합니다.
CLI STEPS: 커맨드라인 인터페이스에 접속합니다. GUI의 CLI 버튼을 사용하거나 PuTTY와 같은 프로그램을 사용합니다.
- 환경설정 모드로 진입합니다.
configure
- 방화벽 룰 자동생성을 허용하고, NAT에서 발생한 IPsec 트래픽을 제외합니다.
set vpn ipsec auto-firewall-nat-exclude enable
- 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
- 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
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
- 사이트 투 사이트 VPN 커넥션의 로컬 소스 주소 (퍼블릭 IP)를 정의합니다.
set vpn ipsec site-to-site peer 192.0.2.1 local-address 203.0.113.1
Note
고정되지 않은 IP 주소를 WAN 커넥션에서 사용할 수도 있습니다. DHCP의 경우에는 set ... peer 192.0.2.1 dhcp-interface eth0 명령어를 사용합니다. PPPoE 인터페이스와 로드밸런싱에서는 set ... peer 192.0.2.1 local-address 0.0.0.0 와 local-address any 명령어 사용을 권장합니다.
7. IKE 프로포절을 사이트 투 사이트 커넥션에 연결합니다.
set vpn ipsec site-to-site peer 192.0.2.1 ike-group FOO0
- 터널을 생성하여 원격지와 로컬 서브넷을 정의하고, ESP 프로포절과 연결합니다.
set vpn ipsec site-to-site peer 192.0.2.1 tunnel 1 esp-group FOO0
set vpn ipsec site-to-site peer 192.0.2.1 tunnel 1 local prefix 192.168.1.0/24
set vpn ipsec site-to-site peer 192.0.2.1 tunnel 1 remote prefix 172.16.1.0/24
- (선택사항) IPsec 오프로딩 기능을 활성화 하여 ESP 성능을 향상시킵니다.
set system offload ipsec enable (this requires a reboot to become active)
- 변경사항을 커밋합니다.
commit
- 환경설정을 저장합니다.
save
Steps: Cisco ASA VPN
Cisco Adaptive Security Appliance (ASA)의 최신 버전과 장비에 인터넷이 연결되어있음을 확인하십시오. Cisco의 사이트 투 사이트 VPN 커넥션은 다음 IPsec 문서를 기준으로 합니다. Configure a Site-to-Site IPSec IKEv1 Tunnel
CLI STEPS: IOS의 커맨드라인 인터페이스에 접속합니다.
- 환경설정 모드로 진입합니다.
configure terminal
2. 인터페이스 이름을 정의하고 보안 수준과 라우팅을 설정합니다.
interface gi0/0
nameif outside
security-level 0
ip address 192.0.2.1 255.255.255.252
interface gi0/1
nameif inside
security-level 100
ip address 172.16.1.1 255.255.255.0
route outside 0.0.0.0 0.0.0.0 192.0.2.2
3. 네트워크 객체를 설정하여 원격지, 로컬 서브넷과 일치하도록 합니다.
object network obj-local
subnet 172.16.1.0 255.255.255.0
object network obj-remote
subnet 192.168.1.0 255.255.255.0
4. IPsec 접근 리스트(IPsec_ACL)를 생성하여 네트워크 객체와 연결합니다.
access-list IPsec_ACL extended permit ip object obj-local object obj-remote
- EdgeRouter의 보안 설정과 IKE 정책을 맞추어 생성합니다.
crypto ikev1 policy 100
authentication pre-share
encryption aes-256
hash sha
group 5
lifetime 86400
- EdgeRouter의 보안 설정과 일치하도는 IPsec 트랜스폼 셋(IPsec_TS)를 생성합니다.
crypto ipsec ikev1 transform-set IPsec_TS esp-aes esp-md5-hmac
- 크립토 맵 (IPsec_CM)을 생성하고 IPsec TS, ACL을 P2 기간동안 연결합니다.
crypto map IPsec_CM 100 set peer 203.0.113.1
crypto map IPsec_CM 100 set ikev1 transform-set IPsec_TS
crypto map IPsec_CM 100 set security-association lifetime seconds 43200
crypto map IPsec_CM 100 match address IPsec_ACL
crypto map IPsec_CM interface outside
- 터널 그룹과 미리 공유할 키를 생성합니다. (<secret>을 원하는 비밀번호로 변경합니다.)
tunnel-group 203.0.113.1 type ipsec-l2l
tunnel-group 203.0.113.1 ipsec-attributes
ikev1 pre-shared-key <secret>
- IKE 프로세스를 활성화 합니다.
crypto ikev1 enable outside
- (선택사항) 소스 NAT를 사용한다면, NAT의 변환된 주소에서 발생한 IPsec 트래픽을 제외하는 것을 잊지 마십시오.
nat (inside,outside) source static obj-local obj-local destination static obj-remote obj-remote no-proxy-arp route-lookup
nat (inside,outside) source dynamic obj-local interface
Note
source dynamic 룰은 NAT 설정의 일부분입니다. 이 설정은 환경에 따라서 다를 수 있습니다. NAT 룰을 ASA에 추가할 때에는 적용 순서에 주의하십시오.
소스 NAT가 IPsec 제외 룰보다 뒤에 설정되었기 떄문에 이 룰은 올바른 순서라고 할 수 있습니다. 다음을 확인하십시오:
show nat translated interface outside detail
Manual NAT Policies (Section 1)
1 (inside) to (outside) source static obj-local obj-local destination static obj-remote obj-remote no-proxy-arp route-lookup
translate_hits = 10, untranslate_hits = 10
Source - Origin: 172.16.1.0/24, Translated: 172.16.1.0/24
Destination - Origin: 192.168.1.0/24, Translated: 192.168.1.0/24
2 (inside) to (outside) source dynamic obj-local interface
translate_hits = 28, untranslate_hits = 25
Source - Origin: 172.16.1.0/24, Translated: 192.0.2.1/30
NAT 룰 순서가 틀리다면, 다른 NAT 룰을 삭제하고 다시 추가합니다:
show running-config nat
nat (inside,outside) source dynamic obj-local interface
nat (inside,outside) source static obj-local obj-local destination static obj-remote obj-remote no-proxy-arp route-lookup
no nat (inside,outside) source dynamic obj-local interface
nat (inside,outside) source dynamic obj-local interface
11. 변경사항을 스타트업 환경설정에 작성합니다.
copy running-config startup-config
Steps: 테스팅 및 검증
IPsec VPN을 설정하고 난 이후에는 커넥션/상태를 다음 명령어를 통해서 검증할 수 있습니다.
- IPsec 보안 옵션을 검증하고 ER의 상태를 확인합니다:
show vpn ipsec sa
peer-192.0.2.1-tunnel-1: #1, ESTABLISHED, IKEv1, 184447c009d51f80:14cc0f13aff401c0
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 237s ago, reauth in 85347s
peer-192.0.2.1-tunnel-1: #1, INSTALLED, TUNNEL, ESP:AES_CBC-128/HMAC_MD5_96
installed 237 ago, rekeying in 41939s, expires in 42964s
in cb321982, 180 bytes, 3 packets, 231s ago
out 5d4174b1, 180 bytes, 3 packets, 231s ago
local 192.168.1.0/24
remote 172.16.1.0/24
sudo ipsec statusall
Status of IKE charon daemon (strongSwan 5.2.2, Linux 3.10.14-UBNT, mips):
uptime: 10 minutes, since Mar 12 09:05:48 2017
malloc: sbrk 376832, mmap 0, used 269320, free 107512
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 2
Listening IP addresses:
203.0.113.1
192.168.1.1
Connections:
peer-192.0.2.1-tunnel-1: 203.0.113.1...192.0.2.1 IKEv1
peer-192.0.2.1-tunnel-1: local: [203.0.113.1] uses pre-shared key authentication
peer-192.0.2.1-tunnel-1: remote: [192.0.2.1] uses pre-shared key authentication
peer-192.0.2.1-tunnel-1: child: 192.168.1.0/24 === 172.16.1.0/24 TUNNEL
Routed Connections:
peer-192.0.2.1-tunnel-1{1}: ROUTED, TUNNEL
peer-192.0.2.1-tunnel-1{1}: 192.168.1.0/24 === 172.16.1.0/24
Security Associations (1 up, 0 connecting):
peer-192.0.2.1-tunnel-1[1]: ESTABLISHED 5 minutes ago, 203.0.113.1[203.0.113.1]...192.0.2.1[192.0.2.1]
peer-192.0.2.1-tunnel-1[1]: IKEv1 SPIs: 184447c009d51f80_i* 14cc0f13aff401c0_r, pre-shared key reauthentication in 23 hours
peer-192.0.2.1-tunnel-1[1]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
peer-192.0.2.1-tunnel-1{1}: INSTALLED, TUNNEL, ESP SPIs: cb321982_i 5d4174b1_o
peer-192.0.2.1-tunnel-1{1}: AES_CBC_128/HMAC_MD5_96, 180 bytes_i (3 pkts, 324s ago), 180 bytes_o (3 pkts, 324s ago)
peer-192.0.2.1-tunnel-1{1}: 192.168.1.0/24 === 172.16.1.0/24
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-1
left=203.0.113.1
right=192.0.2.1
leftsubnet=192.168.1.0/24
rightsubnet=172.16.1.0/24
ike=aes256-sha256-modp2048!
keyexchange=ikev1
ikelifetime=86400s
esp=aes128-md5!
keylife=43200s
rekeymargin=540s
type=tunnel
compress=no
authby=secret
auto=route
keyingtries=%forever
#conn peer-192.0.2.1-tunnel-1
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]
Note
실시간 캡쳐의 결과이므로 아무런 결과가 발견되지 않는다면 클라이언트가 트래픽을 생성하지 않거나 트래픽 업스트림이 차단당한 것일수도 있습니다.
4. ER IPsec VPN 로그를 확인합니다:
sudo swanctl --log
[KNL] creating acquire job for policy 192.168.1.10/32[icmp/8] === 172.16.1.10/32[icmp/8] with reqid {1}
[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-1{1} established with SPIs cb321982_i 5d4174b1_o and TS 192.168.1.0/24 === 172.16.1.0/24
Note
실시간 캡쳐 결과이므로 출력이 보이지 않는다면, 트래픽이 방화벽을 통해서 허용되었는지 확인하십시오. 다른 방법으로는 show vpn log | no-more명령어를 통해서 전체 IPsec 로그 히스토리를 확인할 수 있습니다.
5. IPsec 보안 설정을 확인하고 ASA의 통계치를 확인합니다:
show crypto ikev1 sa
IKEv1 SAs:
Active SA: 1
Rekey SA: 0 (A tunnel will report 1 Active and 1 Rekey SA during rekey)
Total IKE SA: 1
1 IKE Peer: 203.0.113.1
Type : L2L Role : initiator
Rekey : no State : MM_ACTIVE
show crypto ikev1 sa detail
IKEv1 SAs:
Active SA: 1
Rekey SA: 0 (A tunnel will report 1 Active and 1 Rekey SA during rekey)
Total IKE SA: 1
1 IKE Peer: 203.0.113.1
Type : L2L Role : initiator
Rekey : no State : MM_ACTIVE
Encrypt : aes-256 Hash : SHA
Auth : preshared Lifetime: 86400
Lifetime Remaining: 86067
show vpn-sessiondb detail l2l
Session Type: LAN-to-LAN Detailed
Connection : 203.0.113.1
Index : 2 IP Addr : 203.0.113.1
Protocol : IKEv1 IPsec
Encryption : IKEv1: (1)AES256 IPsec: (1)AES128
Hashing : IKEv1: (1)SHA1 IPsec: (1)MD5
Bytes Tx : 336 Bytes Rx : 336
Login Time : 01:26:31 UTC Tue Jul 18 2017
Duration : 0h:08m:36s
IKEv1 Tunnels: 1
IPsec Tunnels: 1
IKEv1:
Tunnel ID : 2.1
UDP Src Port : 500 UDP Dst Port : 500
IKE Neg Mode : Main Auth Mode : preSharedKeys
Encryption : AES256 Hashing : SHA1
Rekey Int (T): 86400 Seconds Rekey Left(T): 85884 Seconds
D/H Group : 5
Filter Name :
IPsec:
Tunnel ID : 2.2
Local Addr : 172.16.1.0/255.255.255.0/0/0
Remote Addr : 192.168.1.0/255.255.255.0/0/0
Encryption : AES128 Hashing : MD5
Encapsulation: Tunnel
Rekey Int (T): 43200 Seconds Rekey Left(T): 42684 Seconds
Rekey Int (D): 4608000 K-Bytes Rekey Left(D): 4608000 K-Bytes
Idle Time Out: 30 Minutes Idle TO Left : 21 Minutes
Bytes Tx : 336 Bytes Rx : 336
Pkts Tx : 4 Pkts Rx : 4
show crypto ipsec sa detail
interface: outside
Crypto map tag: IPsec_CM, seq num: 100, local addr: 192.0.2.1
access-list IPsec_ACL extended permit ip 172.16.1.0 255.255.255.0 192.168.1.0 255.255.255.0
local ident (addr/mask/prot/port): (172.16.1.0/255.255.255.0/0/0)
remote ident (addr/mask/prot/port): (192.168.1.0/255.255.255.0/0/0)
current_peer: 203.0.113.1
#pkts encaps: 4, #pkts encrypt: 4, #pkts digest: 4
#pkts decaps: 4, #pkts decrypt: 4, #pkts verify: 4
#pkts compressed: 0, #pkts decompressed: 0
#pkts not compressed: 4, #pkts comp failed: 0, #pkts decomp failed: 0
#pre-frag successes: 0, #pre-frag failures: 0, #fragments created: 0
#PMTUs sent: 0, #PMTUs rcvd: 0, #decapsulated frgs needing reassembly: 0
#TFC rcvd: 0, #TFC sent: 0
#Valid ICMP Errors rcvd: 0, #Invalid ICMP Errors rcvd: 0
#pkts no sa (send): 0, #pkts invalid sa (rcv): 0
#pkts encaps failed (send): 0, #pkts decaps failed (rcv): 0
#pkts invalid prot (rcv): 0, #pkts verify failed: 0
#pkts invalid identity (rcv): 0, #pkts invalid len (rcv): 0
#pkts invalid pad (rcv): 0,
#pkts invalid ip version (rcv): 0,
#pkts replay rollover (send): 0, #pkts replay rollover (rcv): 0
#pkts replay failed (rcv): 0
#pkts min mtu frag failed (send): 0, #pkts bad frag offset (rcv): 0
#pkts internal err (send): 0, #pkts internal err (rcv): 0
local crypto endpt.: 192.0.2.1/0, remote crypto endpt.: 203.0.113.1/0
path mtu 1500, ipsec overhead 74(44), media mtu 1500
PMTU time remaining (sec): 0, DF policy: copy-df
ICMP error validation: disabled, TFC packets: disabled
current outbound spi: 8766F876
current inbound spi : B3D9AF0C
inbound esp sas:
spi: 0xB3D9AF0C (3017387788)
transform: esp-aes esp-md5-hmac no compression
in use settings ={L2L, Tunnel, IKEv1, }
slot: 0, conn_id: 8192, crypto-map: IPsec_CM
sa timing: remaining key lifetime (kB/sec): (4373999/42800)
IV size: 16 bytes
replay detection support: Y
Anti replay bitmap:
0x00000000 0x0000001F
outbound esp sas:
spi: 0x8766F876 (2271672438)
transform: esp-aes esp-md5-hmac no compression
in use settings ={L2L, Tunnel, IKEv1, }
slot: 0, conn_id: 8192, crypto-map: IPsec_CM
sa timing: remaining key lifetime (kB/sec): (4373999/42800)
IV size: 16 bytes
replay detection support: Y
Anti replay bitmap:
0x00000000 0x00000001
- ASA의 P1 negotiation을 콘솔에서 디버깅합니다 (디버깅 레벨 2):
debug crypto ikev1 2
[IKEv1]IP = 203.0.113.1, IKE Initiator: New Phase 1, Intf inside, IKE Peer 203.0.113.1 local Proxy Address 172.16.1.0, remote Proxy Address 192.168.1.0, Crypto map (IPsec_CM)
[IKEv1]IP = 203.0.113.1, Connection landed on tunnel_group 203.0.113.1
[IKEv1]IP = 203.0.113.1, Connection landed on tunnel_group 203.0.113.1
[IKEv1]Group = 203.0.113.1, IP = 203.0.113.1, PHASE 1 COMPLETED
[IKEv1]Group = 203.0.113.1, IP = 203.0.113.1, Add to IKEv1 Tunnel Table succeeded for SA with logical ID 28672
[IKEv1]Group = 203.0.113.1, IP = 203.0.113.1, Add to IKEv1 MIB Table succeeded for SA with logical ID 28672
[IKEv1]Group = 203.0.113.1, IP = 203.0.113.1, Security negotiation complete for LAN-to-LAN Group (203.0.113.1) Initiator, Inbound SPI = 0xc8bd5557, Outbound SPI = 0x886ed28f
[IKEv1]Group = 203.0.113.1, IP = 203.0.113.1, PHASE 2 COMPLETED (msgid=f4c19c33)
- 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
관련 문서