모든 IPS(IDS)는 패킷에서 특정 패턴을 찾는 기능을 기본으로 합니다. 


스노트는 'content' 라는 이름을 사용하고 있습니다. 

이 옵션을 사용하면 패킷의 페이로드 전 부분에 대해 패턴을 찾게 됩니다. 

페이로드라 함은 아래의 그림에서 빨간색 박스로 표시해둔 부분을 말합니다. 


스노트 옵션 중 가장 기본이 되는 패턴을 지정하는 'content'옵션에 대해 알아봅시다. 


  • 기본 사용법
  1. content라는 키워드를 쓰고,                                                                  content
  2. 콜론(:)을 붙여 시작을 알립니다.                                                           content:
  3. 따옴표(")로 패턴이 시작됨을 지정하고,                                                content:"
  4. 탐지하고자 하는 패턴을 입력 합니다.                                                   content:"pat
  5. 따옴표(")를 한 번 더 붙여서 패턴이 끝남을 지정합니다.                     content:"pat"
  6. content가 끝났음을 세미콜론(;)을 붙여 명시합니다.                          content:"pat";


  • 옵션
  1. !     입력한 패턴이 매칭되지 않는지 검사 
  2. |     hex값을 표현할 때 사용
  3. \    특수 기호 escape 처리 할 때 사용


  • 사용 예
  1. content:"pattern";                       단순 패턴 
  2. content:"|20|hex|20 28|";         패턴 + Hex값
  3. content:"\"pattern\|";                 사용 불가한 패턴을 escape처리
  4. content:!"negate";                      패킷에 negate 패턴이 없는지 검사


  • 주의사항

다음 세 가지는 escape처리를 하지 않으면 사용 불가능한 기호입니다. 

;  \  "



  • 함께 사용하는 옵션들

순번 

옵션  

설명 

 1

nocase 

 대/소문자 구분 하지 않음

 2

rawbytes 

 decode하지 않은 raw data와 매칭 시도

 3

depth 

 payload에서 패턴 매칭을 할 끝 위치 지정

 4

offset 

 payload에서 패턴 매칭을 할 시작 위치 지정

 5

distance 

 이전 content에 매칭된 경우, 패턴 매칭을 시작할 상대 위치 지정

 6

within 

 이전 content에 매칭된 경우, 패턴 매칭을 끝 낼 상대 위치 지정  

 7

http_client_body 

 HTTP body 부분에 대해 패턴 매칭 시도

 8

http_cookie 

 HTTP cookie 부분에 대해 패턴 매칭 시도

 9

http_raw_cookie 

 HTTP cookie를 decode하지 않은 부분에 대해 패턴 매칭 시도

 10

http_header 

 HTTP header  부분에 대해 패턴 매칭 시도

 11

http_raw_header

 HTTP header를  decode하지 않은 부분에 대해 패턴 매칭 시도

 12

http_method 

 HTTP method  부분에 대해 패턴 매칭 시도

 13

http_uri 

 HTTP uri  부분에 대해 패턴 매칭 시도

 14

http_raw_uri 

 HTTP uri를  decode하지 않은 부분에 대해 패턴 매칭 시도

 15

http_stat_code 

 HTTP response 패킷의 stat code 부분에 대해 패턴 매칭 시도

 16

http_stat_msg 

 HTTP response 패킷의 stat msg 부분에 대해 패턴 매칭 시도

 17

fast_pattern 

 longest pattern 지정 - keyword처럼 동작함. 

※ HTTP 관련 옵션 참고 글


  • offset/depth/distance/within 동작 원리 

페이로드에서 패턴을 찾고자 하는 위치를 지정해 주는 이 옵션들을 사용하는 주된 이유는 오탐을 줄이기 위해서 입니다. 

더불어, 엔진 내부적으로는 성능 향상을 위해서도 중요한 역할을 합니다. 

페이로드 전체에 대해서 패턴 매칭을 시도하는 것보다 페이로드 일부분에 대해서 패턴 매칭을 시도하는데 걸리는 시간이 짧은건 당연할테니까요. 

아래의 테이블에 시그니처를 작성 했을 때 실제 패턴 매칭에 사용되는 버퍼를 케이스 별로 정리해 두었습니다. 

가장 이상적인 것은 패턴 매칭에 사용되는 버퍼의 크기와 시그니처에 작성된 패턴의 크기가 같은 경우겠죠? 


예) 패킷 페이로드 : 1234567890abcdefghijklmn

 순번

시그니처 

 패턴 매칭 버퍼 

 1

 content:"def";   1234567890abcdefghijklmn

 2

 content:"234"; offset:1; depth:5;  23456  

 3

 content:"123"; depth:3; content:"abc"; distance:5; within:8;   90abcdef

 4

  content:"abc"; distance:5; within:8;

 67890abc


  • 알아두면 뼈가되고 살이되는 정보 

fast_pattern 옵션을 얼마나 잘 활용하는가에 따라 초보자와 숙련가를 구분 할 수 있다고 해도 과언이 아닙니다. 

이 옵션을 사용하지 않아도 동일한 유해 패킷을 탐지 할 수 있기 때문입니다. 

그런데 궂이 왜 이런 옵션을 만들어둔 것일까요? 


fast_pattern은 특정 패턴을 longest pattern으로 지정한다고 했는데요.

기본적으로 스노트는 content에 입력한 패턴 중 길이가 가장 긴 녀석을 longest pattern이라고 부르고, 이런 패턴들을 모아서 Aho-Corasick 알고리즘에 의해 빠르게 검사해야할 시그니처를 걸러냅니다. (보통은 패턴의 길이가 길면 다른 패턴과 중복되지 않고 Unique한 경우가 많기 때문에 스노트에서는 가장 긴 패턴을 골라서 검사해야할 시그니처를 걸러내는 목적으로 사용하고 있는것같습니다. )

이 과정에서 얼마나 많은 시그니처를 걸러내느냐는 얼마나 빨리 공격을 탐지하는가와 직결되는 문제입니다. 

간혹 패턴의 길이는 짧지만 매우 Unique한 패턴이 있다면 이 패턴을 Keyword로 설정해서 Aho-Corasick알고리즘에 의한 필터링에 사용하는게 더 유리하겠죠? 

이것을 가능하게 해주는 옵션이 fast_pattern인 것입니다. 


※ fast_pattern은 부가적인 옵션과 함께 사용가능한데요.. 그 내용들도 알아두면 좀 더 완성도 높은 시그니처를 작성 할 수 있을겁니다. 


  • 몰라도 무관한 재미난 사실 

content에 입력한 값은 Hex값으로 입력 하더라도 문자로 표현할 수 있는 범위(0x20~0x7E)의 값이라면 문자로 변환해서 저장하고 있으며,  그 외의 값은 모두 Hex값으로 저장하고 있게 됩니다. 

이렇게 함으로써 Hex값에 대해서 nocase 옵션을 붙여주게 되면, 그 값이 문자열일 경우 대소문자를 구분하지 않고 탐지가 가능합니다. 

예) content:"|61 62 63|"; nocase;

