EdgeRouter - NAT에서의 IPsec 사이트 투 사이트 VPN¶
download at 2017-10-13T19:37:30Z origin
Overview
이 문서는 정책 기반 사이트 투 사이트 IPsec VPN을 2개의 EdgeRouter에서 구성하는 방법에 대하여 설명합니다. 이 때 1개의 라우터는 NAT 장치 구성을 하였습니다.
정책 기반 VPN 은 로컬, 원격지 서브넷 정의에 따라서 특징지을 수 있습니다. 정책 기반 VPN 타입과 달리 경로 기반 VPN에 따라서 달라지며, 가상 터널 인터페이스 (VTI)와 라우팅 엔트리 사용도에 따라서 특징 지을 수 있습니다. EdgeRouter - IPsec Route-Based (VTI) Site-to-Site VPN 문서를 참조하여 경로 기반 VPN을 설정하는 방법에 대하여 확인하십시오. DynDNS 설정을 호스트네임으로 설정한 경우 EdgeRouter - IPsec Dynamic Site-to-Site VPN using FQDNs 문서를 참조하십시오.
NOTES & REQUIREMENTS: EdgeOS 1.9.7 이상의 펌웨어가 설치된 모든 EdgeRouter 모델에서 적용 가능합니다. 커맨드라인 인터페이스와 기본 네트워킹에 대한 지식이 요구됩니다. 해당 주제에 대한 내용은 관련 문서 섹션의 문서를 확인하시기 바랍니다.
이 문서에서 사용한 장비:
- EdgeRouter-X (ER-X)
- 피어의 테스트 클라이언트 (Host1 and Server1)
Table of Contents
네트워크 다이어그램
네트워크 토폴로지는 다음과 같으며 라우터에서 사용한 인터페이스는 다음과 같습니다:
ER-L (Left)
- eth0 (WAN) - 203.0.113.1
- eth1 (LAN) - 192.168.1.1/24
ER-R (Right)
- eth0 (WAN) - 10.255.12.2/30
- eth1 (LAN) - 172.16.1.1/24
주소 변환 라우터
- WAN - 192.0.2.1
- LAN - 10.255.12.1/30
라우팅과 인터페이스는 양쪽 피어에 모두 설정되어 있으며 피어에 접속이 가능하다고 가정합니다.
IPsec과 관련있는 UDP 포트와 프로토콜은 다음과 같습니다:
- UDP 500 (IKE)
- ESP (프로토콜 50)
- UDP 4500 (NAT-T)
생성할 VPN 타입은 정책 기반 VPN이며, 원격지, 로컬 서브넷을 사용하며 해당 서브넷 정보가 없으면 프록시 ID를 사용합니다. 이 값들은 정확하게 두 피어간에 일치해야하며, 서로 동일한 내용을 가지고 있어야합니다. 터널을 통해서 미리 정해진 값들만 프록시 ID에서 전송 가능합니다. 예제에서는 ER-Left는 192.168.1.0/24 주소를 LAN에서 보유하고 있으며, ER-Right는 172.16.1.0/24 주소를 사용합니다.
설정에서 가장 중요한 점은 ER-Right가 퍼블릭 IP 주소를 갖고 있지 않으며 NAT 장치에서 주소를 받는다는 점입니다. ESP (캡슐화된 보안 페이로드) 트래픽은 포트포워딩 되거나 일반적인 방법으로 주소가 변환된 IPsec 에는 사용할수 없습니다. 그렇기 때문에 NAT-T가 ESP 트래픽을 캡슐화 하여 UDP 포트 4500으로 전송합니다. ER-Right 앞에 라우터가 존재하여 UDP 4500, UDP 500 포트로 포워딩 된 트래픽을 EdgeRouter로 전송합니다. 이 문서는 이 장비의 설정에 대하여 다루지 않고 이미 설정되었다고 가정합니다.
IPsec 피어 사이에서 사이트 투 사이트 커넥션을 성공적으로 설치하는 방법은 2가지가 있습니다:
- non-NAT 피어에서 0.0.0.0 주소로 피어를 설정하기
- NAT 피어에서 다른 피어로 NAT 라우터의 퍼블릭 IP 주소와 인증 ID를 사용하여 구성하기
Steps: 방법 #1 - 0.0.0.0 주소 피어
로컬 IPsec L2TP 서버는 IPsec 사이트 투 사이트 피어 주소가 0.0.0.0으로 설정되면 안됩니다. 프로토콜이 제대로 동작하지 않는데, 이는 입력받는 IKE 커넥션 요청이 명확하지 않고 사이트 투 사이트 클라이언트의 주소가 동적인 IP 주소를 가지며 L2TP 원격 접근 클라이언트로 요청이 오기 떄문입니다.
Note
피어 주소가 0.0.0.0으로 설정되었다면 라우터는 절대로 세션을 초기화 할 수 없으며, 요청에도 응답할 수 없습니다.
GUI STEPS: 라우터 웹 관리 포탈로 접속합니다.
1. ER-Left의 IPsec 피어와 보안 설정(SAs)을 정의합니다. (<secret>을 원하는 패스워드로 변겅합니다.)
VPN > IPsec Site-to-Site > +Add Peer
- 고급 옵션 확인
- 자동 방화벽 개방과 NAT부터 얻는 트래픽을 제외
Peer: 0.0.0.0
Description: IPsec
Local IP: 203.0.113.1
Encryption: AES-128
Hash: SHA1
DH Group: 14
Pre-shared Secret: <secret>
Local subnet: 192.168.1.0/24
Remote subnet: 172.16.1.0/24
2. ER-Right의 IPsec 피어와 보안 설정(SAs)을 정의합니다. (<secret>을 원하는 패스워드로 변겅합니다.)
VPN > IPsec Site-to-Site > +Add Peer
- 고급 옵션 확인
- 자동 방화벽 개방과 NAT부터 얻는 트래픽을 제외
Peer: 203.0.113.1
Description: IPsec
Local IP: 0.0.0.0
Encryption: AES-256
Hash: SHA1
DH Group: 14
Pre-shared Secret: <secret>
Local subnet: 172.16.1.0/24
Remote subnet: 192.168.1.0/24
Note
로컬 IP any에서 로컬 IP 0.0.0.0를 사용하는 것을 권장합니다.
Steps: 방법 #2 - 인증 ID 피어
GUI STEPS: 라우터 웹 관리 포탈에 접속합니다.
1. ER-Left의 IPsec 피어와 보안 설정(SAs)을 정의합니다. (<secret>을 원하는 패스워드로 변겅합니다.)
VPN > IPsec Site-to-Site > +Add Peer
- 고급 옵션 확인
- 자동 방화벽 개방과 NAT부터 얻는 트래픽을 제외
Peer: 192.0.2.1
Description: IPsec
Local IP: 203.0.113.1
Encryption: AES-128
Hash: SHA1
DH Group: 14
Pre-shared Secret: <secret>
Local subnet: 192.168.1.0/24
Remote subnet: 172.16.1.0/24
2. ER-Right의 IPsec 피어와 보안 설정(SAs)을 정의합니다. (<secret>을 원하는 패스워드로 변겅합니다.)
VPN > IPsec Site-to-Site > +Add Peer
- 고급 옵션 확인
- 자동 방화벽 개방과 NAT부터 얻는 트래픽을 제외
Peer: 203.0.113.1
Description: IPsec
Local IP: 0.0.0.0
Encryption: AES-128
Hash: SHA1
DH Group: 14
Pre-shared Secret: <secret>
Local subnet: 172.16.1.0/24
Remote subnet: 192.168.1.0/24
Note
로컬 IP any에서 로컬 IP 0.0.0.0를 사용하는 것을 권장합니다.
CLI STEPS: 커맨드 라인 인터페이스에 접속합니다. GUI의 CLI 버튼을 사용하거나 PuTTY와 같은 프로그램을 사용합니다.
- 환경설정 모드로 진입합니다.
configure
- 인증 ID를 변환 라우터의 퍼블릭 IP 주소에 세팅합니다.
set vpn ipsec site-to-site peer 203.0.113.1 authentication id 192.0.2.1
- 변경 내역을 커밋하고 환경설정을 저장합니다.
commit ; save
Steps: 테스팅 및 검증
IPsec VPN을 설정하고 난 이후에는 커넥션/상태를 다음 명령어를 통해서 검증합니다. (아래의 결과는 방법 2의 결과입니다.):
- IPsec 보안 옵션을 검증하고 ER-Right의 상태를 확인합니다:
show vpn ipsec sa
peer-203.0.113.1-tunnel-1: #1, ESTABLISHED, IKEv1, 7c7fa3eb7eb59546:7c057264ab063f76
local '192.0.2.1' @ 10.255.12.2
remote '203.0.113.1' @ 203.0.113.1
AES_CBC-128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048
established 76s ago, reauth in 28005s
peer-203.0.113.1-tunnel-1: #1, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-128/HMAC_SHA1_96/MODP_2048
installed 76 ago, rekeying in 2562s, expires in 3526s
in c1f5b727, 180 bytes, 3 packets, 70s ago
out cb2e250b, 180 bytes, 3 packets, 70s ago
local 172.16.1.0/24
remote 192.168.1.0/24
sudo ipsec statusall
Status of IKE charon daemon (strongSwan 5.2.2, Linux 3.10.20-UBNT, mips64):
uptime: 2 minutes, since Oct 02 14:19:24 2017
malloc: sbrk 410768, mmap 0, used 276376, free 134392
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 3
Listening IP addresses:
10.255.12.2
172.16.1.1
172.30.1.1
Connections:
peer-203.0.113.1-tunnel-1: 0.0.0.0...203.0.113.1 IKEv1
peer-203.0.113.1-tunnel-1: local: [192.0.2.1] uses pre-shared key authentication
peer-203.0.113.1-tunnel-1: remote: [203.0.113.1] uses pre-shared key authentication
peer-203.0.113.1-tunnel-1: child: 172.16.1.0/24 === 192.168.1.0/24 TUNNEL
Routed Connections:
peer-203.0.113.1-tunnel-1{1}: ROUTED, TUNNEL
peer-203.0.113.1-tunnel-1{1}: 172.16.1.0/24 === 192.168.1.0/24
Security Associations (1 up, 0 connecting):
peer-203.0.113.1-tunnel-1[1]: ESTABLISHED 88 seconds ago, 10.255.12.2[192.0.2.1]...203.0.113.1[203.0.113.1]
peer-203.0.113.1-tunnel-1[1]: IKEv1 SPIs: 7c7fa3eb7eb546_i* 7c0572663f76_r, pre-shared key reauthentication in 7 hours
peer-203.0.113.1-tunnel-1[1]: IKE proposal: AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048
peer-203.0.113.1-tunnel-1{1}: INSTALLED, TUNNEL, ESP in UDP SPIs: c1f5b727_i cb2e250b_o
peer-203.0.113.1-tunnel-1{1}: AES_CBC_128/HMAC_SHA1_96, 180 bytes_i (3 pkts, 82s ago), 180 bytes_o (3 pkts, 83s ago)
peer-203.0.113.1-tunnel-1{1}: 172.16.1.0/24 === 192.168.1.0/24
2. ER-Right의 IPsec strongSwan 환경설정을 검증합니다:
sudo cat /etc/ipsec.conf
# generated by /opt/vyatta/sbin/vpn-config.pl
config setup
conn %default
keyexchange=ikev1
conn peer-203.0.113.1-tunnel-1
left=0.0.0.0
leftid="192.0.2.1"
right=203.0.113.1
leftsubnet=172.16.1.0/24
rightsubnet=192.168.1.0/24
ike=aes128-sha1-modp2048!
keyexchange=ikev1
ikelifetime=28800s
esp=aes128-sha1-modp2048!
keylife=3600s
rekeymargin=540s
type=tunnel
compress=no
authby=secret
auto=route
keyingtries=%forever
#conn peer-192.0.2.1-tunnel-1
sudo cat /etc/ipsec.secrets
# generated by /opt/vyatta/sbin/vpn-config.pl
0.0.0.0 203.0.113.1 192.0.2.1 : PSK "<secret>" #LEFT#
Note
ipsec.secrets 파일은 로컬 IP 주소를 처음에 기록하고 (0.0.0.0) 다음에는 리모트 피어 주소 (203.0.113.1), 인증 ID(192.0.2.1)을 기술합니다.
3. WAN 인터페이스에서 들어오는 IKE, NAT-T 트래픽을 캡쳐합니다:
sudo tcpdump -i eth0 -n udp dst port 4500 or 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
14:20:48.416654 IP 10.255.12.2.500 > 203.0.113.1.500: isakmp: phase 1 I ident
14:20:48.423597 IP 203.0.113.1.500 > 10.255.12.2.500: isakmp: phase 1 R ident
14:20:48.937831 IP 10.255.12.2.500 > 203.0.113.1.500: isakmp: phase 1 I ident
14:20:49.650892 IP 203.0.113.1.500 > 10.255.12.2.500: isakmp: phase 1 R ident
14:20:50.163656 IP 10.255.12.2.4500 > 203.0.113.1.4500: NONESP-encap: isakmp: phase 1 I ident[E]
14:20:50.170501 IP 203.0.113.1.4500 > 10.255.12.2.4500: NONESP-encap: isakmp: phase 1 R ident[E]
14:20:50.686856 IP 10.255.12.2.4500 > 203.0.113.1.4500: NONESP-encap: isakmp: phase 2/others I oakley-quick[E]
14:20:51.398714 IP 203.0.113.1.4500 > 10.255.12.2.4500: NONESP-encap: isakmp: phase 2/others R oakley-quick[E]
14:20:51.912250 IP 10.255.12.2.4500 > 203.0.113.1.4500: NONESP-encap: isakmp: phase 2/others I oakley-quick[E]
14:20:53.825375 IP 10.255.12.2.4500 > 203.0.113.1.4500: UDP-encap: ESP(spi=0xcb2e250b,seq=0x1), length 100
14:20:53.827659 IP 203.0.113.1.4500 > 10.255.12.2.4500: UDP-encap: ESP(spi=0xc1f5b727,seq=0x1), length 100
14:20:54.835061 IP 10.255.12.2.4500 > 203.0.113.1.4500: UDP-encap: ESP(spi=0xcb2e250b,seq=0x2), length 100
14:20:54.836919 IP 203.0.113.1.4500 > 10.255.12.2.4500: UDP-encap: ESP(spi=0xc1f5b727,seq=0x2), length 100
Note
실시간 캡쳐의 결과이므로 아무런 결과가 발견되지 않는다면 클라이언트가 트래픽을 생성하지 않거나 트래픽 업스트림이 차단당한 것일수도 있습니다.
4. IPsec VPN 로그를 확인합니다:
sudo swanctl --log
[KNL] creating acquire job for policy 172.16.1.10/32[icmp] === 192.168.1.10/32[icmp] with reqid {1}
[IKE] initiating Main Mode IKE_SA peer-203.0.113.1-tunnel-1[1] to 203.0.113.1
[ENC] generating ID_PROT request 0 [ SA V V V V ]
[NET] sending packet: from 10.255.12.2[500] to 203.0.113.1[500] (156 bytes)
[NET] received packet: from 203.0.113.1[500] to 10.255.12.2[500] (136 bytes)
[ENC] parsed ID_PROT response 0 [ SA V V V ]
[ENC] generating ID_PROT request 0 [ KE No NAT-D NAT-D ]
[ENC] parsed ID_PROT response 0 [ KE No NAT-D NAT-D ]
[IKE] local host is behind NAT, sending keep alives
[ENC] generating ID_PROT request 0 [ ID HASH N(INITIAL_CONTACT) ]
[ENC] parsed ID_PROT response 0 [ ID HASH ]
[IKE] IKE_SA peer-203.0.113.1-tunnel-1[1] established between 10.255.12.2[192.0.2.1]...203.0.113.1[203.0.113.1]
[IKE] scheduling reauthentication in 28081s
[IKE] maximum IKE_SA lifetime 28621s
[ENC] generating QUICK_MODE request 896435043 [ HASH SA No KE ID ID ]
[ENC] parsed QUICK_MODE response 896435043 [ HASH SA No KE ID ID ]
[IKE] CHILD_SA peer-203.0.113.1-tunnel-1{1} established with SPIs c1f27_i cb2e2b_o and TS 172.16.1.0/24 === 192.168.1.0/24
Note
실시간 캡쳐 결과이므로 출력이 보이지 않는다면, 트래픽이 방화벽을 통해서 허용되었는지 확인하십시오. 다른 방법으로는 show vpn log | no-more명령어를 통해서 전체 IPsec 로그 히스토리를 확인할 수 있습니다.
5. 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
관련 문서