실무를 하면서 VPN을 구축할 일이 생겼습니다.
원격으로 상용서버를 접속 할 때 Any IP를 오픈하면 안되니 하나의 접속 포인트에서 상용서버들을 접속하는게 보안상 안전할 것입니다.
먼저 VPN 서버를 구축 하기 전에 VPN이 뭔지 간단하게 개념을 짚고 넘어가겠습니다.
VPN(가상 사설 네트워크, Virtual Private Network)은 공용 네트워크를 통해 데이터를 전송할 때, 사용자의 연결을 암호화하고 보안을 강화해 주는 기술입니다. 이를 통해 인터넷 연결이 보다 안전해지고, 사용자의 프라이버시를 보호할 수 있습니다.
sudo apt-get install update
sudo apt-get install openvpn easy-rsa# 폴더 생성
mkdir ~/easy-rsa
# 심볼릭 링크 생성
ln -s /usr/share/easy-rsa/* ~/easy-rsa/
PKI란? --> PKI(Public Key Infrastructure)는 공개 키 암호화 기술을 활용하여 네트워크 상에서 보안성과 신뢰성을 제공하는 체계
vars 파일 생성 및 수정
# 폴더로 이동
cd easy-rsa
# vars 파일 생성
vi vars
# 세팅 값 붙여넣기
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

PKI 생성
./easyrsa init-pki
인증서 생성
cd /easy-rsa
./easyrsa build-ca nopass
-> Enter
./easyrsa gen-req server nopass
-> Enter


sudo cp /home/ubuntu/easy-rsa/pki/private/server.key /etc/openvpn/server/
인증서 서명 및 암호화 자료 구성
sudo cp ~/easy-rsa/pki/private/server.key /etc/openvpn/server/
# 인증서 서명
./easyrsa sign-req server server
-> yes
sudo cp ~/easy-rsa/pki/issued/server.crt /etc/openvpn/server/
sudo cp ~/easy-rsa/pki/ca.crt /etc/openvpn/server/

Diffie-Hellman key 생성 및 ta.key 생성
# Diffie-Hellman key 생성
./easyrsa gen-dh
# ta.key 생성
sudo openvpn --genkey --secret ta.key
# ta.key, dh.pem 파일 복사
sudo cp ~/easy-rsa/ta.key /etc/openvpn/server/
sudo cp ~/easy-rsa/pki/dh.pem /etc/openvpn/server/
VPN Clinet 계정 만들기
# 폴더 생성 및 권한 부여
mkdir -p ~/client-configs/keys
chmod -R 777 ~/client-configs
# 계정 인증서 생성
./easyrsa gen-req 유저명 nopass
-> Enter

파일 복사
# 키 파일 이동
sudo cp pki/private/유저명.key ~/client-configs/keys/
# 인증서 생성
./easyrsa sign-req client 유저명
-> yes
sudo cp pki/issued/유저명.crt ~/client-configs/keys/
ta.key 복사
sudo cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo cp ta.key /etc/openvpn/server
sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
# 권한 부여
sudo chmod -R 777 ~/client-configs
Server.conf 수정
# 파일 이동
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server
# Server.conf 수정
sudo vi /etc/openvpn/server/server.conf
server.conf
일부 설정은 제외 하였습니다.
;local a.b.c.d
port 1194
# TCP or UDP server?
;proto tcp
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key # This file should be kept secret
dh /etc/openvpn/server/dh.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
;server-bridge
push "route 192.168.10.0 255.255.255.0"
push "route 192.168.20.0 255.255.255.0"
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 1.1.1.1"
;client-to-client
;duplicate-cn
keepalive 10 120
tls-auth ta.key 0
key-direction 0
cipher AES-256-GCM
auth SHA256
;compress lz4-v2
;push "compress lz4-v2"
;comp-lzo
;max-clients 100
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log
verb 3
;mute 20
explicit-exit-notify 1
#### OTP 설정 ####
reneg-sec 0
plugin openvpn-plugin-auth-pam.so "openvpn login USERNAME password PASSWORD 'verification code' OTP"
verify-client-cert none
username-as-common-name
```
네트워크 구성 변경
sudo vi /etc/sysctl.conf
# 주석 해제
net.ipv4.ip_forward=1

sudo sysctl -p
네트워크 NAT 설정
ip route list default
자신의 인터페이스 nat 설정
vi /etc/iptables/rules.v4
# 추가
##### NAT #####
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens3 -j MASQUERADE
COMMIT

결과확인
iptables -t nat -L

iptables-restore < /etc/iptables/rules.v4OpenVPN 시작
sudo systemctl -f enable openvpn-server@server.service
sudo systemctl start openvpn-server@server.service
VPN 상태 확인
systemctl status openvpn-server@server

Client 추가 구성
# 폴더 생성
mkdir -p ~/client-configs/files
# 샘플 파일 복사
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
sudo vi ~/client-configs/base.conf
자신의 환경에 맞게 base.conf를 수정하시면 됩니다!
Simple Script(make_config.sh) 작성
vi ~/client-configs/make_config.sh
# make_config.sh
#!/bin/bash
# First argument: Client identifier
KEY_DIR=/home/ubuntu/client-configs/keys
OUTPUT_DIR=/home/ubuntu/client-configs/files
BASE_CONFIG=/home/ubuntu/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn
Config file 권한부여
sudo chmod 777 ~/client-configs/make_config.sh
.ovpn 생성
cd /home/ubuntu/client-configs
./make_confing.sh 계정명
ex) ./make_config.sh asher
생성확인(파일 위치)
cd ~/client-configs/files
ll
OpenVPN 다운로드
OpenVPN 바로가기
https://openvpn.net/community-downloads/
.ovpn 파일 위치 변경
C:\Program Files\OpenVPN\config 에 ovpn 이동
OpenVPN 접속

결과화면
