라즈베리파이 팩스서버에서 Avantfax 웹애플리케이션 운용하기

 

 

   지난 포스팅에서 리눅스 운영체계가 설치된 라즈베이파이(혹은 유사 파이)에 USB 팩스모뎀을 연결하고, hylafax 서버를 설치하여 팩스머신으로 운용하는 방법에 대하여 기술한 바 있습니다. 이번에는 이 라즈베리파이 팩스머신을 보다 편리하게 운용하기 위하여 Avantfax라고 하는 웹애플리케이션을 설치하고 초기 설정을 진행해 보겠습니다.

   Avantfax를 설치하는 이유는, hylafax가 리눅스 커맨드기반 인터페이스(CLI) 환경에서 동작하기 때문에 운용이 쉽지 않고 직관적이지 않는데 기인합니다. 물론 hylafx의 서드파티 클라이언트를 통해서 일부 GUI로 관리할 수도 있습니다만, 통합적이고 직관적인 관리는 어렵지요. Avantfax의 더 큰 장점은, Avantfax를 통해 웹에서 관리하게 되면, 사무실 등 설치 장소 외에서도 인터넷이 되는 곳이라면 어디에서나 사무실 팩스서버 웹인터페이스에 접속하여 원격관리 및 팩스 수발신이 가능하다는 데에 있습니다.

   Avantfax는 리눅스 운영체제가 설치되고 웹서버와 MySQL 데이터베이스, 그리고 PHP에 의한 동적 웹서비스 환경하에 동작하는 웹애플리케이션입니다. 따라서 소위 LAMP(Linux + Apache/Nginx + MySQL/MariaDB + PHP) 환경이 설치되어 있는 장치라면, 일반 PC환경에서도 당연히 적용할 수 있는 것이지요. 그래도 24시간 수신대기를 위한 팩스머신이라면 저전력을 소모하고 소음이 없는 라즈베리파이 등의 파이류가 제격입니다.

   저는 그동안 위의 환경을 구축하기 위한 일련의 포스팅들을 진행해 왔습니다. 다만, 라즈베리파이나 다른 파이들에 리눅스 운영체제를 설치하는 과정에 대하여는 국내외 인터넷에 많은 자료들이 있으므로 그 자료들을 참조하면 되구요. 저는 Raspbian 등 데비안 계열 운영체제가 설치되어 있다는 것을 전제로 이 포스팅을 진행합니다. 운영체제 설치 이후 필요한 사항들에 대하여는 아래 링크를 참조하시어 반드시 각 단계를 거쳐야 합니다.

 

 

   우선 우리의 라즈베리파이에 ssh 접속하거나 데스크톱으로 사용하신다면 터미널을 열어서 아래와 같이 Avantfax 웹애플리케이션을 다운받습니다. 현재 작성일 기준 최신 3.3.5버젼을 다운로드 받을 경우 아래와 같습니다.

1
$ cd /usr/src
cs
1
$ sudo wget http://jaist.dl.sourceforge.net/project/avantfax/avantfax-3.3.5.tgz 
cs

 

   Avantfax의 최신 버젼을 확인하기 위해서는 웹브라우져에서 아래의 URL을 열어 확인하시면 됩니다.

   아래와 같이 tgz 압축을 풀어 줍니다.

1
$ sudo tar zvxf avantfax-3.3.5.tgz
cs

   압축을 풀어준 디렉토리에 있는 데비안용 설치 스크립트를 에디터로 열어 봅니다.

1
$ cd avantfax-3.3.5/
cs
1
$ sudo nano -w debian-install.sh 
cs

   이 스크립트의 내용을 보면 맨 처음에 필요한 패키지들을 설치하고, PHP의 pear모듈을 설치한 후 Avantfax를 타겟 폴더에 설치하고, smarty 설치, DB 생성 및 설정, hylafax 설정 등을 스크립트로 한방에 처리할 수 있도록 짜여진 프로그램임을 알 수 있습니다. 이 스크립트가 현재 우리의 환경과 정확히 일치한다면 별다른 고생없이 이 스크립트를 실행만 해 주면 되겠습니다만, 불행히도 그렇지 않지요. 그 이유는 다음과 같습니다.

  • 사전 설치 대상 필수패키지들이 현재 버전의 데비안과 맞지 않습니다. 따라서 기본 저장소에 없는 패키지의 설치를 요구하는 등 현실과 맞지 않습니다.

  • 이 스크립트는 Apache, Mysql을 자동으로 설치하도록 되어 있지만, 우리는 이미 설치한 Nginx와 MariaDB를 활용할 것입니다.

  • 피어 사이트에서 pear 모듈을 다운 받아 설치하는 과정에서는 에러가 나지 않지만, 동적 웹사이트가 작동하지 않고 error가 납니다. 이는 pear 모듈 저장소의 버전 불일치에 기인하는 것으로써 특정 pear 모듈들을 베타버젼으로 업데이트해 주어야 해결되는 문제입니다.

   위 세가지 사항이 반영되도록 스크립트를 수정한 후 스크립트를 실행해도 무방하지만, 혹시 발생할 수도 있는 에러를 방지하기 위하여 위 문제와 관련된 사항은 스크립트 실행 전에 미리 별도로 실행해 주는 것을 권장합니다. 아예 스크립트를 실행하지 않고, 참고만 하면서 터미널 배시쉘에서 모두 실행 및 설정해 주는 것도 가능합니다. 공부는 되겠지만 시간과 편의를 위해 우리는 적정한 선에서 스크립트를 사용할 것입니다. 일단, nano에디터에서 편집 없이 ctrl+X로 나옵니다.

   우선, 아래와 같이 필수패키지 먼저 설치하겠습니다.

1
sudo apt-get install imagemagick libtiff5-dev netpbm libnetpbm10-dev giflib-tools php-mail php-mail-mime php-file php-db psutils wdiff rsync 
cs

   다음으로, pear 모듈을 설치합니다.

1
2
3
$ sudo pear channel-update pear.php.net
$ sudo pear upgrade-all
$ sudo pear install --alldeps Mail Net_SMTP Mail_mime MDB2_driver_mysql
cs

 

   여기까지가 스크립트에 포함된 pear 설치 내용입니다만, 현재 pear의 버전으로는 에러가 납니다. MDB2의 Mysql드라이버가 버전이 낮아서 호환이 안되는 문제입니다. 아래와 같이 베타버전으로 업그레이드 해 주어야만 정상적으로 작동합니다.

1
$ sudo pear upgrade mdb2-beta mdb2_driver_mysqli-beta
cs

  이제 Apache와 Mysql 관련 부분이 남았습니다만, Apache는 설치하지 않을 것이므로 Nginx에서 웹페이지를 구성하는 것만 추후에 진행해 주면 되고, Mysql은 MariaDB가 100% 대체 (Drop-in Replacement)하므로 스크립트를 그대로 이용하면 됩니다. 이제 스크립트의 환경설정(Preference)인 debian-prefs.txt 파일을 편집해 봅시다.

1
$ sudo nano -w debian-prefs.txt 
cs

   아래와 같은 부분을 각자의 상황에 맞게 수정해 줍니다.

FAXDOMAIN=fax.mydomain.com

  예를 들어, 외부에서 접속할 수 있는 도메인 주소가 fax.example.org라면 위 내용을 아래와 같이 바꾸어 줍니다.

FAXDOMAIN=fax.example.org

   새로이 생성되는 avantfax를 위한 데이터베이스의 이름과 그 사용자명은 그대로 avantfax를 쓰는 것이 관리목적상 바람직하지만 그 비밀번호는 보안을 위해 주어진 값(3.3.5버전에서는 d58fe49)에서 반드시 변경하기 바랍니다.

PASS=새로이_변경된_비밀번호

   Mysql(MariaDB)의 루트 비밀번호는 저처럼 MariaDB 혹은 Mysql을 사전에 설치했다면, 설치시 설정한 비밀번호를 아래 자리에 입력하여야 에러가 나지 않습니다.

