3. 설정 (B) - 설정파일 생성

 

     (1) 서버 측 설정파일 (.conf) 만들기

1
# nano /etc/openvpn/server.conf 
cs

          위 명령을 실행하여 빈 파일 server.conf 파일을 편집합니다.

          아래 텍스트를 전체 선택하여 복사 후 위 server.conf 파일에 붙여넣기 한 후 파일을 저장하고 나옵니다.

1
#################################################
#                                               #
#     My Server OpenVPN Server Configuration    #
#                                               #
#################################################
 
port 1194
local 192.168.0.2
proto udp
dev tun
 
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
 
server 10.8.0.0 255.255.255.0
 
ifconfig-pool-persist ipp.txt
 
push "route 10.8.0.1 255.255.255.255"                # Add route to Client routing table for the OpenVPN Server
push "route 10.8.0.0 255.255.255.0"                  # Add route to Client routing table for the OpenVPN Subnet
 
push "route 192.168.0.2 255.255.255.0"               # local subnet
 
push "dhcp-option DNS 8.8.8.8"                       # Set primary domain name server address to th Google DNS
push "dhcp-option DNS 8.8.4.4"                       # Set primary domain name server address to th Google DNS
 
push "redirect-gateway def1"                         # Override the Client default gateway by using 0.0.0.0/1 and
           # 128.0.0.0/1 rather than 0.0.0.0/0. This has the benefit of
           # overriding but not wiping out the original default gateway.
 
 
client-to-client
 
keepalive 10 120
 
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
cipher AES-128-CBC
comp-lzo
 
user nobody
group nogroup
 
persist-key
persist-tun
 
status /var/log/openvpn-status.log 20
log /var/log/openvpn.log
 
verb 3
 
crl-verify crl.pem 
cs

         보안 강화를 위해 아래와 같이 server.conf 파일의 권한을 변경해 줍니다.

1
# chmod 640 /etc/openvpn/server.conf 
cs

 

     (2) 서버 측 인터넷 데이터 포워딩 설정

         서버 측인 Raspbian (혹은 Armbian) 운영체제는 기본적으로 설정된 네트워크 간에 데이터 포워딩을 허용하지 않습니다.  server.conf 파일에 의해서 새롭게 구성되는 10.8.0.0/4 네트워크가 인터넷 통신을 하기 위해서는 이 설정을 변경하여 가능하도록 해 줍니다.

1
# nano /etc/sysctl.conf 
cs

         파일 내용이 꽤 긴데, 아래로 쭉 내리시면 중간 쯤에 “Uncomment the next line to enable packet forwarding for IPv4.” 라는 문구가 보이실 겁니다. 그 바로 아랫 줄의 # 표시를 제거하여 설정이 enable 되도록 변경해 주고 저장 후 nano에서 나옵니다. (아래 그림을 참조하시기 바랍니다. 중간 쯤에 제가 하이라이트 해 놓은 부분입니다.)

 /etc/sysctl.conf 파일/etc/sysctl.conf 파일을 nano 에디터로 열고 중간 정도 까지 스크롤 다운 한 화면입니다.

 

          이제 라즈베리파이 시스템에 우리가 설정을 변경하였다는 것을 알려 주기 위해 다음 명령을 입력합니다.

1
# sysctl -p 
cs

          위 명령을 통해 라즈베리파이 시스템은 재부팅 없이도 (at runtime) sysctl.conf 파일의 최신 변경사항을 반영할 것입니다.

          이제 리눅스 방화벽 차원의 인터넷 데이터의 포트포워딩을 설정해 주어야 합니다. 이 과정은 아래의 간단한 쉘스크립트를 통하여 가능합니다. 아래의 명령으로 새로운 빈 스크립트 파일을 엽니다.

1
# nano /etc/firewall-openvpn-rules.sh  
cs

          새로 열린 파일에 아래의 내용 전체를 복사하여 붙여 넣고 저장하면서 나옵니다.

1
#!/bin/sh
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 192.168.0.2 
cs

          보안상 중요한 파일이며 실행권한이 필요하므로 아래와 같이 입력해 줍니다.

1
# chmod 700 /etc/firewall-openvpn-rules.sh 
cs

          위에서 만들어준 OpenVPN을 위한 방화벽 예외 사항이 부팅 시(혹은 이더넷이 켜질 때)에 자동으로 실행될 수 있도록 아래와 같이 해 줍니다. 

1
# nano /etc/network/interfaces 
cs

          이 파일이 열리면 내용 중에서 "iface eth0 inet dhcp"라고 나오는 부분을 찾습니다. 우리가 이전에 이 파일을 열어서 고정IP로 변경하는 설정을 해 주지 않았다면 위의 내용이 보일 겁니다. 이 줄의 맨 끝에서 Enter키를 눌러 주어 한 줄을 추가한 다음 Tab키를 두 번 누르고 그 자리에 아래 내용을 복사하여 붙여 넣기를 해 주고 저장하며 종료합니다.

