Development2017.07.04 22:54

맥 환경에서 Mongo DB 를 설치하는 방법은 여러가지 입니다. 직접 압축된 Mongo DB 를 다운로드 받아 설치하는 것도 방법이지만, 이왕이면 패키지 매니저를 이용하여 설치하는 것이 여러가지로 간편합니다. 맥에서 가장 널리 사용되는 brew 를 이용하여 손쉽게 Mongo DB 를 설치할 수 있습니다.


$ brew install mongodb


brew 를 이용하여 설치한 경우 환경 설정 파일이 별도로 저장됩니다. Mongo DB 의 데이터 파일은 아래 경로에 위치한 mongod.conf 파일에 지정된 dbpath 경로를 따르게 됩니다. 단, 이 파일의 정보를 이용하는 경우는 brew 를 이용하여 Mongo DB 서비스를 시작하는 경우이고, mongod 를 통해 데몬을 실행하는 경우는 로그인한 사용자 경로의 ~/data/db 경로가 기본 데이터 파일의 위치가 됩니다. 실행 방법에 따라 데이터 파일의 위치를 적절히 지정하시기 바랍니다.


/usr/local/etc/mongod.conf


systemLog:

  destination: file

  path: /usr/local/var/log/mongodb/mongo.log

  logAppend: true

storage:

  dbPath: /Users/nopd/dev/data/db

net:

  bindIp: 127.0.0.1


conf 파일에 dbpath 위치를 적절히 수정했으면 brew 를 이용하여 Mongo DB 를 서비스 형태로 실행해 보도록 하겠습니다.


$ brew services start mongodb

==> Tapping homebrew/services

Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...

remote: Counting objects: 12, done.

remote: Compressing objects: 100% (8/8), done.

remote: Total 12 (delta 0), reused 7 (delta 0), pack-reused 0

Unpacking objects: 100% (12/12), done.

Tapped 0 formulae (40 files, 53.8KB)

==> Successfully started `mongodb` (label: homebrew.mxcl.mongodb)


프로세스에 Mongo DB 가 잘 실행되어 있는지 확인해 보겠습니다.


$ ps -ef | grep mongo

  501  3609     1   0 10:44PM ??         0:01.75 /usr/local/opt/mongodb/bin/mongod --config /usr/local/etc/mongod.conf

  501  3648   924   0 10:52PM ttys001    0:00.00 grep mongo


Mongo DB 프로세스를 종료하기 위해서는 마찬가지로 brew 를 이용하면 됩니다.


$ brew services stop mongodb

Stopping `mongodb`... (might take a while)

==> Successfully stopped `mongodb` (label: homebrew.mxcl.mongodb)


- NoPD -

저작자 표시 비영리
신고
Posted by 노피디
Development2017.05.04 15:33

새롭게 지급받은 회사 PC 에서 dig 명령을 Client Subnet 정보 없이 사용하고 있던 찰나, 고객님의 확인 요청으로 Client Subnet 정보를 활용한 DNS 조회가 필요해졌습니다. 늘 그랬던 것처럼 bind-9.9.3 버전을 다운로드 받아 패키지에 포함되어 있는 dig 을 추출해 사용하려고 했습니다만 Xcode8 이 설치된 환경에서 발생할 수 있는 컴파일 이슈를 만났습니다.


여기저기 수소문을 해보니 누락된 커맨드 라인 도구가 있고 이로 인해서 많은 make 빌드가 실패하고 있다는 제보가 온천지에 깔려있었습니다. 궁극적인 해결은 애플이 새로운 Xcode 를 배포하면서 누락된 커맨드 라인 도구를 포함시켜 주는 것이겠습니다만 일단 문제 해결이 먼저이니 Quick-Fix 를 적용해 봤습니다. 