ROOTMYSQLPWD=Mysql_혹은_MariaDB_처음_설치시_설정한_root_비밀번호

   주의할 점은, 리눅스시스템의 root비밀번호가 아닌 MariaDB 혹은 Mysql의 root 비밀번호를 입력해야 한다는 점입니다.

   아래 그림을 참조하여 모든 변경이 완료 되었다면, Ctrl+X키를 누르고 y키로 저장을 해 주시면서 nano 에디터에서 나옵니다.

1
$ sudo chmod 600 debian-prefs.txt
cs

   debian-prefs.txt 파일은 민감한 비밀번호가 저장된 파일이므로 보안을 위하여 위와 같이 권한을 변경해 줍니다.

   다음은, 한번 내용만 들여다 보았던 debian-install.sh 파일을 편집합니다.

1
$ sudo nano -w debian-install.sh
cs

   우리가 이미 진행했던 사항들에는 줄 맨 앞에 #표시를 붙여 주석으로 만들어 주어 스크립트 실행 시 제외되도록 해 줍니다. 사전 필수 패키지 설치와 pear 모듈 설치 부분입니다. 아래 그림을 참조하시기 바랍니다.

   우리는 Apache 웹서버를 설치하지 않고 Nginx 웹서버를 설치하여 진행하고 있습니다. 아래 그림은 Apache 웹서버를 위한 가상호스트 설정과 웹서버 재시작 부분입니다. 역시 마찬가지로 그림처럼 모두 주석처리해 줍니다. 나중에 Nginx의 웹페이지 설정과 재시작을 수동으로 해 줄 것입니다.

   자, 이제 모든 편집이 끝났습니다. Ctrl+X를 누른 후 y를 눌러 저장 후 에디터에서 나옵니다. 스크립트를 실행할 차례입니다. 아래와 같이 실행해 줍니다.

1
$ sudo ./debian-install.sh
cs

   그러면, 아래 그림과 같이 실행이 될 것입니다. ln 명령 2건이 실패한 것을 제외하고는 특별한 문제는 없습니다. 소프트링크가 실패한 것은, 확인해 보니 그역방향으로 소프트링크가 이미 걸려 있어서 실패했네요. 현재로 봐서는 크게 문제될 것이 없어 보입니다.

   배시쉘에서 명령을 하나하나 입력해 가며 했으면, 꽤 오래 걸렸을 작업을 순식간에 해내는군요. 쉘스크립트의 힘입니다.

   다만, debian-prefs.txt 파일에서 설정해 준 avantfax의 비밀번호가 debian-install.sh 스크립트의 실행 과정에서 적용이 누락된 부분이 있습니다. 그 부분을 추가로 설정해 주어야 avantfax 웹사이트가 정상적으로 작동합니다. 아래와 같이 nano에디터를 실행해 줍니다.

1
$ sudo nano -/var/www/avantfax/includes/local_config.php
cs

   여기서 아래의 내용을 찾습니다.

define('AFDB_PASS',             'd58fe49');           // password

   바로 debian-prefs.txt에 있는 avantfax 데이터베이스 사용자의 초기 비밀번호가 그대로 있는 것을 확인할 수 있는데요. 이를 우리가 앞에서 변경해 준 것으로 바꾸어 줍니다.

define('AFDB_PASS',           '새로이_변경된_비밀번호');           // password

   이제 미뤄왔던 Nginx 웹사이트 설정에 들어가야 합니다.

1
2
3
$ cd /etc/nginx/sites-available/
$ sudo cp default avantfax
$ sudo nano -w avantfax
cs

   아래 내용을 찾습니다.

        listen 80 default_server;
        listen [::]:80 default_server;

   이것을 아래와 같이 바꿔 줍니다.

        listen 80 ;
        listen [::]:80 ;

   아래 내용을 찾습니다.

root /var/www/html;

   이것을 아래와 같이 바꿔 줍니다.

root /var/www/avantfax;

   또, 아래 내용을 찾습니다.

server_name _;

   이것을 아래와 같이 바꿔 줍니다. 단, fax.example.org는 여러분이 실제로 외부에서 접속할 수 있는 도메인명으로 바꾸어 입력하여야 합니다.

server_name fax.example.org;

   아래 그림을 참조하시면서 확인 후 Ctrl+x 키와 y키를 눌러 저장 후 nano에디터를 종료합니다.

   배시쉘로 돌아오면 아래 명령을 입력하여 Nginx를 재시작해 줍니다.

1
2
$ sudo ln -s ../sites-available/avantfax avantfax
$ sudo systemctl restart nginx.service
cs

   여기까지 특별한 에러가 없다면, 웹브라우져를 열어 주소창에 fax.exampl e.org를 입력하여 아래의 그림과 같은 화면이 나오는지 확인합니다. 물론 fax.example.org는 여러분의 실제 도메인명으로 입력해야 합니다.

   avantfax의 관리자 아이디와 초기 비밀번호는 아래와 같습니다.

 I.D : admin

Password : password 

   이것을 입력하고 최초 로그인을 하면 비밀번호를 바꾸는 페이지로 전환됩니다. 반드시 관리자의 비밀번호를 각자의 것으로 바꾸어 주시기 바랍니다.

   관리자 비밀번호를 바꾼 후에는 아래 사진과 같은 화면이 열립니다.

   설치 후 첫 로그인이기 때문에, 보낸 팩스, 받은 팩스가 없지요. 우측 상단에 분홍색 테두리로 표시한 작은 아이콘을 누르면 관리자모드로 들어갈 수 있습니다. 혹은 주소창에 아래와 같이 입력하여도 동일한 결과가 됩니다.

   아래 그림과 같이 상단 menu 창을 누르고 modems를 선택해 줍니다.

   그럼 모뎀을 설정하는 화면이 나오는데 아래 화면과 같이 각자의 환경에 맞도록 입력해 줍니다. Device 란에는 ls -la /dev/tty*에서 확인되는 팩스모뎀의 장치 이름을 기재해 줍니다. 제 경우는 ttyACM0이었지만, 각각 설치한 기종에 따라 다를 수 있습니다. Alias 란에는 해당 팩스모뎀 기기의 설치 장소 등 특징적인 사항을 구문의 형태로 작성해 줍니다. '~의 집 팩스기기' 같은 형태도 좋겠지요. 여기까지가 필수 입력 사항이고 아래 Contact에는 이메일 주소를 기재해 주면 수신되는 팩스를 입력된 이 주소로 자동으로 메일을 보내 줍니다. 단, postfix 발송 SMTP가 이미 설정되어 있는 경우에 한합니다. 우리의 경우 이미 해 주었기 때문에 가능하다고 보면 됩니다. 그 아래 Printer 항목은 수신 팩스를 지정한 CUPS/lpr 프린터에 인쇄해 줍니다. 저는 이 설정을 하지 않는 것을 권장합니다. 메일로 고지되면 충분합니다. 정 인쇄가 필요하면 메일에 첨부되는 PDF파일을 인쇄하면 됩니다. 광고성 스팸 팩스가 범람하기 때문이지요.

   모두 입력 되었으면 Save 버튼을 눌러 주어 팩스설정을 저장해 줍니다.

   이상과 같이 기나긴 Avantfax의 설치와 설정을 모두 마쳤습니다. 가정용의 경우 지금까지의 설정으로도 충분하지만, 여러 사람이 사용하는 기업의 경우는 admin 계정 말고도, 각 사용자별 계정을 만들어 주어서 각 사용자별 권한을 따로 설정해 주고, 팩스 서비스에 개별 접근할 수 있도록 설정해 주시기 바랍니다. 모두 우리가 조금 전에 접속한 웹 환경에서 가능하므로 큰 어려움은 없으리라 생각합니다.

   Avantfax가 참 좋은 웹애플리케이션이지만, 아직 공식적인 한글 로컬라이제이션 파일이 존재하지 않습니다. 일부 선구적으로 이 앱을 사용하신 분들이 의욕적으로 한글 로컬 파일을 만드신 것으로 알고 있는데 공개도 잘 안하시고, avantfax 측에 제공도 안하셔서, 아직 한글 번역 파일이 배포되고 있지 않는 것이지요. 언젠가 제가 한글화를 하게 되면, avantfax 측에 제출하여 향후 공식 배포본에 포함될 수 있도록 해 볼 생각입니다. 이상으로 마칩니다.

 

 

 


신고
Posted by truerain