1
pre-up /etc/firewall-openvpn-rules.sh 
cs

          자 이제 서버 측에서 설정하고 구성하여야 할 것들은 거의 끝났습니다. 서버 측에서 남은 것은 이제 실제로 운용해 보면서 나오는 이슈들을 해결하기 위해 설정을 튜닝하는 것뿐입니다. 서버를 이제 재부팅합시다.

1
# shutdown -r now 
cs

 

     (3) 클라이언트 측 설정파일 (.ovpn) 만들기

          ssh를 통해 서버에 원격접속해 있었다면 1분 정도 여유있게 기지개를 좀 펴고 스트레칭 좀 하면서 파이가 재부팅할 시간을 준 뒤 재접속합니다. 그리고 루트 환경으로 진입한 후 우리가 작업하던 easy_rsa 폴더로 다시 가 봅시다.

1
2
$ sudo -s
# cd /etc/openvpn/easy-rsa/
cs

          클라이언트 측에는 사실 여러 가지 파일을 많이 가지고 있어야 합니다. 설정파일인 .ovpn (혹은 .conf) 파일, CA 파일, 키 파일, 클라이언트 인증서 등등... 이 파일들을 윈도우, 리눅스, 맥 클라이언트 들같은 데스크탑/랩탑에 복사하고 관리하는 것이야 뭐 큰 문제 없다고 할 수도 있지만, 요즘과 같은 모바일 세상에서 안드로이드나 iOS 클라이언트까지 저 잡다한 파일들을 죄다 옮겨서 유지 관리하기 보다는 좀 더 간편한 파일관리를 원하게 됩니다.

          그래서 Eric Jodoin 이라는 분이 배시 쉘 스크립트를 개발해서, 우리가 지난 1부에서 클라이언트를 위해 만들었던 잡다한 파일들을 설정파일 하나에 모두 집어 넣어, 설정파일 하나만 클라이언트 디바이스에 넣고 OpenVPN을 돌리면 서버에 문제 없이 접속되도록 해 놓으셨습니다. 설정파일을 비롯해 네다섯 개의 파일을 클라이언트에 넣으려고 scp 명령을 여러번 써 가며 고생했는데 신세계를 열어 주셨네요. 어떤 분인지 잘 모르지만 감사의 말씀을 전합니다.

          아무튼 이 스크립트를 쓰기 위해서 우리는 클라이언트 설정파일의 기본적인 내용을 담고 있고 CA, 인증서, ta.key 등의 내용이 합쳐질 기본 템플릿 파일 노릇을 할 txt 파일 하나를 만들어 놔야 합니다. 지금까지와 마찬가지로 복붙신공으로 순식간에 만들어 보겠습니다.

1
# nano /etc/openvpn/easy-rsa/keys/Default_Client_Template.txt 
cs

          역시 마찬가지로 새로 열린 파일에 아래의 내용 전체를 복사하여 붙여 넣습니다.

1
client
dev tun
proto udp
remote my_network.iptime.org 1194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ns-cert-type server
key-direction 1
cipher AES-128-CBC
comp-lzo
verb 3
mute 20 
cs

          자, 우리는 지난 제1부의 처음 도입부에서 네트워크 시스템의 환경부분을 언급하며, DDNS가 설정되어 있고 그 이름이 my_network.iptime.org 인 것으로 가정한다고 했습니다. 기업의 경우에는 외부 고정IP를 보유하고 계신 곳도 많으니, 만약 고정IP를 사용하신다면 그 고정IP를 my_network.iptime.org 자리에 입력하시면 됩니다. KT, SKB, LG U+ 등 통신회사가 제공하는 서비스가 유동IP 서비스라면 반드시 DDNS 서비스를 등록하시고 URL을 부여 받으신 뒤 그 주소를 my_network.iptime.org 자리에 입력하셔야 제대로 동작합니다. 이 글의 주제에서 벗어난 이슈이기 때문에 자세한 언급은 생략하지만, DDNS 서비스는 무료 제공이 대세입니다. 우리의 파이가 클라이언트 역할을 할 수도 있으며, ipTIME 공유기의 경우 공유기 차원에서 등록하고 유지 관리 및 클라이언트 역할을 할 수 있어 편리한 점이 있습니다. 

          Control+X 키를 누른 후 저장하겠냐는 물음에 Y하고 파일을 빠져 나옵니다.

          이제, 언급해 드린 배시 쉘 스크립트 파일을 만들 차례입니다.

