티스토리 뷰

보안

openvpn 셋팅 및 운영

초보의 CHOMAN 2015.06.12 10:19

Open VPN (Virtual Private Network)

 

UDP 와 TCP 한 포트를 이용하여 두 지점간 "Symmetric Key"를 이용하여 VPN 암호/복호화 가능

어플리케이션 수준에서 동작 구축이 쉬움

별도의 암호화 모듈 필요없음 (openssl 쓰는듯함)

분리된 두 네트워크를 동일 네트워크에 있는것 처럼 통합 가능

 

 

vpn 이해를 위한 개념도

 



 

 


 

 

 


 

 

VPN 구성 예

서버에 접근하기 위해 VPN 서버를 GATEWAY 라 생각하고 통신하는 형태
파란색 화살표 구간망은 암호화 되어 안전을 확보할수 있다



 

 

2개의 네트웍을 묶어서 서로 간에 암호화 통신하게 함 (큰 기업들 경우?) 인프라넷 개념인거 같기도 함




 



가장 단순한 유형으로 최종 서버단에 VPN을 어플로 셋팅하여 클라이언트와 암호화 통신하는 형태
서버 내부에 사설 아이피가 하나 셋팅되므로 사설로 통신시 암호화 통신이 가능한 형태

 



 

 

어떤 경우는 중국 - 한국 접속이 좋지 않을때 한국 - 중국 간 속도가 제일 잘 나오는 구간에 두고 VPN을 사용하기도 함.

중국 - VPN - 한국 인데 문제는 중국과 한국 속도가 가장 잘 나오는 구간을 찾는게 관건일듯 함.


openssl 설치

그냥 YUM이 간편하다

[root@localhost logs]# yum install openssl openssl-devel



LZO 설치 (암축 및 암호화할때 필요한듯 함)


이건 머 YUM으로 안되네 rpm구해서 깔던가 소스설치해야한다...

wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.04.tar.gz

[root@localhost lzo-2.04]# ./configure
[root@localhost lzo-2.04]# make
[root@localhost lzo-2.04]# make install



openvpn 설치

wget http://swupdate.openvpn.net/community/releases/openvpn-2.1.4.tar.gz

[root@localhost openvpn-2.1.4]# ./configure --prefix=/usr/local/openvpn
[root@localhost openvpn-2.1.4]# make
[root@localhost openvpn-2.1.4]# make install



OpenVPN 내에 인증서 및 키 생성을 쉽게 해주는 스크립트가 있다는데... 소스설치 했을경우는 원본소스쪽에

openvpn-2.1.4/easy-rsa 여기에 있다...

내 서버는 /usr/local/src/openssl-package/openvpn-2.1.4/easy-rsa/2.0/ 여기에 있군... (아마 2.X 대니깐 2.0 이겠지)

vim /usr/local/src/openssl-package/openvpn-2.1.4/easy-rsa/2.0/vars 파일 열고 수정하면 된다 (마지막 라인쯤)

openssl KEY 생성이 아니므로 대충 적어도 되지 않을까 싶긴 한데???

export KEY_COUNTRY="KR"
export KEY_PROVINCE="NA"
export KEY_CITY="POHANG"
export KEY_ORG="kensei.co.kr"
export KEY_EMAIL="
takakocap@kensei.co.kr"



환경변수를 시스템에 저장한다나??? (그냥 하라니깐 한다) 마침표 2개인데 2개 사이에 빈칸 뛰어야 함

[root@localhost 2.0]# . ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/local/src/openssl-package/openvpn-2.1.4/easy-rsa/2.0/keys



기존 인증서 관련 key 값 전체 삭제 (위 환경변수를 시스템에 저장한걸 삭제 할때 쓰는듯함)

[root@localhost 2.0]# ./clean-all
[root@localhost 2.0]#



ROOT CA 생성 (저 위에 환경 변수를 시스템에 저장해서 그런지) 미리 다 되어 있어서 엔터만 입력하거나 내용 입력

인증서는 기본이 유효기간 365일임 (1년) 입니다. 빌드카 하기전에 아래 명령어 한번 처서 동기화 해주고 하자

/usr/bin/rdate -s time.bora.net > /dev/null; clock -r > /dev/null; clock -w > /dev/null


1년을 변경할려면 build_ca 내용중 openssl req -days 360 요 구문을 수정하면 될듯 하다.


[root@localhost keys]# ./build-ca