라즈베리파이에 팩스서버 설치하기

 

들어가는 글

 

    라즈베리 파이는 기본적으로 Faxmodem 칩을 가지고 있지는 않습니다. 하지만, USB 포트들이 있으므로, 리눅스 운영체제에서 지원하는 USB 팩스모뎀을 구해서 연결만 해 주면 훌륭한 팩스기기로 변신합니다. 저렴하게는 5만원 안쪽에서 팩스시스템을 구축할 수 있는 것이지요. 오늘은 USB 팩스모뎀을 라즈베리 파이에 설치하고 팩스서버 어플리케이션을 설치 및 설정하여 팩스 서비스를 실행하는 것에 관하여 포스팅합니다.

     ※준비물

  • 리눅스 운영체제가 설치된 라즈베리파이 (이 글에서는 Raspbian 가정)

  • USB 팩스모뎀 (리눅스 호환 칩을 가진 모델일 것)

  • 개통 완료된 전화 1회선 (전화기는 필요 없습니다.)

    라즈베리파이는 네트워크 접속만 할 수 있고, USB 슬롯이 있는 모델이라면 어떠한 것도 상관 없습니다. 마찬가지로 Orangepi 및 각종 Pi류 다 괜찮습니다. 당연한 이야기지만 PC도 됩니다. 운영체제도 리눅스 운영체제라면 Arch linux, Ubuntu 계열도 모두 괜찮습니다. 다만, 리눅스 커널은 USB 팩스모뎀이 인식되도록 범용으로 컴파일된 것이어야 합니다.

    USB팩스모뎀은 시중에 4~5만원대 제품도 있고, 10만 원이 넘어가는 고급 제품도 있는 것으로 알고 있지만, eBay나 aliexpress에서 무료 배송에 우리 돈으로 1만 원 가량하는 제품도 괜찮습니다. 물론 도를 닦는 심정으로 한 달 이상을 기다려야... 단, 상품상세 설명에 지원하는 운영체제로 Linux가 반드시 기재 되어 있어야 합니다.

USB 팩스모뎀제가 파이 팩스서버를 구축하기 위해 Aliexpress에서 구입한 중국산 팩스모뎀제품입니다. 당시 (2016년 1월) 구입가는 USD8.56이었습니다.

 

USB팩스모뎀의 설치 및 확인

 

    전화선의 경우 팩스 전용의 회선이 따로 있다면 자동수신으로 설정해 놓고 사용할 수 있습니다. 그렇지 않고 전화용 회선에서 끌어다가 팩스를 쓴다면, 수동수신으로 설정해서 사용하는 것이 좋겠지요. 아무튼, 전화선을 국선 라인에 연결해 주고 USB 커넥터도 라즈베리파이의 USB 슬롯에 연결해 줍니다.

    이제 라즈베리 파이에 ssh로 접속하여(혹은 데스크톱환경에 접속 후 터미널을 열어) 아래와 같이 입력해 줍니다.[각주:1]

1
$ lsusb 
cs

    위 명령의 결과, 아래와 같이 faxmodem 장치가 잡혀 있다면 라즈베리파이 리눅스에 하드웨어가 잘 장착된 것입니다[각주:2]. 당연히 Bus와 Device 번호, ID는 다를 수 있겠지요.

    하드웨어 디바이스의 폴더도 아래와 같이 살펴 봅니다.[각주:3]

1
$ ls -la /dev/ttyA* 
cs

    아래와 같이 장치가 잡혀 있으면 됩니다. 이때, tty로 시작하는 장치의 이름을 대소문자 및 숫자 구분하여 반드시 기억하거나 메모해 둡니다.

 

 

애플리케이션의 설치

 

    우리의 라즈베리파이에 메일 서버가 설치되어 있지 않은 경우, 수신 메일을 메일로 포워딩하는 기능을 활용하기 위해 MTA(Mail Transfer Agent)를 설치할 필요가 있습니다. hylafax-server를 설치하면 mailutils까지 함께 설치되고 이렇게 되면 기본 MTA프로그램인 Exim이 설치되기 때문에, MTA로 Exim이 아닌 postfix를 설치하여 간단하게 gmail의 SMTP를 통한 relay가 가능하도록 설정해 줄 필요가 있습니다. 이 과정은 아래의 링크로 대신합니다.

<Gmail SMTP Server를 사용하여 발송전용 Postfix 메일 서비스 구축하기> 바로가기

    이제 팩스서버 어플리케이션을 설치합니다. 리눅스에서는 팩스서버-클라이언트 패키지인 hylafax를 많이 씁니다. 서버를 설치하면 클라이언트도 함께 설치됩니다.

1
$ sudo apt-get install hylafax-server 
cs

 

 

hylafax 팩스모뎀 설정

 

    애플리케이션 설치가 완료되면 아래와 같이 팩스모뎀에 대한 설정에 들어 갑니다.

1
$ sudo faxsetup 
cs

    hylafax의 설정 스크립트가 시작되어 특별한 에러가 없으면 아래와 같은 부분에서 사용자 입력을 대기하게 됩니다.

        HylaFAX configuration parameters are:

        [1] Init script starts faxq:            yes
        [2] Init script starts hfaxd            yes
        [3] Start old protocol:                 no
  Are these ok [yes]? 엔터

Can I terminate this faxq process (3804) [yes]? 엔터
Should I restart the HylaFAX server processes [yes]? 엔터

 

Do you want to run faxaddmodem to configure a modem [yes]?엔터
Serial port that modem is connected to [ttyS0]? ttyACM0

 

※ 위에서 암기하거나 메모해 둔 팩스모뎀의 디바이스명을 정확히 입력해 줍니다.

    [ ] 안의 기본값 yes를 그대로 적용한다는 의미로 엔터를 입력하면 계속해서 사용자의 설정값을 받도록 대화모드가 이어집니다. 아래에 기술한 항목에 대하여는 각자의 환경에 맞는 값을 입력해 주어야 하며, 특별히 언급이 없는 항목에 대하여는 기본값대로 엔터를 입력하며 넘어가 줍니다.

Country code [1]? 82
Area code [415]? 2 <- 지역번호에 0을 빼고 입력합니다. ex 서울 2, 경기 31, 인천 32
Phone number of fax modem [+1.999.555.1212]? +82.2.1234.5678  <-실제 전화번호입력
Local identification string (for TSI/CIG) ["NothingSetup"]? Truerain's Home Fax <-각자 변경
Protection mode for received facsimile [0600]? 644
Protection mode for session logs [0600]? 644
Protection mode for ttyACM0 [0600]? 666
Rings to wait before answering [1]? 1   <- 발신 전용일 경우 0 입력
Modem speaker volume [off]? 엔터    <- 기본값 외에 QUIET LOW MEDIUM HIGH 가능 Max consecutive bad lines to accept during copy quality checking [5]? 3  <-줄여도 무방
Max number of pages to accept in a received facsimile [25]? 엔터    <- 늘려도 무방

Are these ok [yes]? 엔터  

   이제 스크립트는 모뎀 속도를 체크한 뒤, 가능한 모뎀 Class를 확인한 후 어떤 클래스를 사용할 것인지 물어 옵니다. 이때 구형 팩스를 포함한 모든 팩스기기와 호환되기 위해서 반드시 1을 입력해야 합니다.

This modem looks to have support for Class 1.0, 1 and 2.
How should it be configured [1.0]? 1

     아래의 문구가 나올 때 까지 몇 번 더 기본 값을 승인하는 엔터를 입력한 후 아래의 문구대로 다른 팩스모뎀을 더 설정할 것이 없다면(팩스모뎀 단 하나를 설치한 우리도) no를 입력하고 엔터를 입력합니다.

Do you want to run faxaddmodem to configure another modem [yes]? no

    마지막으로 아래 물음에 엔터로 승인하면 팩스모뎀 설정이 완료됩니다.

Should I run faxmodem for each configured modem [yes]?  엔터

    이제 스크립트가 알아서 지금까지의 모든 설정을 저장하며 Bash쉘로 돌아옵니다. 새로이 저장된 설정을 반영하기 위해 아래와 같이 hylafax 서비스를 재시작 해 줍니다.[각주:4]

