OpenVPN on CentOS 7

https://www.digitalocean.com/community/tutorials/how-to-setup-and-configure-an-openvpn-server-on-centos-7

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

위의 링크를 참고하여 CentOS7 에서 OpenVPN 설치 및 설정했습니다.

준비사항

  • CentOS7
  • 리눅스 관리를 위한 최소한의 설정
  • Epel (Extra Package for Enterprise Linux)

OpenVPN 은 기본 레포지토리에 없으므로 epel 을 추가 후 설치를 진행해야 한다.

# yum install epel-release

OpenVPN 설치

OpenVPN 과 키페어 생성을 위한 Easy-rsa 를 설치한다.

# yum install openvpn esay-rsa

OpenVPN 설정

OpenVPN 설정 파일 저장을 위한 디렉토리를 생성한다.

앞으로 진행되는 모든 설정, 키, 인증서 파일이 아래 디렉토리에 저장된다.

# mkdir /etc/openvpn

OpenVPN 의 설정 예제 파일은 문서 디렉토리에 존재하며, OpenVPN 서버 설정을 위한 “server.conf” 파일을 시작 위치에 복사한다.

# cp /usr/share/doc/openvpn-*/sample-config-files/server.conf /etc/openvpn

복사한 설정 파일을 열어서 몇가지 수정을 한다.

# vi /etc/openvpn/server.conf
.....파일내용
; vpn 에서 사용할 프로토콜
proto udp
; 사용할 가상 인터페이스 타입
dev tun
; 서버에서 사용할 root 인증서, 인증서, 키 파일 경로
ca ca.crt
cert server.crt
key server.key
; diffie hellman 암호화 길이
dh dh2048.pem
; vpn에서 사용할 ip 주소 및 서브넷
server 10.8.0.0 255.255.255.0
; 서버 측 다른 사설 서브넷으로 접근하는 것을 허용하기 위해
; 클라이언트에 라우팅을 push 한다.
push "route 10.8.0.0 255.255.255.0"
; OpenVPN의 모든 트래픽을 리다이렉트하도록 클라이언트에게 알려준다.
;push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 168.126.63.1"
push "dhcp-option DNS 8.8.8.8"
; vpn 클라이언트는 오직 서버만을 인식할 수 있다.
; 아래 주석을 해제하면 클라이언트 들끼리 서로를 인식할 수 있다.
;client-to-client
; OpenVPN 데몬의 권한을 nobody 로 설정한다.
user nobody
group nobody

사용하는 server.conf

port 1194
proto udp
dev tun
# auth
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh2048.pem
# vpn network
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;push “redirect-gateway def1 bypass-dhcp”
push “route 192.168.56.0 255.255.255.0”
;push “dhcp-option DNS 168.126.63.1”
;push “dhcp-option DNS 8.8.8.8”
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
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

인증서 및 키 생성

서버 설정이 완료됐으면, 이제 vpn 연결에서 사용할 키와 인증서를 생성해야 한다.

easy-rsa 는 이 키와 인증서를 생성하기 위한 스크립트를 제공하고 있다.

우선 키 저장을 위한 디렉토리를 생성한다.

# mkdir -p /etc/openvpn/esay-rsa/keys

키와 인증서를 생성하는 스크립트를 복사한다

# cp -rf /usr/share/esay-rsa/2.0/* /etc/openvpn/esay-rsa

키 생성 시 매번 정보를 입력해야 하는데 vars 파일을 수정하여 기본 값을 설정할 수 있다.

# vi /etc/openvpn/esay-rsa/vars
... 파일 내용
... KEY_ 로 시작하는 값을 변경할 것이다.
export KEY_COUNTRY="KR"
export KEY_PROVINCE=""
export CITY="Seoul"
export ORG="TEST"
export KEY_EMAIL="test@gmail.com"
export KEY_OU="TEST"
export KEY_NAME="server"
export KEY_CN="test.example.co.kr"

openssl 버전을 인식하지 못해서 설정이 로딩되지 못하는 것을 막기 위해 openssl 설정파일에서 버전을 제거한다.

# cp /etc/openvpn/esay-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf

키와 인증서 생성을 시작하기 위해서 esay-rsa 디렉토리로 이동하고 새로운 “KEY_” 환경 변수 값들을 source 명령을 사용해서 적용한다.

# cd /etc/openvpn/esay-rsa
# source ./vars

기존 키와 인증서를 정리한다. 모든 키와 인증서가 지워지므로 주의..

# ./clean-all

root 인증서를 빌드할 때 vars 파일에 있는 모든 정보를 입력하도록 물어볼 것이다. 하지만 이미 기본값이 설정되어 있기 때문에 엔터만 누르면 된다.

# ./build-ca

다음으로 서버에서 사용할 서버 키와 인증서를 생성. 다시 한 번 질문하고 엔터를 누를 것이다. 마지막에 “Y” 를 누르면 변경 사항이 적용된다.

# ./build-key-server server