'abc', 'Abc', 'ABC', 'aBc' 모두 탐지 가능 


단, 아래 4가지 값은 hex값으로 저장하고 있게 됩니다. 

 순번

 Hex값

기호 

 1

20 

'스페이스' 

 2

22 

 3

3B 

 4

7C 


찾는 내용이 없다면 [스노트/Snort] 카테고리의 다른 글을 참고해보세요~ ^^


Posted by KT한
,

Snort에는 여러가지 유용한 전처리기들이 존재합니다. 

그 중 HTTP inspection 모듈은 다양한 공격 패킷을 탐지하는데 매우 중요한 역할을 합니다. 

더불어 실시간으로  좀 더 정확하게 패킷을 검사하는데도 일조 하고 있죠. 



  • HTTPINSPECT PACKET FLOW 와 각 모듈별 역할 


1. Session Inspection Module

  - 'snort.conf' 파일에 정의해둔 http server port값과 비교해서 서버/클라이언트를 판단 

  - 또한, http inspect를 수행 할 지에 대한 판단도 함께 진행 

  - 현재는 Stateless 모드만 지원한다. (Stateful로 수행하기에는 좀 버거울 지도..)


2. HTTP Inspection Module

  - method/header/body/cookie등 HTTP패킷을 파트별로 분류하는 작업 수행 

  - pipeline request 패킷에 대한 처리도 함께 수행 함


3. HTTP Normalization Module

  - HTTP패킷에 대한 정규화작업을 수행  (하단 설명 참고)

  - 별도의 버퍼에 HTTP패킷을 파트별로 구분해둔 값을 설정 


4. HTTP Detection Module

  - 시그니처와 패턴 매칭 수행 

  - 위에서 설정한 별도의 버퍼에 대해서 탐지를 수행


5. HTTP Event Output Module

  - 매칭된 결과에 대한 출력 




  • 정규화(Normalization) 작업의 허와 실 


정규화는 인코딩된 URL값을 디코딩 하는 작업을 말합니다. 


인코딩은 흔히 다음과 같이 이루어 지게되죠. 


'&' -> %26 (hex값으로 26이 '&'이므로)



일반적으로 웹서버는 인코딩 된 값을 알아서 디코딩 해 주는데, 

중간에서 악성 패킷을 검사하는 보안 장비는 일반적으로 

장비 성능 이슈 때문에 디코딩을 완벽하게 수행하지는 않습니다. 


