본문 바로가기

시스템/OpenVPN

[OpenVPN] Server 구축 및 Client.ovpn 생성(인증서 기반) (1)

반응형

 

설치


  • CentOS7 x86_64
  • 설치는 패키지 관리자로 설치
yum install epel-release
yum install openvpn easy-rsa

 

Server Config


  • 인증서 기반 접속 서버 설정
vim /etc/openvpn/server.conf 

## Start of server.conf##
## openvpn 바인드 포트
port 21194

## Protocol 종류(Tcp/Udp 지원)
proto tcp

## 터널링시 os상 생성 될 interface 이름
dev tun

## TLS 설정
tls-server
tls-auth /etc/openvpn/easy-rsa/pki/ta.key
key-direction 0
auth SHA512
cipher AES-256-CBC

## 터널링에 사용될 IP 대역
server 10.1.0.0 255.255.255.0
## ipp.txt에 연결되었던 client의 할당 IP 정보 기록. 추후 접속에도 같은 IP 할당
ifconfig-pool-persist ipp.txt

## Client 연결 후 Client에 추가할 라우틸 테이블
push "route 10.1.0.0 255.255.255.0 "
push "route 172.16.10.0 255.255.255.0 "
## DNS
push "dhcp-option DNS 172.16.10.21"

## 만약 Client 가 모든 트래픽을 openvpn 으로 보낸다면 아래와 같이 설정
#push "redirect-gateway def1"

## 중복 로그인 허용
#duplicate-cn

## Ca Key 위치
ca   /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key  /etc/openvpn/easy-rsa/pki/private/server.key
dh   /etc/openvpn/easy-rsa/pki/dh.pem

comp-lzo
keepalive 10 60
ping-timer-rem
persist-tun
persist-key

status /var/log/openvpn-status.log
verb 3

## 세션 종료 및 상태를 확인 하기 위한 management 포트 설정
management localhost 10921

## 서비스 로그 설정
log-append /var/log/openvpn/openvpn-service.log
log /var/log/openvpn/openvpn.log

## 기본적으로 openvpn인증을 pam 인증 하기 위한 모듈 위치 지정
#plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login

#client-cert-not-required
#username-as-common-name

##End of server.conf##

 

KEY 생성


  • 관리를 용이하게 하기 위해 easy-rsa 키 디렉토리를 openvpn 디렉토리로 복사
> mkdir /etc/openvpn/easy-rsa
> cp -arf /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa

 

vars 작성

> vim /etc/openvpn/easy-rsa/vars 

export KEY_COUNTRY="KR" 
export KEY_PROVINCE="Soeul" 
export CITY="GANGNAMGU" 
export ORG="ploz.tistory.com"
export KEY_EMAIL="ploz@ploz.com" 
export KEY_OU="ploz-group" 
export KEY_NAME="TEST" 
export KEY_CN="OPENVPN"
  • vars 적용
> chmod u+x /etc/openvpn/easy-rsa/vars 
> source /etc/openvpn/easy-rsa/vars

 

PKI 초기화

> /etc/openvpn/easy-rsa/easyrsa init-pki

 

CA key 생성

> cd /etc/openvpn/easy-rsa
> ./easyrsa build-ca

...

## CA 패스워드 입력
Enter New CA Key Passphrase: 
Re-Enter New CA Key Passphrase: 
...
Your new CA certificate file for publishing is at:
# 아래 경로에 ca key 생성 됨
/etc/openvpn/easy-rsa/pki/ca.crt

 

SERVER Key 생성

> cd /etc/openvpn/easy-rsa
# nopass로 패스워드 입력 없이 진행 가능
> ./easyrsa build-server-full server [nopass]

...
## SERVER Key 패스워드 입력
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

...

## ca key 생성 시 입력했던 CA 패스워드 입력
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
...

Write out database with 1 new entries
Data Base Updated

 

  • server key는 아래 경로에 생성됨
> ls -al /etc/openvpn/easy-rsa/pki/issued

-rw------- 1 root root 4523 Jan 27 15:59 server.crt

> ls -al /etc/openvpn/easy-rsa/pki/private

-rw------- 1 root root 1834 Jan 27 15:59 server.key

 

DH 생성

> cd /etc/openvpn/easy-rsa
> ./easyrsa gen-dh

# 확인
> ls -al /etc/openvpn/easy-rsa/pki
...
-rw------- 1 root root  424 Jan 27 16:02 dh.pem
...

 

TA Key 생성

openvpn --genkey --secret /etc/openvpn/easy-rsa/pki/ta.key

 

Client Key 생성

# easyrsa build-client-full [user name] [nopass]
> ./easyrsa build-client-full test1 nopass

...
## CA 패스워드 입력
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:
...
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'test1'
Certificate is to be certified until May  1 09:00:43 2024 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

 

Server 실행


포그라운드 실행

> /usr/sbin/openvpn --config /etc/openvpn/server.conf 
## server key 패스워드 입력
Enter Private Key Password: **********

 

 

Systemd 사용

  • systemd 설정
> cat /usr/lib/systemd/system/openvpn-server\@.service 
[Unit]
Description=OpenVPN service for %I
After=syslog.target network-online.target
Wants=network-online.target
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO

[Service]
Type=notify
PrivateTmp=true
WorkingDirectory=/etc/openvpn
ExecStart=/usr/sbin/openvpn --status %t/openvpn-server/status-%i.log --status-version 2 --suppress-timestamps --config server.conf
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE CAP_AUDIT_WRITE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
ProtectSystem=true
ProtectHome=true
KillMode=process
RestartSec=5s
Restart=on-failure

[Install]
WantedBy=multi-user.target

 

  • 실행
> systemctl restart openvpn-server\@server
# server private key 입력. nopass 옵션으로 서버키를 생성한 경우 예외
Enter Private Key Password: **********

 

  • Server Key password가 틀린경우 아래와 같이 process 가 뜸
> pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
    ...
        ├─openvpn───systemd-ask-pas
 ...

# ps
dbus        546  0.0  0.0  58336  2584 ?        Ss   Feb12   0:12 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation

 

  • Server Key password 재입력
# 하기 메세지가 터미널에 표출 됨
Broadcast message from root@OPENVPN (Mon 2022-02-14 21:02:46 KST):

Password entry required for 'Enter Private Key Password:' (PID 85557).
Please enter password with the systemd-tty-ask-password-agent tool!

# 아래 명령으로 password 재입력
> systemd-tty-ask-password-agent 
Enter Private Key Password: ******

 

  • Server Key password 없이 재시작 하려면 server.conf에 아래와 같이 설정을 추가 후 재시작
> vim /etc/openvpn/server.conf
...
askpass pass.txt
...

> vim /etc/openvpn/pass.txt
<server private key password>

 

반응형