1
$ sudo systemctl restart hylafax.service 
cs

    팩스서비스가 설정대로 잘 재시작되었는지 상태를 점검하기 위해 아래 명령으로 확인합니다.

1
$ sudo faxstat -s
cs

    그 결과가 아래 그림과 같이 나오면 잘 설정되어 실행중에 있으며 대기상태에 있음을 알 수 있습니다.

 

나오는 글

    지금까지 데비안 Jessie 계열 운영체제가 설치된 라즈베리파이에 USB팩스모뎀을 설치하고 hylafax 애플리케이션을 설치하여 팩스서버로 작동하도록 구성하는 절차를 진행하였습니다. 지금까지 설정한 것 이외에도 별도의 클라이언트 프로그램을 설치하여 내부네트워크의 다른 단말기에서도 팩스를 수신 및 발신 할 수 있도록 추가 설정이 가능합니다. 하지만, 이보다는 avantfax 웹애플리케이션을 웹서버에 설치하여 hylafax와 연동하도록 구성하고 인터넷으로 접속하여 라즈베리파이 팩스서버를 관리하는 것이 훨신 효율적이고 편리하므로, hylafax 서버의 설정은 이 정도 선에서 마무리하도록 하겠습니다.

 

 

 

 

  1. 기본적으로 제가 구입한 conexant 제품은 Plug & Play를 지원하기 때문에 재부팅이 필요 없었습니다. 구매한 팩스모뎀 제품에 따라 재부팅을 필요로하거나 수동 설정을 필요로하는 경우가 있을 수 있습니다. 이 경우 제품 메뉴얼을 참조하시기 바랍니다. [본문으로]
  2. 제가 Aliexpress에서 구입한 제품은 벌크제품으로서 Conexant Systems (Rockwell), Inc.의 모뎀 칩을 사용하는 TRENDnet TFM-561U이거나 그 카피 제품으로 보입니다. 해당 모델은 리눅스와 호환성이 매우 좋은 것으로 알려져 있습니다. [본문으로]
  3. 제 경우와 달리, USB팩스모뎀의 종류에 따라 ttySL0 등의 이름으로 잡히는 모델이 있으므로 ls -la /dev/tty* 라는 명령으로 살펴볼 필요가 있습니다. [본문으로]
  4. 만약, Debian(Raspbian) Jessie 이전 배포판을 사용하고 있다면 sudo service hylafax restart 라는 명령을 통해 재시작하여야 합니다. [본문으로]
신고
Posted by truerain

라즈베리파이에 EMP (Nginx + MariaDB + PHP) 설치하기

   오늘은 라즈베리파이에 동적인 웹 서비스를 가동하는데 필요한 3종세트, 즉 웹서버 + 데이터베이스 서버 + PHP를 설치하고 기본적인 설정을 하는 방법에 대한 이야기를 해 보겠습니다.

1. 들어가는 말

   전통적으로 리눅스에는 Apache 웹 서버와 Mysql DB서버를 PHP에 연동시켜 사용해 왔습니다. 하지만 최근 경향을 보면 개인 서버나 소호, 중소기업의 경우 Apache 웹서버 보다는 설정이 보다 간편하고 적은 접속자 수에 적합한 Nginx의 사용을 더 선호하는 편이고, DB서버의 경우 Oracle에 편입된 Mysql의 미래에 대해 의구심을 가지는 개발자들이 이를 대체하는 MariaDB를 fork하여 그 사용자 기반을 넓혀가고 있지요. 이에 따라 데비안8 버전에 기반을 둔 Raspbian 운영체제가 설치되어 있는 라즈베리파이에도 Nginx, MariaDB, PHP를 서로 연동시킨 동적 웹서버를 구현해 보도록 하겠습니다.

   이 글에서는 우리의 라즈베리파이가 내부네트워크 192.168.0.2의 주소를 가지고 있다고 가정합니다.


2. 각 애플리케이션의 설치

(1) Nginx 설치

1
$ sudo apt-get install nginx 
cs

   아래와 같이 재부팅없이 nginx 웹서비스를 실행해 줍니다.

1

$ sudo systemctl start nginx.service 

cs

   데비안8의 nginx를 설치하면 기본 웹사이트의 위치는 /var/www/html 입니다.

   nginx가 잘 설치되었다면, 이 기본 웹사이트는 내부 네트워크 PC에 있는 웹브라우저 주소창에 192.168.0.2를 입력 시 아래와 같은 기본 환영 페이지로 보이게 됩니다.

 

(2) Mariadb 설치

1
$ sudo apt-get install mariadb-server mariadb-client 
cs

   위 명령을 실행하면 설치가 진행되면서 MariaDB의 root 암호를 처음 설정하는 파란색 대화창이 열립니다. 보안을 위해 운영체제 root 암호와는 다른 새 암호를 권장합니다. 새 암호를 입력하면, 다시 한번 root 암호를 확인 입력하는 화면에 동일한 암호를 입력합니다. 이후 나머지 설치과정을 마치게 됩니다.

 

(3) PHP 설치

1

$ sudo apt-get install php5-fpm 

cs

   위 명령의 실행으로 fastCGI를 지원하는 PHP-FPM (PHP FastCGI Process Manager)를 설치해 줍니다. PHP-FPM도 Nginx처럼 systemd에 의해 관리되는 서비스(대몬)입니다. FastCGI 서버죠.

 

3. 각 애플리케이션의 설정

(1) Nginx 설정

   아래와 같이 nginx의 설정파일을 editor로 엽니다.

sudo nano -w /etc/nginx/nginx.conf

1
$ sudo nano -w /etc/nginx/nginx.conf 
cs
 

   nano 에디터 화면에서

keepalive_timeout  65;

라는 라인을 찾아 숫자 65를 2로 바꾸어 줍니다.

   이번에는 default 사이트의 설정 파일을 바꿔줄 차례입니다.

1
$ sudo nanow -w /etc/nginx/sites-available/default 
cs

   여기서 다음과 같은 줄을 찾습니다.

 # Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

   여기 index로 시작하는 라인 제일 끝에 다음과 같이 index.php를 추가해 줍니다.

 index index.html index.htm index.nginx-debian.html index.php;

   이 파일의 좀 더 아래쪽으로 내려가서 다음과 같은 부분을 찾습니다.

 #location ~ \.php$ {
    #include snippets/fastcgi-php.conf;

#    # With php5-cgi alone:
#    fastcgi_pass 127.0.0.1:9000;
#    #With php5-fpm:
#    fastcgi_pass unix:/var/run/php5-fpm.sock;
#}

   윗 부분에서 일부 주석처리를 제거해 다음처럼 편집해 줍니다.

 location ~ \.php$ {
    include snippets/fastcgi-php.conf;

#    # With php5-cgi alone:
#    fastcgi_pass 127.0.0.1:9000;
     # With php5-fpm:
     fastcgi_pass unix:/var/run/php5-fpm.sock;
}

   마지막으로 다음과 같은 절차는 작동을 위해 반드시 필요하지는 않지만, 보안 강화를 위해 진행을 권장합니다.

   바로 아래 부분에서 다음과 같은 부분을 찾습니다.

 # deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
    #deny all;
#}

   이를 다음과 같이 주석 처리 제거를 해 줍니다.

 # deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
    deny all;
}

   편집이 완료되었으면 Control+X키를 누르고 저장 여부를 확인하는 메세지에 y키를 눌러 저장 후 nano 에디터를 빠져 나옵니다.

   그리고 재부팅 없이 설정파일이 반영되도록 다음과 같이 nginx 서비스를 재시작해 줍니다.

1
$ sudo systemctl reload nginx.service 
cs

 

(2) PHP 설정 1 (웹서버와의 연동)

   이제 PHP-FPM의 설정파일을 다음과 같이 엽니다.

1

$ sudo nano -w /etc/php5/fpm/php.ini 

cs

   이 파일에서 아래와 같은 부분을 찾습니다.

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1

   이 라인은 꽤 한참 아래로 내려가야 나오는데, 제 경우는 771번째 줄에 있었습니다. 이 설정을 아래와 같이 바꾸어 줍니다.

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0

   cgi.fix_pathinfo의 설정값을 0으로 바꾸어 주는 것인데, 앞의 ; 주석을 제거해 주어야 합니다. 그렇지 않으면 PHP가 이 설정값을 기본값인 1로 인식합니다.

   자, 이제 PHP가 잘 작동하는지 PHP 상태 정보를 불러오는 php 페이지를 만들어 봅니다. 다음과 같이 새 php 페이지를 만들어 줍니다.

