네트워크 보안/네트워크
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>
이 설정을 통해 다음과 같은 과정이 진행된다
- IKE_SA_INIT: 초기 SA(Security Association) 교환이 수행되고, NAT 탐지 및 키 교환
- IKE_AUTH: 클라이언트와 서버가 인증을 완료하고 가상 IP 할당이 진행
- 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]