해커는 이 점을 악용해서 공격을 할때 인코딩을 한 패킷을 전송할 수도 있겠죠?


중간에 보안 장비가 있을 것을 대비해서 여러번 인코딩 한 패킷을 전송할 수도 있겠구요. 

아쉽게도 Snort(스노트)는 HTTP 패킷에 대해 최대 2번까지만 디코딩 작업을 수행합니다. 

다시 말하면 3번 인코딩한 패킷을 탐지 못한다는 뜻이됩니다. 



어쨌든, 

디코딩한 결과를 'uricontent'라는 옵션을 사용해서 시그니처를 작성 할 수 있습니다. 


기본적으로 uricontent는 http inspection모듈에 의해 normalization을 수행한 결과값을 가지고 있게되구요. 


일반적으로 uricontent는 HTTP 패킷의 uri 필드에  '%28' 과 같은 값을 '(' 와 같이 디코딩 하여 

uricontent:"("; 와 같이 시그니처를 작성 함으로써 인코딩 된 패킷을 탐지하는데 사용됩니다. 


만약, 

시그니처에 uricontent:"%33%34"와 같은 시그니처가 있다면 

실제 탐지하는 패킷은 %%%33%33%%%33%34 와 같은 패턴을 가지고 있겠죠.

 

무슨 말인지 어렵다구요? 

단계별로 알아보면.. 


%  %  %33 %33 % % %33 %34

%  % 3 3              % % 3 4                    - 1번째 디코딩

% 33                    % 34                         - 2번째 디코딩


물론, 한번 더 디코딩을 한다면 34가 됩니다.

 


주의사항:

HTTP패킷의 uri 필드에 '+' 가 있는경우,

snort에서는 '빈칸'으로 인식하고 Hex값 '20'으로 치환해버립니다. 


일반적으로 HTTP패킷의 body에서는 빈칸을 '+'로 표시하는데,

snort는 uri에 대해서도 동일하게 처리하고 있답니다. 


Posted by KT한
,
목적: 
프로그래밍을 하다보면 printf문을 사용해서 보기 편하게 출력해야할 일이 생기기 마련이죠. 
스페이스바나 탭기호를 넣어서 어렵게 하지 마시고, 
printf문의 다양한 출력 형식을 활용하면 쉽게 가능합니다. 


알아봅시다:

1. 좌,우 정렬
출력되는 자료를 어느 방향으로 정렬할 것인지를 결정해 줍니다.
(-)부호를 앞에 붙이면 왼쪽 정렬이 됩니다. 

당연히 아무것도 붙이지 않으면 오른쪽 정렬이 되구요. 


평소에는 쓸 일이 없겠지만.. 아래 형식에 따라 이쁘게 줄을 맞출때 유용합니다. 



2. 다양한 출력 형식

%c : char(문자)형의 한 문자로 출력(그냥 '%c'로만 사용하시기 바랍니다.)
%d : 부호 있는 정수로 출력
%o : 부호 없는 8진수 정수로 출력
%x : 부호 없는 16진수 정수로 소문자 출력
%X : 부호 없는 16진수 정수로 대문자 출력
%u : 부호 없는 정수로 출력
%f : float나 double형의 실수로 출력
%e : 과학 기술 계산용(예 : 1e5 = 100000)으로 e를 소문자로 출력
%E : %e와 비슷하나 E를 대문자로 출력
%g : %f나 %e중 짧은 것으로 선택
%G : %f나 %E중 짧은 것으로 선택
%s : 문자열 출력('\0'을 만날 때 까지 계속 출력합니다.)
%p : 포인터의 주소를 hex값으로 출력
%% : '%'를 그대로 출력(그냥 '%%'로 사용하시기 바랍니다.)


3. 출력할 최대 자릿수 지정

자리가 모자라면 그냥 무시하고 계속 출력하고
자리가 남으면 나머지를 공백(정수,문자열) 혹은 0(소수점 유효숫자 이하)으로 채웁니다.

※ 주의 : 실수의 경우에는 소수점까지 포함한 전체 자릿수를 말합니다.

예) 123을 %5d로 출력하면 -> __123 ( _는 공백)
123.456를 %10f로 출력하면 -> 123.456000
"ASDF"를 %10s로 출력하면 -> ______ASDF


4. 최대 출력 폭(길이)과 문자 수를 구분(문자열)

.(점) 을 이용해서 구분해 줄 수 있습니다. 
소수점 이하 자릿수를 구분(실수)해 줍니다.

예) 123.456789 를 %10.3f로 출력하면 -> ___123.457 (반올림 됨) 



5. 소수점 이하 자릿수(실수)나 출력할 문자 수(문자열) 
.(점) 이후에 숫자로 지정해줍니다. 