Country Name (2 letter code) [KR]:KR
State or Province Name (full name) [NA]:POHANG
Locality Name (eg, city) [POHANG]:JANGSUNG
Organization Name (eg, company) [kensei.co.kr]:kensei.co.kr
Organizational Unit Name (eg, section) []:smileserv
Common Name (eg, your name or your server's hostname) [kensei.co.kr CA]:kensei.co.kr
Name []:kensei



다 처 넣고 나면 keys/ 디렉토리 안에 보면 생성된듯 하다...

-rw-r--r-- 1 root root 1419 1¿ù 26 00:27 ca.crt
-rw------- 1 root root 891 1¿ù 26 00:27 ca.key
-rw-r--r-- 1 root root 0 1¿ù 26 00:26 index.txt
-rw-r--r-- 1 root root 3 1¿ù 26 00:26 serial



서버 Key 생성 (VPN 서버에 필요한듯) 대충 암호설정하고 대충 누르면 된다

[root@localhost 2.0]# ./build-key-server server

Common Name (eg, your name or your server's hostname) [server]:server

keys/ 디렉토리안에 생성된듯 하다 (확장자 crt 랑 key는 서버에서만 이용되니깐 유출안되게 한다)

-rw-r--r-- 1 root root 4164 1¿ù 26 00:39 server.crt
-rw-r--r-- 1 root root 790 1¿ù 26 00:37 server.csr
-rw------- 1 root root 887 1¿ù 26 00:37 server.key




클라이언트 Key 생성 (VPN 서버에 접속해서 사용할 애들이 쓸거 같음)

[root@localhost 2.0]# ./build-key client

Common Name (eg, your name or your server's hostname) [client]:client

역시 keys/ 디렉토리 안에 생성된듯 하다 (애내들은 패스워드 입력할때 클라이언트니깐 패스워드 주지 않았다)

crt 랑 key 확장자는 클라이언트들에게 배포하라네..ㅋ

-rw-r--r-- 1 root root 4054 1¿ù 26 00:42 client.crt
-rw-r--r-- 1 root root 765 1¿ù 26 00:42 client.csr
-rw------- 1 root root 887 1¿ù 26 00:42 client.key




Diff Hellman 파라메터 생성 (암호화에 이용)

[root@localhost 2.0]# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.............................................+..................

keys/ 디렉토리 안에 아래 파일 생성 (서버에만 쓴다네)

-rw-r--r-- 1 root root 245 1¿ù 26 00:47 dh1024.pem



클라이언트 KEY들 모아두기

[root@localhost keys]# mkdir /usr/local/openvpn/keys
[root@localhost keys]# mkdir /usr/local/openvpn/keys/client
[root@localhost keys]# cp ca.crt client.* /usr/local/openvpn/keys/client/
[root@localhost keys]# chmod 700 /usr/local/openvpn/keys/client/
[root@localhost keys]# zip client-keys.zip client/*



서버 KEY 도 모아보았다

[root@localhost keys]# cp /openvpn-2.1.4/easy-rsa/2.0/keys/server.* /usr/local/openvpn/keys/server/
[root@localhost keys]# cp /openvpn-2.1.4/easy-rsa/2.0/keys/dh1024.pem /usr/local/openvpn/keys/server/
[root@localhost keys]# cp /openvpn-2.1.4/easy-rsa/2.0/keys/ca.* /usr/local/openvpn/keys/server/



Open VPN 샘플디폴트 설정파일

/usr/local/src/openssl-package/openvpn-2.1.4/sample-config-files/server.conf

대충 찾기 쉽게 복사해보았다...
[root@localhost sbin]# cp /openvpn-2.1.4/sample-config-files/server.conf /usr/local/openvpn/



open vpn 설정 예제

# 접속포트
port 1194
# UDP 권장이라는데 뭐가 좋은가?
proto udp
dev tun
# 인증서들.... 파일이름 정의해주는듯
ca /usr/local/openvpn/keys/server/ca.crt
cert /usr/local/openvpn/keys/server/server.crt
key /usr/local/openvpn/keys/server/server.key # This file should be kept secret 서버의 개인키라 노출 되면 안됨
dh /usr/local/openvpn/keys/server/dh1024.pem
# 사설망 대역 정의
server 10.8.0.0 255.255.255.0
# IP Pool 리스트 현황 로그파일?
ifconfig-pool-persist /usr/local/openvpn/ipp.txt
# NAT 이용시 ROUTE 대역 정의 (쉽게 말해 VPN 서버로 들어오는 애들 대역을 지정해주란뜻인거 같음)
# VPN 모든 클라이언트들은 VPN 서버를 거쳐서 통신이 이루어짐
# 한마디로 클라이언트들은 내외부 통신 모두가 VPN 거쳐서 통신하게 된다는 뜻인듯...

push "route 119.194.229.0 255.255.255.0"
# NAT 이용시 VPN 서버를 통해 외부 인터넷과 통신지원 (위 옵션과 같이 쓰이는듯 함)
push "redirect-gateway def1"
# VPN 사설망 할당시 1차 DNS 자동 할당 아마 클라이언트들이 dhcp로 잡을경우 네임서버 지정인듯
push "dhcp-option DNS 168.126.63.1"
push "dhcp-option DNS 168.126.63.2"
# 사설망 내에 클라이언트 끼리의 통신 지원
client-to-client
# 인증서 하나로 다수 PC 사용 지원
duplicate-cn
keepalive 10 120
# 압축모듈 이용
comp-lzo
# 최대 VPN 연결 클라이언트 수 정의
max-clients 10
persist-key
persist-tun
status /usr/local/openvpn/openvpn-status.log
verb 3
# 실계정 인증 추가
plugin /usr/local/openvpn/openvpn-auth-pam.so login # 실 계정 인증 추가




open vpn client key 와 ID & PASSWD 인증을 같이 사용하기 위해서...

cd /openvpn-2.1.4/plugin/auth-pam

make 하면

openvpn-auth-pam.so 라는 파일 생성된다 

[root@localhost auth-pam]# mv openvpn-auth-pam.so /usr/local/openvpn/ 

위에 server.conf 에 아래와 같이 한줄 추가해주면 된다.

plugin /usr/local/openvpn/openvpn-auth-pam.so login



openvpn에서 모든 클라이언트들이 VPN을 타고 통신을 할려면

서버의 Masquerade 기능이 활성화 되어야 하며

/etc/sysctl.conf 에 net.ipv4.ip_forward = 1 이 되어 있어야 함 

# nat
iptables 상에는 -A POSTROUTING -s 10.1.1.0/255.255.255.0 -i eth0 -j MASQUERADE 요 룰이 있어야 함

-s 10.1.1.0 은 클라이언트들 대역임



일단 세부적인 셋팅은 끝난거 같고....

소스설치를 해서 script 를 찾아봐야 하는데 openvpn 원본소스파일에 script 를 제공하긴 한데...

처음부터 RPM으로 셋팅했으면 바로 적용해 쓸수 있었을듯 하다....

그냥 명령어로 실행해도 될듯 한데...

/usr/local/openvpn/sbin/openvpn --cd /usr/local/openvpn --daemon --config server.conf



일단 서버 셋팅이 끝났으니 우리 클라이언트들은 거의 윈도우쓸것이다 리눅스 쓸수도 있겠지만....

http://openvpn.net 접속해서 윈도우용 openvpn 다운 받아서 설치한다.

설정파일은 샘플꺼 복사해서 수정해서 쓴다.

C:\Program Files\OpenVPN\sample-config\client.ovpn (샘플)
C:\Program Files\OpenVPN\config\client.ovpn (실제 적용되는 설정파일)

C:\Program Files\OpenVPN\config\ (여기에 client.key 등 위에서 만든거 파일 3개 복사한다 클라이언트 용으로)



client.ovpn 예제 (머 대충 위에 서버랑 매칭되면 되는듯 하다.)

client
dev tun
proto udp

remote xxx.110.xxx.88 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
comp-lzo
verb 3
# 인증
auth-user-pass




윈도우즈에서 vpn 접속이 잘 안될때 windows7의 경우 openvpn 실행파일을 관리자 권한으로 실행하면 된다.

vpn 접속시 모든 접속은 VPN 서버를 통해서 들어가고 나오는것이 확인되면 성공이다

 

 

openvpn 설정 예제 (디지문)


 ### OpenVPN Server Config ###

port 60000 # vpn 접속 포트

proto udp # vpn 사용 프로토콜(udp 권장)

dev tun # vpn 장치 타입 선택 : tun/tap

ca ca.crt # 인증서 파일명

cert server.crt # 인증서 파일명

key server.key # 인증서 파일명 (주의 : 보안 철저)

dh dh1024.pem

ifconfig 10.0.0.1 255.255.255.0

server 10.0.0.0 255.255.255.0 # 사설망 IP 대역 정의

ifconfig-pool-persist ipp.txt # IP Pool 리스트 현황 로그파일

client-to-client # 기본적으로 VPN에 연결된 서버와 클라이언트 간에만 통신할 수 있지만 VPN에 접속한 클라이언트끼리도 통신할 수 있도록 허용할지 결정

duplicate-cn # client 인증서 하나로 다수 PC 사용 지원

keepalive 10 120

comp-lzo # LZO 압축 모듈 이용

max-clients 100 # 서버에서 동시에 접속을 받아들일 클라이언트 개수를 지정한다. 별도로 지정하지 않으면 1024가 기본값

persist-key

persist-tun

status openvpn-status # 상태 로그 파일명

verb 3 # Verbose 레벨 정의

plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login

push "dhcp-option DNS 168.126.63.1" # VPN 사설망 할당 시, 1차 DNS 자동 정의

;push "route xx.180.xx.0 255.255.255.224" # NAT이용 시, Route 대역 정의

;push "redirect-gateway def1" # NAT이용 시, VPN 서버를 통해, 외부 인터넷과 통신 지원



 

openvpn 참고 URL

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/System_management/VPN/OpenVPN

'보안' 카테고리의 다른 글

mod_security 문법 예제들...  (0) 2015.06.12
리눅스 보안 설정 스크립트  (0) 2015.06.12
openvpn 셋팅 및 운영  (0) 2015.06.12
edian firewall  (0) 2015.06.12
SNORT SNARF  (0) 2015.06.11
snort 설치 (Centos6)  (0) 2015.06.11
댓글
댓글쓰기 폼
공지사항
Total
671,440
Today
48
Yesterday
158
링크
«   2018/09   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
글 보관함