diffie-hellman 키 교환 파일을 생성한다. 아래 명령을 수행하는데 1–2분의 시간이 소요된다.

# ./build-dh

서버 키와 인증서 준비가 완료됐다. 생성된 파일을 OpenVPN 디렉토리로 복사한다.

# cd /etc/openvpn/esay-rsa/keys
# ls -lah
total 60K
drwx------ 2 root root 4.0K Dec 22 08:53 .
drwxr-xr-x 3 root root 4.0K Dec 22 08:51 ..
-rw-r--r-- 1 root root 5.4K Dec 22 08:53 01.pem
-rw-r--r-- 1 root root 1.8K Dec 22 08:51 ca.crt
-rw------- 1 root root 1.7K Dec 22 08:51 ca.key
-rw-r--r-- 1 root root 424 Dec 22 08:53 dh2048.pem
-rw-r--r-- 1 root root 133 Dec 22 08:53 index.txt
-rw-r--r-- 1 root root 21 Dec 22 08:53 index.txt.attr
-rw-r--r-- 1 root root 0 Dec 22 08:51 index.txt.old
-rw-r--r-- 1 root root 3 Dec 22 08:53 serial
-rw-r--r-- 1 root root 3 Dec 22 08:51 serial.old
-rw-r--r-- 1 root root 5.4K Dec 22 08:53 server.crt
-rw-r--r-- 1 root root 1.1K Dec 22 08:53 server.csr
-rw------- 1 root root 1.7K Dec 22 08:53 server.key
# cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

마지막으로 클라이언트에서 사용할 키와 인증서를 생성한다.

각각의 클라이언트마다 다른 키와 인증서를 생성해야 하며, 보안상으로도 그게 좋다.

client_name 은 유일한 이름이여야한다.

# cd /etc/openvpn/esay-rsa
# ./build-key client_name

VPN 을 위한 CentOS 설정

CentOS7 에서 새로운 방화벽인 firewalld 보다 iptables 를 사용해서 라우팅을 설정할 것이다.

iptables 서비스가 설치되어 있는지와 활성화되어 있는지를 확인한다.

iptables 서비스 패키지를 설치.
# yum install iptables-services
firewalld 서비스를 비활성화한다.
# systemctl mask firewalld
iptables 서비스를 활성화한다.
# systemctl enable iptables
firewalld 서비스를 중지한다.
# systemctl stop firewalld
iptables 서비스를 시작한다.
# systemctl start iptables
iptables chain 안의 모든 rule 과 모든 chain 을 삭제한다.
# iptables --flush

포스트라우팅에 masquerade 룰을 추가한다.

테스트 환경의 네트워크는

eth0 — 외부와 연결되는 네트워크 (공인)

eth1 — 내부 서버들과 연결되는 네트워크 (사설)

로 구성되어 있으며, vpn 사용해서 내부 서버에 연결 하는 테스트 환경이다.

# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE
# iptables-save > /etc/sysconfig/iptables

커널의 ip forward 기능을 활성화 한다.

# vi /etc/sysctl.conf
.... 파일 내용.
net.ipv4.ip_forward = 1
# systemctl restart network.service

서비스 시작

systemctl 로 OpenVPN 서비스를 추가하고 시작한다.

# systemctl -f enable openvpn@server.service
# systemctl start openvpn@server.service

서비스가 잘 실행되면 OpenVPN 을 위한 서버쪽 설정은 끝난다.

VPN 클라이언트 설정

클라이언트 운영체제와 상관없이 클라이언트 키와 인증서, root 인증서를 서버로 부터 생성하고 복사해 오면 된다.

클라이언트 키와 인증서를 생성할 때 유일한 이름으로 생성해야 한다.

client 라는 이름의 키와 인증서를 생성한다.

# ./build-key client

생성되는 클라이언트 키와 인증서, root 인증서를

/etc/openvpn/esay-rsa/keys/client.crt
/etc/openvpn/esay-rsa/keys/client.key
/etc/openvpn/esay-rsa/keys/ca.crt

클라이언트로 복사한다.

클라이언트에는 client.ovpn 이라는 파일을 생성해서, 아래 내용을 붙여넣기 한다.

client
dev tun
proto udp
remote your_server_ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca /path/to/ca.crt
cert /path/to/client.crt
key /path/to/client.key

Plugin

vpn 에 linux pam 인증을 추가하기 위한 모듈 로딩

# mkdir /etc/openvpn/plugin
# cp /usr/lib64/openvpn/plugin/lib/openvpn-auth-pam.so /etc/openvpn/plugin/

server.conf 파일에 아래 내용 추가

plugin /etc/openvpn/plugin/openvpn-pam-auth.so login

클라이언트 설정 파일에 아래 내용 추가

auth-user-pass

그 밖의..

안전한 vpn 서버 관리를 위해서 추가적인 보안 설정 및 키관리가 요구된다.

  • OS 보안 설정
  • 개인의 키 관리
  • 추가 방화벽 설정

이상.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.