출력할 0의 갯수(정수)를 지정할 때도 사용됩니다.

실수 출력인 경우에는 출력할 자릿수만 소수 이하로 출력되며
문자열의 경우에는 맨 앞부터 출력할 문자수만큼 출력합니다.

예) "ASDF"를 %.2s로 출력하면 -> ___AS
1.23456789 을 %.3f로 출력하면 -> 1.235 (반올림 됨)
123을 %.12d로 출력하면 -> 000000000123


6. long형으로 출력

실수, 정수형에서만 사용이 가능한 옵션입니다. 
(long형은 double, long double, long, unsigned long을 말합니다.)



다양한 예제:


1. "ASDF"라는 문자열

%s : ASDF
%10s : ______ASDF
%-10s : ASDF______
%10.3s : _______ASD
%-10.3s : ASD_______


2. 123.456789 라는 실수 

%f : 123.456789 
%.3f : 123.457 (반올림 됨)
%10.3f : ___123.457
%-10.3f : 123.457___
%10.3E : _1.235E+02
%-10.3E :  1.235E+02_

3. 123 라는 정수

%d : 123
%5d : __123
%05d : 00123 
%.5d : 00123 (%05d와 같은 의미)
%-5d : 123__
%x : 7b
%5x : ___7b
%-5x : 7b___
%05x : 0007b
%-5X : 7B___
%o : 173
%07o : 0000173
%-7o : 173____
%7o : ____173


Posted by KT한
,

소스 검증 툴은 크게 정적 분석 툴(static analysis tool)과 동적 분석 툴(dynamic analysis tool)로 구분 할 수 있습니다. 


정적 분석 툴은 분석하고자 하는 프로그램을 실행시키지 않더라도 소스만 보고 문제를 찾아준다는 장점이 있지만, 

아무래도 복잡한 소스는 문제를 완벽하게 찾아주지 못한다는 단점이 있습니다. 

대표적으로 Prevent(유료)가 있습니다. 

다양한 정적 분석 툴(http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis)


동적 분석 툴은 메모리에 관한 거의 모든 문제를 찾아준다는 정확성면에서 매우 큰 장점이 있지만,

프로그램을 실행 시켜야만 된다는 단점이 있습니다. 

(프로그램이 매우 크다거나.. 종료되지 않고 계속 도는 데몬이라면.. 분석이 어려울 수 있습니다. )

Valgrind(무료)는 대표적인 동적 분석 툴에 해당됩니다. 

동적 메모리 디버깅 툴: MEMWATCH, Valgrind, Electric Fence, etc..

그 외의 다양한 동적 분석 툴(http://en.wikipedia.org/wiki/Dynamic_code_analysis)



프로그래밍을 하다보면 메모리 누수(memory leak)를 찾지 못해 고생하는 일이 종종 발생하죠. 

소스를 보기가 막막하다면 Valgrind(발그린드)의 도움을 받아보는것이 정신건강에 좋습니다. 


자세한 설명은 메뉴얼을 참고하세요~ 

valgrind_manual.pdf



추천은 저를 춤추게 합니다 ^^



1. 설치 


기본적으로 fedora와 같은 linux에는 valgrind 패키지가 포함되어 있습니다. 

yum 명령어를 사용해서 손쉽게 설치가 가능합니다. 

$ yum install valgrind 



2. 실행


기본적으로 제공되는 도움말에 다음처럼 사용법을 제시하고 있습니다. 

usage: valgrind [options] <prog-and-args>


예를 들면 이런식으로 실행 하는거죠.

$ valgrind --leak-check=full ./testLeak 



3. 결과 분석 


malloc 후에 free를 하지 않은 프로그램을 돌려보면 이런식으로 결과가 나옵니다. 


1) process ID(28403)가 앞에 나옵니다. 

2) 명확하게 leak이 발생한 크기(4bytes)에 대한 정보가 첫 줄에 나옵니다. 

3) 'at'은 leak이 발생한 위치, 즉 malloc에 의해 메모리를 할당 했는데 free가 안됐다는걸 보여줍니다. 

4) 'by'는 leak이 발생한 함수 이름이 나오죠. 


$ valgrind --leak-check=full -q  ./testLeak

==28403== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1

==28403==    at 0x4A0515D: malloc (vg_replace_malloc.c:195)

==28403==    by 0x40056D: main (in /testLeak)

==28403==



4. 팁


옵션을 좀 더 살펴보면.. 

1) tool을 선택 가능합니다. 

--tool=memcheck 와 같이 지정해주면 됩니다. 

사실, 기본으로 [memcheck]가 선택되어 있기때문에 memcheck를 할꺼라면 별도로 지정해주지 않으셔도 됩니다. 