1
$ sudo nano -w /var/www/html/info.php 
cs

   이 파일에 아래 내용을 붙여 넣고 Ctrl+X키로 저장(y입력) 후 nano에디터를 나옵니다.

<?php
phpinfo();
?>

   자, 이제 네트워크 내의 PC에서 웹브라우져를 열고 주소창에 아래 주소를 입력해 봅니다.

   아래 그림과 비슷하게 PHP의 정보가 웹브라우져에 출력된다면 웹서버와 PHP가 잘 연동되도록 설정된 것입니다.

 

(3) PHP설정 2 (데이터베이스 서버와의 연동)

   Debian 패키지 시스템에서 PHP는 여러가지 기능이 모듈화되어 각각의 패키지 형태로 제공됩니다. 어떠한 모듈들이 있는지는 다음과 같은 명령으로 확인할 수 있습니다.

1
$ sudo apt-cache search php5 
cs

   이 중에서 본인이 어떤 웹서비스를 할 것인가에 따라 본인에게 필요한 모듈을 골라서 설치해 줄 수 있습니다. DB연동도 PostgreSQL, sybase/MSSQL Server 등에 대한 연동까지 가능합니다. MariaDB는 Mysql을 완전히 대체(drop-in replacement)하는 애플리케이션이므로 MariaDB와의 연동을 위해서도 php5-mysql 혹은 php5-mysqlnd를 설치해 주어야 합니다. 끝에 붙은 nd는 native driver의 약자로서, php5-mysqlnd의 사용이 더 권장된다고 하네요. 우리도 이 녀석을 설치해 봅니다.

1
$ sudo apt-get install php5-mysqlnd 
cs

   특별히 설정파일을 만질 필요 없이 설치 과정 중에 스크립트가 알아서 다 연동 시켜 주고요. 우리는 그냥 다시 한번 웹브라우저에서 php 정보를 다시 불러서 확인해 보면 됩니다.

 

   위 그림과 비슷하게 설정이 되었다면 PHP와 MariaDB가 잘 연동된 것입니다.

   자, 이제 모든 설정을 마쳤으면, 보안상 우리가 생성한 info.php 파일은 삭제하는 것을 권장합니다.

 

4. 나오는 말

   이상과 같이 데비안 리눅스가 돌아가고 있는 라즈베리파이에 Nginx 웹 서비스, PHP 동적페이지 서비스, MariaDB 데이터베이스 서비스를 서로 연동하여 설치하는 방법을 살펴 보았습니다. 저렴한 구매비용뿐 아니라, 전력 소모도 적고 소음도 없으며 공간 마저 거의 차지하지 않는 이 기특한 물건 덕분에, 개인이나 소호, 중소기업까지도 이 작은 보드에 LEMP를 설치하여 동적 웹 서비스를 하기에 무리가 없는 시대가 도래하였습니다. 이제 이 웹서버에 여러 유용한 웹 콘텐츠를 올려 유용하게 사용해 봅시다. [끝.]

신고
Posted by truerain

4. 서버 측 공유기 포트포워딩 및 라우팅 설정

     (1) 서버 측 공유기 포트포워딩 설정

          우리가 사용하는 인터넷 공유기는 외부 네트워크와 내부 네트워크를 연결해 주고, 내부 네트워크를 보호해 주는 역할을 합니다. 외부 네트워크에서 봤을 때, 우리의 내부 네트워크는 기본적으로 하나의 (외부)IP와 (공유기의) MAC 주소를 가진 하나의 단말기 혹은 디바이스로 보입니다. VPN이라는 것이 기본적으로 외부에서 내부 네트워크로 마치 빨대를 꽂아 빨아 먹듯 사설 파이프를 연결하여 쓰는 것이므로 내부 네트워크 안에 있는 우리의 라즈베리파이 (혹은 오렌지파이) OpenVPN 서버와 지정된 포트(기본적으로 UDP 1194)로 막힘없이 통신할 수 있어야 합니다. 따라서 서버 측 공유기의 포트포워딩 설정을 통해 외부 OpenVPN 클라이언트와 내부 OpenVPN 서버가 통신할 수 있도록 설정해 줍시다. 

          우리 주변에 설치된 공유기들은 너무나 종류가 다양하고 펌웨어 또한 파편화 되어 있어, 모든 종류의 공유기에 대하여 설명한다는 것은 불가능 합니다. 여기서는 우리나라에서 가장 널리 쓰이는 ipTIME 제품을 예로 설명합니다. 포트포워딩과 다음에 기술할 라우팅 테이블 설정은 공유기의 기본 중 기본 기능이므로 용어와 메뉴 위치만 다를 뿐 다른 공유기에도 대동소이하게 존재하는 기능일 것으로 생각됩니다. 이 글을 참고하실 분들은 여러분의 공유기의 메뉴를 찬찬히 살피시어 그 동일한 기능을 제공하는지를 확인하시기 바랍니다.

          아울러, 이 설명은 제1부 "환경"부분에서 제시한 바와 같이 외부에서 우리 공유기를 찾아 들어올 수 있도록 외부 고정IP가 서비스되고 있거나, Dynamic DNS 서비스 (DDNS)가 이미 설정되어 있고, OpenVPN 서버가 내부 고정IP로 설정되어 있거나 공유기 단의 dhcp 서비스에서 예약/지정된 내부 유동IP를 할당받은 상태(우리의 예시는 192.168.0.2) 에서의 설명임을 다시 한번 상기시켜 드립니다.

          웹브라우져를 열고 주소창에 공유기의 내부네트워크 주소(일반적으로 192.168.0.1 이지만 공유기에 따라 혹은 본인 설정에 따라 아닐 수도 있습니다.)를 입력하고 엔터를 치면 공유기 관리화면 로그인 화면이 나옵니다. 로그인한 후 "관리도구"를 선택하여 들어갑니다. 브라우져 왼쪽 프레임에 메뉴탐색기에서 하단의 "고급설정-NAT/라우터관리-포트포워드 설정"을 차례로 클릭하고 들어갑니다. 그러면 오른쪽에 "포트포워드 설정"이라는 프레임이 열립니다.

          "정의된 리스트" 항목에는 "사용자 정의"를 선택하여 주시고, 그 왼쪽 "규칙이름"란에는 "OpenVPN"이라고 기재해 주세요. 그 아래쪽 "내부 IP 주소" 란에는 우리의 파이 OpenVPN 서버의 내부 주소인 192.168.0.2를 네 칸에 맞추어 입력해 줍니다. 프로토콜은 서버와 클라이언트 설정파일에서 선언해 준 대로 "UDP", 외부포트는 클라이언트 설정파일에서 선언해 준 대로 "1194", 내부포트도 서버 설정파일에서 선언해 준 대로 "1194"를 입력해 주고 아래 "추가" 버튼을 눌러 주면 설정이 완료됩니다. 아래 그림을 참조해 주세요.

