[Linux/CentOS] OpenVPN을 이용하여, VPN을 구축 해보자. - WEBSHARE

[Linux/CentOS] OpenVPN을 이용하여, VPN을 구축 해보자.

vpn_logo

 

집에 있는 서버 PC를 업그레이드했다.
정확히는 더 좋은 사양의 PC를 하나 둔 것이고,
기존 서버 PC는 홈 서버로서 세컨드로 두고 있다.

문제는 인터넷 회선은 하나인데 두 개를 같이 연결하려는 것!
메인 PC는 랜이 꽂혀있고, 세컨드와 메인은 크로스 케이블로 연결하여 내부 아이피로 잡아 둔 상태다.

문제는 외부에서 세컨드 PC에 접속하는 것인데…
아파치는 프락시를 이용하여 넘겨주면 되지만 기타 서비스는 그러한 방식들이 어렵다.
그렇다고 포트를 이용해서 포워딩 하고 싶은 생각은 그다지 없고…

여하튼 현재 상황에서 PC를 원활하게 연동하는 것은 다소 무리가 있다.
직접 DNS 서버를 꾸리지 않는 이상은 말이다.

이번에 포스팅할 내용은 VPN에 대한 것이다.
VPN으로 네트워크에 접속하여 내부 IP로서 PC들을 제어할 수 있도록 할 것이다.
먼저 VPN을 얘기하자면 복잡하게 얘기할 것 없이, 네이버의 용어 사전을 인용하여


VPN (virtual private network : 가상 사설망)
인터넷망과 같은 공중망을 사설망처럼 이용해 회선 비용을 크게 절감할 수 있는 기업통신 서비스를 말한다.
이런 느낌인데… 음.. 개념은 어렵지 않으니 쉽게 이해할 수 있을 것이다.

이 글을 본 사람은 어차피 대부분 알고 접근한 것일 테니, 본론으로 들어와 본격적인 설치를 진행하겠다.
참고로 운영체제 환경은 Centos7이다.
타 버전에선 확인해보지 못했다.

 

먼저 repository를 추가한다.

$ yum install epel-release

 

이후 openvpn과 easy-rsa를 설치할것이다.

$ yum install openvpn easy-rsa -y

 

설치가 끝나면 다음으로 할 것은 기본적인 openvpn 세팅이다.

# config 파일을 복사 한다.
$ cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn

# conf파일 수정
$ vi /etc/openvpn/server.conf

# 하단의 내용을 주석 해제 한다. (; 제거)
;push "redirect-gateway def1 bypass-dhcp"

# 하단의 내용을 주석 해제 하고 값을 세팅한다. (주소는 하단의 내용 참고)
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"

# 유저와 그룹 주석 해제
;user nobody
;group nobody

# 로그가 쌓이길 원한다면 하단 주석 해제후 경로 지정 (필자는 /var/log/openvpn/openvpn.log로 지정하고 /var/log/openvpn 디렉토리를 생성 하였다)
;log openvpn.log
;log-append openvpn.log

상단의 내용에 보면 DNS 부분을 작성하는 부분이 있는데, 이곳은 자신의 인터넷 통신사의 DNS를 집어넣으면 된다.
만약 자체적으로 DNS 서비스를 운영 중이라면 해당 주소를 넣으면 된다.
만약 그것도 다 모르겠다면 구글 DNS를 집어넣으면 된다.

KT olleh (올레; 구 QOOK(쿡)), KT DNS
기본 DNS 서버 주소 – 168.126.63.1
보조 DNS 서버 주소 – 168.126.63.2

SK Broadband (브로드밴드), SK DNS
기본 DNS 서버 주소 – 210.220.163.82
보조 DNS 서버 주소 – 219.250.36.130

LG U+(유플러스; 구 XPEED 파워콤), LG DNS
기본 DNS 서버 주소 – 164.124.107.9
보조 DNS 서버 주소 – 203.248.242.2

Google Public (구글 퍼블릭)
기본 DNS 서버 주소 – 8.8.8.8
보조 DNS 서버 주소 – 8.8.4.4

 

여기까지 왔으면 기본적인 설치와 세팅은 끝이 났고,
가장 중요한 키를 제작하는 작업을 들어갈 것이다.

 