문제는 "make" 에서 발동되었습니다. ㅜㅜ (참조 : https://www.gsic.uva.es/~jnisigl/dig-edns-client-subnet.html)



발견된 빌드 실패 메세지에서 몇 가지 단서를 찾아보았습니다. 


gcc -g -O2 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/libxml2 -I../../lib/isc/include \

-D__APPLE_USE_RFC_3542   -o gen ./gen.c -lpthread  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/lib -lxml2 -lz -lpthread -licucore -lm

ld: file not found: /usr/lib/system/libsystem_symptoms.dylib for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)


gcc 를 수행하는 와중에 발생한 /usr/lib/system/libsystem_symptoms.dylib 파일의 누락이 결국 문제라고 판단되었습니다. 구글신께 missing 커맨드와 함께 이 파일의 풀 패스를 넣으니 고생하는 개발자들이 여기저기에서 튀어나왔습니다. 그 중, 용자가 정리해놓은 Quick-Fix 는 tbd 파일에서 존재하지 않는 파일 참조 경로를 없애서 원천적으로 접근 시도를 하지 않도록 하는 것이었습니다. 간단히 아래의 명령으로 레퍼런스 정보를 삭제했습니다.


$ sudo /usr/bin/sed -i.backup -E -e 's@/usr/lib/system/libsystem_symptoms.dylib(, )?@@' $(grep -ril /usr/lib/system/libsystem_symptoms.dylib /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/lib)


이후 다시 make 를 돌리니 아무런 문제 없이 컴파일을 마치고 Client Subnet 을 지원하는 dig 을 획득할 수 있었습니다. 혹시 유사한 이슈를 겪는 분이 계시다면 "애플 탓이구나~ 명령어를 돌려보자~!"로 대응하시면 좋겠습니다.



저작자 표시 비영리
신고
Posted by 노피디
Development2017.05.02 12:07

이유는 알 수 없습니다만 여러곳에서 지속적으로 사용자 유입이 되고 있는 포스팅이 "JSON 포맷에서 주석을 사용할 수 있을까?" 라는 글입니다. 유입이 많은 이유로 생각되는 것은 많은 분들이 JSON 포맷을 사용하면서 주석 사용에 대한 욕망(?)이 있고, 이에 대한 방법을 찾으려다 검색 유입이 되는 것이라는 생각이 듭니다. 저 역시 글을 쓴 이유가 JSON 포맷에서 주석을 왜 쓸 수 없을까 였기 때문에 결국 같은 갈망을 가지고 검색후 실망-_-이라는 수순을 밟고 있는 안타까운 현실이라 하겠습니다.



요즘 읽고 있는 책 중 하나가 제이펍에서 출간한 "자바스크립트와 Node.js 를 이용한 웹 크롤링 테크닉"(책 내용 자세히 보기 [바로가기]) 이라는 책입니다. 곧 이직을 계획하고 있어서 여유 시간을 알차게 활용하고자 Node.js 와 파이썬(Python), 그리고 인프라스트럭쳐 배포 자동화에 심취해 있는데요, 여튼 이 책을 읽던 중 JSON5 에 대한 정보를 습득하게 되어 간단하게 공유해 보고자 합니다. 