선택가능한 옵션은 이런것들이 있답니다. 

memcheck(memory), cachegrind(cache), callgrind(call-graph), helgrind(thread), etc..



2) 결과만 보고 싶다면 

-q 옵션을 붙여주면, 잡다한 메시지는 보여주지 않고 에러 메시지만 출력합니다. 


Posted by KT한
,

1. CISCO 스위치 기본 정보

시스코 스위치를 처음 사용해보신다면, 다음 다섯 가지는 꼭 기억하세요~ 


  1. cisco 스위치는 기본적으로, 설정 조회 화면에 출력된 내용이 설정 명령어 인 경우가 많습니다. 
  2. 설정한 값을 없애는 명령어는 설정 명령어 앞에 'no'만 붙여주면 되는 경우가 많습니다. 
  3. 명령은 일부만 입력해도 중복되는 문자가 없다면 알아서 인식합니다. ( 예) show -> sh 만 입력해도 됨)
  4. 명령어 일부만 입력 후 'tab'키를 누르면 중복되는 명령어가 없다면 자동으로 완성해 줍니다. ( 예) sh 'tab' -> show 가 입력됨)
  5. 현재 상태에서 사용 가능한 명령 리스트는  물음표를 입력하면 조회 가능합니다. 


2. 설정 조회

스위치의 설정을 조회하는 다양한 명령어가 존재 합니다. 

자주 사용하는 명령어를 몇개만 보자면 아래와 같은게 있겠죠? 


1). 설정된 모든값 조회  

 - switch# sh run (show running-config) 


2). 인터페이스 조회 

  - switch# sh int (show interface)


3). 라우팅 조회
switch# sh ip route (show ip route)


3. 설정 저장 및 재부팅

1). 열심히 설정을 했다면, 만약의 사태(?)에 대비해서 설정을 저장합니다. 


 switch# write memory


2). 재부팅을 시켜주면 설정 파일을 저장 할건지 물어봐 주긴 합니다. 


switch# reload


그래도 불안하다면 설정 저장을 먼저 하시는걸 추천합니다. ^^ 


4. ip 설정 

1). 인터페이스 선택

Switch(config)# interface gigabitEthernet 0/4


2). switch port로 사용 안함

Switch(config-if)# no switchport


3). 입력 

Switch(config-if)# ip address 41.41.41.2 255.255.0.0


4). 적용

Switch(config-if)# no shutdown


5). 삭제 

Switch(config-if)# no ip address 41.41.41.2 255.255.0.0



5. route 설정


1). 입력

                                  타겟 주소  / 네트워크 대역 / 게이트웨이

Switch(config)# ip route 42.42.42.0   255.255.255.0   30.30.30.100


2). 삭제

Switch(config)# no ip route 41.41.41.0 255.255.255.0 41.41.41.1



여기까지는 기본 설정이구요. 

좀 더 다양한 설정은 종류별로 따로 포스팅 하겠습니다. 


Posted by KT한
,

가변인자 함수

1. 가변인자 함수 설명 
 va_list
가변 인자들의 시작 주소를 저장하는 자료형
 va_start
가변 인자의 시작 주소를 va_list 형의 변수에 저장하는 매크로
 va_arg
가변 인자를 접근하는 매크로
 va_end
가변 인자 시작 주소를 NULL로 설정하는 매크로


2. 가변인자 함수의 제약

하나 이상의 고정 인자를 필요로 한다.
va_arg()를 이용하여 접근하는 가변인수는 순차적으로만 접근 가능하다.
정확한 자료형으로 접근하는 것은 전적으로 사용자의 몫
가변인수의 목록은 원형이 없기 때문에 가변인수로 전달되는 값은 인수 확장이 발생한다. (argument promotion)
int 형보다 작은 
char, short -> int
float ->  double
인수 확장이 일어난 인수는 va_arg()로 접근할 때 확장된 자료형으로 접근해야 한다.


3. 필요 라이브러리 
 #include <stdarg.h>


예제 


1. 메크로 선언


디버깅 메시지를 호출하는 파일, 함수, 위치에 정보를 넘겨주기 위한 메크로 함수
그리고, 디버깅 메시지에 색깔을 주기 위한 컬러 프린트 메크로 함수
 
#define DebugPrint(n, fp, ...) \
                   DebugPrintFunc(n, fp, __FILE__, __func__, __LINE__, __VA_ARGS__)

#define cprintf(color,fmt, args...) ({ \
        printf(color fmt ANSI_FG_NC, ##args); \
        })


2. 실제 함수 선언


int DebugPrintFunc(int , const char* , const char* filename,
          const char* funcname, int line,  const char *, ...);



