VPN 제작

정찬수·2024년 9월 20일
post-thumbnail

안녕하세요, 오늘은 최근 VPN 제작과정에 있었던 일을 포스팅 하고자 합니다.

회사 업무와 관련하여 vpn 요청이 있어 이번에 제작하게 되었어요.

vpn 서비스 자체 제공업체들도 고려를 했었습니다.
찾아보니 ExpressVPN, NordVPN 등 다양한 vpn 서비스 제공업체들이 있더라구요.
헌데 가격이 비싸요 ㅠㅠ.. 다른 업체의 vpn 서비스를 이용하는 것 자체도 문제가 있구요.

그래서 이번 기회에 그냥 vpn 자체 구축을 하게 되었습니다.

최대한 빨리 그리고 최대한 쉽게 하기 위해서 찾아보던 중 오픈소스로 openVPN이 있더라구요.

그래서 openVPN에 대해 조사하니 꽤나 제가 개발해야하는 환경에 맞게 되어 채택하게 되었어요.

우선 제가 개발한 환경에서는 서버가 window 환경이었기에
https://openvpn.net/ 공식 사이트를 통해서 VPN SERVER를 돌리기 위한 파일을 받아서 설치해줬어요.

보니까 애네는 openVPN GUI로 통합관리를 하더라구요.

처음에는 통신을 udp로 설정해서 최대한 연결속도에 관점을 두고 개발하였는데

ISP 에서 udp의 일부 포트를 막아뒀더라구요 허허허...
그래서 그냥 맘편하게 TCP로 바꾸고 인증 및 암호화도 전부 AES-256으로 바꿔 구축했어요

암호화 알고리즘은 Diffie-Hellman 알고리즘 사용해서 공개키로 진행하였습니다.

openVPN의 server 설정을 하려고 보니 CA인증서, server인증서, server키 이렇게 3개가 필요 했어요.

그래서 Easy-RSA로 인증서를 뽑아내려고 했는데 기간설정이나 인증서에 넣어야 할 추가 요구사항이 들어가다보니 좀 더 유연한 인증서 라이브러리가 필요하더라구요

그렇기에 OpenSSL을 사용하기로 하고 설치하였습니다.

인증서 뽑는 건 그다지 어렵지 않았어요.

CA키
openssl genpkey -algorithm RSA -out ca.key -aes256,

CA인증서
openssl req -x509 -new -key ca.key -sha256 -days 3650 -out ca.crt

이런식으로 CA인증서를 간편하게 만들어 낼 수 있으니까요

보시면 아시겠지만 RSA알고리즘 사용하였습니다.

이제 서버인증서를 뽑을 차례인데요. 여기서 서버 인증서의 경우는 CSR(Certificate Signing Request)를 따로 만들어서 서명 처리과정을 거쳐야 해요

그래서
서버키
openssl genpkey -algorithm RSA -out server.key -aes256
뽑아내고
서버 인증서 서명요청 파일
openssl req -new -key server.key -out server.csr
만들어낸 서버키 기반으로 인증서 서명요청 파일 뽑아내구요

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256

이전에 만들었던 서버인증서서명, ca인증서, ca키로 서버 인증서 뽑아내었습니다.

이제 필요한 인증서는 다 뽑아내었으니 openVPN의 server.conf만 수정해서 서버 구동하였어요.

세세하게 server.conf의 수정사항은 클라이언트 ip유지나 서브넷설정, 연결 키핑에 대한 설정, 암호화 방식 설정, 권한 설정 등 전부 처리해서 구동하니 문제없이 잘 동작하더라구요.

이제 서버는 끝났으니 클라이언트 처리해줄 차례인데 https://openvpn.net/ 공식사이트에 제공하는 설치파일 통째로 받는게 아니라 Client전용 프로그램을 따로 제공하더라구요.

그래서 OpenVPN Client만 설치하고 client.ovpn 설정파일 만들어주고 안에 들어가야 할 ca.crt, 클라이언트 인증서, 클라이언트 개인키
클라이언트 인증서, 클라이언트 개인키 의 경우 위와 같이 openSSL로 뽑아주고 설정파일에 넣어주었습니다.

이렇게만 하고 윈도우 방화벽의 인바운드 처리와 포트포워딩 까지 처리해주고 나면 문제없이 vpn이 활성화 되는 걸 확인 할 수 있었어요.

그런데 이렇게 하면 모든 트래픽이 VPN 연결된 곳으로 처리되다 보니 외부인터넷이 안되는 문제가 생겼습니다.

그래서 특정 네트워크만 라우팅처리 해주었어요.
예시 : route 10.10.0.0 255.255.0.0
또한 클라이언트의 DNS서버를 유지시켜야 되서
pull-filter ignore "dhcp-option DNS"
처리해주었구요.
전체 트래픽이 연결된 VPN 으로 라우팅 안되도록
pull-filter ignore "redirect-gateway"
까지 넣어 예외사항 발생에 대해 전부 처리해주었습니다.

이번 VPN 구축을 통해 네트워크 분야와 학부생때 OSI 7계층 봤던게 많이 생각나더라구요.
어렵진 않았는데 처음에 UDP설정하고 1000번대 포트로 연결을 빼두었는데 연결이 계속 안되었거든요 ㅠㅠ.. 결국 확인 해보니 ISP에서 자체적으로 막아둔 거더라구요..........
생각지도 못한 문제였어서 좀 당황했었는데 결국 전체적으로 잘 처리해서 잘 동작했어요.

이번 기회를 통해 네트워크 동작방식이나 트래픽처리에 대해서도 추가적으로 배우게 된 것도 많았고 생각보다 쉬워서 재밌었던 것 같아요.

다음에 시간여유가 되면 제대로 한번 배워보려구요!

여러 다른 개발자들의 velog가 있는데
https://velog.io/@yellowsunn/%EA%B0%80%EC%83%81%EB%A8%B8%EC%8B%A0%EC%97%90-OpenVpn-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0
yellowsunn님의 포스팅이 괜찮더라구요.
혹시 포스팅 보시는 분들 중 자세하게 구축과정이 필요하시다 하면 참고해보시는 거 추천드려요!

**해당 포스팅의 설정은 실제 업무 설정과 다름을 알려드립니다.

profile
Beyond the Best

0개의 댓글