네트워크 보안/네트워크

strongswan #1 IKEv2 소프트웨어 아키텍쳐, 메세지 포맷, config 설정 및 실행 방법

uzguns 2024. 11. 3. 21:39

Strongswan 소스코드를 확인하면 아래와 같이 많은 모듈이 나온다. 하지만 크게 봐야할 부분은 다음과 같다.

  • libstrongswan: strongSwan의 핵심 라이브러리(암호화, 키 교환, 인증 및 다양한 프로토콜을 지원)
  • libcharon: IKE 데몬인 charon에서 사용하는 라이브러리( IKEv2 프로토콜 기반 VPN 커넥션 관리, 네트워크 키 교환 처리)
  • plugins: 예) X.509 인증서 플러그인, EAP(Extensible Authentication Protocol) 플러그인 등
  • charon: strongSwan의 IKEv2 데몬으로, VPN 터널을 설정하고 관리
  • swanctl: strongSwan의 charon 데몬을 제어하고 VPN 설정을 관리하는 CLI
  • starter: charon의 Launcher역할, ipsec.conf 파일을 사용해 VPN 설정을 charon 에 전달
  • stroke command: starter가 charon 데몬과 통신할 때 사용하는 명령어 인터페이스(현재 strongSwan에서 swanctl로 대체되어 사용이 줄어듬)

주요 프로세스는 IKE SA 및 IPSec SA의 설정, 해체, 업데이트 및 기타 관련 작업을 담당하는 charon 프로세스이다.

 

Strongswan 설치

strongswan을 설치 해서 구동해보자.

$ apt-get install -y \
    ca-certificates \
    ssl-cert \
    openssl \
    iproute2 \
    iputils-ping \
    libgmp10

 

$ VERSION="5.9.8" && \
  DEV_PACKAGES="wget bzip2 make gcc libssl-dev libgmp-dev" && \
  apt-get install -y $DEV_PACKAGES && \
  mkdir -p strongswan-build && \
  cd strongswan-build && \
  wget --no-check-certificate https://download.strongswan.org/strongswan-$VERSION.tar.bz2 && \
  tar -xjf strongswan-$VERSION.tar.bz2 && \
  cd strongswan-$VERSION && \
  ./configure --prefix=/usr --sysconfdir=/etc \
    --enable-charon --enable-ikev2 --enable-nonce --enable-random     \
    --enable-openssl --enable-pem --enable-x509 --enable-pubkey       \
    --enable-constraints --enable-pki --enable-socket-default         \
    --enable-kernel-netlink --enable-swanctl --enable-resolve         \
    --enable-eap-identity --enable-eap-md5 --enable-eap-mschapv2 --enable-eap-dynamic       \
    --enable-eap-tls --enable-updown --enable-vici                    \
    --enable-silent-rules  && \
   make -j4 all && make install && \
   ln -s /usr/libexec/ipsec/charon charon

 

$ ipsec version
Linux strongSwan U5.9.8/K6.8.0-47-generic
University of Applied Sciences Rapperswil, Switzerland
  • 주요 파일
    • /etc/ipsec.conf : VPN 연결의 설정 정의
    • /etc/strongswan.conf : strongSwan 데몬 설정 정의
    • /etc/ipsec.secret : 인증에 필요한 비밀 정보(PSK, RSA 키 등) 저장.

아래 명령어로 실행해볼 수 있다. 로그를 보면 starter가 실행되고 starter가 charon 데몬의 런쳐역할을 하며 charon을 실행한다.

그 후 설정파일을 로드하고 플러그인을 로드한다. 백그라운드 프로세스는 16개의 쓰레드로 실행한다.

$ /usr/sbin/ipsec start --nofork --debug-all
Starting strongSwan 5.9.8 IPsec [starter]...
Loading config setup
Attempting to start charon...
00[DMN] Starting IKE charon daemon (strongSwan 5.9.8, Linux 6.8.0-47-generic, x86_64)
00[LIB] providers loaded by OpenSSL: legacy default
00[CFG] loading ca certificates from '/etc/ipsec.d/cacerts'
00[CFG] loading aa certificates from '/etc/ipsec.d/aacerts'
00[CFG] loading ocsp signer certificates from '/etc/ipsec.d/ocspcerts'
00[CFG] loading attribute certificates from '/etc/ipsec.d/acerts'
00[CFG] loading crls from '/etc/ipsec.d/crls'
00[CFG] loading secrets from '/etc/ipsec.secrets'
00[LIB] loaded plugins: charon aes des rc2 sha2 sha1 md5 mgf1 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs12 pgp dnskey sshkey pem openssl pkcs8 fips-prf gmp curve25519 xcbc cmac hmac kdf gcm drbg attr kernel-netlink resolve socket-default stroke vici updown eap-identity eap-md5 eap-mschapv2 eap-dynamic eap-tls xauth-generic counters
00[JOB] spawning 16 worker threads
charon (126798) started after 40 ms

 

터널 연결

  • ipsec.conf 파일은 strongSwan이 VPN 연결을 설정할 때 사용하는 주요 구성 파일이다.