3. 실제 함수 정의

    
int DebugPrintFunc(int run_level, const char* thread, const char* DebugFile, 
                  const char* DebugFunc, int DebugLine,  const char *errorMsg, ...)
{
    char buf[STD_BUF+1];
    va_list ap;

    va_start(ap, errorMsg);
    vsnprintf(buf, STD_BUF, errorMsg, ap);
    buf[STD_BUF] = '\0';

    cprintf(YELLOW,"[FATAL_ERROR] %s:%s:%d:%s",
                 DebugFile, DebugFunc, DebugLine, buf );

    va_end(ap);
}



4. 함수 호출 

DebugPrint(DEBUG_ERROR, thread_name, "Alloc Fail..Not Enough Memory\n");


Posted by KT한
,

스위치의 가상 랜(VLAN)설정은 하나의 스위치를 

여러개의 분리된 스위치 처럼 사용 가능 하도록 지원해 주는 기능입니다. 



1. 기본 정보 조회 


switch>en                                          <- enable 약자

Password:

switch# show interfaces status     <- 인터페이스 상태를 조회 

Port      Name               Status       Vlan       Duplex  Speed Type
Gi0/1                        notconnect   1            auto   auto 10/100/1000BaseTX
Gi0/2                        notconnect   1            auto   auto 10/100/1000BaseTX
Gi0/3                        notconnect   routed       auto   auto 10/100/1000BaseTX
Gi0/4                        notconnect   routed       auto   auto 10/100/1000BaseTX
Gi0/5                        notconnect   routed       auto   auto 10/100/1000BaseTX
... 중략 ... 
Te0/2                        notconnect   routed       full    10G 10GBase-SR
Fa0                          notconnect   routed       auto   auto 10/100BaseTX

'Gi' 는 gigabitEthernet 을 의미 하고, 'Fa'는 fastEthernet을 의미 합니다. 
사용중인 스위치 인터페이스 타입을 알아야 설정이 가능 하겠죠? 
포트들은 기본적으로 Vlan 1번에 포함되어 있습니다. 

switch#show vlan   <- vlan 현황 조회

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                                 active    Gi0/1, Gi0/2, Gi0/17, Gi0/26

Vlan1 번의 이름은 'default'이며, 기본적으로 포트들이 여기에 포함되어 있는걸 확인 할 수 있습ㄴ디ㅏ. 


2. vlan 생성 

switch#conf t                                                          <- configure terminal 약자 
switch(config)#vlan 2                                           <- vlan 2번을 생성  
switch(config-vlan)#name VLAN_NUM2          <- 이름은 'VLAN_NUM2' 라고 함
switch(config-vlan)#exit                                        <- 설정 저장하고 나가기 
switch(config)#exit                                                 <- 설정 저장하고 나가기 
switch#show vlan

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                                 active    Gi0/1, Gi0/2, Gi0/17, Gi0/26
2    VLAN_NUM2                      active

VLAN 2번에 'VLAN_NUM2' 라는 이름으로 새로운 vlan이 생성된것을 확인 할 수 있습니다. 


3. vlan에 인터페이스 추가 

switch#conf t
switch(config)#interface gigabitEthernet 0/2     <- vlan에 포함 시킬 포트
switch(config-if)#switchport access vlan 2        <- vlan2에 등록 함 
switch(config-if)#exit
switch(config)#exit
switch#show vlan

VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                                 active    Gi0/1, Gi0/17, Gi0/26
2    VLAN_NUM2                      active    Gi0/2

VLAN2에 Gi0/2가 포함되어 있는게 보이시죠? 


4. vlan에 IP 주소 설정 

switch#conf t
switch(config)#interface vlan 2  
switch(config-if)#ip address 10.10.10.2 255.255.255.0         <- vlan2에 ip를 설정 함
switch(config-if)#no shutdown                                                    <- shutdown 앞에 'no'가 붙었으므로, 인터페이스를 살리라는 뜻. 
switch(config-if)#exit
switch(config)#exit
switch#show interfaces vlan 2                                                      <- vlan2의 정보 조회 

Vlan2 is up, line protocol is down
  Hardware is EtherSVI, address is 1c17.d3e5.c14e (bia 1c17.d3e5.c14e)
  Internet address is 10.10.10.2/24
  MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec,
     reliability 255/255, txload 1/255, rxload 1/255
 .. 이하 생략 .. 

IP주소가 정상적으로 설정 된것을 볼 수 있습니다. 


5. vlan에 설정한 IP 주소 삭제
switch#conf t
switch(config)#interface vlan 2  
switch(config-if)#no ip address                              <- vlan2의 ip를 삭제 함
switch(config-if)#exit
switch(config)#exit
switch#show interfaces vlan 2                                <- vlan2의 정보 조회 