1
# nano /etc/openvpn/easy-rsa/keys/MakeOVPN.sh 
cs

          새로 열린 파일에 아래의 내용 전체를 복사하여 붙여 넣고 저장하면서 나옵니다.

1
#!/bin/bash
# Default Variable Declarations
DEFAULT="Default_Client_Template.txt"
FILEEXT=".ovpn"
CRT=".crt"
KEY=".key"
CA="ca.crt"
TA="ta.key"
#Ask for a Client name
echo "Please enter an existing Client Name:"
read NAME

#1st Verify that client’s Public Key Exists
if [ ! -f $NAME$CRT ]; then
 echo "[ERROR]: Client Public Key Certificate not found: $NAME$CRT"
 exit
fi
echo "Client’s cert found: $NAME$CR"

#Then, verify that there is a private key for that client
if [ ! -f $NAME$KEY ]; then
 echo "[ERROR]: Client 3des Private Key not found: $NAME$KEY"
 exit
fi
echo "Client’s Private Key found: $NAME$KEY"
#Confirm the CA public key exists
if [ ! -f $CA ]; then
 echo "[ERROR]: CA Public Key not found: $CA"
 exit
fi
echo "CA public Key found: $CA"
#Confirm the tls-auth ta key file exists
if [ ! -f $TA ]; then
 echo "[ERROR]: tls-auth Key not found: $TA"
 exit
fi
echo "tls-auth Private Key found: $TA"
#Ready to make a new .opvn file - Start by populating with the default file
cat $DEFAULT > $NAME$FILEEXT
#Now, append the CA Public Cert
echo "<ca>" >> $NAME$FILEEXT
cat $CA >> $NAME$FILEEXT
echo "</ca>" >> $NAME$FILEEXT
#Next append the client Public Cert
echo "<cert>" >> $NAME$FILEEXT
cat $NAME$CRT | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $NAME$FILEEXT
echo "</cert>" >> $NAME$FILEEXT
#Then, append the client Private Key
echo "<key>" >> $NAME$FILEEXT
cat $NAME$KEY >> $NAME$FILEEXT
echo "</key>" >> $NAME$FILEEXT
#Finally, append the TA Private Key
echo "<tls-auth>" >> $NAME$FILEEXT
cat $TA >> $NAME$FILEEXT
echo "</tls-auth>" >> $NAME$FILEEXT
chmod 600 $NAME$FILEEXT
echo "Done! $NAME$FILEEXT Successfully Created."
#Script written by Eric Jodoin 
cs

 

           이제 키 파일들이 위치한 디렉토리에서 작업하기 위해 폴더를 변경합니다.

1
# cd /etc/openvpn/easy-rsa/keys/ 
cs

          아울러 이 파일은 실행을 전제로 하는 쉘 스크립트이므로 실행권한을 주도록 변경합니다.

1
# chmod 700 ./MakeOVPN.sh 
cs

          자, 이제 드디어 쉘 스트립트를 실행해 봅시다.

1
# ./MakeOVPN.sh 
cs

          이 스크립트가 실행 되면서, 클라이언트의 이름을 입력하라고 합니다. 우리는 지난 제1부에서 Client1이라는 이름의 클라이언트를 생성해 준 바 있습니다. 이걸 넣어 보죠.