ipTIME 공유기 포트포워드 설정 화면ipTIME 공유기 포트포워드 설정 화면입니다.

 

     (2) 공유기 라우팅 테이블 설정

          지난 회에서 설명할 기회가 없었지만, 우리는 서버와 클라이언트의 설정파일을 만드는 과정에서 "client-to-client"라는 옵션을 선언해 주었습니다. (서버 .conf 파일과 클라이언트들의 .ovpn 파일들을 한번 열어서 확인해 보세요.) 이것이 의미하는 바는 클라이언트가 OpenVPN에 접속하면 OpenVPN 서버 컴퓨터인 우리의 파이뿐만 아니라, 서버 측 내부 네트워크의 다른 내부 IP를 가진 장치들 (예를 들어 192.168.0.3의 주소를 가진 리눅스 서버 혹은 192.168.0.154의 주소를 가진 윈도우 PC 등등...)에 서버측 내부 네트워크 주소체계로 접근하여 통신하겠다는 의미입니다. 더 구체적으로 설명하자면, 우리의 예처럼, 외부 윈도우클라이언트에서 내부의 파이로 만든 OpenVPN 서버에 성공적으로 접속하여 10.8.0.0/24의 VPN네트워크가 형성되었다면, 외부 윈도우 클라이언트는 OpenVPN 서버인 파이에 ssh 접속을 10.8.0.1로도 할 수 있고, 192.168.0.2로도 할 수 있게 됩니다. 이뿐 아니라, 서버측 윈도우 PC에 원격데스크톱 접속을 하고 싶다면 (공유기 방화벽에 관계 없이 OpenVPN 서버의 도움으로) 내부 주소인 192.168.0.154로 원격 접속이 가능하다는 의미입니다.

          이것이 가능하기 위해서는 두 가지 조건이 필요한데, 첫째는 클라이언트측이 사설 IP 주소를 사용하여 접속한 경우, 서버 측과 클라이언트측의 내부 네트워크 주소가 동일한 세그먼트를 사용해서는 안된다는 것입니다. 즉, 만약 서버와 클라이언트 각 각 다른 내부 네트워크에 있지만, 모두 192.168.0.0/24 주소체계를 사용한다면, client-to-client 접속은 불가능합니다. 따라서 애초에 공유기 설정을 통해 서버 측 내부 네트워크를 10.XXX 로 시작하는 내부 주소로 전환하여 구성한 뒤에 OpenVPN 서버를 설치하는 것을 권장하기도 합니다. 대부분의 공유기들이 192.168.XXX 로 시작하는 내부 주소체계를 기본으로 채택하기 때문입니다.

          client-to-client를 가능하게 하는 두번째 조건이 바로 우리의 주제인 공유기 라우팅 테이블 설정입니다. 서버와 클라이언트가 아무리 설정을 통해 선언하여도 외부클라이언트가 10.8.0.0/24 네트워크를 통해서 192.168.0.X에 보내오는 데이터를 어디로 보내야 될 지 모르면 그 데이터는 갈 곳을 잃고 사라지고 맙니다. 그래서 '이 길로 가라'라고 지정해 주는 것이 라우팅이고 그것이 표로 정리된 것을 '라우팅 테이블'이라고 합니다. 이 과정을 통해 우리는 10.8.0.0/24 네트워크를 통해 나오는 데이터는 공유기인 192.168.0.1이 게이트웨이가 아니고 OpenVPN 서버인 192.168.0.2가 게이트웨이임을 선언해 줄 것입니다.

          다시 ipTIME 공유기로 가 보겠습니다. 왼쪽 메뉴탐색기에서 하단의 "고급설정-NAT/라우터관리-라우팅 테이블 관리"로 들어갑니다. 역시 오른쪽에 "라우팅 테이블 관리" 화면이 생깁니다. 맨 앞 "Type"엔 "Net"을 선택해 주시고, "Target"에는 10.8.0.0을 네 칸에 맞게 입력하여 주시고, "Mask"에는 숫자 "24"를 입력합니다. 마지막 "Gateway"에는 192.168.0.2를 역시 네 칸에 맞추어 입력해 주고 아래 "추가"를 누르면 설정이 완료됩니다. 아래 그림을 참조해 주세요.

ipTIME 공유기 라우팅 테이블 관리 화면ipTIME 공유기 라우팅 테이블 관리 화면입니다.

5. 문제 해결 (Troubleshooting and Workarounds)

     (1) 데비안 Jessie의 systemd 도입에 따른 이슈

          데비안은 Jessie 버전부터 init 시스템 대신 systemd를 전면 도입했습니다. 이것이 의미하는 바는 이전 Wheezy 버전까지는 시스템이 부팅되면 init 스크립트 체계에 설정해 놓은 선후관계에 따라 디먼(윈도우의 서비스)을 자동 실행하는 체제였다면, Jessie 버전부터는 총사령관 역할을 하는 systemd라고하는 디먼(서비스)가 먼저 실행되어 똬리를 틀고 앉아서 각 서비스의 의존관계에 따라 유연하게 순서를 정하여 각 서비스들을 자동 실행하는 것으로 바뀐 것입니다. 우리 같은 문외한이 보면 어차피 순서대로 실행만 잘 되면 별로 느낌이 안오는 변화인데, 운영체제를 깊이 파고들면 굉장히 큰 변화라고 합니다. 이게 그런데 아직 완벽하게 잘 정착이 되지는 않은 모습입니다. 제 리눅스 데스크탑도 데비안 jessie 기반의 우분투 16.04나 민트18에서 시스템 종료/재부팅 시 심한 딜레이에 빠져 systemd 관련 설정파일을 수정해야 했습니다. 데비안 OpenVPN 패키지도 마찬가지 인데요. 이 녀석은 기존에 init 시스템이 openvpn 디먼 서비스를 시작하면 OpenVPN이 .conf 파일을 불러들여 시작하는 형태였습니다. 그런데 systemd 체제는 OpenVPN이 하나의 서비스로 시작되고, 설정파일들이 종속적인 다른 각각의 서비스로 시작되어야 하는 구조로 되어 있습니다. 패키지 설치시에는 당연히 .conf 설정파일이 존재하지 않으므로, 설치 스크립트에 의해서 systemd 서비스가 enable 될래야 될 수 없는 구조인 것이죠. 따라서 Jessie 버전 이후부터는 서버의 .conf 파일을 만들어 주고 난 후 이것을 서비스로 enable 해 주는 절차가 수작업으로 필요하게 되었습니다. 마치 윈도우즈용을 설치하고 난 후 제어판 서비스에 가서 "자동" 실행으로 변경해 주어야 하는 것처럼 말이죠. Raspbian이든 Armbian이든 Jessie 이후 버젼이라면 이 절차를 따라야 합니다. 기본적으로 Debian 운영체제이거든요.

          다시 파이에 접속해 봅니다. 우리가 서버 측 설정파일의 이름을 server.conf라고 했지요. 재부팅 필요 없이 지금 server.conf 설정을 구동하고 싶다면 아래와 같이 입력합니다.

1
$ sudo systemctl start openvpn@server.service 
cs

          아래와 같은 명령도 동일한 결과를 가져옵니다.

1
$ sudo service openvpn@server start 
cs

          OpenVPN 설정파일을 부팅시 자동시작하도록 하고자 한다면 아래와 같이 입력해 줍니다.

1
$ sudo systemctl enable openvpn@server.service  
cs

          위 명령이 실제 하는 일은, openvpn 패키지로 설치된 "/lib/systemd/system/openvpn@.service"라는 파일에 연결되는 심볼릭 링크를 /etc/systemd/system/multi-user.target.wants/openvpn@server.service라는 링크 파일로 만들어 주는 것입니다.

          이제 재부팅하여 OpenVPN 서버 설정 서비스가 잘 시작되는 지 봅시다.

1
$ sudo reboot 
cs

 

     (2) .conf 설정파일의 서비스가 active되지 않는 경우

          재부팅이 완료되면 다시 파이에 접속하여 server.conf 서비스가 부팅 시 정상적으로 실행되었는 지를 확인합니다. 이를 위하여 아래의 명령을 이용합니다.

1
$ systemctl status openvpn@server.service 
cs

          그 결과 초록색 점과 "Active"항목의 결과값이 초록글씨의 active (running) 이라면 정상적으로 실행이 된 것입니다. 그러나 빨간색으로 표시되며 inactive 하다고 나오는 경우가 있습니다. 그 이유는 대부분 systemd가 실시간으로 의존성을 분석해 시작한 순서에 문제가 있어서 즉, 너무 빨리 실행되어 의존성을 만족시키지 못해 오류가 났을 가능성이 가장 큽니다. 이때의 대처방안은 서비스설정파일 (Unit 파일)을 수정하여 의존성 추가로 실행 순서를 늦추어 주는 것입니다.

          데비안 Jessie에 포함된 systemd 버전 상 Unit 파일을 수정해 주는 방법은 직접 해당 파일을 수정해 주는 것[각주:1]이므로 아래 명령으로 해당 파일을 에디터에 불러 들입니다.

