Vultr 클라우드 서버호스팅에서 사용할 커스텀 윈도우10 OS 이미지를 생성하는 방법입니다.


커스텀 윈도우 ISO을 만들기위해서는 아래 파일들이 필요합니다.


1. 윈도우10 .ISO  DVD 정품 이미지 파일

    

2. VIRTIO Driver 이미지

  https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso


3. 7zip   (ISO 파일 압축풀기용)

http://www.7-zip.org/


4. ImgBurn  (최종 ISO 생성용)



작업순서


1. 윈도10 ISO 파일이 있는 경우 해당 ISO 파일을 특정 디렉토리에 풉니다.  

여기에서는  C:\custom\win10 에 압축을 푼다고 가정하겠습니다.


2. Virtio Driver ISO 파일을   C:\custom\win10\virtio 경로로 풉니다.






3. ImgBurn 을 이용하여  C:\custom\win10 을 통째로 다시 iso 파일을 생성합니다.


ImgBurn 을 실행하면 아래와 같은 선택창이 나타납니다. 여기에서 [Create image file from files/folders] 를 선택합니다.



그리고 나서 Source 항목에는 앞서 윈도10 을 풀어놓은 디렉토리를 선택합니다. 

Destination에는 새로 생성할 iso 파일경로 선택및 이름을 넣어 줍니다. 



우측 옵션탭에서 File System 을 UDF로 선택합니다.

그리고 Labels 탭선택 후  적당한 UDF Label 입력 하기 


Advanced 탭선택후, Make Image Bootable 을 체크합니다.


Boot Image 에서는 윈도10 에 포함된 etfsboot.com 파일을 선택해줍니다.

(전체 경로는 C:\custom\win10\boot\etfsboot.com)


Developer ID도 입력하고 Sectors To Load는 8을 입력합니다.


Load Segment는 기본적으로 나타나는 값을 유지합니다.


여기까지 입력되었으면 최종적으로  Build를 실행합니다.



ISO빌드 실행시 보여지는 대화창.



[확인] 해주면 짧은 시간안에  새로운 커스텀 ISO파일이 생성됩니다.


프로그램을 개발하다보면 소스에 대한 버전관리는 필수 이다.  오래된 CVS 사용이후  SVN을 사용했었고, 최근에는 Git을 사용하고 있는데.  사실 Git에 대한 얘기를 들은지는 오래됐었지만 실제 사용까지는 시간이 많이 걸렸었데

 


 






 

git은 다른 버전 관리 소프트웨어들과 다른 개념을 갖고 있는게 있다보니 이를 이해하는것이 귀찮았었다.  하지만 Git 이 좋다니 몇가지 명령만으로 사용하고는 있었는데  최근에  Git 를  일종의 파일시스템으로 이용해봐야 겠다는 생각이 있어. 이렇게 하기위해서  Git에 대한 깊숙한 이해가 필요하기에

좀더 상세 하게 알아보게 되었다.

 

그러다 보니 그간 불분명했던 Git에 대한 것이 좀더 명확해졌는데. 이를 정리해 볼까 한다.   여기서는 Git 의 Repository 구조를 알기위해서는 Gi에서 Tree라는 object를 정확히 이해 하고 있어야하는데 이해대한 이해를 위해  git 의 Low Level 명령어를 이용해  Git repository에 파일과 디렉토리를 추가하는 것을 해볼것이다.

 