Vlan2 is up, line protocol is down
  Hardware is EtherSVI, address is 1c17.d3e5.c14e (bia 1c17.d3e5.c14e)
  MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec,
     reliability 255/255, txload 1/255, rxload 1/255
 .. 이하 생략 .. 

IP주소가 정상적으로 제거 된것을 볼 수 있습니다. 


6. vlan 삭제 

switch#conf t
switch(config)#no vlan 2                     <- vlan2 를 삭제함 (cisco 스위치는 앞에 'no'를 붙이면 제거/삭제 의 의미를 가짐)
switch(config)#exit
switch#show interfaces status

Port      Name               Status       Vlan       Duplex  Speed Type
Gi0/1                        notconnect      1            auto   auto 10/100/1000BaseTX
Gi0/2                        notconnect      2            auto   auto 10/100/1000BaseTX

이상하게도.. vlan2를 지웠는데 
2번 포트는 여전히 Vlan 2에 포함되어있다고 나옵니다. 
default vlan으로 돌아가게 하고 싶다면 아래 명령을 수행해야 합니다. 


7. vlan에 등록했던 인터페이스 제거 

switch#conf t
switch(config)#interface gigabitEthernet 0/2                     <- vlan에서 제거할 포트 
switch(config-if)#no switchport access vlan 2                  <- vlan2 에서 제거 
switch(config-if)#exit
switch(config)#exit
switch#show inter status

Port      Name               Status       Vlan       Duplex  Speed Type
Gi0/1                        notconnect      1            auto   auto 10/100/1000BaseTX
Gi0/2                        notconnect      1            auto   auto 10/100/1000BaseTX
Posted by KT한
,

삼바(Samba)는?

삼바는 윈도우를 설치한 PC에서 리눅스(유닉스) 서버에 있는 파일을 공유할 수 있게 해줍니다. 

즉, 윈도우 사용자가 리눅스 장비의 삼바 서버에 접속한 후, 윈도우용 에디터를 이용하여 파일을 편집 하는게 가능하도록 해준다는 거죠. 



1. 삼바 설치


# yum install samba 


=============================================================================

 Package                  Arch      Version           Repository        Size

=============================================================================

Installing:

 samba                    x86_64    3.4.9-60.fc12     secui-updates    4.3 M

Installing for dependencies:

 libtalloc                x86_64    2.0.0-0.fc12      secui-mirror      19 k

 samba-common             x86_64    3.4.9-60.fc12     secui-updates     11 M

 samba-winbind-clients    x86_64    3.4.9-60.fc12     secui-updates    934 k


Transaction Summary

=============================================================================

Install       4 Package(s)

Upgrade       0 Package(s)



2. 삼바 설정 

설정 파일을 열어서 설정 가능 


# vi /etc/samba/smb.conf 


기본적으로 'homes'가 공유되도록 되어 있음. 

삼바를 설치 한 장비에 유저로 등록 되어 있다면 자신의 'home' 디렉터리를 접근 할 수 있도록 해준다는 뜻. 

만약, public을 설정 하고 싶다면 설정 파일 하단에  'public'을 검색해서 주석을 해제하면 됩니다. 


[homes]

        comment = Home Directories

        browseable = no

        writable = yes



3. 삼바 시작 

yum을 통해서 설치 했다면 간단하게 아래 명령어만 실행 해주면 됩니다. 

'OK' 라고 나오면 정상적으로 시작 된겁니다. 


# service smb start

Starting SMB services:                                     [  OK  ]


장비가 꺼졌다가 켜졌을 때 자동으로 시작하게 하려면 chkconfig에 등록 해야 합니다. 

우선 현재 상황을 확인합니다. 


# chkconfig | grep smb

smb             0:off   1:off   2:off   3:off   4:off   5:off   6:off


아래 명령어를 수행해서 삼바를 등록해줍니다. 


# chkconfig smb on


이후 다시 확인하면 정상적으로 등록 되어있겠죠? 


# chkconfig | grep smb

smb             0:off   1:off   2:on    3:on    4:on    5:on    6:off



4. 사용자 등록 

이제 삼바 사용자를 등록해주면 됩니다. 

아래 명령어를 실행해주면 됩니다. 


# smbpasswd -a kthan


New SMB password:

Retype new SMB password:

Added user kthan.



5. 삼바 접근하기 

윈도우 탐색기를 열어서 삼바를 설정한 서버주소를 입력해 보세요. 
사용자 정보를 입력 하면 'home' 폴더의 정보가 보일겁니다. 



Posted by KT한
,

함수 포인터 란?

C언어의 포인터가 데이터의 위치를 가리키는 대신 함수 포인터는 함수를 가리키는 것입니다. 

포인터는 세그먼트 폴트를 유발하는(?) 단점이 있지만, 잘 활용한다면 C언어만의 장점이 됩니다. 


사용 용도 및 활용 방안:

Generic 함수를 만들어서 사용 및 관리가 용의하게 코딩이 가능합니다. 

또한, 범용 함수기 때문에 코드에 대한 이해도를 높히는 부가적인 효과도 있습니다. 




자.. 그럼 어떻게 사용해야 하는지 알아봅시다. 


이해를 돕고자 같은 녀석들 끼리 같은 색을 칠해두었습니다. 


1. 함수를 호출할 이름을 정의 함.


#define DEFINE_FUNC_NAME      "func_name"             



2. 함수 포인터 선언


함수 이름을 포인터 타입으로 해야 합니다. 

그리고, 괄호로 묶는 위치도 신경써야 합니다. 


typedef int (*OptFunc)(int argument1, char *argument2);



3. 실제로 호출 될 함수 정의 


위에서 선언한 함수에 의해 실제로 호출 될 함수 입니다. 


static int  FuncName(int argument1, char *argument2)

{

...

}



4. 함수 포인터 구조체 정의 

예제로 이름, 변수, 함수 세가지만 정의했습니다. 
실제 사용할 때 기본이 되는 구조입니다. 

typedef struct _OptFunc

{

    const char *name;

    int arg;

    OptFunc func;

} FuncPointer;



5. 함수 포인터 구조체에 값 설정 

함수를 여러개 설정 해서 사용할 것이므로 배열로 잡아줍니다. 
위에서 정의한 구조체의 순서에 따라 name, arg, func에 각각 매핑 됩니다. 

다시 말해서..
name 은 DEFINE_FUNC_NAME으로 설정 해줍니다. 즉, "func_name"이 되겠죠
arg는 1 로 설정 해줍니다. 
func는 FuncName을 가리키게 되겠죠. 

static const FuncPointer options[] =
{
    {  DEFINE_FUNC_NAME, 1, FuncName },                 
    { NULL, 0, 0, NULL }   
};


6. 함수 호출  

함수 포인터에 정의된 함수를 찾아서 Argument와 함께 호출 합니다. 

toks[0]가 "func_name"이면 FuncName 함수가 호출 되는 구조입니다. 
즉, 입력을 받아 특정 함수만 호출 하도록 구현하시면 됩니다. 

for (i = 0; options[i].name != NULL; i++)
{
 if (strcasecmp(toks[0], options[i].name) == 0)              
{
options[i].func(argument1, argument2);                   
}
}


Posted by KT한
,

윈도우7에서는 CD가 없어도 윈도우를 설치가 가능합니다. 

그렇지만.. 간혹 CD에 iso파일을 구워서 사용해야 할 필요가 있을 수 있죠. 


하지만, CD굽는게 번거롭기도 하거니와.. 

RW가 아니면 한번 쓰고 못쓰게 되고.. 

요즘은 집에 공CD 가지고 있는 경우도 적어서 참 불편합니다. 


이럴때는.. 

요즘은 보편화된 USB를 CD대용으로 활용 할 수 있는 방법을 알아봅시다. 


먼저 첨부된 uDiskToolBar를 받아서 실행합니다.  

아쉽게도, 비스타 혹은 윈도우7에서만 동작하는 군요..


uDiskToolBar_only_for_Vista_Win7.exe




1. 실행 후 usb를 연결하면 알아서 메뉴가 뜹니다. 

참고로, usb를 연결 해야만 메뉴가 뜨더군요. 


그럼 CD이미지 아이콘을 클릭합니다. 

메뉴는 'AutoRun Manager' 군요. 


2. 설정 창이 뜹니다. 

iso이미지 파일을 지정해주고~ 

'Burn'을 클릭 합니다. 


만약 남은 공간을 사용하기 싫다면 'CDROM Only'를 체크해줍니다. 

궂이 하지 않아도 정상 동작하므로 저는 패스~ 


3. 화면 하단에 진행 게이지가 보입니다. 

인내심을 가지고 기다려줍니다. 


4. 이미지 굽기에 성공!

장치를 뽑았다가 다시 연결 하라고 알림창이 뜹니다. 


5. 다시 연결하면 파티션 설정 화면에 

'CD-ROM'에 iso이미지 크기만큼 할당된게 보입니다. 

정상적으로 잘 구워졌다는 거죠~ 


6. 만약 USB에서 CD영역을 지우고 초기화 하고 싶다면.. 

매우 간단하게 해결 가능합니다. 


'ISO File'을 선택을 아무것도 하지 않은 상태로 'Burn'을 클릭하면

다시 초기 상태로 돌릴 수 있답니다~ 


참고로..

일부 USB에서는 정상 동작하지 않을 수 있습니다. 

(보통 칩셋 문제이므로.. 다른 USB를 사용해서 시도해보세요~ )


Posted by KT한
,