키 생성 이전에 사전 작업 준비를 한다.

# 디렉토리 생성 및 파일들을 easy-rsa 관련 복사한다
$ mkdir -p /etc/openvpn/easy-rsa/keys
$ cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa

 

그리고 보다 생성을 편하게 키에 관련된 속성값들을 미리 세팅해둔다.
하단의 EMAIL부분이나 ORG부분은 자신에게 맞춰 작성하도록 한다.

$ vi /etc/openvpn/easy-rsa/vars

...

export KEY_COUNTRY="KR"
export KEY_PROVINCE="NA"
export KEY_CITY="Seoul"
export KEY_ORG="example.com"
export KEY_EMAIL="admin@example.com"
export KEY_OU="Community"

# X509 Subject Field
export KEY_NAME="server"

...

# 참고용, 무시 바람
export KEY_CN=openvpn.example.com

...

 

이제 키를 빌드 할 것이다.
먼저 준비 작업

#config 파일을 복사 세팅 한다.
$ cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf

# 경로 이동
$ cd /etc/openvpn/easy-rsa

# 소스 타겟 지정
$ source ./vars

# 키 파일이 생성될 디렉토리를 비운다.
$ ./clean-all

 

키 생성작업 시작, 먼저 ca 빌드, 대략 엔터만 쳐주면 된다.

$ ./build-ca

#대략 아래의 문구들이 지나간다.
Generating a 2048 bit RSA private key
............................................+++
.......................................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
...

Country Name (2 letter code) [KR]:
...

 

다음은 서버 키를 빌드 할 것인데, 여기서 중요한 것! 무의식적으로 엔터만 칠 수가 있는데,
끝에 나오는 질문에 대해 y를 쳐줘야 커밋이 된다.

# 서버 빌드
$ ./build-key-server server

# 대략 내용 지나감
...

# 여기서 y를 쳐주어야 한다!
Certificate is to be certified until Aug 27 10:38:03 2025 GMT (3650 days)
Sign the certificate? [y/n]:y

# 여기서도 마찬가지
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

 

생성한 키들을 토대로 dh를 빌드 한다.

$ ./build-dh

# 대략 길고 긴 작업 진행이 흐른다.
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.............

 

생성한 키들을 openvpn 루트 디렉터리에 복사해두자.

# 이동 및 복사
$ cd /etc/openvpn/easy-rsa/keys
$ cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

 

다음은 클라이언트 연결을 위해 키를 생성하자.
클라이언트도 서버와 마찬가지로 마지막 질문에 y를 답해야  커밋 한다.

# 다시 경로 이동
$ cd /etc/openvpn/easy-rsa

# 빌드
$ ./build-key client

# 서버 키 생성과 같다. y를 눌러 완료
Certificate is to be certified until Aug 27 10:38:03 2025 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

 

기본적인 키 생성은 모두 끝이 났다.
이제 외부에서 접속하여 진입할 시 특정 네트워크로 연동시킬 라우팅 작업을 들어갈 것이다.

여기서 두가지 선택지가 존재한다.

먼저 firewalld를 비활성화 시키고 iptables를 사용하는 방법

# iptable을 설치 한다.
$ yum install iptables-services -y

# 서비스 관련 세팅을 한다.
$ systemctl mask firewalld
$ systemctl enable iptables
$ systemctl stop firewalld
$ systemctl start iptables
$ iptables --flush

# 포워딩 규칙 생성
$ iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

# iptables 세팅값 저장
$ iptables-save > /etc/sysconfig/iptables

# 포워드 활성화
$ vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

 

그리고 firewalld를 그대로 사용하는 방법

# 서비스 등록
$ firewall-cmd --permanent --add-service openvpn
# vpn의 어뎁터인 tun0으로 zone 생성 및 속성 설정
$ firewall-cmd --permanent --zone=trusted --add-interface=tun0
$ firewall-cmd --permanent --zone=trusted --add-masquerade
# 변수 설정
$ DEV=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
# 기본 이더넷에 연결 (만약 !! 특정 어뎁터에 연결을 시키고 싶다면 끝부분 -j 앞에 -o eno2 식으로 어뎁터를 지정)
$ firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEV -j MASQUERADE
# 설정값 리로드
$ firewall-cmd --reload

 