준비환경은 git 을 실행할 수 있는 환경이면 어디든 상관없는데. 참고로 여기서는 Windows 에 msysgit(http://code.google.com/p/msysgit/) 을 설치했을때 생겨나는 bash 쉘 에서 실행했다.

 

아래 내용은  git 의 문서인 (정확히는 Pro Git이라는 책의 온라인 링크) http://git-scm.com/book/en/Git-Internals 경로의 내용을 내 나름대로 좀더 명확하게 다뤄봤다고나 하는 정도이다.

 

 

먼저 git init 명령으로 빈  git 디렉토리 생성하고 진행한다.

 

 init 명령을 통해 git repository를 생성하고 나서 이하의 디렉토리를 살펴보면 다음과 같다.

 $ find .git -type f
.git/config
.git/description
.git/HEAD
.git/hooks/applypatch-msg.sample
.git/hooks/commit-msg.sample
.git/hooks/post-commit.sample
.git/hooks/post-receive.sample
.git/hooks/post-update.sample
.git/hooks/pre-applypatch.sample
.git/hooks/pre-commit.sample
.git/hooks/pre-push.sample
.git/hooks/pre-rebase.sample
.git/hooks/prepare-commit-msg.sample
.git/hooks/update.sample
.git/info/exclude



hash-object 명령을 이용해 object ID와  blob object를 생성한다.

 파일에서가 아닌 직접 입력으로 파일을 생성한다. 

$ echo 'test content' | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4


위 명령을 하고 난뒤  git의 database 공간인  .git/objects  디렉토리 이하를 살펴보면   하나의 object가 새로 생성되었음을 알 수 있다.  

아래 명령 실행 참고
$ find .git/objects -type f
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4


위의 것은 파일로 부터 object를 만드는 것과 어떤 차이가 있을까?

이번에는 object를 파일로 부터 만들어 본다.

$ echo 'test content  2' > second.txt

 

$ git hash-object -w second.txt
warning: LF will be replaced by CRLF in second.txt.
The file will have its original line endings in your working directory.
031da66cfe6457d8fb541fa95e54e5b600576d41

 위 명령어는 파일로 부터 내용을 읽어 blob object와  object ID를 생성해서  git database에 생성한다.

단지 파일에서 내용을 읽을 뿐  앞서  echo 명령을 이용해 데이터를 바로 전달한 것과 차이가 없다

다음 명령실행결과를 보면  둘간에 차이가 없음을 알 수 있다.

$ find .git -type f
.git/config
.git/description
.git/HEAD
.git/hooks/applypatch-msg.sample
.git/hooks/commit-msg.sample
.git/hooks/post-commit.sample
.git/hooks/post-receive.sample
.git/hooks/post-update.sample
.git/hooks/pre-applypatch.sample
.git/hooks/pre-commit.sample
.git/hooks/pre-push.sample
.git/hooks/pre-rebase.sample
.git/hooks/prepare-commit-msg.sample
.git/hooks/update.sample
.git/info/exclude
.git/objects/03/1da66cfe6457d8fb541fa95e54e5b600576d41
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4

단지 git/objects/ 디렉토리에 object파일(031da6)이 하나 만들어 졌을 뿐이다.  이 말인즉,  파일명 정보는  아직 저장 되지 않았다는 의미 이다. 단지 내용만 object로 만들어 졌다. 

실제로 object에 파일명을 붙여주는(매핑해주는) 작업은 추가로 해주어야 한다.

git 에서 object와  해당 object의 이름(파일명 또는 또 다른 tree 명)을 매핑해주는 정보는  tree 라는 object에 저장하게 된다. 

즉 파일명을 붙여주려면 tree object를 만들어 주어야 한다. tree object를 만들기 위해서는 먼저 index 정보가 필요하다. index 내용을 이용해서 tree object를 만들기 때문이다.



update-index 명령으로 이를 해줄 수 있으며  앞서  echo명령을 이용해 내용을 전달해서 만든 object 에 first.txt 라는 파일명을 부여해줘보겠다.

$ git update-index --add --cacheinfo 10644 d670460b4b4aece5915caf5c68d12f560a9fe3e4 first.txt

위 명령을 하고 나서 .git 디렉토리를 살펴보면 
 
$ find .git -type f
.git/config
.git/description
.git/HEAD
.git/hooks/applypatch-msg.sample
.git/hooks/commit-msg.sample
.git/hooks/post-commit.sample
.git/hooks/post-receive.sample
.git/hooks/post-update.sample
.git/hooks/pre-applypatch.sample
.git/hooks/pre-commit.sample
.git/hooks/pre-push.sample
.git/hooks/pre-rebase.sample
.git/hooks/prepare-commit-msg.sample
.git/hooks/update.sample
.git/index
.git/info/exclude
.git/objects/03/1da66cfe6457d8fb541fa95e54e5b600576d41
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4

.git/index 파일이 생겨났음을 알 수 있다. 

이 index 정보는 곧  git 에서 말하는 stage 상태의  (cache)정보가 된다.  

그리고 아직 object들간의 관계정보는 없는데 관계정보라 함은,  object의 이름. object의 위치(파일시스템에서 보면 어떤 디렉토리에 존재하는 지 정보 등) 이들 관계정보를 갖는 것이 결국 tree 이다. 

git 에서 tree 에 대한 개념만 정확히 이해 하면 사실 90% 이상은 이해하는 것 같다.

git에서  commit 이라는 것이 특정 시점의 특정한 object들의 관계정보를 저장하면서 commit 이라는 object를 만드는 것인데 결국 이는 tree 정보를 말한다.   다만 commit object와  tree object 차이점은  commit object는 특정한 tree object를 가리키고 여기에 comment와 누가 만들고 commit했는지 정보를 추가하는 것 뿐이다.

여기서 오해가 없어야 할것이 대상 tree object는 계속 바뀐다는 것이다.  파일을 추가한다는 것은 기존 tree 정보를 활용해 object가 추가된다는 것이고, 파일을 변경한다는 것은 기존 object를 둔채 새로운 object가 역시 추가된 다는 것이고 

(좀더 상세히 말하면 중간에 index 에 추가되거나 변경되는 object들에 대한 매핑정보를 가지고 있다가 write-tree 에서 실제 새로운 tree 를 만들면서 저장이 된다.)   그리고 추가되고나 바뀐 내용을 저장하기 위해서는 새로운 tree object 가 생겨난다는 것이다.  따라서 해당 tree object를 가리키는 oid는 당연히 바뀌고 이때 commit을 하기되면 commit object가 가리켜야할 tree object역시 바뀌어야 하기 때문이다.



  index =   object's name + object type + oid 

  tree =  writed index 

  commit =  tree  +  comment + author info    라고 보면 되겠다.


그리고 branch 와 같은 reference 도  모두  특정한 commit을 가리키게되는 데 결국 특정시점에 만들어진 tree object를 가리키게 되는 셈이다.

이제 앞서 만든 index 내용을 tree object로 만들어 보자 

$ git write-tree
802e62ded81357dc7b0f74ed37f72bf245f88a4b

 tree 역시 object 로 만들어지기 때문에 object ID를 뱉어 냈다.

$ find .git/objects -type f
.git/objects/03/1da66cfe6457d8fb541fa95e54e5b600576d41
.git/objects/80/2e62ded81357dc7b0f74ed37f72bf245f88a4b
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4

그리고 해당 tree object의 내용을 살펴보면  

$ git cat-file -p 802e62ded81357dc7b0f74ed37f72bf245f88a4b
100644 blob d670460b4b4aece5915caf5c68d12f560a9fe3e4    first.txt

 이제 commit object를 만들어 볼 것이다.  commit을 만들었다는 것은 이를 이용해 branch 를 지정 해 줄 수 있다는 의미이다.

앞서 만든 tree object를 이용해  commit-tree 명령을 하면  commit object가  생겨난다. 

$ echo 'commit first' | git commit-tree 802e62
296f93c8cd0adbd687cbf73b0c8cef61e138e71e

그리고 다시 한번 objects 디렉토리를 살펴보면   object가 하나 추가 되어있다. 해당 object는 commit object이다. 

$ find .git/objects -type f
.git/objects/03/1da66cfe6457d8fb541fa95e54e5b600576d41
.git/objects/29/6f93c8cd0adbd687cbf73b0c8cef61e138e71e
.git/objects/80/2e62ded81357dc7b0f74ed37f72bf245f88a4b
.git/objects/99/12b44e53af4bce15827526c1709f75bc7bb88a
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4 

$ git cat-file -p 296f93c8cd0adbd687cbf73b0c8cef61e138e71e
tree 802e62ded81357dc7b0f74ed37f72bf245f88a4b
author user@somecomp.co.kr <user@somecomp.co.kr> 1395645128 +0900
committer commiter@somecomp.co.kr <commiter@somecomp.co.kr> 1395645128 +0900

commit first


이렇게 만들어진 commit을 master(reference)로 지정해 보겠다. 방법은 간단하다.  
해당 commit object oid .git/refs/heads/master  에 넣어주면 된다.

먼저 해당 폴더를 살펴보면 아직 파일이 없다. 

$ find .git/refs
.git/refs
.git/refs/heads
.git/refs/tags

 그리고 앞서 만든 commit 의 oid를 이용해 master 파일을 만든다.

$ echo  "296f93c8cd0adbd687cbf73b0c8cef61e138e71e" > .git/refs/heads/master

 이제 만들어진 master를 checkout해볼텐데 앞서 현재 디렉토리 상황을 한번 보면 


$ ls
second.txt

앞서 테스트용으로 만들어봤던 second.txt 파일이 있다. 

이제 checkout을 할 텐데  , chechkout 하기에 앞서 최종적으로 commit을 만들때 사용한 tree 에는 first.txt라는 파일명을 붙여준 object하나만을 매핑 하고 있음을 기억하고 있자.

checkout 에 -f 옵션을 붙여 줄텐데  이는 현재 작업디렉토리 상황을 무시하고 master branch 내용대로 파일들을 chechkout하라는 의미이다. 안그러면 현재 작업디렉토리에 first.txt 가 없기 때문에 삭제된 것으로 인지 하 기 때문이다.

$ git checkout -f master
Already on 'master'
$ ls
first.txt  second.txt

 자 이렇게 해서  파일없이 git object추가 부터 commit 까지 해보았다.

그럼 디렉토리는 어떻게 추가할까? 

git 에서 디렉토리는 tree 가 그 역할을 하게 되는데  tree 는 기본적으로 다른 object에 대한 매핑정보없이는 만들어질 수 없다.  즉 한개의 object라도 매핑이 되어야 한다.  

예를 들어 mydir 이라는 디렉토리가 생성되려면,  mydir/ 밑에 특정 object를 있는 것으로 경로를 지정해주면서 index에 추가 해주면 된다.

추가하기전에 먼저 현재 object 목록을 살펴보자


$ find .git/objects -type f
.git/objects/03/1da66cfe6457d8fb541fa95e54e5b600576d41
.git/objects/29/6f93c8cd0adbd687cbf73b0c8cef61e138e71e
.git/objects/80/2e62ded81357dc7b0f74ed37f72bf245f88a4b
.git/objects/99/12b44e53af4bce15827526c1709f75bc7bb88a
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4


그리고 서브디렉토리생성및  object 추가 하기 

$ git update-index --add --cacheinfo 10644 031da66cfe6457d8fb541fa95e54e5b600576d41 mydir/echo_second.txt

이렇게 index에 mydir/echo_second.txt를 추가하더라도 object 상황은 바뀐게 없다. 

$ find .git/objects -type f
.git/objects/03/1da66cfe6457d8fb541fa95e54e5b600576d41
.git/objects/29/6f93c8cd0adbd687cbf73b0c8cef61e138e71e
.git/objects/80/2e62ded81357dc7b0f74ed37f72bf245f88a4b
.git/objects/99/12b44e53af4bce15827526c1709f75bc7bb88a
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4

단지 index 파일에만 내용이 저장되기 때문이다. 

그런데 이렇게 하고 나서 write-tree를 하게 되면 어떨게 될까.

$ git write-tree
adf331e74367e0a991c41b7918e14be8faf3189b

우선 해당 tree를 살펴보면  mydir 이라는 tree object를 가리키고 있는 것을 볼 수 가있는데, 

 $ git cat-file -p adf331e74367e0a991c41b7918e14be8faf3189b
100644 blob d670460b4b4aece5915caf5c68d12f560a9fe3e4    first.txt
040000 tree 1f6e6885b83dd560a9d6ea062a3e3a997b035855    mydir

정작 echo_second.txt는 안보인다.  어디있을까 ?
이것은 다시 mydir 이라는 tree object를 살펴보면 된다.

$ git cat-file -p  1f6e6885b83dd560a9d6ea062a3e3a997b035855
100644 blob 031da66cfe6457d8fb541fa95e54e5b600576d41    echo_second.txt

이렇게 write-tree를 하게되면 해당 tree 에 대한 새 object(adf331e) 와  echo_second.txt를 포함해야하는 tree object(1f6e688) 이 생겨나게 된다.

$ find .git/objects -type f
.git/objects/03/1da66cfe6457d8fb541fa95e54e5b600576d41
.git/objects/1f/6e6885b83dd560a9d6ea062a3e3a997b035855
.git/objects/29/6f93c8cd0adbd687cbf73b0c8cef61e138e71e
.git/objects/80/2e62ded81357dc7b0f74ed37f72bf245f88a4b
.git/objects/99/12b44e53af4bce15827526c1709f75bc7bb88a
.git/objects/ad/f331e74367e0a991c41b7918e14be8faf3189b
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4 


즉 git 에서는 directory라는 형태의 object가 없고  다른 tree를 포함하는것으로 서브 디렉토리역할을 하게 되는데. tree 는 기본적으로 object의 관계정보를 가지고 있어야하기때문에  결국 디렉토리를 만들기 위해서는 하나의 이상의 파일을 포함해야 하게 된다.

그러다 보니 git 에서 빈 디렉토리가 필요할 경우  git add 명령을 이용해 비어있는 서브디렉토리를 지정해줘 봤자 추가가 안된다.  그래서 보통은  .gitignore 와 같은 파일을 하나 만들어 두고 추가하는 방법을 쓰곤 한다.

 

끝으로 이글을 정리하기 전에 참고한 링크 이다.

http://git-scm.com/book/en/Git-Internals

 

 

 

소규모 네트워크를 구성할때 많이 사용되는 공유서버 및 VPN과 관련한내용을 작성정리한 블로그 링크만 찾아 보기 편하도록 따로 뽑았습니다.



#1 삼바(SAMBA)를 이용한 윈도우 접근 가능 공유폴더 만들기(설정방법) - 우분투 리눅스를 이용한 개인, (중)소기업용 PC 파일서버(NAS) 구축하기 강좌

http://funnylog.kr/434


#2 rsync를 이용한 (공유폴더) 디렉토리 자동(동기화)백업 방법 - 우분투 리눅스를 이용한 개인, (중)소기업용 PC 파일서버(NAS) 구축하기 강좌

http://funnylog.tistory.com/439


#3 Dynamic DNS(DDNS)을 활용 나만의 무료 도메인네임 부여 하여 원격접속하기(공유기 포트포워딩 설정) - 우분투리눅스 강좌 시리즈 

http://funnylog.tistory.com/457


#4 AjaxPlorer를 이용한 스마트폰/PC 모두 사용가능한 웹디스크(WebDisk) 서버 만들기 - 우분투 NAS 구축 강좌 시리즈

http://funnylog.kr/481


VPN(가상사설망) 이란 "가상전용선(터널링)"을 이용한 "가상전용망" 이다. VPN 필요성과 개념정리

http://funnylog.tistory.com/543


VPN의 활용.가상인터페이스 이해.- PPTP를 이용한 외부에서의 공유폴더 접속하기, VPN 공유기/윈도우 설정 방법

http://funnylog.tistory.com/552








 

 지난번에는 VPN이 어떤것인지 개념을 잡아보았습니다.


이번에는 실제 어떻게 사용될 수 있는지 알아보겠습니다.


VPN자체는 터널링을 이용한 가상의 전용망이라는 개념입니다.  실제 서비스에서는 여러가지 방식이 있을 수 있습니다. 그장 가장흔히 사용되는 방법은 PPP(Point To Point Protocol) 라는 프로토콜에서의 가상의 인터페이스 카드를 이용하는 방법입니다. 


가상인터페이스는  가상의 랜카드(포트)를 생각하면됩니다.  앞서 VPN개념강좌에서 VPN은 가상의 전용선을 이용한 망이라고 말씀드렸었는데요.  가상의 전용선연결하기위해서는 말그대로 가상이기때문에  네트워크 인터페이스 카드도  가상으로 만들어진다고 이해하면 쉽습니다.


즉, 우리가 랜을 구성(인터넷을)하려면  컴퓨터 랜포트에 랜케이블을 연결하게 되는데요. 이렇게 눈에 보이는 랜포트 말고 가상의 랜포트가 더 생겨나는 것입니다. 



실제로 이러한 가상 네트워크를 구성해보도록 하겠습니다.


PPTP 를 이용한 VPN 연결의 이해 


  MS Windows에서는 VPN을 위해  PPTP(Point To Point Tunneling Protocol)방식을 지원합니다. PPTP는 MS를 비롯한 몇몇 회사가 개발한 VPN을 위한 프로토콜입니다.


1.  실제 이더넷어댑터 상태 보기 

도스프롬프트(cmd.exe) 를 실행시키고  ipconfig 명령어로 현재 어댑터 상태를 확인합니다.


 C:\>ipconfig


Windows IP 구성



이더넷 어댑터 로컬 영역 연결:


   연결별 DNS 접미사. . . . : localdomain

   IPv6 주소 . . . . . . . . . : fdb2:2c26:f4e4:0:4420:9b5f:8889:a44

   임시 IPv6 주소. . . . . . . : fdb2:2c26:f4e4:0:f0a6:f616:949b:6028

   링크-로컬 IPv6 주소 . . . . : fe80::4420:9b5f:8889:a44%11

   IPv4 주소 . . . . . . . . . : 10.211.55.4

   서브넷 마스크 . . . . . . . : 255.255.255.0

   기본 게이트웨이 . . . . . . : 10.211.55.1



C:\>


2. PPTP 연결한 뒤 어댑터 상태 보기.


C:\>ipconfig


Windows IP 구성



PPP 어댑터 회사 VPN 연결:


   연결별 DNS 접미사. . . . :

   IPv4 주소 . . . . . . . . . : 192.168.1.81

   서브넷 마스크 . . . . . . . : 255.255.255.255

   기본 게이트웨이 . . . . . . : 0.0.0.0


이더넷 어댑터 로컬 영역 연결:


   연결별 DNS 접미사. . . . : localdomain

   IPv6 주소 . . . . . . . . . : fdb2:2c26:f4e4:0:4420:9b5f:8889:a44

   임시 IPv6 주소. . . . . . . : fdb2:2c26:f4e4:0:9032:41af:f2c1:2185

   링크-로컬 IPv6 주소 . . . . : fe80::4420:9b5f:8889:a44%11

   IPv4 주소 . . . . . . . . . : 10.211.55.4

   서브넷 마스크 . . . . . . . : 255.255.255.0

   기본 게이트웨이 . . . . . . : 10.211.55.1


C:\>



PPTP VPN이 연결되면 [PPP 어댑터 xxxxxx 연결]  이 추가 된것을 확인 할 수 있습니다. 그리고 이때 부여되는 IP 는 VPN 서버측에서 제공되는 IP입니다.  여기에서는 192.168.1.81 라는 주소를 부여 받게 된것이고.  해당 IP가 회사 내부네트워크 영역이라면 해당 VPN에 연결된 PC 는 마치 회사 내부에 있는 컴퓨터처럼 내부망에 접근이 가능하게 되는것입니다.  그리고 PPP 어댑터는 가상의 랜카드 역할을 하게 되는것입니다.



그럼 이제 PPTP  를 이용한 VPN을 구성하는 방법을 알아보겠습니다.


VPN을 구성하는 방법은 여러가지가 있겠지만 소규모 사무실에서 특별한 큰 비용들이지 않으면서  어렵지 않게 간단하게 구성할 수 있는 방법을 기준으로  알려드리겠습니다. 


여기에서는  공유기를 이용해서 구성하는 방법입니다. 제가 사용중인 ipTime 공유기를 설정예를 보여드릴 텐데 다른 공유기들도 VPN만 지원한다면 유사하게 설정하면 됩니다.



PPTP VPN 구성하기 


1.  공유기 설정


메뉴 에서 [특수기능] - [VPN서버설정]선택




그리고 VPN 서버 설정화면에서 


동작모드 :실행

암호화(MPPE) : 암호화사용함


선택 합니다.


그리고 VPN 접속시 사용할 계정을 추가 해주어야합니다.


아이디/암호를 넣어주고.  할당 될 IP주소는 해당 USER가 VPN접속하고 나면 부여받게 되는  IP입니다. 해당 IP를 사용하게 되면서, 마치 해당 내부 네트워크에 접속된상황이 되는거죠.


해당 IP는 사전에 DHCP 부여 영역에서 제외를 시켜야합니다.




VPN 접속계정은 여러명이사용할 경우 사용자별로 만드는게 좋습니다. 동시접속등의 경우에도 문제가 없어야 하니까요.



이렇게 해서 VPN 접속계정까지 추가했다면.  공유기 설정을 저장합니다.  공유기 종류에 따라서는 공유기를 다시 실행시켜야 할 수 도 있습니다.



2. VPN 접속하기 


그럼 이제 외부에서 VPN을 접속하는 방법입니다.


여기에서는 Windows 7 을 기준으로 설명합니다. (다른 버전에서도 유사하게 설정할 수 있습니다.)



제어판에서 - 네트워크 및 인터넷 - 네트워크 및 공유센터   로 찾아 들어갑니다.



네트워크 설정 변경에서 [ 새 연결 또는 네트워크 설정]을 선택합니다.



[연결 옵션] 선택에서  회사에 연결을 선택합니다. (회사라는 말은 그냥 상징적인 단어입니다. 그냥 VPN 연결용 이라고 보면 됩니다.)





연결 방법중에서  [내 인터넷 연결 사용(VPN)]을 선택합니다.



인터넷 주소에는 회사 공유기의 실제 IP 또는  미리 만들어둔  DDNS 이름을 넣어주면됩니다.  

(DDNS 는 http://funnylog.kr/457 글을 참고하세요)


그리고 대상이름을 적절히 넣어주고.





다음에는  사용자 이름과 암호를 넣어줍니다.



그리고 연결을 진행하면 바로 VPN 연결이 되고,  추후에 연결을 하고 자 할때는 작업표시줄에 네트워크상태표시 아이콘을 클릭하면 (WIFI나 유선)  VPN 설정목록이 보입니다. (아래그림참고)




그리고 해당 VPN 설정 선택후 [연결] 을 누르면 아래 처럼 로그인 창이 나타납니다. 마치 전화다이얼업모뎀 연결과 같은 화면 입니다.




앞서 공유기에 등록한  VPN 계정을 이용해 연결을 하면 됩니다.



연결이 끝나면 사무실vpn  [연결됨]으로 바뀌었습니다.


네트워크 연결 아답터 목록에서 보면 사무실vpn 이 활성화 되어있습니다.  해당 WAN miniport 가 PPTP 용 가상 네트워크 인터페이스(랜카드)가 되는 셈 입니다.


그리고  도스프롬프트(CMD)에서 ipconfig 명령으로 확인 하면  PPP 어댑터가 연결되어있는 것을 확인 할 수 있고. 

해당 어댑터의 IP는 공유기에서 설정한 내부 IP가 됩니다.




이제  외부에서 사무실 내부로 접속한 상태가 되어.  내부내트워크 자원(공유폴더, 그룹웨어 등) 에 접근할 수 있습니다.


제 경우는 사무실밖에 있을때 스마트폰의 핫스팟기능으로 노트북을 WIFI로 인터넷 연결한뒤 VPN 을 이용해 사무실등에 연결할때 사용하는 편입니다.






 위 강좌시리즈의 5번째 시작입니다.


#5.1 VPN개념 정리


  VPN을 활용하는 강좌를 쓰기에 앞서 먼저 VPN이 뭔지에 대해서 정리해보려고 합니다.


VPN은 Virtual Private Network의 약자로  보통 우리말로는  "가상사설망"이라고 합니다.   이 "가상사설망"이란 직역된 단어 때문에 저도 처음에는 그게 뭔가 했었던것 같습니다.   지금은 VPN 이 널리 활용되고 있기는 하는데  VPN이전에는 무엇을 썼는지 알아보면 좀더 쉬울 것 같습니다.


VPN(Virtual Private Network)이전에는 PN(Private Network)을 쓰고 있었습니다.  그럼 PN 이 뭘까요? 이미 쓰고 있었다는데.  바로 전용선을 말합니다.   


   즉  VPN이 좀더 자연스러운 우리말로 바꾸면 "가상전용망(선)"이라는 말이 더 어울리고 개념적으로도 분명해진다는 생각입니다.   그리고 사설이라함은 사적으로 설치하고 사용하는 것을 의미하지만, 물리선로  자체를  사적으로 설치 소유하는경우는 거의 없고 KT 같은 통신망 회사의 선로를 임대 이용하는 경우가 대부분이니까요. 전용으로 사용하는 망(전용망)이 더 적절해 보입니다.  


  그리고 VPN 에서  Network  단어를  번역하면  일반적으로  '망(望)'이 되는데 '망'이 구성되려면 '선(線)'로가 있어야 합니다.  즉 전용망이 구성되려면 전용선(線)이 구성되어야 한다는 것이죠.  따라서  가상전용망(VPN)을  구현하려면  전용선을 가상으로 구현하기 위한 '가상전용선' 기술이 먼저 필요합니다.  


그래서 VPN을 알려면 먼저 '가상이 아닌' 전용선을 이해 하고,   '가상' 전용선의 개념으로 접근하는게 쉽습니다.


그럼 전용선이 무엇이었나요?


실제로 제가 예전에 근무하던직장은 전용선을 사용하고 있었습니다. (1997년도 즈음)


본사는 서울에 있었고 공장은 경기도에 있었습니다.  저는 공장인 경기도에 근무하고 있었는데.  처음 회사에 입사했을때  사무실에서 외부로 전화할때는 보통 9번을 누르고 원하는 곳에 지역번호화 전화번호를 눌러서 전화하는 식이었는데  서울본사에 전화할때는 그럴필요가 없었습니다.  서울 본사로는 전용선이 설치되어있어서 본사로 전화할때는 전용선을 통하게 되었기때문에 본사 내선번호로 바로 누르면 되었습니다. 따라서 전화요금(공중망비용)이 안들어 가는 것이었죠.  


   그러니까 우리가 쓰는 지역번호를 눌러서 사용하던 전화망은 공중망이라고 하는 Public Network 인것인데 이를 이용할때는 해당 전화요금을 내야 하지만 전용선을 설치한경우에는 그 비용을 낼 필요가 없는 것이죠.  


그런데 이런 전용선을 유지하는 비용이 적잖았습니다.  56Kbps회선에  대략 월 50만원이상 들었던 것 같습니다.  (당시 제 월급보다  많습니다)


지금 가정용 100Mbps 광랜(공중망)을 월 2만원도 안되는 비용에 이용하는 것을 생각하면 엄청나게 비싼것이죠.  지금은 많이 내리긴 했지만 지금도 여전히 전용선은 비쌉니다. 





즉 비싼 전용선 대신 값싼 공중망의 한 회선을 이용하는걸 선호하는게  당연합니다. 그런데 문제가 있습니다. 


이 공중망는 말그대로 공중에 노출되어있습니다. 그러다 보니 보안에 취약합니다. 실제로 예전에는 이러한 공중망의 보안취약함 때문에  도청을 당하기도 쉬었습니다.  그것은 인터넷을 이용하는 경우에도 마찬가지 입니다.  인터넷을 통해 메일을 보거나 파일을 송수신 할때도 항상 누군가가 중간에 가로챌수있는 상황에 놓이게 됩니다.  이것은 공중망이 말그대로 상대편과 연결과는 수많은 단계를 거치면서 중간에 누군가 빼낼 수 있는 것입니다.  물론 각각 서비스 마다 암호화 통신을 할 수 도 있겠지만 그럴경우 서비스 비용이 만만치 않습니다. 매 서비스마다 암호화 기술을 적용해야 하기 때문이고 유지보수가 힘들어지기 때문입니다.  전용선일때는 고민할필요없던 문제 였습니다. (물론 전용선이라고 100% 안전을 담보할 순 없습니다.)


   사실 본사와 지방사무실 1곳만 연결하는 경우라면 여전히 전용선이 효과적일 수 있습니다.  하지만 본사와 수십개의 전용선을 연결해야 하는 상항이라면?


 제가 처음 VPN을 알게된것은  입사 2년정도 지났을때였습니다.


   그때 회사에는 사내식당이 있었는데  이때는 회사가 사내식당을 운영을 외부업체에 맡기게 되었습니다.  이 업체는 C사 였습니다.  식당에는 조그마한 사무실이있었는데 C사에서 파견된 영양사가 근무하고 있었습니다.  한번은 PC가 고장났다며 상태를 좀 봐달라고 해서 갔었는데  영양사는 매주 식단을 짜고 이를 바탕으로 본사에 식자재를 주문을 프로그램을 통해 하고 있었습니다.   이때 영양사는 전화선을 통해 모뎀을 접속해서 인터넷을 연결하고 다시 VPN 을 연결하는 과정을 거쳤습니다.  즉 전화선을 이용한 인터넷이라는 공중망을 이용하지만 여기에 다시 VPN연결을 한뒤에야 실제 프로그램 통신이 가능한 네트워크(망)이 구성되고 해당 업체 본사전산에 연결이 가능해 지는 구조 였습니다.


그때만 해도 왜이런 불편한 과정을 추가로 거치나 했는데.  해당 업체 본사 내부에 있는 실제 전산망에 원격지의 한 PC를 마치 내부의 망에 연결되것 처럼 하기 위해서는 가상의 회선을 (소프트웨어적으로)설치하는 과정이었던것 입니다. 


즉 이 외주업체는 여러 지역에 고객사마다 영양사를 파견하고 주문 프로그램을 운영해야 하는데 여기마다 실제 전용선을 설치한다는 것은 비용이 너무 많이 발생하기 때문에 가상의 전용선을 소프트웨어적으로 구현하는 VPN 기술을 이용하는것이 훨씬 저렴한 방법이기 때문입니다. 그리고 보안도 확보되구요.



그럼 VPN은 어떻게 가상으로 전용망이 확보 되고 보안 된다는 것인가?


  VPN은 알 수 없는 공중망을 거치는 연결을 통하지만 그안에서 소프트웨어적으로 가상의 회선을 직접 연결한 것과 같은 효과를 내는 것을 말합니다.

 

  여기에서 가상의 회선을 구현하는 방식에따라 VPN 방식을 분류하게 되는데 공통적으로 터널링이라는 기술이 사용됩니다. 터널링이라는것은 사전적의미로는 실제 통신을 위해 사용을 원하는 특정프로토콜 (예 IP)를  이를 지원하지 못하는 네트워크 프로토콜(X25망 ,ATM 망 같은), 이나 신뢰성이 부족한 네트워크(공중망)에 캡슐화를 통해 전달하는 기술을 말합니다.


  간단히 말하면  데이터영역안에 프로토콜을 통째로 집어넣는것이죠. 





예를 들어  A사무실에서  본사의 특정서버 S로 데이터를 보내야 하는데  사무실과 본사간의 통신연결은  X25라고 합시다. 그런데 A사무실내에 네트워크와  본사의 네트워크는 모두 IP 네트워크인것이죠.  그러면서 본사와 연결되는 프로그램이 IP프로토콜  사용한다고 했을때 X25로 바뀌는 시점에 데이터를 뽑아 X25에 맞춰서 보내고 다시 받는쪽에서 X25에서 데이터를 뽑아 IP프로토콜로 변환 해야 합니다.  이렇게 할경우 통신 서비스가  1종만 있다면 별 문제가 없겠지만 다양한  IP 프로토콜을 이용한 통신서비스를 사용해야 하는경우 각 서비스마다 변환 프로그램을 개발해야 하기 때문에 상당히 비효율적입니다. 그래서 단지 데이터만 뽑아서 변환하기 보다  프로토콜을 통째로 전달해버리는 것입니다. 즉 X25 프로토콜안에 IP프로토콜을 통째로 넣어서 보내 버리고 도착지에서 다시 IP프로토콜로 뽑아서 보내는 겁니다. 

이렇게 하면,IP프로토콜을 이용한 다양한 서비스가 있더라도 새로 데이터 변환 프로그램을 개발할 필요가 없게 됩니다. 이러한 프로토콜을 통째로 전달해버리는 것을 터널링이라고 합니다. 


양쪽에 실제 통신하는 컴퓨터들은 X25라는 프로토콜을 전혀 몰라도 상관이 없게 되는것이죠. 


그런데 이러한 터널링을 다른프로토콜을 사용하는 통신간의 전달뿐 아니라 신뢰성이 부족한 같은 IP통신에서도 활용할 필요가 있게 되는데 이역시 터널링이됩니다.


단지 예를 들어 IPv4라는 프로토콜을 또 다른 공중망 IPv4를 통해 전달하게 될때 이번에는 프로토콜을 통째로 집어넣기전에 한번 암호화를 하고 넣는것입니다. 그러면 중간에 누군가 IPv4 패킷을 가로채어 데이터 영역을 들여다 보더라도 암호화 되어있기 때문에 알 수 가 없게되는 것이죠.  이렇가 하면 해당 터널링 안에서는 보안통신을 하지 않더라도 자동적으로 터널링 레벨에서 보안이 되는겁니다.


터널링 = 가상전용선


이러한 터널링 기술은 가상 전용선이 될 수 있게 됩니다. 그리고 이를 이용해  원격지와의 네트워크를 구성하게 되면 바로 가상사설망이라고 하는 VPN(Virtual Private Network)이 되는 것이죠.


다음강좌에서는 이를 이용한 활용방법을 알아보겠습니다.


 





이번강좌(#4)는에는 공유 서버를  웹디스크로 만들기 입니다. 


지난번 강좌까지 공유(폴더)서버를 만들고, 자동백업을 설정하고, 도메인네임을 부여했는데요. 이제는 외부에서도 공유파일에 보다 안전하게 접근하고 사용할 수 있는 웹디스크 서버를 만드는 방법입니다.




   웹디스크를 만들기 위해 사용할 솔루션 패키지 프로그램은  AjaxPlorer   입니다.   해당 프로그램 이름에  Ajax 라는 Prefix처럼 웹화면에서도  동적인 UI 를 적용하여 편리하게 파일관리를 가능하게 해줍니다.


   마치 네이버의 N드라이브나  다음클라우드, 드롭박스 같은 웹기반 디스크 UI를 개인적으로 구축할 수 있다고 이해 하면 쉽습니다.



AjaxPlorer 의 현재시점(3월2일기준)의 최종 버전은 4.3.1 개발(Dev)버전과  4.2.3 안정(Release)버전 까지 나와 있습니다. 


 여기서는 4.2.3 안정화된 버전으로 설치하는것으로 합니다.


일단 공식적인 다운로드 및 설치 방법은 http://ajaxplorer.info/download/  에서 확인 가능합니다.



설치 환경 OS우분트  12.04 LTS  입니다. (현재 우분투 파일 서버 강좌시리즈 이므로)



설치하기


프로그램 설치를 위해서는 먼저 apt-get 설치환경에  Ajaxplorer  패키지의 소스정보를 추가해야 합니다.


방법은 적당한 에디터로 패키지 소스리스트 파일을 열고


$ sudo nano /etc/apt/sources.list


아래의 내용을 맨 하단에 추가합니다.


deb http://dl.ajaxplorer.info/repos/apt squeeze main

deb-src http://dl.ajaxplorer.info/repos/apt squeeze main


그리고 ajaxplorer 관련 public key 를 설치합니다.


$ sudo wget -O - http://dl.ajaxplorer.info/repos/charles@ajaxplorer.info.gpg.key | sudo apt-key add - 


  그리고 Ajaxplorer패키지를 설치합니다.  ajaxplorer 은 기본적으로 Apache2 와 php5를 사용합니다. 따라서 해당 패키지들이 사전에 설치되어있어야 하지만 설치가 안되어있더라도  ajaxplorer 설치과정에서 자동적(필요한 apache2, php5 등을)으로 설치하게 됩니다.


$ sudo apt-get update

$ sudo apt-get install ajaxplorer 


설치 실행시 보여지는 관련설치되는 패키지들입니다.

자동으로 필요한 패키지들이 설치되는 예


apt-get 을 이용한 설치가 끝났으면 Apache2  의 SSL을 활성화 시켜 줍니다. 


$ sudo a2enmod ssl            #ssl 모듈활성화 명령

$ sudo a2ensite default-ssl    #ssl 사이트 설정  활성화


  여기서 설치하는 SSL  웹기반 데이터 전송에 있어서 암호화를 지원하기 위한 도구 입니다.  Ajaxplorer 에서는 파일전송을 하는 경우에도 안전한 보안 통신을 권장하고 있기때문에 기본적인 수준에서 SSL 사용을 활성화 합니다.


그리고 다음은  사용 문자 인코딩을  한국어에 맞게 해줍니다.

envvars 파일을 환경설정을 위한정보를 저장하게 되는데 여기에서  LANG 이라는 환경변수를 설정해주면 됩니다.


방법은 envvars 파일을 열고  

 

$ sudo nano /etc/apache2/envvars


LANG="ko_KR.UTF-8"  을 설정해주면 되는데,  우분투에  /etc/default/local 파일에는 기본적인 인코딩설정이 있습니다. 이를 그대로 사용하기위해 아래 처럼  LANG 변수설정들을 모두  comment처리하고,  

. /etc/default/locale  부분에 있는 # 을 없애줍니다. ( uncomment )


## The locale used by some modules like mod_dav

#export LANG=C

## Uncomment the following line to use the system default locale instead:

. /etc/default/locale


#export LANG


그리고  /ajaxplorer 경로 설정을 Apache2에  (활성화)추가합니다.  


$ sudo cp /usr/share/doc/ajaxplorer/apache2.sample.conf /etc/apache2/sites-enabled/ajaxplorer.conf


그리고 나면 마지막으로  apache2를 재시작 해줍니다.


$ sudo service apache2 restart


이렇게 하여   http://도메인네임/ajaxplorer  접속시  ajaxplorer 로 연결 되게 됩니다.


처음 접속하고 나면 아래 그림처럼  Diagnostic Tool이 보여 현재 설치된 상태를 보여 줍니다. 

SSL Encryption Warning은 현재 SSL 접속이 아니다 보니 메시지를 보게 되는데. https://로  접속하면 해결되고, 


또는  아래 파일을 열어


$ nano /etc/ajaxplorer/bootstrap_conf.php


// 로 comment처리되어있던 부분을 제거해  AJXP_FORCE_SSL_REDIRECT 를 활성화 해줍니다.  


/*

 * If you want to force the https, uncomment the line below. This will automatically

 * redirect all calls to ajaxplorer via http to the same URL with https

 */

define("AJXP_FORCE_SSL_REDIRECT", true);


그럼, 이후 http://...     로 ajaxplorer경로에 접속하더라도 강제로 https://... 로 바뀌어 접속하게  됩니다.


그럼 이제 웹브라우저로   http://ip/ajaxplorer  접속해봅니다.




설정하기  - 리파지토리(Repository) 추가 



접속이 정상적으로 이루어 지면 아래 그림처럼 로그인 화면이 나옵니다.



최초 로그인은 admin/admin  관리자 계정으로 로그인 합니다. 


그리고 가장 먼저 해줄일은 password변경입니다.

화면 우측에 Logged as admin 이라는 버튼을 클릭하면 Change Password 메뉴로 변경이 가능합니다.





그렇게 해서 원하는 password로 변경했다면  다음 할일은 리파지토리(Repository)추가 입니다.


   Ajaxplorer에서 리파지토리는 사용자에게 접속가능한 저장공간을 의미하게 되는데, 그 저장공간의 실체가 파일시스템(파일경로) 일수도 있지만,  다른 서버의 FTP나, SFTP, SAMBA 또는 메일함 같은 논리적 개념의 저장공간도 접근 가능하게합니다.  그래서 단순히 Storage나 Directory(File Path)라는  말이 아닌 리파지토리(Repository)라는 가상 저장공간의 개념을 사용하고 있습니다.

  

   각각의 리파지토리는 원격지 또는 로컬영역에 상관없이 관리자가 원하는 가상의 경로에 매핑을 하게 됩니다.  이를 잘 활용하면  Ajaxplorer은  여러 서버로 흩어져 있는 저장소를 하나의 웹UI로 묶어 접근을 할 수 있게 해줍니다.


그럼 가장 기본적인 파일시스템 공간을 리파지토리로 추가해보겠습니다.


아래 그림을 참고하세요


좌측 상단 선택에서 아래 순서대로 메뉴을 선택합니다.

 

   Settings  -->  Repositories & Users  --> New --> Repository 


선택합니다.


그러면 아래 그림과 같은 생성창이 나옵니다.  






먼저 /first 경로로 Repository를 만들어 보겠습니다.  


   가장 기본적인 파일시스템[File System (Standard) ]을 선택합니다. 파일 시스템은 현재 Ajaxplorer이 설치된 서버에서 원하는 임의 디렉토리를 매핑할 수 있습니다.


   예를 들어  리눅스 /home/user1/first  디렉토리를 생성해서 http://myip/ajaxplorer/first 에 매핑 해주는 경우입니다. 


  

   그런데 여기서 먼저 확인이 필요한 부분이 있습니다.  Main Options에서 매핑할 디렉토리경로를 생성까지 하려는 경우에는 생성하려는 상위디렉토리가  www-data 유저에 권한이 있어야 합니다. 그렇지 않은 경우에는 실패합니다.   따라서 해당 사용자에 권한이 있는 상위디렉토리 이하에만 만들거나 또는  이미 권한(0777)있는 디렉토리를 매핑 해주면 됩니다.



우선 여기서는 우선 최소한의 옵션만 다루겠습니다.


Path : 매핑 디렉토리

Create : No  (이미 있는디렉토리 매핑)

File Creation Mask: 0777  (해당 리파지토리에서 파일생성시 부여할 권한 )

Purge Days : 해당일단위로 제거합니다.(Action Tasks Scheduler 설정필요)

Data template : 디렉토리 첫 접근시  복사할 내용이 있는 경로,  일종의 디렉토리 템플릿




 이렇게 하고 체크(확인)버튼을 누르면 

메타플러그인 설정이 나옵니다.



메타플러그인은 여러가지 부가정보 (검색정보, 버전관리)를 관리할 수 있는 플러그인입니다.  우선 별선택없이 바로 체크(확인) 합니다.


그러면 리파지토리가 정상적으로 생긴것을 확인 할 수 있습니다.



   이제 해당 first 리파지토리로 이동해서 파일을 올리거나 내려 받기가 가능합니다.  해당 경로를 기존의 사용중인 공유 디렉토리에 매핑해주면 일종의 웹디스크가 되는 것입니다.



가족이나 같은 사무실직원들간에 공유를 하고 싶은경우에는 사용자들 추가 시켜줄 수 도 있습니다.




Settings --> Users --> New User  


메뉴에서 사용자를  추가해 줍니다.


간단히 ID와 패스워드만 입력해주면 되고,  리눅스의 계정과는 별개로  Ajaxplorer 전용 유저 입니다.

 



접근 가능한 경로와 접근 권한을 부여합니다. 


앞서 만들 first 리파지토리에 읽고 쓰기 권하는 부여합니다.  그러면 바로 friend 라는 유저로 접근이 가능해집니다.  





사용하기 



아래는 friend 로 로그인한 이후 보게 되는 화면입니다.  



웹 UI의 기본 사용언어도 변경이 가능합니다. 


화면에서 마우스 우측버튼을 클릭하면  [language] 선택 후 한글로 전환이 가능합니다.




간단한 텍스트 파일은 웹화면에서 바로 만들고 작성/수정도 가능합니다.


텍스트파일을 더블 클릭하거나 마우스 우측버튼 클릭 후 [New File]을 클릭하면 됩니다.




Ajaxplorer은 PC/리눅스/Mac 에서 웹브라우저 환경뿐 아니라 스마트폰에서도 사용이 가능합니다.


 안드로이드폰에서 접근한 화면입니다.  


  처음 접속시 [보안인증서를 신뢰할 수 없습니다.]는 SSL설치에 사용된 인증서가 테스트인증서이기 때문에 나오는 화면입니다.  


로그인화면에 나타납니다. 여기에 새로 추가한 사용자를 이용해서 로그인합니다.


안드로이드에서는 전용 앱(유료)을 이용해서 사용할 수 도 있습니다.





   여기까지 Ajaxplorer 을 이용한 웹디스크 만들기를 마칩니다.  Ajaxplorer 은 최근 Version 5 를 발표를 앞두고 있는것으로 보입니다.   현재 4.x 에서도 방대하다 싶을 정도의 많은 기능 들을 제공하고있습니다.


  Ajaxplorer을 활용하면 가정이나 소규모 사무실에서 원격지에서도 웹을 이용해 공유서버로의 접근및 사용을 하는데 많은 편리함(사진서버,  대용량 첨부파일 보내기 기능 등...)을 제공해 줄 것 입니다.  





지난 번 강좌에서는 rsync를 이용하여 자동 백업 방법을 정리해 보았습니다.



이번강좌에서는 Dynamic DNS 구성 이를 이용한 원격접속입니다. 

환경은 우분투 리눅스 환경입니다. (강좌1 참고)


이번글 순서는 크게  


 - www.dnsdynamic.org 에서 무료 도메인을 받고,  ddclient로 공인IP자동 반영하기

 - 공유기 포트포워딩 설정하기


요약 될 수 있습니다.





1. Dynamic DNS 개요


 가정집에서 사용하는 인터넷 회선의 경우 보통 아파트광랜이거나 단독주택의 경우 VDSL(ADSL) 같은 비교적 월요금이 저렴한 서비스를 사용하고 있습니다. 소규모 사무실인 경우에도 비슷할 것 이라고 봅니다.


  이러한 환경에서 구축한 서버를 외부에서 접속을 하고자 하는 경우에는 현재 부여된 공인IP를 알아내야 합니다. 그런데 이때  대부분의 경우  인터넷 서비스 공급자로부터 동적 공인IP를 받게 됩니다.  


   즉 내가 사용하고 있는 회선을 위해서 IP를 고정해주지 않습니다. (일부 업체에서 부가 이용료를 내면 고정IP서비스를하기도 합니다).  그래서 보통 접속 중인 공유기를 다시 시작하는 경우, 또는 여러가지 이유로 회선연결이 순간  단절되었다 다시 연결되는 경우에는 IP가 바뀌어 있게 됩니다.   따라서 외부에서 이렇게 수시로 변경되는 IP를 알아내서 접속하기에는 여러모로 불편합니다. 


그래서 이 경우 활용할 수 있는 것이 Dynamic DNS 입니다.


   본래 DNS(Domain Name System)은 IP를 대신해 도메인 네임을 이용하여 컴퓨터서비스(자원_에 접속할 수 있도록 하는 시스템입니다.  예를 들어 PC에서 http://funnylog.kr(도메인네임) 를  웹브라우져에 입력해서  접속을 시도하게 되면 접속과정에서 DNS 서버로 부터 도메인에 해당하는 IP를 넘겨받아 접속하게 됩니다. 그런데 이러한 질의 과정은 하나의 웹페이지를 접속한다고 했을때 최소 수차례에서 수십차례까지 요청(각 이미지, 스크립트 마다 매번)을 하게 됩니다.  따라서  DNS서버까지의 질의 과정을 최소화하기 캐쉬를 하게 되는데  각각의 도메인 네임은 저마다의 캐쉬시간을 지정하게 됩니다. 이를 TTL(Time To Live)라 하고 통상 24시간(86,400초) 정도를 지정하게 됩니다.  즉 한번 질의를 하고 나면  이시간 동안은 재질의가 필요없다는 뜻입니다. 


   따라서 이사이에  도메인네임과 IP매핑이 바뀌게 되면 변경이 반영되지 못할 수 있는데, Dynamic DNS는 이 시간을 최소로(3~5분정도) 줄인 것을 말합니다.  그렇게 해서  수시로 변경 될수있는 고정IP에 대해서   캐쉬시간을  최소로 줄여주거나  아예 매번 서버에 확인을 하도록 하여 IP가 바뀌더라도 금세 반영이 되도록 한것이죠. 이를 이용해서 가정용회선과 같은 고정IP가 아닌곳에도 사용하게 되는것입니다.  (다만 그만큼 서버에 대한 부담은 커지게 됩니다.)



2. Dynamic DNS적용하기 


그럼 Dynamic DNS (이하 DDNS)를 어떻게 적용할 수 있을까요?


 개인이 DDNS를 이용하려면 해당 서버를 제공하는  업체를 이용하면 됩니다. 유명한 업체로 www.dyndns.org가 있는데. 최근에는 유료로(.com) 전환되면서 더이상 무료로는 사용할 수 가 없게 되었습니다. (다만 기존에 등록된 도메인네임에 대해서는 계속 사용 가능합니다.)


지금 현재 시점에 dyndns.org 대신해서 사용할 만한  서비스로는 www.dnsdynamic.org 이 있습니다.


적용 순서

2.1 www.dnsdynamic.org 가입

- 가입은 이메일 주소와 사용할 비밀번호만 입력하면 됩니다.

- 그리고 입력한 이메일로 수신한 confirm메일을 확인하면 로그인이 가능합니다.





2.2 사용할 도메인 네임추가 

- 가입이 끝나고 나면 해당 이메일과 비밀번호로 로그인을 한뒤 [Add a new domain]으로 원하는 도메인을 추가합니다.



위 예에서는 fun2.dnsd.me  라는 도메인네임을 생성한 경우 입니다.


웹상에서 이후에도 현재 접속중인 회선의 공인IP 를 보여주고 설정하도록 해줍니다.  


하지만 이렇게 매번 공인IP 가 바뀔때마다 서버에 접속하여 변경을 하는 것은 번거럽습니다. 그래서 이를 대신해주는 프로그램  ddclient를 사용하면 편리합니다.


2.3 Dynamic DNS 자동갱신 스크립트 적용하기


ddclient를 이용하면 일정시간단위로 외부에서 바라보는 현재 공인 IP를 찾아서 업데이트를 할 수 있습니다.


그럼 우분투환경에서 적용해보겠습니다.


먼저 설치방법입니다.



$sudo apt-get  install ddclient


  

  이렇게 하면 ddclient를 자동으로 내려받아 설치하게 되고 설치과정에서 설정정보를 묻게 되는데

차례대로 입력을 해주거나,  빈칸으로 넘어간뒤(또는 ESC) 수동으로 설정파일을 만들어주거나 수정하면 됩니다.

설정 파일은  /etc/ddclient.conf 파일을 수정해서 다음과 같이 설정하면 됩니다.



# /etc/ddclient.conf

daemon=60           # 갱신 주기 60초

protocol=dyndns2    #  통신 방식 (고정)

use=web, web=myip.dnsdynamic.com     # 나의 공인 IP 알아내기  (고정)

server=www.dnsdynamic.org    #   서비스 업체 서버 (고정)

login=메일주소        #  로그인 ID

password='qlalfqjsgh'                # 비밀번호

fun2.dnsd.me                    #반영할 내 서버의 도메인네임


/etc/ddclient.conf 파일의 수정이 끝났으면  ddclient 를 다시 시작해주어야 합니다.



$sudo service restart ddclient



이렇게 한뒤   www.dnsdynamic.org  접속해서 임의이 다른 IP로 적용한뒤  ddclient.conf정한  갱신시간이 흐른뒤  실제 공인 IP로 맞게 바뀌는 지 확인을 합니다. 


 제대로 바뀐다면 정상설치된 것 입니다.


만일 동작이 안되는것 같으면 아래 명령순서대로 다시 시작해보고 


$sudo service ddclient stop

$pgrep -f ddclient   # 실행중인 pid 가 있으면

$sudo pkill ddclient     #종료

$sudo rm /var/cache/ddclient/ddclient.cache   #캐쉬제거

$sudo service ddclient start 


그래도 안되면  ddclient 종료 후  아래 명령으로 실행해서 



$sudo ddclient -daemon=0 -noquiet -debug -verbose



어떻게 동작하는지 세부적으로 확인 합니다.


여기까지 마쳤으면  나만의 도메인네임을 갖게 된것입니다. 



   이렇게 설정한  해당 도메인네임으로 특정 서비스를 사용하려면  실제 외부에 노출된 공유기에서 포트포워딩 설정을 해주어야 합니다.


   외부에서 공인IP로 접속을 시도하더라도 내부에 있는 서버는 이를 알 수 없기 때문입니다.  공유기(또는 라우터)에서 적절한 포워딩을 해주어야 합니다.


3. 공유기에서 포트포워딩 설정 하기


   여기에서는  현재 제가 사용중인 ipTime 공유기를 가지고 설명하겠습니다.  대부분의 다른 공유기들도 포트포워딩을 지원하고 있으며 설정방법역시 유사하기때문에 이글과 공유기 도움말을 참고하시면 충분히 설정이가능할것입니다.


3.1  서비스 포트 알기 

  서비스 포트라는 것은 외부에서 내부서버로 접속하는 프로그램이 사용하는 통신 포트를 말합니다.

  

 일반적으로 서비스 별로 사전에 약속된 포트 번호가 있고, 경우에 따라서는 이를 변경할 수 가 있습니다.


통상 다음과 같은 예를 볼 수 있습니다.


HTTP  80

SSH 22

TELNET  23


3.2 공유기에 포트포워딩 추가


그럼 공유기에 적용해보겠습니다.  아래 그림을 참고하세요


공유기설정하는 웹으로 접속합니다. (보통 192.168.1.1 일겁니다.)


접속을 하면 공유기 메뉴에서 고급설정에 포트포워딩이라고 있습니다.


클릭하면 아래 그림과 같은 화면에 나옵니다. 


여기에서는 SSH 22번포트를 적용하는 예 입니다.  


규칙이름 : 어떤 용도 명인지 넣습니다.

내부IP주소 : 해당 포트 연결시도시 넘겨받을 내부서버 ip입니다.

프토토콜 : SSH는 TCP 접속입니다.

외부포트 :  외부에서 SSH 접속시 사용할 포트 입니다. 

내부포트 : 내부 서버가 SSH용으로 사용하고 있는 포트 번호 입니다.


              

이렇게 입력이 끝나면 [추가]버튼을 누르고 저장하면 됩니다.


반영되었는지 확인을 하려면  


SSH 클라이언트 (Putty)에서  앞서 정한  Dynamic 도메인네임(예 fun2.dnsd.me)로 접속하면 됩니다.                          




이렇게 해서 접속이 되면 모든 적용이 완료 되었습니다.


마치겠습니다.



지난 번 강좌에서는 (우분투) 리눅스의  SAMBA를 이용하여 공유폴더 환경을 만들었습니다. 




이번에는 두번째 강좌인 rsync 백업 입니다.


  저장공간을 만들었으면 그 다음 우선적으로 할일을 백업입니다.  (단순 개인적인 용도로 영화파일이나 음악파일정도 보관하는 용도라면 백업에 대한 부담이 덜하겠지만,  중요한파일도 같이 보관하거나, 여럿이 사용할 파일 서버라면 백업은 필수 입니다.  


 컴퓨터로 자료를 보관하는 입장이라면 , 일단 기본적으로 저장매체는 믿지 마십시오, 언제든 파괴될 수 있고, 장애를 일으킬 수 있습니다. 저장매체가  무엇(HDD, SSD, CD, DVD, 테이프 등) 이든 말입니다. 믿을 수 있는것은 이중화 뿐입니다.




위 그림에서 보면 1~3 가지 정도로 자동백업 상황을 고려 해볼 수 있습니다. 자료의 중요도에 따라 백업은 이중, 삼중으로 되어야 하고, 필요시에는 원격지 다른장소에 구성하여 서버의 장애는 물론, 화재나, 해킹, 지진등에 도 대비를 해야 겠죠.  심지어 국가를 넘어서 자료를 백업하기도 합니다. 사실 개인도 그러한 구성도 얼마든지 가능합니다.


어째든 최소한 다른미디어에 백업하는 정도라도 구성하기를 권장합니다.


여기서 다루게될 백업(동기화)도구인 rsync 는 위 그림에서나오는 모든 경우에 대해 적용이 가능합니다.


 rsync 는 Unix-like 환경을 유틸리티로  한곳의 파일이나 디렉토리를 다른 곳에 동일하게 동기화 할 수 있도록 합니다.  처음 발표된건 1996년도입니다. 당시는 지금과 같은 네트워크 대역폭이 넓지 않은 상태인 만큼, 네트워크를 통한 파일 전송을 최소화 하는것이 중요했을 것입니다.(물론 지금도 그렇지만) 그래서 delta 인코딩이라는 기술로 변경내용만 빠르게  추려내어  전송량을 최소화 하도록 하였습니다. 이렇게 해서 잘만들어진 rsync는  지금도 유용하고 편리한 백업/미러링 도구입니다.


 rsync는 필수 유틸리티 이기 때문에 대부분의 유닉스 시스템(맥북에도)을 설치하게 되면 기본적으로 설치되어있어 바로 사용이 가능합니다. 그리고 무료이구요.


그럼 rsync   기본 사용법입니다.


rsync [OPTION]...  원본경로   사본생성경로

rsync [OPTION]... 원본경로    USER@호스트:사본생성경로

rsync [OPTION]...  USER@호스트:원본경로    사본생성경로     


rsync사용법은 파일 복사 명령어와 비슷합니다.  다만 같은 서버내에서는 물론 네트워크를 이용한 서버간에도 복사 동기화가 가능합니다.  이때는 접속 USER ID와 호스트 명(IP or DOMAIN NAME)이 들어가게 됩니다.



그럼 실제 예를 보겠습니다.


1) 먼저 동일 서버에서 디렉토리간 동기화 방법입니다.  


$rsync -avz /home/user1/one   /home/user1/two



옵션(-avz) 설명


 - a : archive mode동작지시,  -rlptgoD 라는 여러개의 옵션을 -a로 표현한것입니다.  이것은 (-r)지정된 원본디렉토리 이하의 모든 디렉토리와 파일, 심볼릭 링크(-l), 장치파일(-D)까지 모두 사본생성경로로 원래 권한(-p), 시간(-t),그룹(-g), 소유자(-o) 권한을 유지한채 복사하란 뜻입니다.  

즉, 아래와 같다고 보면 됩니다.

rsync -r -l -p -t -g -o -D

-v : verbose 실행과정 내용을 가능한 상세히 보여 달라는 뜻입니다.

-z : 전송데이터 량을 줄이기 위해 전송중 압축을 하라는 내용입니다. 최종 복사된 파일이 압축되는 것은 아닙니다.


이렇게 해서 실행하는 예를 보면 

 

$ ls -l one

합계 4

-rw-rw-r-- 1 user1 user1 10  2  2 19:17 test01.txt


$rsync -avz /home/user1/one   /home/user1/two

sending incremental file list

one/

one/test01.txt


sent 128 bytes  received 35 bytes  326.00 bytes/sec

total size is 10  speedup is 0.06


$ ls -l two

합계 4

drwxrwxr-x 2 user1 user1 4096  2월  2 19:17 one


   one 디렉토리 통째로 two안으로 들어간 것을 볼 수 있습니다. 테스트 상황에서는 파일이 한개(test01.txt)만 있어서 금방 끝납니다. 


2) 다음은  다른 서버로 부터 동기화 하는 예 입니다.


 사실 rsync에서  리모트로 부터 파일을 전송하는 방법에는 크게 2가지가 있습니다. 


- rsync 데몬을 이용하는 방법  (HOSTIP::/path 형식사용 또는  rsync:://  형식사용 )

(또는  rsync 데몬을 이용하되 ssh 컨넥션 이용하는 방법)


- 리모트 쉘 ( ssh,  rsh )  를 이용하는 방법   (  HOSTIP:/path  형식사용)


  rsync 데몬을 명령줄에서의 두가지 방법차이는 콜론(:) 개수 차이 입니다. 콜론 개수에 따라 rsync는 리모트 쉘을 이용할지 리모트 rsync 데몬을 이용할지를 결정합니다. 


  첫번째 원격 접근 방법인 rsync데몬을 이용하게 되면 대상 호스트에 inetd (873포트) 에 설정을 하여 항상 데몬이 뜰 수 있도록  해주어야 하며 기본적으로 전송간 암호화는 되지 않습니다. (여기에 ssh 컨넥션을 이용하는 방법을 추가해서 암호화가 되도록 해줄 수 도 있긴 합니다.)  


 두번째 원격접근 방법인 리모트쉘을 이용하는 방법을 사용하게 되면 통상 ssh (22번포트)를 사용하게 되고 더불어 자동으로 암호화된 세션안에서 통신을 하게 됩니다. 별도로 데몬 설정도 불필요합니다.


여기에서는 두번째 방법인 리모트쉘을 이용하는 방법을 사용하게 될 것 입니다.


  리모트쉘(ssh) 를 이용하는 전제는 ssh 패키지가 설치 되어있어야합니다. 만일 설치전이라면 ssh부터 설치하시기 바랍니다. (리모트,로컬 양쪽에 설치 되어있어야 합니다.)


$sudo apt-get install ssh



그럼 준비가 되었으면 rsync 를 이용한 리모트 원본을 동기화예를 보겠습니다.


$rsync -avz user2@192.168.1.51:/home/user2/three two


  51번 호스트의 /home/user2/three 원본 경로전체를 two 로 동기화 한다는 뜻입니다.  이때 51번 호스트로 접속할때  사용자는 user2입니다.  콜론이 한개(:)이기때문에 ssh접속을 하게 됩니다.


그럼 실행해 봅니다.

$rsync -avz user2@192.168.1.51:/home/user2/three two

user2@192.168.1.51's password: 

receiving incremental file list

three/

three/test02.txt


sent 34 bytes  received 141 bytes  50.00 bytes/sec

total size is 19  speedup is 0.11


$ls -l two

합계 8

drwxrwxr-x 2 user1 user1 4096  2월  2 19:17 one

drwxr-xr-x 2 user1 user1 4096  2월  2 19:56 three


51번 호스트의 three디렉토리 통째로 two로 동기화(복사) 됩니다.


 파일서버를 개인적인 용도로 쓰고 별도의 리모트 서버 구성을 하지 않는다면 1)번의 디렉토리간 동기화방법을 사용하면 됩니다.



정기적 백업의 자동화


  rsync를 이용하면 앞서 설명한것처럼 간편하게 명령 한줄로 (동기화)백업을 해낼 수 있습니다만.  이왕이면 정기적을 자동 백업을 해줄 수 있다면 더욱 좋을 것 입니다.


 리눅스와 같은 (Unix-like) OS에서는 cron 이라는 주기적 작업을 쉽게 설정할 수 있는 도구가 있습니다. 이를 이용하면 rsync를 자동화 백업이 가능해 집니다.


cron 의 실행하는 스케쥴표는 crontab  명령으로 작성할 수 있습니다.


실행 명령 입니다.


$crontab -e


아마도 처음 crontab을 실행한다면 어떤 에디터를 사용할지 물어 볼겁니다. 익숙한 에디터를 선택하시면 됩니다.  그러면  crontab은 하나의 설정파일을 열어 줍니다.


해당 파일에 작업 command 를 추가 해주면 되는 데 형식은 다음과 같습니다.


#분 시 일 달 요일  command

#30 1 2 3 *   rsync ...  # 3월 2일 1시 30분에  rsync ...를 실행한다. (특정일 실행)

#10 2 * * 1  rsync ...     #  매주 첫날 2시 10분에 rsync...를 실행한다. (주 단위 실행)

#0 3 *  * *   rsync ...    # 매일 3시 정각에 rsync... 를 실행한다.  (매일 실행)


즉 위처럼 원하는 스케쥴에 rsync 실행줄을 넣어 주면 되는 겁니다.   (맨앞 # 코멘트 표시는 제거해야죠 ^^)


여기에 좀더 세련된 관리 방법을 넣어 보겠습니다.


7일 단위 증분 백업하면서 동기화하기


위 말이좀 헷갈리죠?


  이 말뜻은  매일 동기화를 해서 원본과 맞추되.  만약에 특정 변경된 파일이 문제가 있어 복원 필요한 경우 해당 파일을 적어도 일주일 전까지는 되돌릴 수 있도록 따로 변경분만 별도 백업 한다는 뜻입니다.


어떻게?


--backup   이란 옵션을 사용하면 됩니다.

 

 이 옵션을 사용하게 되면 원본에 동기화를 할때 변경이 발생해서 덮어쓰이게 되는 경우 이전파일을 다른 이름으로 바꾸거나(--suffix 옵션)  다른 디렉토리로(--backup-dir)로 옮겨 놓을 수 있도록 하는 명령 입니다.


즉, 바뀌게 되는 파일만 또 다른 공간으로 살려두게 되는 것이죠. 


그런데 이 옵션만으로는 좀 세련되게 하기가 안되므로 간단히 스크립트를 만들고 이 스크립트를 실행하는 명령을  crontab 으로 등록하겠습니다.


아래 스크립트입니다.   http://rsync.samba.org/examples.html  있는 예제를 좀더 간단하게 바꾸었습니다.


#!/bin/sh


SRCPATH=/src


BACKUPHOME=/backup


#동기화 제외 대상 목록을 넣을 파일

EXCLUDES=$BACKUPHOME/exclude_files.txt


# 일요일, 월요일, 화요일 ... 토요일 또는 영문으로 (sunday ... )

BACKUPSUB=`date +%A`     


OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES  

          --delete --backup --backup-dir=$BACKUPHOME/$BACKUPSUB -a"


export PATH=$PATH:/bin:/usr/bin:/usr/local/bin


rm -rf  $BACKUPHOME/$BACKUPSUB/*


# 동기화 실행 진행

rsync $OPTS $SRCPATH  $BACKUPHOME/current


이 파일을  /backup/runrsync.sh  실행가능한 파일로 저장합니다.


그리고  요일별로 변경분만 백업될 디렉토리를 미리 만들어 주어야 합니다.


$mkdir /backup/일요일  /backup/월요일 /backup/화요일 /backup/수요일  /backup/목요일 /backup/금요일  /backup/토요일



$crontab -e 


실행 후 아래 처럼 추가해줍니다.

#0 2 *  * *   /backup/runrsync.sh


그럼 매일 새벽 2시에 동기화를 하게 되고 이때  바뀌는 파일은 /backup 밑에 요일별로 옮겨지면서 전체 동기화된 파일은   /backup/current 에 있게 됩니다.



  여기까지 rsync를 이용한 자동 동기화 방법에 대한 설명을 마치겠습니다.  각자 필요한 환경에 맞게 적절히 변경하여 활용하시기 바랍니다.  감사합니다.

 




  리눅스를 가지고 할 수 있는 것은 수도 없이 많지만 그중에서도 가장 유용하게 쓰일 수 있는 분야가 파일서버(NAS: Network-attached storage) 인것 같습니다.  요즘은 조그마한 네모박스형태의 NAS 제품이 많이 나와 간편하게 활용하는 방법도 있지만.  PC를 이용한 전통(?)적인 파일 서버만의 강점이 있기에 이부분을 다뤄 보려고 합니다.


(대상은 리눅스를 잘 모르시는 분들도 가능한데, 다만 중간중간 나오는 명령어들이 이해가 안될때는 따로 조금씩 공부하면서 따라오는걸 전제로 하겠습니다.)


일단 강좌 순서는 아래 대로 진행하려고 합니다.  상황을 봐서 여기에 좀더 추가적으로 활용할 만한 내용이 있으면 좀더 길어 질 수  있을 지 모르겠습니다.


 순서대로 강좌를 끝나고 나면 대략 아래 그림과 같은 구성을 할 수 있게 됩니다.



  구성도에서 보여주는 것은 집이나 소규모 사무실 내부에서 공유폴더로 사용가능하고 외부에서도 인터넷을 통해 접근 가능한 구조 입니다.

 

오늘은 첫번째로 SAMBA를 이용한 공유폴더 만들기 입니다.

우분투 설치 PC 준비하기

   SAMBA 사용은 아주 간단하게 할 수 도 혹은 복잡하게 할 수 도 있지만. 여기서는 최소한의 설정으로 금방 공유 폴더가 될 수 있도록 하는 정도 만 다루게 됩니다. (강좌 전반에 최대한 간결 하는 방향으로 할 생각입니다.)

  우선 우분투가 설치된 PC 가 있어야 하는데 여기서는 현재 시점의 최신 LTS 버전인 12.04 를 기준으로 합니다.  LTS (Long Term Support)는 말그대로 오래 지원이 가능한 배포본으로 몇년동안은 OS 업데이트 유지가 비교적 용이합니다.

  우분투를 설치전이라면 http://www.ubuntu.com/download/desktop  에서 다운로드 하여 설치합니다.
우분투 서버버전도 있지만 네트워크 보안설정이나  XWindows 환경이 편한 데스크탑(32bit)  버전으로 합니다.  (서버버전도 물론 가능합니다만. 처음에는 데스크탑 버전으로 해보시길 권장합니다.)

다운 받은 .iso 를 CD 로 구워 부팅 설치 하면 됩니다. 하드디스크 파티션은 기본추천하는데로 하셔도 무방합니다. (우분투 설치는 "계속" 버튼을 누르면서 쭈욱 진행하면 되지만 혹 중간에 잘 모르겠으면 설치방법을 검색하면 글이 많이 있습니다.)


삼바(SAMBA) ?


   SAMBA는 윈도우용 네트워크 파일시스템을 리눅스와 같은 Unix-like OS에서 지원하도록 만들어진 서버 프로그램입니다. 즉, 리눅스에 디렉토리를 윈도우에서 공유폴더로 접근하여 쓸 수 있도록 해주는 소프트웨어 프로그램이라는 뜻입니다.  물론 MS윈도우를 파일서버로 사용가능 하나 그만큼 OS를 추가 구매 해야 하나 리눅스는 무료입니다. 그리고 다양한 리눅스의 백업 솔루션을 활용 할 수 있고,  단순히 공유폴더 서버로만 쓰더라도  최근의 복잡해진 윈도우 공유폴더 보다 (아이러니하게도 오히려) 더 간단하게 설정이 가능합니다.

프로그램 설치하기

우분투에 SAMBA를 설정하려면 먼저 패키지를 설치해야 합니다.

설치는 간단합니다.


$sudo apt-get  install samba



이렇게 하면 일단 프로그램 자체는 설치가 끝났습니다.


다음에 접속할 사용자를 추가합니다.


먼저 리눅스 사용자를 추가합니다.




$sudo adduser user1

$sudo adduser user2




그리고 SAMBA 접속 가능 사용자로 등록및 패스워드 설정합니다.


$sudo smbpasswd -a user1

$sudo smbpasswd -a user2



이때 설정하는 패스워드는 윈도우에서 공유폴더로 접속할때 인증할 패스워드가 됩니다. 


그리고 설정파일 입니다.   vi 에디터나 nano 에디터 등으로  /etc/samba/smb.conf 파일을 열어 맨아래에
아래 내용을 추가합니다.


$sudo nano /etc/samba/smb.conf


# 아래 내용 추가

[user1_home]

        comment= My  Folder

        path = /home/user1

        read only = no

        browseabale = yes

        guest ok = no

        create mask = 0666

        valid users = user1


[pub]

        comment=public                           # 폴더설명

        path = /sharefolder/pub                # 공유 대상 경로

        read only = no                              # 읽기 전용 여부

        browseable = yes                         # 해당 폴더가 보일지 여부

        guest ok = no                               # 누구나 접근 가능여부

        create mask = 0666                  # 1. 파일 생성시 권한 비트

        force create mode = 0                   # 2. OR masking

        security mask = 0777                     # 3. AND masking

        force security mode = 0                 # 4. OR masking with security mask

        directory mask = 0777                    # 5. 디렉토리 생성시 권한 비트 

        force directory mode = 0                # 6. OR masking

        directory security mask = 0777        # 7. AND masking

        force directory security mode = 0    # 8. OR masking with directory security mask



 
각각 항목별로 옆에 코멘트를 달아 드렸는데  크게 어려운 것은 없을 것(?) 입니다.

  다만 기본적으로 알아두면 좋을 것은  valid users create mask 입니다.  
아래 [pub] 폴더처럼 valid users 에 지정된 사용자가 없으면 누구나 접근 가능한 폴더가 되고, [user1_home] 폴더 처럼 user1을 지정한 경우에는 user1만 접근 가능하게됩니다.

  그리고 create mask 는  리눅스에서 파일에 대한 접근권한 부분입니다.  윈도우에서 해당 폴더를 공유해서 파일을 생성하게 되었을때 어떠한 파일권한을 갖게 할것인지를 설정하는 것이죠.

그런데 이것만으로는 파일 생성권한이 잘 먹히지 않습니다. 왜냐면  security mask 에서 허용이 되어있어야 하기 때문 입니다.   

            관련해서 SAMBA에서는 최종 권한을 적용할때 다음과 같은 로직으로 설정됩니다.


 create permission =  

( create mask  OR force create mode ) AND (security mask OR force security mode)



즉 security mask 에서 허가되지 않은 부분은 create mask 로 설정이 되어있더라도 적용이 안됩니다. 만일 create mask에서 설정하는데로 되게 하고 싶으면 security mask를 0777로 해두면 됩니다. 위에 예처럼 말이죠.

현재 우리가 적용하는 상황은 보안보다는 편의성이 중요한 상황이라고 보고 일단 접근 가능한 사용자라면 누구나 생성/삭제가 가능하도록 적용하였습니다.

이렇게 해서 파일을 추가하고 나면 SAMBA 데몬(서버프로그램)을 다시 시작해야 합니다.


$sudo  /etc/init.d/smbd restart



다시 시작하면 이제 윈도우에서 접근해봅니다.  

접근 방법은 리눅스의 IP를 조회하면 됩니다.  ifconfig 명령을 이용하면 조회가 가능합니다.
보통 eth0 또는 eth1 랜카드에 ip가있을 겁니다. 아래의 예는 랜포트가 2개 있는 PC인 경우이고 현재 eth1에 연결되어있습니다.


$ ifconfig

eth0      Link encap:Ethernet  HWaddr 00:1b:1b:0a:8f:f7

          UP BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

          Interrupt:16 Memory:96400000-96420000


eth1      Link encap:Ethernet  HWaddr 00:1b:1b:40:a9:c5

          inet addr:192.168.1.109  Bcast:192.168.1.255  Mask:255.255.255.0

          inet6 addr: fe80::21b:1bff:fe40:a9c5/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:592504491 errors:0 dropped:0 overruns:0 frame:0

          TX packets:218177502 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:895777159784 (895.7 GB)  TX bytes:16078571519 (16.0 GB)

          Interrupt:17 Memory:94400000-94420000




위에 보면 노랗게 되어있는 부분이 주소 입니다.  이 주소를 이용해서 윈도우폴더에서
\\192.168.1.109 를 입력하면 됩니다.

아래 윈도우 7 에서 접근 한 그림을 참고하세요.


위처럼 2개의 폴더가 조회됩니다.


그러면 접근해서 파일을 보관사용하면 되겠습니다.


이렇게해서 첫번째 리눅스를 이용한 파일서버(NAS)구축하기 강좌를 마치겠습니다. 


혹시나 가능한 필요한 부분만 쓴다고 불친절한 글이 됐는지 모르겠습니다.  감사합니다.






+ Recent posts