이전 글에서는 VPN서버를 구축할려다가 공유기의 내부 기능이 있는걸 뒤늦게 발견해서 그냥 흐지부지하게 끝났다.
하지만 이번에는 VPN서버를 끝까지 구축을 하고, 왜 공유기의 내부 기능을 사용 안하는지, 내가 구축한 VPN 서버를 사용하는지 설명하겠다. 최종적인 결과로는 잘 작동하고 내가 원하는 기능까지 잘 되고 있다
VPN서버의 종류
VPN서버에서는 여러가지 종류의 VPN 종류가 있다. 이중에서 3가지의 종류를 알아볼려고 한다.
일단 대중적으로 알려진 VPN 종류는 5개만 보면 된다.
IKEv2, IPsec, L2TP, PPTP, SSTP 이렇게 있다.
IPsec
IPsec은 Internet Protocol secutiry의 줄임말로 네트워크 계층에서 사용되는 프로토콜이다.
네트워크 계층에서 사용되는 프로토콜이기 때문에 데이터 암호화가 좋다. 프로토콜이기 때문에 단독으로 사용가능하지만, 다른 부가적인 요소와 혼합해서 사용되기도 한다. 때문에 탁월한 보안을 제공하여 보안에 민감한 사람한테는 좋은 선택지이다.
단점으로는 네트워크 계층에 보안이 좋기 떄문에 그만큼 설정이 복잡하기도 하고 설정에 따라 연결이 안될수도 있지만, 당신이 잘만 한다면 100% 프리패스이다.
IKEv2
VPN 연결 설정 프로토콜이다. 이것도 보안이 좋고, 클라이언트를 잘 가리지도 않으며 호환성이 좋다. 보통 IKEv2+IPsec과 혼합해서 강력한 보안성을 제공해주며, 빠른 속도를 보장해준다.
그게 끝임.
L2TP
터널링 프로토콜이라고 불린다. 이는 자체적으로 제공해주는 보안성은 없으며, 이를 보안하기 위해 IPsec과 혼합이 가능하다. 또한 다양한 클라이언트를 지원하지만, 속도가 IKEv2에 비해 느리며, 설정 또한 복잡하다
물론 난 안해봐서 모름..... 누군가 그러더라...
PPTP
이것도 L2TP와 동일하게 터널링 프로토콜이다. VPN중에서 오래된 VPN이며, 암호는 제공하지만 낮은 수준의 보안을 제공해준다.
설정은 매우 간단하지만, 암호가 낮은 탓에 그리 딱히 선호하지는 않는다. 그럴거면 IKEv2를 쓰지....
SSTP
SSL/TLS의 기반 VPN이다. TCP443을 사용하지만, 크나큰 기능이 있어 지나가던 시골 잡종개 누렁이도 피식 웃으면서 똥싸지르는 엄청난 기능을 제공해준다.
MicroSoft에서만 씀ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
맥? 아이폰? 안드로이드? 까@는 소리하네ㅋㅋㅋㅋㅋ 얘네들은 연결 안됨ㅇㅇ
IKEv2 방식의 VPN 설정
우분투에 IKEv2 VPN 서버를 구축할거다.
그렇게 되면 당신도 보안 튼튼 엄청난 VPN서버를 구축할 수 있다 !
물론 내꺼 보고 따라하지는 말고 걍 다른 사람 게시글 보고 하셈
우선은 필요한 패키지를 다운 받아서 설정해줘야 한다.
sudo apt-get install strongswan strongswan-pki libcharon-extra-plugins -y
sudo : 관리자 권한으로 실행
apt-get : 우분투를 비롯한 데비안의 패키지 설치 명령어(자동 설정까지 따따봉)
install : 설치
strongswan : strongswan 패키지 설치
strongswan-pki : strongswan-pki 패키지 설치
libcharon-extra-plugins : libcharon-extra-plugins 설치
strongswan은 오픈소스 IPsec 기반 VPN이다. 네트워크 트래픽을 암호화하여 안전하게 전송해주는 녀석이다
내가 진행하는 IKE방식을 지원하고, 다양한 인증 방식 또한 지원해준다. 뿐만 아니라 정책 기반 및 터널 기반 암호화도 가능하다
strongswan -pki는 strongswan에 내장된 PKI 관리 도구이다. PKI는 Public Key Infrastructure의 줄임말이다. 즉, VPN과 클라이언트간의 신뢰할 수 있도록 도와주는 녀석이다,
libcharon-extra-plugins는 strongswan의 확장형 플러그인이다. 다양한 기능을 추가적으로 사용 가능하게 해준다
이렇게 하면 IKE방식의 VPN 서버 가동에 필요한것들을 모두 완료가 된 상태이다.
이제 추가적인 설정과 인증서, 사용자 생성, 아이피 할당, 라우팅 등 설정을 해줘야 한다
VPN서버에서 사용 할 인증서 발급 후 적용
이게 제일 중요하다. 이거는 인증서를 제대로 해야 클라이언트와 신뢰하는 사이 좋은 이웃이 된다.
그래서 가능하면 원콤에 바로 끝내면 좋은 방법중 하나이다.
나는 Let's Encrypt라는 서비스를 이용하여 강력하고 간편하고 무료로 인증서를 발급할거다.
만약 Let's Encrypt가 없다면 우분투에서 설치를 진행해주면 된다.
#certbot 설치
sudo apt install certbot -y
#certbot을 이용한 인증서 발급 받기
sudo certbot certonly --standalone -d veno.kr
certbot은 let's Encrypt를 통해 인증서를 발급받기 위한 방법이다.
certbot을 사용하기 위해서는 웹서버 프로토콜인 80번이 동작해야 하는 준비가 되어있어야 하고, certbot을 실행하는 순간 내 서버의 80번 포트를 통해 내 도메인 기준으로 하나의 인증서가 만들어지게 되는거다.
뒷쪽 도메인은 내 서버를 뜻하는 도메인을 넣어줘야 하고 나중에 인증서가 발급되면 중요한 CN이름이 해당 도메인으로 들어가게 된다.
그렇게 되면 인증서가 만들어지는데 이때 경로는 아래와 같다.
/etc/letsencrypt/live/veno.kr/fullchain.pem
/etc/letsencrypt/live/veno.kr/privkey.pem
fullchain.pem파일은 내 서버가 진짜 veno.kr이 맞냐? 라는 어처구니 없는 질문에 증거형식으로 내밀어주는 인증서이다.
클라이언트가 "님 베노임?" 이러면 신원 미상의 서버가 "ㅇㅇ 내가 찐임" 이럴 경우 클라이언트는 "구라 치고 있네ㅋㅋㅋ 증거 대봐" 이럴 경우 fullchain.pem인증서를 떡하니 내밀어주면 클라이언트는 "진짜네...." 이러면서 믿게 된다. 이는 당연히 80포트를 통해 내서버가 veno.kr이다! 라고 명령해서 certbot으로 만들어진거기 때문에 뺴도박도 못하는 상황인거다.
privkey.pem파일은 외부로 유출 되면 안되는 중요한 파일이다. 이 파일은 클라이언트가 보낸 데이터를 복호화 해주거나, 서버가 보내주는 데이터를 서명을 할때 쓰이는 중요한 파일이다. 즉, 클라이언트가 내 서버한테 데이터를 보낼때 암호화 해주거나 서버가 보내는 데이터를 "ㄹㅇ 데이터임 구라 아님ㅎㅎ"을 증명해주는 핵심적인 파일이다.
그래서 저 두개의 파일은 1:1매칭이 가능한 파일이다.
저 두개의 파일을 가지고 올바른 위치에 넣어주면 된다.
이제 IKE VPN서버에 해당 인증서를 넣어주고, 서버에 대한 설정을 진행해줘야 한다.
나는 아래와 같이 설정했다.
ipsec.conf
config setup
uniqueids = never
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
#암호화/ESP 정책 지정
ike=aes256-sha256-modp2048,aes128-sha256-modp2048,3des-sha1-modp1024,aes256-sha256-modp1024
esp=aes256-sha256,aes128-sha256,3des-sha1
dpdaction=clear
dpddelay=300s
rekey=no
#서버측 설정
left=%any
leftid=veno.kr
leftcert=leftcert=인증서경로.crt
leftsendcert=always
leftsubnet=0.0.0.0/0
#클라이언트측 설정
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=192.168.0.200-192.168.0.210
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
eap_identity=%identity
맨 첫줄부터 해석에 들어간다면,
config setup
uniqueids = never
config setup : 전역설정이다. strongswan에 대한 전체적인 전역 동작 설정 블록에 해당된다.
uniqueids = never : 같은 사용자가 여러 기기에 접속 할 수 있도록 설정한다.
never는 중복 로그인이 가능하게 만들어준다.
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
#암호화/ESP 정책 지정
ike=aes256-sha256-modp2048,aes128-sha256-modp2048,3des-sha1-modp1024,aes256-sha256-modp1024
esp=aes256-sha256,aes128-sha256,3des-sha1
dpdaction=clear
dpddelay=300s
rekey=no
#서버측 설정
left=%any
leftid=veno.kr
leftcert=인증서경로.crt
leftsendcert=always
leftsubnet=0.0.0.0/0
#클라이언트측 설정
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=192.168.0.200-192.168.0.210
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
eap_identity=%identity
conn ikev2-vpn : ikev2-vpn이라는 이름으로 프로파일 정의를 시작한다. 아래의 내용에 기능을 적용시킨다.
auto=add : 부팅 시 자동적으로 연결은 하지 않으며, 구성만 등록을 한다.
compress=no : VPN 패킷 압축을 비활성화 한다. 만약 켜놓는다면, 보안적으로 취약점이 생길 수 있으니 비활성화를 추천한다.
type=tunnel : 터널 모드를 사용한다. IP해더까지 암호화되어 완전한 네트워크 간 터널이 생성된다.
keyexchange=ikev2 : 키 교환 프로토콜을 IKEv2로 지정한다.
fragmentation=yes : 패킷이 클 경우 조각으로 사용하도록 한다. 방화벽, NAT환경에서 유용하다.
forceencaps=yes : NAT환경에서도 UDP강제로 허용한다. 일부 클라이언트가 연결되지 않을 경우 필수이다.
ike=aes256-sha256-modp2048,aes128-sha256-modp2048,3des-sha1-modp1024,aes256-sha256-modp1024
IKE 단계의 사용할 암호 알고리즘 지정한다. 강력한 AES256, SHA-256 등 다양한 알고리즘을 적용 시킨다.
esp=aes256-sha256,aes128-sha256,3des-sha1 : ESP 단계에서 데이터 암호화에 사용할 알고리즘을 지정한다.
dpdaction=clear : 응답이 없을 경우 연결을 해제 시킨다. 이는 dpdelay의 시간을 받아 주기별로 동작한다.
dpddelay=300s : 주기 시간은 300초(5분)으로 주기를 지정한다.
rekey=no : 자동 재키 교환 방지, 모바일 환경에서 불필요한 재연결 방지를 목적으로 한다.
left=%any : 서버의 IP주소를 자동으로 감지한다. DHCP를 사용한다면 유용하지만, 고정이든 자동이든 상관 없다.
leftid=veno.kr 서버의 식별자이다. 이는 인증서의 CN과 동일해야 한다.
leftcert=인증서경로 : 서버의 인증서 경로이며, 이는 fullchain의 파일로 지정해야 한다.
leftsendcert=always : 서버의 인증서를 클라이언트로 보내준다. 이는 다양한 클라이언트의 호환성을 확보해주기 위함이다.
leftsubnet=0.0.0.0/0 : 클라이언트에게 전체 인터넷 트래픽을 터널링 하도록 지정한다.
right=%any : 클라이언트측의 IP지정이다. any는 어떤 IP로든 VPN에 접근 하도록 한다.
rightid=%any : 클라이언트의 ID 또한 어떤거든 접근 하도록 지정한다.
rightauth=eap-mschapv2 : 인증방식이다. 윈도우, 아이폰, 안드로이드 등 사용자명, 비밀번호 기반으로 인증하는거다.
rightsourceip=192.168.0.200-192.168.0.210 : VPN연결 시 클라이언트한테 IP를 할당해주는 범위를 지정한다.
rightdns=8.8.8.8,8.8.4.4 : 클라이언트가 VPN 연결 중 사용할 DNS 서버를 지정해준다. 나는 구글로 해줬다.
rightsendcert=never : 클라이언트한테 인증서를 요구할것인지 물어보는것인데 난 계정 로그인 방식이라 never
eap_identity=%identity : 클라이언트가 로그인 시 입력한 ID를 EAP 식별자로 그대로 사용한다는거다. EAP 식별자는 밑에 다룬다.
서버 설정이 완료 되었으면, EAP 설정으로 넘어간다.
ipsec.secrets
: RSA "privkey 경로"
유저ID1 : EAP "비번"
유저ID2 : EAP "비번"
유저ID3 : EAP "비번"
유저ID4 : EAP "비번"
간단하다.
RSA는 개인키가 들어가야한다. 경로를 지정해주면 된다.
유저ID 부분에는 사용자의 ID를 지정해주면 되고 EAP 뒷쪽 비번 또한 알아서 비번도 넣어주면 된다. 당연히 영어다.
이거는 VPN 연결시 필요한 계정에 쓰이는 정보들이다.
그런 다음 해당 서버에서 VPN 가동 후 클라이언트들이 서버에 연결 할 수 있게 방화벽에 규칙을 넣어줘야 한다.
sudo ufw allow 500/udp
sudo udw allow 4500/udp
500번은 VPN의 포트, 4500은 NAT 방식을 고려하여 두개를 규칙에 추가한다.
그 다음 공유기나 장비에서 포트포워딩을 추가하면 된다.
서버 보안 범위 지정하기
여기서부터는 선택인데 내가 VPN 서버를 구축하는 이유중 하나는 다른 게시글에서도 적었지만, 여러대의 서버가 있다면, 이 서버들을 관리하기 위해서는 SSH를 열어놨다. SSH는 원격 접속 프로토콜인데 내가 외부(집 밖)에 있을떄 서버가 갑자기 죽었거나, 서버에 문제가 발생하면 외부에서도 접근 가능하게 해놨다. 나는 보안 서버를 하나 지정해서 외부로부터 공격을 방어하고, 보안서버에서 나머지 서버들의 침입탐지 및 침해사고 징조가 있을 경우 해당 서버를 자동적으로 격리시키고 보호하게 해놨다.
로그를 계속 지켜본 결과 미세먼지 나라에서 계속해서 SSH를 뚫을려는 징조가 수차례 포착 되었고, 심지어 SSH 계정을 해킹할려는 시도가 있었다. 물론 뭐 뚫린적은 없기에 큰 문제는 없지만, 언제 뚫릴지 모를 상황이라 VPN 서버를 구축하고, 내부 IP로 접근 가능하게 해 놨다. 그러기 위해서는 VPN서버를 통해 내부 IP를 받은 클라이언트들이 내 서버에 접근 할 수 있도록 VPN 서버에서 해당 조건에 부합하게 만들어야 한다.
그러기 위해서는 VPN 서버 내부에서 포워딩을 해줘야 한다.
sudo vim /etc/sysctl.conf
sysctl.conf는 매우 중요하다. 해당 파일은 리눅스의 커널 동작 방식을 제어하는 설정 파일이므로 수정 전 백업 해 두는것이 좋다.
해당 파일은 네트워크, 보안, 메모리, 프로세스 등 어떻게 동작하게 할 것인지에 대한 정의가 들어가 있다.
net.ipv4.ip_forward=1
해당 매개변수는 VPN 패킷을 내부망으로 전달하게 해 주는것이다. 저장 후 포워딩을 시작한다.
sudo iptables -t nat -A POSTROUTING -s 192.168.0.200/29 -o eth0 -j MASQUERADE
iptables는 리눅스 커널의 Netfilter 프레임워크를 기반으로, IP 패킷을 제어하고 필터링하는 방화벽 관리 도구이다.
ufw는 iptables를 보다 쉽게 다룰 수 있도록 만든 고수준 인터페이스로,주로 포트 단위의 접근 제어를 간편하게 설정할 수 있다.
iptables는 IP와 패킷 단위로 동작하며,ufw는 그 위에서 동작하는 간편한 관리 도구라고 볼 수 있다.
아이피 부분에서는 VPN 연결시 할당해주는 아이피에 대한 범위만 지정하면 된다.
모든 설정 마치고 VPN 서버 가동하면 된다.
sudo ipsec start #VPN 서버 가동
sudo ipsec stop #VPN 서버 중지
sudo ipsec restart #VPN 서버 재시작
끝으로
우선 나는 잘 작동한다. ipTime으로 VPN 기능을 사용할땐 잘 안되었다가 내가 직접 구축하니 잘 된다.
IP도 우리집 공유기의 정보를 잘 끌고오기도 하고, 심지어 내부IP만 접속 가능하게 한 SSH접속도 잘 된다.
처음 구축하는건데 꽤 힘들긴 했다. 계속해서 IKE 서버에서 인증 정보를 가져올 수 없다고 씨부리기도 하고, VPN 서버에서 강렬하게 외부 IP를 거부하길래 개빡쳐서 기판을 한번 핥아보기도 했다.
이전 게시글에서는 ipTIme의 VPN 기능으로 사용 할려 했다. VPN 연결 까지는 완료 되었지만, 내부까지 패킷이 도달하지 않아 SSH 접속에 실패했다. 혹시 "펌웨어 버전이 낮아서 문젠가???" 하고 펌웨어 업데이트를 하니

