AWS

[실습] AWS IPSecVPN(site-to-site) 실습 : Libreswan 사용

jetblack1 2025. 9. 12. 13:32

 

개요 및 계획 (Planning)

  • 인프라 구성 현황
    • IDC 환경 (On-Premises Simulation)
      • VPC CIDR: 10.10.0.0/16 (이름: IDC-VPC)
      • Public Subnet: 10.10.0.0/24 (이름: IDC-Public-Subnet)
      • Private Subnet: 10.10.1.0/24 (이름: IDC-Private-Subnet)
      • EC2 : IDC-CGW (Public Subnet에 위치)
      • EC2 : IDC-EC2 (Private Subnet에 위치)
    • AWS 클라우드 환경
      • VPC CIDR: 10.20.0.0/16 (이름: AWS-VPC)
      • Public Subnet: 10.20.1.0/24 (이름: AWS-Public-Subnet)
      • EC2 (: AWS-EC2 (Public Subnet에 위치)

최종 목표: IDC-EC2 (Private IP) <-> AWS-EC2 (Private IP) 양방향 Ping 통신 성공

 


1단계: IDC 환경(온프레미스), AWS 인프라 구축

먼저 온프레미스 데이터센터를 시뮬레이션할 AWS 환경을 구축합니다.

1. VPC 및 서브넷 생성(IDC-VPC)

  • AWS Management Console > VPC > VPC 생성
    • 생성할 리소스: VPC 등 선택
    • 이름 태그 자동 생성: IDC 입력
    • IPv4 CIDR 블록: 10.10.0.0/16
    • 가용 영역(AZ) 수: 1
    • 퍼블릭 서브넷 수: 1
    • 프라이빗 서브넷 수: 1
    • 서브넷 CIDR 블록 사용자 지정
      • 퍼블릭 서브넷 CIDR 블록 : 10.10.0.0/24
      • 프라이빗 서브넷 CIDR 블록 : 10.10.1.0/24
    • NAT 게이트웨이: 없음
    • VPC 엔드포인트: 없음
    • [VPC 생성] 클릭 (VPC, 서브넷, 라우팅 테이블, 인터넷 게이트웨이가 자동으로 생성됩니다.)

2. VPC 및 서브넷 생성(AWS-VPC)

  • VPC > VPC 생성
    • 생성할 리소스: VPC 등
    • 이름 태그 자동 생성: AWS
    • IPv4 CIDR 블록: 10.20.0.0/16
    • 가용 영역(AZ) 수: 1
    • 퍼블릭 서브넷 수: 1
    • 프라이빗 서브넷 수: 0
    • 서브넷 CIDR 블록 사용자 지정
      • 퍼블릭 서브넷 CIDR 블록 : 10.20.1.0/24
    • NAT 게이트웨이: 없음
    • [VPC 생성] 클릭

3. 보안그룹 및 EC2 생성(IDC-CGW, IDC-EC2)

  • IDC 보안 그룹 생성: EC2 생성 전, 필요한 보안 그룹을 미리 만듭니다.
    • VPC > 보안 그룹 > 보안 그룹 생성
    • 보안 그룹 이름: IDC-CGW-SG
    • VPC: IDC-VPC 선택
    • 인바운드 규칙 추가:
      1. 유형 : SSH | 프로토콜 : TCP | 포트 범위 : 22 소스: 0.0.0.0/0
      2. 사용자 지정 UDP | UDP | 500 | 소스: 0.0.0.0/0 
      3. 사용자 지정 UDP | UDP | 4500 | 소스: 0.0.0.0/0 
      4. 모든 ICMP - IPv4 | 소스: 0.0.0.0/0 
    • 보안 그룹 이름: IDC-Private-SG
    • VPC: IDC-VPC 선택
    • 인바운드 규칙 추가:
      1. SSH | TCP | 22 | 소스: 0.0.0.0/0 
      2. 모든 ICMP - IPv4 | 소스: 0.0.0.0/0 
  • 보안 그룹 생성(AWS):
    • VPC > 보안 그룹 > 보안 그룹 생성
    • 보안 그룹 이름: AWS-EC2-SG
    • VPC: AWS-VPC 선택
    • 인바운드 규칙 추가:
      1. SSH | TCP | 22 | 소스:0.0.0.0/0
      2. 모든 ICMP - IPv4 | 소스: 0.0.0.0/0
  • EC2 인스턴스 시작(IDC-CGW)
    • AWS Console > EC2 > 인스턴스 시작
    • IDC-CGW 생성:
      • 이름: IDC-CGW
      • AMI: Amazon Linux 2023
      • 인스턴스 유형: t2.micro(프리티어)
      • 키 페어: 기존 키 페어 선택 또는 새로 생성 (접속에 필수)
      • 네트워크 설정 편집:
        • VPC: IDC-VPC
        • 서브넷: IDC-Public-Subnet
        • 퍼블릭 IP 자동 할당: 활성화 (매우 중요!)
        • 방화벽(보안 그룹): 기존 보안 그룹 선택 > IDC-CGW-SG 선택
      • [인스턴스 시작] 클릭
    • IDC-EC2 생성:
      • 이름: IDC-EC2
      • AMI: Amazon Linux 2023
      • 인스턴스 유형: t2.micro
      • 키 페어: 동일한 키 페어 선택
      • 네트워크 설정 편집:
        • VPC: IDC-VPC
        • 서브넷: IDC-Private-Subnet
        • 퍼블릭 IP 자동 할당: 비활성화
        • 방화벽(보안 그룹): 기존 보안 그룹 선택 > IDC-Private-SG 선택
      • 고급세부정보 -> 사용자 데이터 (ssh 계정/패스워드 로 접속하기 위한 설정)
        #!/bin/bash
        # root 비밀번호 설정
        echo "root:qwe123" | chpasswd
        
        # sshd_config 수정 (비밀번호 로그인 허용 + root 로그인 허용)
        sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
        sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
        
        # sshd 재시작
        systemctl restart sshd
      • [인스턴스 시작] 클릭
  • IDC-CGW 소스/대상 확인 비활성화: 라우터 역할을 위해 필수입니다.
    • IDC-CGW 인스턴스 선택 > [작업] > [네트워킹] > [소스/대상 확인 변경] > 중지 후 저장
      • 이유: 기본적으로 EC2는 자신이 송수신하는 트래픽의 IP 주소가 자신의 IP와 일치하는지 확인합니다. 이 EC2는 VPC-A(10.10.0.0/16)로 향하는 다른 인스턴스들의 트래픽을 대신 전달(라우팅)해야 하므로, 이 확인 기능을 비활성화해야 합니다.
  • AWS EC2 인스턴스 시작:
    • 이름: AWS-EC2
    • AMI: Amazon Linux 2023
    • 인스턴스 유형: t2.micro
    • 키 페어: 기존 키 페어 사용
    • 네트워크 설정 편집:
      • VPC: AWS-VPC
      • 서브넷: AWS-Public-Subnet
      • 퍼블릭 IP 자동 할당: 활성화
      • 방화벽(보안 그룹): 기존 보안 그룹 선택 > AWS-EC2-SG 선택
    • [인스턴스 시작] 클릭
  •  

2단계: AWS VPN 구성

이제 IDC와 AWS를 연결하는 VPN을 AWS 측에서 설정합니다.

  1. 고객 게이트웨이(CGW) 생성: IDC-CGW를 논리적으로 표현합니다.
    • VPC > 고객 게이트웨이 > 고객 게이트웨이 생성
    • 이름: IDC-CGW-Object
    • IP 주소: IDC-CGW EC2 인스턴스의 퍼블릭 IP를 입력합니다.
    • [생성] 클릭
  2. 가상 프라이빗 게이트웨이(VGW) 생성 및 연결: AWS VPC 측의 게이트웨이입니다.
    • VPC > 가상 프라이빗 게이트웨이 > 가상 프라이빗 게이트웨이 생성
    • 이름: AWS-VGW
    • [생성] 클릭
    • 생성된 AWS-VGW 선택 > [작업] > [VPC에 연결] > AWS-VPC 선택 후 연결 (상태가 attached가 될 때까지 대기)
  3. Site-to-Site VPN 연결 생성:
    • VPC > 사이트 간 VPN 연결 > VPN 연결 생성
    • 이름: IDC-to-AWS-VPN
    • 가상 프라이빗 게이트웨이: AWS-VGW 선택
    • 고객 게이트웨이 : 기존
      • 고객 게이트웨이 ID: IDC-CGW-Object 선택
    • 라우팅 옵션: 정적(Static)
    • 정적 IP 접두사: 10.10.0.0/16 (IDC 네트워크 CIDR) 입력
    • 터널 1 옵션
      • 사전 공유 키(Pre-Shared Key) : ipsectest
      • 터널 1의 고급 옵션 > 터널 1 옵션 편집
        • 1단계 암호화 알고리즘 : AES256 (AES256 빼고 나머지 암호화 X 클릭하여 삭제)
        • 2단계 암호화 알고리즘 : AES256
        • 1단계 무결성 알고리즘 : SHA2-256
        • 2단계 무결성 알고리즘 : SHA2-256
        • 1단계 DH 그룹 번호 : 14
        • 2단계 DH 그룹 번호 : 14
        • IKE 버전 : ikev2
    • 터널 2 옵션
      • 사전 공유 키(Pre-Shared Key) : ipsectest
      • 터널 2의 고급 옵션 > 터널 2 옵션 편집
        • 1단계 암호화 알고리즘 : AES256 (해당 암호화 제외 나머진 X 클릭하여 삭제)
        • 2단계 암호화 알고리즘 : AES256
        • 1단계 무결성 알고리즘 : SHA2-256
        • 2단계 무결성 알고리즘 : SHA2-256
        • 1단계 DH 그룹 번호 : 14
        • 2단계 DH 그룹 번호 : 14
        • IKE 버전 : ikev2
    • [VPN 연결 생성] 클릭
  4. AWS-VPC 라우팅 테이블 전파 설정:
    • VPC > 라우팅 테이블에서 AWS-VPC에 연결된 라우팅 테이블을 선택합니다.
    • [라우팅 전파] 탭 > [라우팅 전파 편집] 클릭
    • AWS-VGW[전파] 체크박스를 활성화하고 저장 합니다.
    • 잠시 후 [라우팅] 탭에 10.10.0.0/16 경로가 VGW로 자동 추가됩니다.
      • 이유: 이 설정을 통해 VGW는 VPN 터널을 통해 알게 된 경로(여기서는 10.20.0.0/16)를 이 라우팅 테이블에 자동으로 추가해 줍니다.
  5. VPN 구성 파일 다운로드:
    • VPC > Site-to-Site VPN 연결에서 생성된 VPN 연결을 선택하고 [구성 다운로드] 클릭
    • 공급업체: Generic
    • IKE 버전 : ikev2 선택 후 [다운로드]

3단계: IDC-CGW VPN(Libreswan) 설정

다운로드한 구성 파일을 사용하여 IDC-CGW EC2에 Libreswan을 설정합니다.

  • IDC-CGW EC2에 SSH 접속 (Public IP 사용)
  • Libreswan 설치 및 시스템 설정:
        # 패키지 업데이트 및 Libreswan 설치
    sudo yum update -y
    sudo yum install libreswan -y
    
    # IP 포워딩 활성화 (라우터 기능)
    sudo sysctl -w net.ipv4.ip_forward=1
    sudo sh -c 'echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf'
      
  • VPN 구성: 다운로드한 텍스트 파일을 열고 아래 정보를 확인합니다.
    • Pre-Shared Key
    • Virtual Private Gateway (AWS VGW의 터널 외부 IP 주소)
  • VPN 설정 파일 생성 및 설정 (터널 1 기준)
    • sudo vi /etc/ipsec.d/aws.conf
    # 아래 내용 붙여넣기 (값은 다운로드한 파일에서 복사)
    conn aws-vpn-tunnel
        # 연결 타입
        type=tunnel
        authby=secret
        keyingtries=3
    
        # Phase 1 (IKE) 설정 - AWS 호환
        ikev2=insist
        ike=aes256-sha2_256;modp2048
        ikelifetime=28800s
    
        # Phase 2 (IPSec) 설정
        esp=aes256-sha2_256;modp2048
        salifetime=3600s
        pfs=yes
    
        # Dead Peer Detection (중요!)
        dpddelay=10
        dpdtimeout=30
        dpdaction=restart
    
        # 네트워크 설정 (실제 값으로 교체 필요)
        left=%defaultroute
        leftid=1.1.1.1  #IDC-CGW의_퍼블릭_IP, 설정 예시 : 1.1.1.1
        leftsubnets=10.10.0.0/16
    
        right=2.2.2.2  #AWS_VGW_터널1의_퍼블릭_IP, 설정 예시 : 2.2.2.2
        rightsubnets=10.20.0.0/16
    
        # 연결 설정
        auto=start
        compress=no

     

    # IP 확인방법 :
        EC2 IDC-CGW 퍼블릭IP : EC2 인스턴스에서 확인
        VGW 첫번째 터널 외부 IP : 
            확인방법 1 : 
                구성 다운로드 
                #3: Tunnel Interface Configuration 항목 
                Outside IP Addresses:
                Virtual Private Gateway IP
            확인방법 2 : 
                VPC
                Site-to-Site VPN 연결
                IDC-to-AWS-VPN 선택
                하단 터널 세부 정보
                Tunnel1 외부IP주소

     

     

    5. Pre-Shared Key 파일 생성
    sudo vi /etc/ipsec.d/aws.secrets

    # 아래 형식으로 붙여넣기 (값은 다운로드한 파일에서 복사)
    [EC2 IDC-CGW의_퍼블릭_IP] [VGW의_첫번째_터널_외부_IP] : PSK "ipsectest" #Pre-shared 키
    
    # 설정 예시 : 
    1.1.1.1 2.2.2.2 : PSK "ipsectest"
  • IPsec 서비스 시작 및 확인:
    # IPsec 서비스 시작
    sudo systemctl start ipsec
  • 터널 정상 확인
    • VPC > Site-to-Site VPN 연결 > IDC-to-AWS-VPN 클릭 > 하단 터널 세부 정보 > Tunnel 1 상태 Up 확인

4단계: IDC 환경 라우팅 설정

IDC-EC2가 AWS로 가는 트래픽을 IDC-CGW로 보낼 수 있도록 설정합니다.

  • VPC > 라우팅 테이블에서 IDC-Private-Subnet에 연결된 라우팅 테이블을 선택합니다.
  • [라우팅] 탭 > [라우팅 편집] > [라우팅 추가]
    • 대상: 10.20.0.0/16 (AWS VPC CIDR)
    • 대상(Target): 인스턴스 선택
    • 네트워크 인터페이스 ID: IDC-CGW 인스턴스를 선택합니다.
  • [변경 사항 저장]

5단계: 최종 통신 테스트

모든 설정이 완료되었습니다. 이제 최종 목표를 확인합니다.

  1. AWS 콘솔에서 터널 상태 확인:
    • VPC > 사이트 간 VPN 연결에서 생성한 VPN을 선택합니다.
    • [터널 세부 정보] 탭에서 터널 1의 상태가 UP으로 표시되는지 확인합니다.
  2. IDC-EC2에서 AWS-EC2로 Ping 테스트:
    • IDC-EC2에 직접 SSH 접속은 불가하므로, IDC-CGW를 통해 접속합니다.
    • 먼저 로컬 PC에서 IDC-CGW로 SSH 접속합니다.
    • IDC-CGW 터미널에서 IDC-EC2의 프라이빗 IP로 SSH 접속합니다. 
      # IDC-CGW 터미널에서
      ssh root@<IDC-EC2의_Private_IP>
      password : qwe123
    • IDC-EC2 터미널에서 AWS-EC2의 프라이빗 IP로 ping을 실행합니다.
          ping <AWS-EC2의_Private_IP>
      
      # 예시: ping 10.20.1.123
        

[예상 결과]

    PING 10.20.1.123 (10.20.1.123) 56(84) bytes of data.
64 bytes from 10.20.1.123: icmp_seq=1 ttl=254 time=2.34 ms
64 bytes from 10.20.1.123: icmp_seq=2 ttl=254 time=2.15 ms
...
  

 

이 결과가 나오면, IDC의 프라이빗 서브넷에 있는 EC2가 VPN 터널을 통해 AWS VPC의 EC2와 성공적으로 프라이빗 통신을 하는 것입니다.

 

3. AWS-EC2에서 IDC-EC2 프라이빗 IP로 ssh 접속 테스트

# AWS-EC2 터미널에서
ssh root@<IDC-EC2의_Private_IP>
password : qwe123

6단계: 삭제방법

더보기

1단계: EC2 인스턴스 종료

가장 먼저 VPC 내에서 실행 중인 EC2 인스턴스들을 종료합니다.

  1. EC2 콘솔로 이동합니다.
  2. 체크박스를 사용하여 생성했던 모든 인스턴스를 선택합니다:
    • IDC-CGW
    • IDC-EC2
    • AWS-EC2
  3. [인스턴스 상태] > [인스턴스 종료]를 클릭하고 확인합니다.

 

2단계: VPN 관련 리소스 삭제

VPN 연결은 여러 구성 요소가 엮여 있으므로, 다음 순서를 반드시 지켜주세요.

  1. Site-to-Site VPN 연결 삭제:
    • VPC 콘솔 > 사이트 간 VPN 연결로 이동합니다.
    • IDC-to-AWS-VPN 연결을 선택합니다.
    • [작업] > [VPN 연결 삭제]를 클릭하고 삭제를 입력하여 확인합니다. (상태가 deleting으로 변경됩니다.)
  2. 가상 프라이빗 게이트웨이(VGW) 분리 및 삭제:
    • VPC 콘솔 > 가상 프라이빗 게이트웨이로 이동합니다.
    • AWS-VGW를 선택합니다.
    • [작업] > [VPC에서 분리]를 클릭하여 AWS-VPC와의 연결을 해제합니다. (상태가 detaching에서 detached로 변경될 때까지 기다립니다. 30초 이내 분리됨)
    • detached 상태가 되면, 다시 [작업] > [가상 프라이빗 게이트웨이 삭제]를 클릭하여 삭제합니다.
  3. 고객 게이트웨이(CGW) 삭제:
    • VPC 콘솔 > 고객 게이트웨이로 이동합니다.
    • IDC-CGW-Object를 선택합니다.
    • [작업] > [고객 게이트웨이 삭제]를 클릭하여 삭제합니다.

 

3단계: VPC 삭제 (가장 간편한 방법)

VPC를 삭제하면 그 안에 포함된 서브넷, 라우팅 테이블, 인터넷 게이트웨이, 보안 그룹 등 모든 종속 리소스가 한 번에 자동으로 삭제됩니다.

  1. VPC 콘솔 > 내 VPC로 이동합니다.
  2. 먼저 AWS-VPC를 선택합니다.
  3. [작업] > [VPC 삭제]를 클릭합니다.
  4. 삭제 확인 창이 나타나면, 삭제될 리소스 목록을 확인하고 텍스트 필드에 삭제 (또는 delete)를 입력한 후 삭제 버튼을 누릅니다.
  5. 동일한 방법으로 IDC-VPC를 선택하여 삭제를 진행합니다.

※ VPC 삭제 시 주의사항:

  • VPC 내에 EC2 인스턴스, NAT 게이트웨이, VPC 엔드포인트 등 남아있는 리소스가 있으면 VPC 삭제가 실패합니다. 1단계에서 EC2를 먼저 종료한 이유가 바로 이것입니다.
  • 만약 "VPC 삭제" 기능이 오류를 발생시킨다면, VPC에 연결된 네트워크 인터페이스(ENI) 등이 남아있기 때문일 수 있습니다. 이 경우, 오류 메시지를 확인하여 해당 리소스를 수동으로 먼저 삭제해야 합니다.