포워딩 세팅이 끝났으니 서비스를 재시작 하자

$ systemctl restart network.service

 

vpn 서비스 등록 및 서비스를 시작한다.

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

 

이것으로 설치가 모두 끝이 났다.

여기까지 완료한 후 openvpn 클라이언트를 이용해 접속하면 되는데

먼저 프로그램을 다운받고 설치 한다.
해당 프로그램은 https://openvpn.net 에 있으니 다운받으면 된다.
윈도우 버전은 내서버에 업로드 후 링크를 걸어 두겠다.
최신 버전을 원한다면 직접 홈페이지에 접속하여 받길 바란다.

XP (x86)    XP (x64)    Vista and later (x86)    Vista and later (x64)

 

설치가 끝났다 가정하고 진행 하겠다.
우선 서버로부터 클라이언트 키를 복사 해온다. 키들은 아래 위치에 있다.
sftp나 ftp 등등을 이용하여 복사 해오면 된다.
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/client.crt
/etc/openvpn/easy-rsa/keys/client.key

 

그리고 client.ovpn을 생성한다.
이는 서버로 접속하는데 사용되는 세팅값들이다.
메모장등을 이용하여 작성하면 된다.

client
dev tun
proto udp
remote webshare.co.kr 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca ca.crt
cert client.crt
key client.key

 

이후 client.ovpn 파일과 키 파일들을 openvpn 설정 디렉토리에 넣어 둘 것이다.
해당 폴더는 아래와 같다.
Windows :  C:\Program Files\OpenVPN\config
MacOS :  ~/Library/Application Support/Tunnelblick/Configurations
Linux :  openvpn –config ~/path/to/client.ovpn (client.ovpn 경로)

이후 클라이언트를 실행하면 된다.
참고로 윈도우 비스타 이상에서는 마우스 우측버튼을 클릭하여 관리자모드로 실행하여야 한다.

 

위 작업들이 끝났으니 한번 접속 해보자

vpn
관리자 모드 실행

 

vpn_2
더블클릭 혹은 우측 마우스를 눌러 Connect 시도

 

vpn_3
로그 창과 함께 접속을 시도한다.

 

vpn_4
접속 완료 메시지가 뜨면 성공

 

vpn_5
한번 내부 PC로 접근을 해보자

 

vpn_6
접속이 완료 되었다.

 

글이 길어졌는데, 사실 설치나 세팅은 전혀 어려운 게 없다.
상황에 따라서 VPN은 상당히 유용한 기능으로서 많은 편리함을 준다.
비용적인 부분에서도 아주 경제적이라고 할 수 있다.
나와 같이 고민하고 있는 사람에게 도움이 되길 바라며 글을 써본다.

굳이 외부에서 접속할 필요가 없는 경우 사용하면 괜찮다.
키를 이용해서 접근한다는 것만으로도관리만 잘하면 보안적인 부분에서 뚜렷단 장점이 존재한다.

궁금한 점은 댓글 바랍니다.


게시됨

카테고리

작성자

태그:

댓글

“[Linux/CentOS] OpenVPN을 이용하여, VPN을 구축 해보자.”에 대한 4개의 응답

  1.  아바타
    익명

    firewalld 설정에서, 만일 기본 이더넷에 연결되어 있는 zone 이 trusted 가 아니라 다른 zone이라면 그 zone 에 tun0 을 추가하여 사용해도 되는 건가요??

  2. 조성진 아바타
    조성진

    안녕하세요.

    설명 잘보고 했는데

    vpn 연결하고 vpn으로 외부망은 접속 못하나요?

    아이폰으로 openvpn 연결하고 외부망들이 전혀 접속이 안되네요 ㅠㅠ

    1. 김주환 아바타

      vpn 용 네트워크와 외부 네트워크를 브릿지 시켜줘야하는데요.
      vpn 브릿지관련에서 찾아보시면 정보가 있을꺼에요.
      (제가 지금 외부로 출장을 나와 노가다중이라 ㅡ_ㅡ;; 확인이 어렵네요)

댓글 남기기