디자인이 바뀌면서 VPN 서버 설정에 변화가 있다. PPTP는 위에서 적은것처럼 보안에 취약하다.
게다가 아이폰에서는 PPTP 프로토콜이 없다. 애플에서는 이미 눈치 까고 보안에 취약한건 넣을수 없다! 하고 기능을 빼버렸다고 한다.
그래도 바뀐 VPN 서버 기능중에서 L2TP가 왜 없나 하고 찾아봤다.
ipTime의 QnA
질문자1 : 님 펌웨어 업뎃 했는데 왜 L2TP이 없어져있음?
ipTime : 아 그거 그 기능을 넣었더니 공유기가 성능이 딸려서 숨을 껄떡거리던데? 그래서 걍 빼버림ㅋㅋㅋㅋ 꼬우면 비싼거 사시던가ㅋㅋㅋㅋㅋ
질문자2 : 아니 펌웨어 뭔일임;; 다운그레이 가능?
ipTime : 가능은한데 님이 직접 해야 함 그리고 아마 님이 설정한거 다 날아갈걸??? 함 해보셈 우리도 궁금하다ㅋㅋㅋㅋ 함 해보고 알려주셈ㅋㅋㅋ
이상 울며 겨자먹기로 VPN 구축을 개떡같이 한 사람임

'리눅스, 네트워크' 카테고리의 다른 글
| 네트워크 구축 - VPN서버 (0) | 2025.10.19 |
|---|---|
| 네트워크 구축 - 데이터베이스 & VPN 서버 (1) | 2025.10.16 |
| 네트워크 - 서버 업그레이드 (3) | 2025.07.31 |
| 네트워크 구축 1 (0) | 2025.06.01 |
| 메일서버 - 서버에 메일시스템 설치하기 (0) | 2025.01.10 |