config setup
    # 기본 설정을 위해 필요한 옵션들
    charondebug="ike 2, knl 2, cfg 2"  # 디버그 수준 설정
    uniqueids=yes                       # 중복 연결 처리

conn %default
    keyexchange=ikev2                    # IKEv2 사용
    ike=aes256-sha256-modp1024           # IKE 암호화 방식
    esp=aes256-sha256                    # ESP 암호화 방식
    dpdaction=clear                      # DPD(Dead Peer Detection) 설정
    dpddelay=300s                        # DPD 간격
    rekey=no                             # 재키 교환 비활성화
    leftauth=pubkey                      # 로컬 인증 방식(공개키 사용)
    rightauth=pubkey                     # 원격 인증 방식(공개키 사용)
    rightsourceip=10.3.0.0/24            # 가상 IP 할당 풀

# 클라이언트 설정
conn ikev2-client
    left=%any                            # 로컬 IP는 자동 지정
    leftsubnet=0.0.0.0/0                 # 로컬 네트워크 서브넷
    leftcert=serverCert.pem              # 로컬 인증서
    right=%any                           # 원격 IP는 자동 지정
    rightid="client@example.com"         # 원격 식별자
    rightdns=8.8.8.8                     # 클라이언트가 사용할 DNS 서버
    auto=add                             # 자동으로 연결을 추가
  • strongswan.conf 파일은 strongSwan의 전반적인 설정을 관리하며, 플러그인 로드와 같은 기능을 제어할 수 있다.
charon {
    load_modular = yes                   # 모듈을 동적으로 로드
    plugins {
        include strongswan.d/charon/*.conf
        # 주요 플러그인 설정 (예시로 일부만 사용)
        sql {
            loglevel = -1
        }
        eap-identity {
            load = yes
        }
        eap-md5 {
            load = yes
        }
    }
    # IKEv2 기본 설정
    filelog {
        /var/log/strongswan.log {
            time_format = %b %e %T        # 로그 시간 형식
            ike_name = yes                # IKE 이름 표시
            append = no                   # 파일 덮어쓰기 허용
            default = 2                   # 기본 로그 레벨
            flush_line = yes              # 라인마다 즉시 출력
        }
    }
    syslog {
        daemon {
            default = 1                   # 기본 레벨
        }
    }
}

include strongswan.d/*.conf

 

이 설정 으로 기본적인 IKEv2 기반 VPN 연결을 설정하고,

여기에는 가상 IP 할당(rightsourceip)이 포함되어 있어 NAT를 통해 연결된 클라이언트에 가상 IP를 할당하는 데 필요한 설정이 포함된다.

 

이제 설정 파일을 로드하고 strongswan을 시작하면 된다.

ipsec reload
ipsec start
ipsec statusall
# 수동 연결
ipsec up <connection>

 

 

이 설정을 통해 다음과 같은 과정이 진행된다

  1. IKE_SA_INIT: 초기 SA(Security Association) 교환이 수행되고, NAT 탐지 및 키 교환
  2. IKE_AUTH: 클라이언트와 서버가 인증을 완료하고 가상 IP 할당이 진행
  3. CHILD_SA 설정: IPsec 터널이 설정되고, 클라이언트에게 할당된 가상 IP가 적용됨
  • Center 에서 연결 확인
05[ENC] generating IKE_SA_INIT request [SA KE No N(NATD_S_IP) N(NATD_D_IP)]
05[NET] sending packet: from 192.168.0.100[500] to 192.168.0.1[500]
06[NET] received packet: from 192.168.0.1[500] to 192.168.0.100[500]
06[ENC] parsed IKE_SA_INIT response [SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ]
06[ENC] generating IKE_AUTH request [IDi CERT CERTREQ IDr AUTH CP SA TSi TSr]
07[NET] sending packet: from 192.168.0.100[500] to 192.168.0.1[500]
07[NET] received packet: from 192.168.0.1[500] to 192.168.0.100[500]
07[ENC] parsed IKE_AUTH response [IDr CERT AUTH CP SA TSi TSr N(AUTH_LFT)]
07[IKE] installing new virtual IP 10.3.0.1
07[AUD] established CHILD_SA successfully

 

  • Branch에서 연결 확인
05[NET] received packet: from 192.168.0.100[500] to 192.168.0.1[500]
05[ENC] parsed IKE_SA_INIT request [SA KE No N(NATD_S_IP) N(NATD_D_IP)]
05[ENC] generating IKE_SA_INIT response [SA KE No N(NATD_S_IP) N(NATD_D_IP) CERTREQ]
05[NET] sending packet: from 192.168.0.1[500] to 192.168.0.100[500]
06[NET] received packet: from 192.168.0.100[500] to 192.168.0.1[500]
06[ENC] parsed IKE_AUTH request [IDi CERT CERTREQ IDr AUTH CP SA TSi TSr]
06[IKE] peer requested virtual IP %any
06[IKE] assigning virtual IP 10.3.0.1
06[AUD] established CHILD_SA successfully
07[ENC] generating IKE_AUTH response [IDr CERT AUTH CP SA TSi TSr N(AUTH_LFT)]
07[NET] sending packet: from 192.168.0.1[500] to 192.168.0.100[500]