1
Done! Client1.ovpn Successfully Created. 
cs

          우리가 클라이언트의 이름을 오타없이 잘 입력했다면 위와 같은 메세지를 남기며 스크립트가 종료됩니다. 만약 다른 클라이언트를 더 만들었다면, 위의 스크립트를 반복 실행하면서 다른 클라이언트들의 .ovpn파일들을 모두 만들어 줍니다.

 

     (4) 클라이언트 측 소프트웨어 설치 및 구성

          우리는 지금까지 서버 측에서 모든 작업을 해 왔습니다. 이제 클라이언트 소프트웨어를 설치하고, 서버에서 만들어 놓은 .ovpn 파일을 클라이언트에 옮겨 놓고 실행하는 것이 남았네요. 클라이언트는 정말 다양한 환경에서 구동되기 때문에 이 글에서 모두 설명할 수는 없을 것 같습니다. 다만, 윈도우, 리눅스, 안드로이드, iOS 등 대부분의 운영체제에 OpenVPN 소프트웨어가 설치되고 클라이언트로 동작할 수 있는데 반해, MacOS에는 서드파티 소프트웨어만 존재하는 것으로 알고 있습니다. 그 중 쓸만한 것 하나가 Tunnelblick이라는 건데, 우리가 만들어 준 .ovpn 파일도 잘 인식하고 작동합니다.

          서버에 만들어 놓은 클라이언트용 .ovpn 설정 파일을 옮기는 과정도 파이에 랜만 물려 놓고 ssh로 원격접속해 쓰시는 분들은 참 난감하실 수 있습니다. 리눅스에 익숙하신 분들이야 scp로 파일을 순식간에 받으시겠지만 윈도우 쓰시는 분들은 Winscp를 설치하여 파일을 받으셔야 합니다. 파이에 sftp나 ftp 서버를 설치하고 윈도우 등에서 filezilla 등의 ftp/sftp 클라이언트로 .ovpn 파일을 받아오는 방법도 있습니다. 만만치 않은 작업들입니다만, 이글의 작성 목적을 벗어나므로 더 이상의 언급은 생략합니다.

          여기서는 우리나라 PC환경의 대부분을 차지하는 윈도우 클라이언트 설치 및 설정 과정만을 살펴 보겠습니다.

          우선 OpenVPN의 공식사이트 커뮤니티 다운로드 페이지에서 CPU와 윈도우즈 아키텍처에 맞는 32bit x86용 혹은 64bit x86_64용 윈도우즈 인스톨러 파일을 다운로드 받습니다. 특별한 커스터마이징 없이 설치과정을 마치면 "C:\Program Files\OpenVPN"폴더에 프로그램이 설치되고 바탕화면에 바로가기 아이콘이 생성됩니다. 이 설치 폴더 하위 폴더에 "config"라는 폴더도 설치되는데 이 곳에 우리가 서버에서 만들어 준 .ovpn 파일을 넣어 줍니다.

          이제 우리 Windows 클라이언트에서 수동으로 OpenVPN 서버에 접속하기 위해 바탕화면의 OpenVPN GUI 아이콘을 클릭합니다. OpenVPN GUI가 실행되면 시스템 트레이에 자물쇠가 있는 회색 모니터 모양의 트레이 아이콘이 나타납니다. 이 트레이 아이콘에 대고 오른쪽 클릭을 하면 아래 그림과 같은 메뉴가 나오게 되는데 여기서 "Connect"에 대고 클릭을 해 주게 되면 새로운 텍스트 창이 하나 열리면서 우리가 "config"폴더에 넣어 준 .ovpn 설정의 내용에 따라 서버에 접속을 시도하게 됩니다. 

OpenVPN GUI 실행 모습윈도우즈 용 OpenVPN GUI가 실행되어 시스템 트레이에 관련 아이콘이 나타나고 이를 오른쪽 클릭했을 때의 화면입니다.

          이때 접속에 성공하면 접속 프로세스를 보여주는 창이 자동으로 닫히면서 시스템 트레이 아이콘의 모니터 색이 회색에서 연두색으로 바뀌게 되고, 실패하면 접속 진행 창에 에러메세지를 보여 주게 됩니다.

          윈도우용 OpenVPN 프로그램은 GUI 수동접속 지원과 함께 윈도우즈 서비스에도 등록되어 부팅시 자동실행 시키거나 런타임으로 재시작할 수 있도록 되어 있습니다. 다만, 처음 설치하면 이 기능의 기본값은 수동시작으로 되어 있으므로 서버로 실행하거나 클라이언트를 부팅시부터 자동으로 시작하고 싶다면 이를 자동시작으로 바꾸어 줄 필요가 있습니다.

          윈도우즈 바탕화면 왼쪽 하단의 윈도우즈 로고를 오른쪽 클릭하면 나오는 제어판을 실행해 줍니다. 제어판-시스템 및 보안-관리도구에 있는 "서비스"를 클릭하여 실행해 줍니다. ABC 순으로 나오는 각종 서비스들을 주욱 스크롤 다운하면 "OpenVPN Service"라는 서비스 항목이 보이는데 이를 더블클릭합니다. 일반 탭의 중간 쯤 보면 "시작 유형"이 "수동"으로 되어 있을 것입니다. 이것을 아래 그림과 같이 "자동"으로 바꾸어 주고 적용을 누르고 "확인"을 눌러 빠져나옵니다.

윈도우즈 용 OpenVPN Service 속성 화면OpenVPN Service 항목을 더블클릭하면 나오는 속성 화면입니다. 이 화면에서 바로 서비스를 시작, 중지, 일시중지, 계속을 할 수 있으며 부팅 시의 시작유형을 변경할 수도 있습니다.

          이제 재부팅 해 주면 자동으로 OpenVPN 서비스가 시작됩니다.

 

이상으로 Raspberry Pi를 OpenVPN 서버로 만들기 제2부를 마칩니다. 마지막 제3부에서는 VPN이 제대로 운영되기 위한 공유기 설정과 문제해결 (Trouble Shooting and Workaround)에 대해 언급하고 연재를 마치겠습니다.

Posted by truerain