1
$ sudo nano /lib/systemd/system/openvpn@.service 
cs

          열린 파일의 상단 쪽을 보시면,  [Unit] 섹션 아래 쪽 마지막에 "ReloadPropagatedFrom=openvpn.service" 이라고 하는 항목이 있습니다. 이 줄 맨 끝에 가서 엔터를 눌러 주어 한 줄을 더 만들어 줍니다. 새로 만들어 준 줄에 아래 내용을 복사하여 붙여 넣고 저장하고 닫습니다.

1
After=multi-user.target 
cs

          위 설정으로 server.conf 서비스의 부팅 시 실행 순서가 상당히 뒤로 갈 것입니다. 다시 한번 재부팅해 주고 서비스 실행 여부를 확인합니다.

 

     (3) 그래도 .conf 서비스가 active되지 않는 경우

          이론적으로는 사실 위의 설정만 제대로 해 주면 안될 이유는 없습니다. 다만, 그래도 server.conf 서비스가 부팅시에 active되지 않는다면 아래의 조치를 해 볼 필요가 있습니다.

          우선 서버 설정파일을 엽니다.

1
$ sudo nano /etc/openvpn/server.conf 
cs

          상단 "port 1194" 아래에 "local 192.168.0.2"라고 되어 있는 줄의 맨 앞에 "#"을 붙여 주어 그 줄 전체를 주석 처리하고 저장 후 닫습니다.

          한 해외 커뮤니티에 따르면, 원인을 알 수 없는 설정파일 서비스의 inactive 상황의 경우, 위와 같이 서버 설정파일에서 서버의 내부 IP 주소를 명시적을 선언해 주는 위 설정을 없애 주면 (주석처리해 주면) 정상적으로 작동한다는 경험자의 성공담이 있었습니다. inactive의 원인도 해결책의 원리도 밝혀진 것은 없지만, 서버가 내부 ip 주소체계를 확정하기 전에 설정파일 서비스가 시작될 경우 "local 192.168.0.2"라는 설정이 실행에 오류를 내기 때문으로 추정해 볼 수 있습니다.

          아무튼, 명시적인 서버 내부 주소의 선언이 없이도 OpenVPN 네트워크가 잘 돌아가므로, 다소 군더더기에 가까운 이 "local XXX.XXX.XXX.XX"라는 설정은 없애는 것이 오류를 줄이는 것임은 확실한 듯 합니다.

 

이상으로 Raspberry Pi를 OpenVPN 서버로 만들기의 3부작 모든 연재를 마칩니다. 부족한 지식으로 장황하게 쓴 글이지만, client-to-client 방식 접속을 위해 국내에  널리 쓰이는 공유기 관련된 OpenVPN 설정 문서가 부족하고 최신 Jessie 버전에 맞는 설정 방법에 대한 안내문도 부족한 현실에서 나름의 의의를 가지는 문서가 되기를 희망해 봅니다. 이 글을 참조해서 OpenVPN을 성공적으로 도입하시는 분들이 한 분이라도 생긴다면 감사하고 보람된 일이 될 것 같습니다.

          길고 어지러운 글 끝까지 읽어 주셔셔 감사합니다.

 

 

  1. systemd 218 버젼부터는 sudo systemctl edit openvpn@.service 라는 명령이 가능해 졌습니다. /lib/systemd/system/ 폴더에 있는 파일은 직접 수정하면 업데이트시 수정본이 사라지므로 간접 편집방식을 지원하게 된 것입니다. 자세한 사항은 systemd 관련 문서를 참조하세요. [본문으로]
신고
Posted by truerain

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

1. 환경

 

     (1) 실행 하드웨어 및 운영체제

         - Raspberry Pi 2 (운영체제 : Raspbian Wheezy/Jessie) 또는,

           호환 확인된 유사 보드 : Orange Pi PC (운영체제 : Armbian Jessie)

         ※ 물론 ARM 계열 보드들 뿐만아니라 Debian의 Wheezy 혹은 Jessie 배포판을 사용하는 일반적인 PC환경에서도 동작할 것입니다.

 

     (2) 네트워크 – 공유기 (ipTIME) 내부 사설 네트워크

         - 공유기 게이트웨이 : 192.168.0.1

         - OpenVPN이 설치될 라즈베리파이 (혹은 오랜지 파이) 보드 :  

                                     192.168.0.2 (공유기 설정에서 사설IP 예약 할당)

           - 공인 고정 IP 혹은 DDNS (이 글에서는 my_network.iptime.org로

           DDNS 설정이 되어 있는 상황을 가정합니다.)

 

2. OpenVPN 설치

 

     (1) 데비안 Wheezy 버젼인 경우 

          easy-rsa가 openvpn 패키지에 포함되어 있으므로 별도로 설치할 필요가 없습니다.

1
$ sudo apt install openvpn
cs

 

 

     (2) 데비안 Jessie 버젼 이후의 경우 

          easy-rsa가 별도 패키지로 분리되었기때문에 함께 설치가 필요합니다.

1
$ sudo apt install openvpn easy-rsa    
cs

 

 

3. 설정 (A) : easy-rsa 관련파일 생성

 

     (1) root프롬프트 전환

          권한문제 등을 원활히 해결하기 위하여 아래와 같이 root 프롬프트 환경으로 진입합니다.

1
$ sudo –s    
cs

 

     (2) TLS기반 인증을 위한 easy-rsa 스크립트 폴더 복사

         - Wheezy의 경우

1
# cp –r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa   
cs

 

         - Jessie의 경우

1
# cp –r /usr/share/easy-rsa /etc/openvpn/easy-rsa   
cs

 

     (3) vars 파일 변수 설정 편집

1
2
# cd /etc/openvpn/easy-rsa
# nano ./vars
cs

          vars파일이 열리면 ‘EASY_RSA’라는 변수를 찾아 =표시 뒤의 값이 아래와 같이 되도록 바꾸어 줍니다.

1
export EASY_RSA=”/etc/openvpn/easy-rsa”
cs

 