JSON5 (http://json5.org) 는 JSON 이 가지고 있는 몇 가지 단점들을 ECMAScript 표준의 진화에 맞추어 쓸만한 형태로 개선하고자 하는 일종의 제안으로 시작된 프로젝트입니다. 시작된지는 좀 된 과제이지만 여전히 가야할 길을 열심히 걷고 있는 과제이기도 합니다. JSON5 는 JSON 의 규격을 조금 더 완화시키고 유연하게 만들어 다양한 데이터 포맷을 수용하고, 사람들에게도 더 친숙한 (= 주석으로 지저분해지는?) 형태로 만드는 것을 목적으로 하고 있습니다. JSON5 포맷으로 구성한 데이터 포맷의 예를 살펴보면 변화하는 부분을 쉽게 인지할 수 있습니다.



글의 시작에 이야기 했던 주석은 한줄 주석, 혹은 여러 줄로 구분된 주석 형태를 제공하고 있습니다. Key 를 표현할 때 꼭 사용해야 했던 따옴표 역시 제거되어 key 입력에 대한 불편함이 사라졌고, 파싱 에러의 대부분을 차지하고 있는 콤마에 대한 사용도 완화되어 어레이의마지막에 콤마가 들어가도 무방하도록 변경되었습니다. Value 에 멀티라인 텍스트가 들어갈 수 있는 것도 고무적인 부분입니다. 그 외에 Hex 형태의 표현 허용, 소수점 이하 표기법의 자유도 등도 눈에 띄는 부분입니다. Node.js 를 사용하는 경우 npm 을 통해서 json5 모듈을 쉽게 다운로드 받아 사용해 볼 수 있습니다.


$ npm install json5


모듈이 설치되면 Require 문으로 json5 모듈을 불러와야 한다는 점을 제외하면 parse 와 stringify 메소드를 이용해서 기존 JSON 내장 객체처럼 사용할 수 있습니다. 간단한 Node.js 예제코드는 아래와 같습니다.


var JSON5 = require('json5');

var fs = require('fs');

var json5 = fs.readFileSync("data.json5", "utf-8");


var obj = JSON5.parse(json5);


console.log(obj);

console.log(obj.multi_line);

console.log(obj.hex_data);

console.log(obj.items);


당연한 것이겠지만 JSON5 를 이용하여 데이터를 주고 받을 각 주체들은 JSON5 를 지원할 수 있도록 준비되어야 합니다. Node.js 이외의 다른 언어에서도 미리 준비된 패키지가 있을 것으로 생각됩니다만, 규격의 변경에 따른 사용 가능 여부를 확실히 점검하고 넘어가는 것이 좋을 것 같습니다. 주석을 이용할 수 있다는 것은 분명 의미있는 변화이지만 이로 인해 증가할 수 있는 데이터 파일의 크기, 새로운 처리 모듈의 사용 등은 고민을 해봐야 할 부분입니다.






저작자 표시 비영리
신고
Posted by 노피디
Development2017.04.18 10:10

세상에는 굉장히 다양한 이미지 포맷이 존재합니다. 압축 포맷의 대명사인 JPG 부터 비트맵으로 이미지를 표현하는 BMP, 투명한 이미지가 필요할 때 많이 찾게되는 PNG 와 간단한 애니메이션 용도로 널리 사용되는 GIF 등이 대표적입니다. 사람들은 각자의 목적에 따라 이런 이미지들을 활용하게 되는데요, 서로 다른 여러가지 포맷을 바꾸어 가면서 사용해야 하는 경우가 간혹 생기곤 합니다. 


예를 들어 프론트엔드 디자이너라고 하면 PNG 포맷을 많이 사용하겠지만 책을 한권 같이 쓰고 있다면 TIFF 포맷이 필요할 수도 있습니다. 다양한 이미지 관련 프로그램이나 플러그인으로 포맷을 변경하는 것도 가능하지만 왠지 상황에 맞게 이미지를 캡쳐 할 때부터 PNG, TIFF 등을 정할 수 있으면 좋을 것 같습니다. OS X 운영체제에는 간단한 터미널 명령으로 기본 내장 캡쳐 옵션으로 이미지를 만들때 사용하는 포맷을 변경할 수 있습니다.


[ 캡쳐 이미지 포맷 변경하기 ]

$ defaults write com.apple.screencapture type tiff && killall SystemUIServer


위의 명령을 이용하면 지정된 이미지 포맷으로 쉽게 캡쳐 파일의 형식을 지정할 수 있습니다. && 로 연결된 또 다른 명령은 해당 변경사항이 운영체제를 재부팅 하지 않고 적용될 수 있도록 하기 위한 명령입니다. 간단한 명령이지만 이걸 매번 외워서 치거나 어디에 저장해 두었다가 입력하는 것은 왠지 불합리해 보입니다. 개인적으로는 블로그와 회사 공식 블로그에 글을 올릴때 PNG 를 사용하고 있고 저술 작업을 위해 TIFF 를 쓰고 있어서 아래와 같이 쉘 프로파일을 지정해 보았습니다.


[ .bash_profile 파일에 Alias 를 지정 ]

alias png="defaults write com.apple.screencapture type png && killall SystemUIServer"

alias tiff="defaults write com.apple.screencapture type tiff && killall SystemUIServer"


이렇게 지정해두면 터미널이 실행 될때 alias 가 지정되고 간단히 커맨드 프롬프트에서 png, tiff 를 입력하는 것 만으로 쉽게 캡쳐 이미지 포맷을 변경할 수 있습니다. 캡쳐 이미지 포맷을 자주 변경해야 하는 분들이 계시다면 유용하게 활용하실 수 있겠네요!



저작자 표시 비영리
신고
Posted by 노피디
Development/sublime text2017.04.11 14:55

Sublime Text 에디터는 패키지(Package)를 이용하여 기능을 지속적으로 확장, 보완할 수 있습니다.

워낙 다양한 패키지들이 공개되어 있어 어떤 것을 사용하는게 좋다는 이야기를 드리기 조심스럽지만

자주 행하게 되는 반복 작업에 지친 분들이 있을까봐 좋은 패키지 하나를 소개합니다.


업무 특성상 HTML, CSS, Javascript 그리고 JSON 파일을 많이 다루고 있습니다.

여느 웹 개발자나 서버단의 개발자 분들 역시 그런 경우가 많을 것 같습니다.

그동안은 웹 기반으로 만들어져 있는 들여쓰기 정렬툴, 소위 Pretty Print 도구를 사용했습니다만

오프라인 환경에서 작업할 때는 인터넷 엑세스가 제한되어 불편함이 있었습니다.



오늘 발견한 HTMLPrettyfy 패키치는 node.js 가 설치되어 있는 환경에서 사용 가능한 패키지로

서브라임 텍스트2와 3에서 모두 활용할 수 있는 코드 포맷터입니다.

node.js 가 설치되어 있지 않다면 당연히 사용이 어렵다는 정도가 제약사항이라 하겠습니다.


소스코드가 깃헙에 공개되어 있기 때문에 필요에 따라 SQL 이나 다른 구조화된 포맷이 필요한 텍스트에 대해서

기능을 개발하고 제안하여 참여 가능하다는 것도 기억해 두시기 바랍니다. (누가 SQL 좀... 굽신...)




설치를 위해서는 먼저 서브라임 텍스트의 패키지 매니저를 실행해야 합니다.

맥 환경인 경우 Command + Shift + P 를 누르면 되고 윈도인 경우 Ctrl + Shift + P 를 누르면 됩니다.

까만 에디터 위로 조그만 팝업이 뜨면 "Package Control Install Package"를 입력하여 패키지 설치를 시작하겠습니다.



팝업 창이 리프레시되면 위 이미지처럼 "HTML-CSS-JS Prettify"를 검색하시어 선택합니다.

이미 설치되어 있는 경우 결과창이 나오지 않습니다만 설치가 되어 있지 않은 경우

검색 결과 화면이 나오고 엔터를 누르면 서브라임 텍스트 에디터 하단에 설치 진행 현황이 업데이트 됩니다. 


BeforeAfter



이제 정렬하고자 하는 문서가 활성화된 상태에서 Command + Shift + H (윈도에서는 Ctrl + Shift + H) 를 누르면

예쁘게 들여쓰기와 줄바꿈이 된 문서로 탈바꿈 하게 됩니다. 





저작자 표시 비영리
신고
Posted by 노피디
Cloud & Dev. Story2017.01.13 16:51

회사에서 지급받은 맥북에어(MacBook Air)가 3년을 넘기면서 슬슬 배터리 광탈 현상을 보이기 시작했습니다. 아직 회사에서 터치바(Touch Bar)가 내장된 신형 맥북을 지급하고 있지 않아 노트북 교체 신청을 할까 말까 고민했습니다만, 외부 미팅시마다 베터리 걱정에 끙끙 앓느니 뽑는게 낳을거라는 판단에 기존 맥북프로를 한대 지급받았습니다. 일단 메모리와 디스크 용량 커지니 좋고, 외장 모니터를 두개 연결해서 사용하니 이런 천국이 따로 없네요.


안타깝게도 회사에서 타임머신과 같은 장비를 지급해 주진 않기에 새로 받은 맥북에 정성껏 기존 환경에서 쓰던 설정들을 한땀한땀 옮기는 중입니다. 어플리케이션의 환경 설정 파일은 Import / Export 를 통해 쉽게 진행중입니다만, 운영체제 환경설정은 하나씩 옮겨야 하는 탓에 기억도 안나고 (자주 있는 작업이 아니니...) 여러가지로 괴로운 시간을 보내고 있습니다. 내가 이러려고 새로운 PC 달라고 했나 하는 생각에...


그 중 하나가 맥(Mac)의 파인더(Finder)에서 숨김파일을 보여주는 옵션입니다. 회사 인트라넷 게시판 어딘가에 기술된 내용이 있었습니다만 링크가 어디 갔는지도 모르겠고 해서... 구글링 후 다시 한번 블로그에 옮겨 적어 둡니다. 비슷한 경우가 또 언제 생길지 모르니 쉽게 찾아보기 위한 용도입니다. 후후후...


$ defaults write com.apple.finder AppleShowAllFiles YES && killall Finder


위의 명령을 터미널에서 입력하면 실행중인 파인더 프로세스가 모두 종료되고 모든 파일을 보여주도록 변경된 후 파인더가 다시 실행됩니다. 맥에서 숨김파일은 점(".")으로 시작하는 파일이나 폴더이기 때문에, 명령 실행 전후에 해당하는 파일이나 폴더가 보이는지 살펴보시면 됩니다. 언제나 숨김파일이 보이는게 부담스럽다면 필요할 때 위의 명령을 실행하고, 옵션을 "NO"로 바꾸어서 제한하는 것도 방법입니다.


$ defaults write com.apple.finder AppleShowAllFiles NO && killall Finder


- NoPD -

저작자 표시 비영리
신고
Posted by 노피디
Development2016.10.12 09:21

터미널에서 로그파일을 핸들링하면서 자주쓰이는 명령들이 있습니다. 전체 파일을 출력하기 위해서 cat 명령을 사용하고 특정한 컬럼의 값만 출력하기 위해서 파이프로 연결된 awk 명령을 쓸 때가 많습니다. 그런데, 컬럼이 아주 많은 경우에 특정한 컬럼만 제외하고 나머지를 출력할 수 있는 방법이 있을까요? 컬럼이 적은 경우에는 필요한 필드를 나열하는 것도 괜찮지만, 수십개, 수백개의 컬럼이 있다면 그다지 좋은 방법이 될 수가 없습니다.


예를 들어 temp.txt 파일에 아래와 같이 스페이스로 구분된 10개의 컬럼이 있다고 해보겠습니다. 이 파일의 정보들 중에서 특정한 컬럼의 값만 추출하고 싶다면 awk 명령을 이용해서 print 예약어를 이용할 수 있을 겁니다. 


$ cat temp.txt

C1 C2 C3 C4 C5 C6 C7 C8 C9 C10

$ cat temp.txt | awk '{print $3, $5}'

C3 C5


이 데이터 파일에서 거꾸로 3번 컬럼과 5번 컬럼의 값을 제외한 나머지 컬럼의 값을 추출하려면 어떻게 해야 할까요? print 구문의 파라메터로 $3 과 $5 만 빼고 나열해도 되겠지만, 아래와 같이 명령을 입력하면 훨씬 빠르고 쉽게 특정한 컬럼만을 제외하고 데이터를 정제할 수 있게 됩니다.


$ cat temp.txt | awk '{$3=$5=""; print $0}'

C1 C2  C4  C6 C7 C8 C9 C10


동일한 결과물을 얻어내는 방법이 여러가지 있다면 그중에서 가장 간편한 방법을 택하는 것이 누가 뭐라해도 진리일 겁니다. 작업시간을 절약하고 더 집중해야 하는 것들에 몰입하는 하루 되시길 바랍니다!



저작자 표시 비영리
신고
Posted by 노피디
HTTP 2.02016.07.04 16:02

웹 컨텐츠 전송을 위한 프로토콜의 대세가 h2 혹은 http/2 로 자리잡아 가면서 맥(Mac)의 쉘에서도 http/2를 테스트 해야하시는 분들이 많이 늘었을 것으로 생각됩니다. 알려진 내용에 따르면 curl 의 7.34.1 버전 이후에는 --http2 옵션을 통해 http2 로 서버와 통신을 하도록 강제할 수 있지만 환경에 따라서 안되는 경우가 많습니다. curl 은 http/2 를 지원하기 위해 nghttp2 라이브러리를 이용하고 있기 때문에 우선은 nghttp2 를 설치해야 합니다.




nghttp2 가 설치되면 이를 이용해서 curl 을 다시 build 하거나 설치해야 합니다. 홈브루(Homebrew)를 이용하면 간단하게 새로운 버전으로 빌드를 하면서 설치할 수 있으니 아래의 커맨드를 참고해서 설치를 진행하도록 합시다. 아래와 같이 설치한 후 brew info curl 명령을 통해 nghttp2 에 초록색 체크박스가 잘 들어왔다면 일단 설치는 제대로 잘 된거라 봐도 되겠습니다.





그런데 여기까지 하고나서도 curl 을 --http2 옵션으로 실행했을 때 지원하지 않는 프로토콜이라고 에러가 떨어진다면 심볼릭 링크를 한번 교체해줄 필요가 있습니다. 환경 설정에 따라, 사용자 계정에 따라 sudo 를 통해서 권한 상승을 해야 할 필요도 있으니 상황에 따라 적절한 옵션으로 심볼릭 링크를 교체해 주시면 되겠습니다. 




여기까지 해서 마무리가 잘 되었다면 curl --http2 옵션으로 http2 가 활성화된 사이트들, 예를 들어서 아카마이의 https://http2.akamai.com 이라던가 구글 메인 페이지 (https://www.google.com) 쪽으로 요청을 던져볼 수 있게 되셨을 겁니다. 일단 개인적으로 여기까지 해서 문제는 없었습니다만 다른 문제를 겪는 분이 계시다면 댓글로 남겨주시면 한번 살펴보도록 하겠습니다!



- NoPD -




저작자 표시 비영리
신고
Posted by 노피디
Cloud Tech./Server2016.07.01 10:17

가끔 사용중인 리눅스 배포판의 버전과 커널의 버전 확인이 필요할때가 있습니다. 워낙에 배포판도 많고 커널의 버전도 다양하기 때문에 환경에 적합하게 구성된 패키지를 설치하지 않는 경우 이슈가 생길수도 있기 때문이지요. yum 이나 apt-get 으로 설치하는 경우에는 별 문제가 없겠지만 별도로 어플리케이션을 다운로드 받거나 빌드할 필요가 있을때는 버전을 잘~ 맞추어줄 필요가 있습니다.


Cent OS 를 이용하는 경우 아래와 같은 명령을 이용해서 운영체제의 버전과 커널의 버전을 확인할 수 있습니다. redhat 과 같은 다른 배포판 역시 비슷한 네이밍 컨벤션을 사용하고 있기 때문에 해당 폴더에서 어렵지 않게 관련된 파일을 확인할 수 있으니 참고하시기 바랍니다. 자꾸 까먹게 되어 블로그에 기록해 둡니다. 누군가에겐 또 도움이 되리라 믿으며..!!



#cat etc/centos-release

#uname -r 



저작자 표시 비영리
신고
Posted by 노피디
Development2016.06.23 10:38

IPv4 의 주소 체계가 더이상 새로운 주소를 사용자들에게 주지 못할거라는 이야기가 나온지 참 오래된 것 같습니다. 마르지 않는 샘처럼 끊임없이 나오는 IPv4 주소 덕분에(?) 생명연장의 꿈을 꾸고 있습니다만 근래 애플(Apple)의 앱 검수 기준 변화는 IPv6 로의 트랜지션이 본격적으로 시작된 것이라는 느낌을 주기에 충분합니다.


IPv4 네트워크가 워낙에 광범위하게 사용되고 있기 때문에 어느날 갑자기 "오늘부터 IPv6 를 써야해!" 하기는 쉽지 않습니다. 때문에 많은 기술 표준과 이를 준수하는 어플라이언스를 통해 점진적인 트랜지션이 일어나고 있습니다. 개발을 하는 사람들은 사실 이걸 신경쓰지 않아도 됩니다만 이왕 세상이 변하고 있는것, 이해가 가는 부분까지 파보기로 했습니다.


NAT 라는 이야기는 많이 들어보셨을 겁니다. Network Address Translation 의 약자로 이 역할을 하는 장비들은 내부 주소(Private IP)를 외부 주소(Public IP)로 바꿔주는 역할을합니다. 당연한 이야기지만 내부 주소는 사적인 네트워크에서만 동작하기 때문입니다. 외부의 다른 인터넷 자원과의 통신을 위해서 주소 체계를 바꾸어 주는 것이지요. 이것을 IPv6 에 대응하여 IPv4 네트워크와 자연스러운 연결을 위해 만든 것이 바로 NAT64 입니다.


IPv6 체계가 퍼블릭 네트워크에 완전히 보급되는 것은 시간도 오래걸리고 어쩌면 불가능 할지도 모릅니다. 떄문에 IPv4, IPv6 는 한동안 혼용될 것입니다. 상대적으로 내부 네트워크는 IPv6 로의 전이가 쉬운 편이라 사내망에서는 이미 IPv6 를 쓰는 곳들이 꽤 많습니다. 내부에서 사용되는 IPv6 만 사용하는 기기들이 외부의 IPv4 로 구성된 기기에 접근하기 위해서 NAT64 를 활용한다고 보시면 되겠습니다. 시스코에서 게시해 둔 아래의 그림을 보면 이해가 빠를겁니다.


출처 : 시스코



IETF 에서는 NAT64 를 위해서 특정한 IPv6 주소를 활용할 수 있도록 규약을 정의해두었습니다. 이 주소를 활용하게 되면 패킷의 헤더 일부분에 실제 접근해야 하는 IPv4 주소를 포함시킬 수 있게 됩니다. NAT64 어플라이언스는 이 주소체계를 식별하여 IPv4 네트워크로 패킷을 전달할 때 목적지 주소로 활용할 수 있게 되는 것이죠. 실제 패킷의 응답을 다시 받아주기 위해서 NAT64 장비는 이 과정에 원본 주소로 활용할 IPv4 Pool 을 유지하면서 응답을 적절한 사용자에게로 리턴해 줄 수 있게 됩니다.


이러한 과정을 소화하기 위해서는 DNS 역시 AAAA 리소스 레코드로 IPv4 주소를 포함한 데이터를 가지고 있어야 하며 이는 다음글에서 DNS64 라는 주제로 살펴보도록 하겠습니다. NAT64 에 대해서 관심이 더 있으시다면 시스코의 아래 링크와 IETF 문서를 읽어보시면 ㄷ움이 되시겠습니다. 


시스코의 NAT64 관련 글 살펴보기 [바로가기]

IETF 의 RFC6146 (Stateful NAT64) 규약 살펴보기 [바로가기]



저작자 표시 비영리
신고
Posted by 노피디

티스토리 툴바