OpenVPN 구성 방법

OpenVPN 구성 방법

  


OpenVPN 구성 방법


사용 환경은 아래와 같습니다.


CentOS 8.2 에서 구성하였습니다.

해당 문서를 작성하며 그대로 따라해보며 2020년 810일자 작동여부 테스트 하였습니다.

버전 선택 이유는 OS EOL가 도달하게 되면 보안패치가 되지 않기 때문에

최신 버전을 선택 하였습니다.


네트워크 환경은 아래와 같습니다.

192.168.111.129를 방화벽에서 공인IP에 tcp 10440 port를 포워딩 하여 사용합니다.

따라서 클라이언트 파일 배포시 VPN서버와 매핑된 공인 IP와 포트를 내장하여 배포합니다.


selinux permissive 모드로 하였습니다.

selinux 설정을 바꿔주시고 재부팅은 번거로우니

setenforce 0 해주시면 됩니다.



[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum -y install openvpn* easy-rsa
[root@localhost ~]# yum -y install libgcrypt libgcrypt-devel gcc-c++ google-authenticator

[root@localhost ~]# cd /usr/share/easy-rsa/3.0.7/
[root@localhost 3.0.7]# cp /usr/share/doc/easy-rsa/vars.example vars
주석 해제  알맞게 수정

[root@localhost 3.0.7]# vi vars

엄청나게 많은 것들이 나오는데요

 필요없고

:$ 입력하여

 마지막으로 가줍니다.

위와 같이 커서가  마지막으로 이동 됩니다.


아래는 예시입니다주소는 자신에게 맞게 입력해주세요

(대충 입력해도 사실 작동에 상관은 없습니다.)
set_var EASYRSA_REQ_COUNTRY "KR"
set_var EASYRSA_REQ_PROVINCE "Seoul"
set_var EASYRSA_REQ_CITY "Songpa-gu"
set_var EASYRSA_REQ_ORG "hope201"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "hope201"

vpn 접속에 사용  인증서를 만들어야 합니다.
[root@localhost 3.0.7]# ./easyrsa init-pki




[root@localhost 3.0.7]# ./easyrsa build-ca nopass
서버이름 ( 기본으로server라고입력하였어요)


[root@localhost 3.0.7]# easyrsa gen-req server nopass





[root@localhost 3.0.7]# ~]#./easyrsa sign-req server server

중간에 yes 라고 입력  엔터 칩니다.


[root@localhost 3.0.7]# ./easyrsa gen-dh

 작업은 사양에 따라 시간이 소요됩니다.

DH parameters of size 2048 created at /usr/share/easy-rsa/3.0.7/pki/dh.pem

라고 찍힐때까지 기다려주세요~




[root@localhost 3.0.7]# openvpn --genkey --secret /usr/share/easy-rsa/3.0.7/pki/ta.key

[root@localhost 3.0.7]# cd pki/

[root@localhost pki]# cp ca.crt /etc/openvpn/
[root@localhost pki]# cp dh.pem /etc/openvpn/
[root@localhost pki]# cp ta.key /etc/openvpn/
[root@localhost pki]# cp private/server.key /etc/openvpn/
[root@localhost pki]# cp issued/server.crt /etc/openvpn/

 

[root@localhost pki]# cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server.conf

[root@localhost pki]# cd /etc/openvpn


다음은 server.conf 입니다가장 중요한  입니다분량이 많으니 쪼개서 설명드립니다.


[root@localhost openvpn]# vi server.conf

  설정파일인데 주석이 대부분이고 주석처리된 부분은 기본값이거나 다른 값이 활성화가
되어 있습니다. (#붙여도 주석처리판정이고 붙여도 주석처리판정입니다.)

위와 같은 부분을 저는 TCP 설정  것입니다.

따라서 아래와 같이 수정합니다.

(포트 번호는 자유입니다 부분이 openvpn 장점입니다원하는 포트를 사용할  있어요.)
port 10440

# TCP or UDP server?
proto tcp
;proto udp

;dev tap
dev tun

;dev-node MyTap



인증서 부분 설정입니다.


이렇게 설정되어 있는 부분


ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key # This file should be kept secret
dh /etc/openvpn/dh.pem

dh2048-> dh 변경되었습니다.



아래는 이렇게 설정되어 있는거 그냥 두셔도되요

10.8.0.0 IP부분은 VPN 클라이언트들의 가상IP대역이  부분입니다.
;topology subnet.
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

;server-bridge 10.8.0.1 255.255.255.0 10.8.0.6 10.8.0.100

;server-bridge




다음 추가  부분은 route입니다여기가 매우 중요합니다.


push "route 192.168.111.0 255.255.255.0"


위와 같이 작성 합니다.

그렇게되면 vpn client 외부에서 들어왔을  192.168.111.0/24 대역 모두 통신이 가능합니다.


아래 옵션들은 따라해주시면 됩니다.
DNS주소도 자유입니다. VPN client들이 할당 받을 DNS서버입니다.
;push "route 10.8.0.0 255.255.255.0"

;client-config-dir ccd
;route 192.168.111.0 255.255.255.0
;route 10.8.0.0 255.255.255.0

;client-config-dir ccd
;route 10.9.0.0 255.255.255.252

;learn-address ./script
push "redirect-gateway def1"
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 # 클라이언트 접속시 ta.key 사용  것인지 선택입니다.
cipher AES-256-CBC
;compress lz4-v2
;push "compress lz4-v2"

;comp-lzo

max-clients 100 # ;  풀고 최대 동접자를 입력한 숫자만큼 제한 합니다.
user nobody
group nobody
persist-key
persist-tun
status /etc/openvpn/openvpn-status.log
log /etc/openvpn/openvpn.log
log-append /etc/openvpn/openvpn.log
verb 3

;mute 20
#explicit-exit-notify 1
client-cert-not-required 

#클라이언트사용자가 클라이언트의 인증서 사용 없이 ca.crt 가지고 인증하려고  

plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn

구글 OTP 사용하기 위한 부분 입니다.

reneg-sec 14400

#아래는 14400  이후 재인증을 요구하는 설정이며 clinet.ovpn에도 똑같이  아래줄에 추가하심됩니다. 설정하지 않으면 1시간마다 연결끊고 재연결 요청합니다.


이로서 server.conf 설정이 끝났습니다.

다음은 방화벽 부분 입니다.

[root@localhost openvpn]# firewall-cmd --permanent --zone=public --add-port=10440/tcp
[root@localhost openvpn]# firewall-cmd --permanent --add-service openvpn
[root@localhost openvpn]# firewall-cmd --add-masquerade
[root@localhost openvpn]# firewall-cmd --permanent --add-masquerade
[root@localhost openvpn]# firewall-cmd --query-masquerade
[root@localhost openvpn]# firewall-cmd --reload

[root@localhost openvpn]# vi /etc/sysctl.conf
net.ipv4.ip_forward=1


[root@localhost openvpn]# sysctl -p

 

위와 같이 나와야 합니다!


[root@localhost openvpn]# systemctl start openvpn@server

centos8 에서 셋팅하시면 위와 같이 안됩니다..

파일이  만들어져 있더라구요..

해결책은 아래와 같습니다.

[root@localhost openvpn]# vi /usr/lib/systemd/system/[email protected]

아래와 같이 작성 합니다.

[Unit]

Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I

After=network.target


[Service]

Type=notify

PrivateTmp=true

ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf


[Install]

WantedBy=multi-user.target


재부팅 한번 하겠습니다.

[root@localhost openvpn]# reboot


[root@localhost ~]# systemctl start openvpn@server


10440포트가  있는 것을   있습니다.


다음은 Openvpn OTP 붙이는 작업 입니다.

VPN 외부에서 접속하는  만큼 모든 사용자들이 좋은 보안 환경에서 접속하는 것이 아닙니다.
따라서 키로거가 깔려있어서 PW 유출되어도 괜찮은 OTP 생각하게 되었습니다.



[root@localhost openvpn]# cd

[root@localhost ~]# vi /etc/pam.d/openvpn


auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth required pam_google_authenticator.so
account required pam_nologin.so
account include system-auth


위처럼 채워 넣어 주세요.

이제 useradd 사용할 계정

 

예시

[root@localhost ~]# useradd testuser1

[root@localhost ~]# su - testuser1

[testuser1@localhost ~]$ google-authenticator

 

Do you want authentication tokens to be time-based (y/n) y

Warning: pasting the following URL into your browser exposes the OTP secret to Google:

  https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/[email protected]%3Fsecret%3D6CP3EFZCUZHNWMXJF3TZK3LF%26issuer%3Dlocalhost.localdomain

Failed to use libqrencode to show QR code visually for scanning.

Consider typing the OTP secret into your app manually.

Your new secret key is: 6CP3EFZCUZHNWMXJF3TZK3LF

Enter code from app (-1 to skip): -1

Code confirmation skipped

Your emergency scratch codes are:

  42220289

  42508946

  89068009

  17652823

  70626295


Do you want me to update your "/home/testuser1/.google_authenticator" file? (y/n) y


Do you want to disallow multiple uses of the same authentication

token? This restricts you to one login about every 30s, but it increases

your chances to notice or even prevent man-in-the-middle attacks (y/n) y


By default, a new token is generated every 30 seconds by the mobile app.

In order to compensate for possible time-skew between the client and the server,

we allow an extra token before and after the current time. This allows for a

time skew of up to 30 seconds between authentication server and client. If you

experience problems with poor time synchronization, you can increase the window

from its default size of 3 permitted codes (one previous code, the current

code, the next code) to 17 permitted codes (the 8 previous codes, the current

code, and the 8 next codes). This will permit for a time skew of up to 4 minutes

between client and server.

Do you want to do so? (y/n) y


If the computer that you are logging into isn't hardened against brute-force

login attempts, you can enable rate-limiting for the authentication module.

By default, this limits attackers to no more than 3 login attempts every 30s.

Do you want to enable rate-limiting? (y/n) y


 읽으면서 y눌러주세요


발급해 드릴 사용자에게

https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/[email protected]%3Fsecret%3D6CP3EFZCUZHNWMXJF3TZK3LF%26issuer%3Dlocalhost.localdomain

(임으로 링크는 손상시켜서 나오지 않습니다직접 해보시면 위와 같은 링크로 접속시 QR코드가 나옵니다. )


저기 나온 URL 또는 6CP3EFZCUZHNWMXJF3TZK3LF 값을 보내 드리면 됩니다.


 왼쪽은 플레이 스토어 검색 결과 오른쪽은 어플 실행 화면 입니다.


어플레케이션 실행  등록에서 QR 코드 스캔에서 해당화면 찍으시면됩니다.


아니면 설정  입력을 선택하여 입력합니다.

설정  입력을 개인적으로 권장하지는 않습니다.
왜냐하면 사용자가 오타로 입력해 놓고 10 넘게 다시 입력해도 안된다고 클레임 들어오는 경우가 있었습니다직접가서 제가 .. 입력해보니  되더라구요.


저는 사용자에게 해당 QR코드를 캡쳐해서 보냈습니다.



그렇다면 사용자에게 드릴 정보는 서버에서 생성된 ca.crt 파일과 client.ovpn입니다.

그럼 client.ovpn 설정가이드가 이어 지겠습니다.

https://openvpn.net/community-downloads/

 사이트에서 환경에 맞으시는거 다운 받으시면 됩니다.

저는 윈도우10이라서 win10.exe써있는 부분있는걸 받았습니다.

설치체크박스화면은기본값으로위와같이그냥두면됩니다.


설치를 하시고 보면

C:Program FilesOpenVPNsample-config

해당 경로에 client.ovpn 파일이 있습니다.

메모장으로 열고 #설명 부분 제외하고 나머지 부분을 아래와 같이 설정 합니다.

;------------------------------------------------------------------------------------------------

client

;dev tap

dev tun

;dev-node MyTap

proto tcp

;proto udp

remote 맵핑된 공인 IP주소 10440

#예들들면 remote 123.123.xxx.xxx 10440

;remote my-server-2 1194

;remote-random

resolv-retry infinite

nobind

;user nobody

;group nobody

persist-key

persist-tun

;http-proxy-retry # retry on connection failures

;http-proxy [proxy server] [proxy port #]

;mute-replay-warnings

ca ca.crt

remote-cert-tls server

;tls-auth ta.key 1

#서버에서 주석 처리 했었죠~

cipher AES-256-CBC

verb 3

;mute 20

reneg-sec 14400

# 4시간마다 끊기기로 했으니깐요.

--auth-user-pass

패스워드를 물어보겠다는 겁니다.

--auth-nocache

캐쉬없이 하겠다는 겁니다.(어차피 오티피라서 캐쉬남겨봤자 접속안됩니다.)

;------------------------------------------------------------------------------------------------

위에서 처럼 clinet.ovpn파일을 미리 수정해서 사용자에게 같이 배포해 주세요.


이제 마지막입니다.

서버의 /etc/openvpn 있는 ca.crt사용과 아까 설정한 client.ovpn 사용자에게 주고 나서

가이드 입니다.


VPN 사용신청이승인된제공받은ca.crt 파일과 client.ovpn 파일을OpenVPN설치한폴더의하위폴더인config 폴더로복사-붙여넣기를합니다.

기본설치시config 폴더의경로는다음과같습니다.

  • C:Program FilesOpenVPNconfig

OPENVPN GUI실행시킵니다.

트레이아이콘에자물쇠모양이달린아이콘이생겼습니다.

  • 아이콘을 클릭하여 연결을 선택합니다.

  • 로그인창에 사용자ID와 암호(OTP번호)를 입력하고 확인 버튼을 누르면 접속이 됩니다.

서버는 사설IP를 받고 방화벽에서 공인IP에 포트와 함께 NAT시 회사내에서는 접속이 불가하며 외부에서만 접속이 가능합니다.

연결이성공되면할당된 IP 10.8.0.x 보여집니다연결도중창이사라지셨다면연결이성공적으로완료되어창이최소화것으로트레이에서다시아이콘을클릭하면접속창을보실있습니다.




Q. QR코드 링크 잘못 복사했나봐요.. QR코드 웹페이지 링크 다시 보고싶은데
어떻게하면 다시   있을까요 ?!

해당 계정 디렉토리 .google-authenticator 열어보시면 다시 보실  있습니다.


현재  셋팅은 ca.crt인증서와 clinet.ovpn파일로 ID OTP pw 로그인 하는 방식입니다.



Q. 사용자가 client.ovpn 열어서 reneg-sec 14400 이 옵션을 9999999999이렇게주면

4시간이 아니고 무한정 아닌가요? (무한대값은 0주면 됩니다)

아닙니다해당 옵션 건드리면 디폴트값인 3600  끊깁니다.
어떤 사용자분이 4시간마다 끊기는  싫으셔서 고치시고 해보셨는데 1시간뒤에 끊겼습니다.
만약 '우리회사는 안끊기고 계속 유지되는 옵션을 원해요~' 하면 서버에서 해당옵션 0주시고
클라이언트 파일에서도 14400 아닌 0주면됩니다.



Q. selinux 활성화 하고 싶습니다.

  •  semanage port -a -t openvpn_port_t -p tcp openvpn포트명

ex) semanage port -a -t openvpn_port_t -p tcp 10440
 부분 설정해주시고 OTP로그인 시도시 발생하는 문제를
/var/log/message에서 나오는 로그를 보시고 상황에 맞게 해결해주세요.



Q외부 사설망에 서버를 두고 거기 서버를 회사에서 들어가고 싶어요.

  •  server.conf  보시면 clinet-to-client 옵션이 주석해제되어있고둘다 vpn 접속되어있다면
    해당 클라이언트와 통신이 가능합니다.



Q. 사용자들에게 일정기간 이후 계정 만료 정책을 적용하고 싶습니다.

  •   문제는 스크립트 짜셔서 일정 기간 이상 지나면 .google_authenticator 파일을
    .google_authenticator.expire으로 변경한다거나 방식으로 사용   있습니다.



Q. 일부사용자들은 연결시간 무한을 주고싶어요..

  •  /etc/openvpn/server.conf  파일 말고

server2.conf 만드시고 가상 IP 10.8.0.0 대신 다른 것을 사용하고
포트 또한 겹치지 않게 다른 것을 사용  
server2.conf원하는 설정을 집어 넣고
systemctl start openvpn@server2 하시면 데몬을 하나  띄울  있습니다.


Q. 각 클라이언트별로 서로 다른 인증서를 발급하여 접속하게 하고 싶습니다.

  • conf 와 .ovpn파일에 client-cert-not-required  옵션을 지우고
    검색해보시면 클라이언트 인증서 생성하는 스크립트나 방법들이 잘 나와 있습니다.
    해당 방법대로 클라이언트 인증서를 생성하여 각각 클라이언트들에게 서로 다른 인증서로 접속하게 할 수
    있으며 인증서 발급시 만료날짜도 설정할 수 있습니다.
    처음 접하시는 분들에게는 이것까지 하면 머리아프실까봐 추가하지 않았습니다.

12개의 댓글이 있습니다.

3년 이하 전

선생님 OpenVPN 구축에 큰 도움이 되었습니다.

감사합니다 :)

Reply

3년 이하 전

보내주신 메시지 이제보았습니다.
계정 중복로그인은 옵션으로 방지할수있습니다.
해결하셨는지요

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

1st 5stars

3년 이상 전

openvpn 관련 글을 올려 주셨네요~
이제야 이글을 봤습니다~ ^^
참고할께요.
도움이 많이 될 거 같습니다.

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

3년 이상 전

설정부터 접속 하는 부분까지 정말 상세 정보네요
그리고 마지막 QnA까지 좋은 정보 감사합니다

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

3년 이상 전

좋은정보 감사드립니다.....^^~

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

3년 이상 전

와.. 감사합니다...

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

3년 이상 전

한번에 다 못봤네요. 상세한 소개 감사합니다~

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

3년 이상 전

감사드립니다

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

3년 이상 전

와, 과정을 아주 상세하고 남겨놓으셨네요. 몇년 뒤에 다시 설치해도 문제 없이 따라 하겠어요. 감사합니다.

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

3년 이상 전

우와 너무 상세해서 시간나면 한번 따라해봐야겠습니다
감사합니다~

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

3년 이상 전

좋은 정보 감사드립니다.

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

3년 이상 전

OpenVPN 사용시 많이 도움 되겠네요.
감사합니다.

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입