(이때 줄 맨 앞에 #표시가 붙지 않아야 합니다. 설정파일 특정 행의 선두에 #이 붙어있다는 것은 그 행 전체가 주석이라는 의미입니다.)

vars파일의 EASY_RSA 변수 부분.vars파일의 EASY_RSA 변수 부분을 찾아 그 값을 변경해 준 이후의 모습입니다.

          계속해서 아래 내용이 나오는 부분을 찾습니다.

1
export KEY_COUNTRY="US"
cs

          위 변수 선언이 나오는 곳을 찾아 =부호 뒤 따옴표 안의 US를 서버가 위치한 곳의 국가코드로 바꾸어 줍니다. (반드시 2자리 국가코드 형태로 입력합니다. 우리나라는 KR이겠지요.)

          그 아래로 KEY_PROVINCE  변수는 =부호 뒤 따옴표 안의 CA를 서버가 위치한 특별/광역시/도 영어 이름으로 바꾸어 줍니다. 마찬가지 방법으로 도시도 바꾸어 주고, KEY_ORG는 영어 회사명 혹은 누구네 집 (~’s home)정도를 입력해 줍니다. KEY_EMAIL은 굳이 기재할 필요는 없는데 스크립트가 공란을 허용하지 않으므로, . 만 입력하고 넘어갑니다. KEY_OU는 부서명을 영어로 입력하거나 .를 입력하여 넘어갑니다. 아래 그림은 서울시 용산구에 위치한 용산(주) 영업부라는 가상 조직의 예를 var파일의 해당 변수에 입력한 예시 화면입니다.

vars파일 예시입니다.이 그림은 서울시 용산구에 위치한 용산(주) 영업부라는 가상 조직의 예를 var파일의 해당 변수에 입력한 예시 화면입니다.

          위 KEY_COUNTRY부터 KEY_OU까지는 아래에서 언급할 키 생성 스크립트들에서 사용자에게 물어보는 값들입니다. 이때 [ ]안에 우리가 var파일에 입력한 국가코드, 시도 이름, 도시 이름 등이 기본값으로 제시되며 그냥 엔터만 누르고 지나가면 기본값이 입력되고, 변경하고자 한다면 변경될 값을 입력한 후 엔터를 입력하면 변경된 값이 적용되는 방식입니다. 

          자, 이제 Control + X 키를 누른 뒤 nano 에디터가 저장할 지를 물으면 Y 키를 눌러 저장하고 나옵니다.

 

     (4) CA (Certificate Authority) 구축

1
2
3
# source ./vars
# ./clean-all
# ./build-ca
cs

          위 bash 명령어에서 첫 줄은 vars 파일에서 선언해 준 변수들을 읽어들여 참조하라는 의미이며, 두번째 줄은 서브디렉토리 keys/가 생성되어 있다면 해당 폴더의 내용을 전부 지우는 명령입니다. 따라서 처음 key들을 생성할 때 이외에는 실수로 이 명령어를 입력하지 않도록 주의하여야 하며, 반대로 모든 key작업을 처음부터 다시 시작하여야 할 필요가 있을 때, 유용하게 이 명령을 사용함으로써 초기화된 깨끗한 환경에서 새로 CA와 키들을 생성할 수 있습니다. 세번째 줄의 명령어는 CA (Certificate Authority)를 생성하라는 의미입니다.

          CA 생성을 시작하면, EASY_RSA 프로그램은 난수를 생성한 뒤, 위에서 우리가 변수로 선언한 국가코드 등을 어떻게 적용할지를 사용자에게 묻는 절차를 진행합니다. vars파일 편집을 잘 해 놓으셨다면 특별히 변경 없이 엔터를 입력하여 넘어가도 무방해 보입니다.

 

     (5) 서버 Certificate 및 KEY 생성

1
# ./build-key-server [서버_이름] 
cs

          이제 위 명령어를 통해 서버 인증서와 키를 생성해 줍니다.

          서버 이름은 해당 부서 혹은 회사 전산실에서 OpenVPN 서버로 사용할 컴퓨터를 네트워크 상에서 구분해서 부르는 영어(와 숫자로 된) 실제 이름을 붙여 기재합니다. 예를 들어, 그냥 Server라는 이름을 붙였을 경우 아래와 같이 입력합니다.

1
# ./build-key-server Server 
cs

          단, 서버 이름은 이 후에 만들 클라이언트들의 이름과 겹치지 않도록 하는 것이 관리 목적상 중요합니다. 아울러 이 명령에 입력하는 [서버_이름]이 서버키를 만드는 과정에서 스크립트가 CN (Common Name) 값을 물어볼 때 [ ]안에 들어가는 기본값이 되는데, 이 기본값을 유지해 주어야 합니다. 이 CN 값은 모든 클라언트와 서버가 각각 고유한 값을 가져야 합니다. (즉, 동일한 값을 입력하면 작동시 오류가 납니다.) 단, 설정파일에서 동일한 값을 갖을 수 있도록 옵션을 설정할 수는 있지만, 역시 관리목적상 바람직하지 않습니다.

          또한가지 중요한 것은, 스크립트가 사용자의 입력값을 요구하면서 아래와 같이 묻습니다.

1
A challenge password?
cs

          이때 어떠한 값도 입력하지 말고 엔터를 입력해야 합니다.

1
Sign the Certificate?
cs

          라는 질문에는 Y를 입력해야 합니다.

1
Sign the Cer1 out of 1 certificate requests certified, commit?
cs

          여기에도 Y를 입력하면 비로소 정상적으로 서버 인증서와 키가 완성됩니다.

 

     (6) Client Certificate 및 Key 생성

          이제 클라이언트용 키를 생성하는 단계입니다. 클라이언트용 키는 일반적으로 VPN에 접속할 VPN사용자 단위로 만들어 줍니다. 그래야 회사의 경우 VPN사용자 퇴사 시 해당 클라이언트 키만 무효화하여 서버와 다른 클라이언트를 유지할 수 있습니다. 따라서 이 경우 해당 VPN사용자의 고유한 값 (e.g. 사원번호)을 [클라이언트_이름]과 CN 값으로 입력하는 것이 현명해 보입니다.

          만약 가정에서 운용하고, 접속하는 VPN사용자는 극히 적고 변동될 가능성이 없는데 동일한 VPN사용자가 PC, MAC,  모바일 기기 등 여러 디바이스로 접속한다면, 접속하는 디바이스의 고유 이름대로 클라이언트 키를 만들어 줄 수도 있을 것입니다. 물론, 이 경우 접속하던 디바이스를 처분할 때, 해당 클라이언트 인증서와 키를 폐기하는 스크립트를 실행해 주어야 하겠지요. 특히 비밀번호 없이 클라이언트를 생성할 경우 폐기 절차는 보안에 절대적으로 필요합니다.

           아래 명령어는 참고만 하십시오.

1

# ./build-key-pass [클라이언트_이름] 

cs

          역시 [클라이언트_이름]으로 입력해 준 값이 CN 기본값이 됩니다.  위 명령은 클라이언트 키를 생성하는 스크립트가 진행될 때 PEM 패스워드를 만들도록 되어 있습니다. 위 방식으로 클라이언트 키를 만들면, VPN사용자는 OpenVPN 서버에 접속할 때마다 PEM 패스워드를 입력하여야 합니다. 또한 위 방식으로 만든 클라이언트가 iOS, 안드로이드 등 모바일기기에서 서버에 접속하고자 한다면, 3des 파일을 한 번 더 만들어 줘야 한다고 합니다. 이 글에서는 위 방식은 다루지 않고 아래와 같이 PEM 패스워드를 입력하지 않고 접속하는 클라이언트 생성방법을 설명합니다.

1
# ./build-key [클라이언트_이름] 
cs

          [클라이언트_이름]은 전술한 바와 같이 적절하고 고유한 클라이언트의 실제 이름으로 치환하여 입력하여야 합니다. 예를 들어, Client1 이라는 이름으로 클라이언트 키를 생성하기 위해 아래와 같이 입력합니다.

1
# ./build-key Client1 
cs

          그러면 스크립트가 난수 생성과정을 진행한 뒤 서버키 생성때와 마찬가지로 사용자의 입력값을 쭉 요구하고 나서 아래와 같이 묻습니다.

1
A challenge password?
cs

          역시 이때 어떠한 값도 입력하지 말고 엔터를 입력해야 합니다.

1
Sign the Certificate?
cs

          라는 질문에는 Y를 입력해야 합니다.

 

     (7) Diffie-Hellman key exchange 생성

1
# ./build-dh 
cs

          우리가 var파일에서 해당 변수에 특별한 변경을 하지 않았다면, 위 명령을 입력했을 때, 스크립트가 2048 비트로 암호화하는 dh2048.pem 파일을 keys 디렉토리 내에 생성합니다. 이 파일의 생성시간이 상대적으로 서버, 클라이언트 난수 생성보다 꽤 길게 느껴질 것입니다. 그래서 데비안 wheezy 때까지만 해도 암호화 수준을 1024 비트 수준으로 하는 것이 var파일의 기본값이었고 권장값이었는데, Jessie로 넘어오면서는 기본값이 2048 비트로 되어 있더군요. 아마 하드웨어의 성능이 비약적으로 향상되면서 1024 비트의 암호해독 속도도 줄었을 것이고, 반대로 2048 비트로 암호화 하는 체감 속도도 과거 보다는 빨라졌기 때문에 생긴 변화일 것이라 생각해 봅니다. (순식간에 완료하겠구나 하고 오해하는 것은 금물입니다. 과거보다 빨라졌을 뿐, 2048비트 암호화 파일 생성시간이 orange pi pc 기준으로 12~13분 가량 이상은 됩니다.) 아무튼 보안 수준이 높아진다는 것은 나쁠 것은 없지요.  

 

     (8) ta.key 파일 생성

1
# openvpn –-genkey –-secret keys/ta.key 
cs

          이제 해커의 DoS (Denial of Service) 공격을 대비하기 위해 서버와 클라이언트가 공유하는 파일인 ta.key 파일을 위와 같은 명령으로 만들어 줍니다.

 

   이상으로 Raspberry Pi를 OpenVPN 서버로 만들기 제1부 내용을 마칩니다. 이어질 2부에서는 서버와 클라이언트 설정파일을 생성하는 과정까지 마치고 3부에서는 실제로 운용해보고 발생하는 문제에 대한 대처 등을 다루어 볼까 합니다.

신고
Posted by truerain