카테고리 보관물: study

audit설정을 통한 리눅스 파일 보안강화

개요

시스템 관리자로써 관심있는 사항은 “어떻게 사용자들의 읽고 쓰는 것을 관리할 수 있을까? 어떻게 시스템의 무결성을 보장할 것인가?” 하는 점이다.
해결책은 2.6 커널의 audit시스템을 이용하는 것이다. 대부분의 리눅스에는 auditd 데몬이 깔려서 나오고 이는 사용자들의 디스크 액세스를 관리하게 된다. /etc/audit.rules를 통해 설정이 되고 audit.rules에서 로그의 경로나 다른 세팅을 바꿔줄 수 있다. 기본설정값으로 충분히 사용가능하기도 하다.

설치 및 실행

설치와 실행을 위해서 몇가지 필요한 툴이 있다.
auditctl: 커널의 audit시스템을 관리하고 상태, 추가, 삽입과 같은 시스템을 관리하고 특정파일에 대한 모니터링을 실시한다.
ausearch: 서치를 실행한다.
aureport: audit시스템의 리포트에 사용된다.
기본적으로 audit을 2.6 커널에 설치되어 있지만 그렇지 않다면 다음과 같이 설치해준다.
# yum install audit
그리고 서비스를 실행해보자
# /etc/init.d/auditd start
설치가 끝났다면 기능들을 설정해 보겠다. 우선 /etc/passwd 폴더의 변경을 검열하고 싶다면 아래와 같이 설정한다.
# auditctl -w /etc/passwd -p war -k password-file
위에서 –p war는 권한을 설정하는 것이고 w-write, x-execute, a-append 그리고 r-read의 권한을 부여하게 된다.
즉 위의 명령어를 통해 여러분은 쓰기, 추가, 읽기와 관련된 사항에 대한 로그를 받게 된다.

결과값 검색

누가 접근을 했고 어떤 변경을 하였는지는 다음의 명령어를 통해 알 수 있다.
# ausearch -f /etc/passwd
이에 대한 결과값은 아래와 같이 나오게 된다.
type=PATH msg=audit(03/16/2007 14:52:59.985:55) : name=/etc/passwd flags=follow,open inode=23087346 dev=08:02 mode=file,644 ouid=root ogid=root rdev=00:00

type=CWD msg=audit(03/16/2007 14:52:59.985:55) :  cwd=/webroot/home/lighttpd

type=FS_INODE msg=audit(03/16/2007 14:52:59.985:55) : inode=23087346 inode_uid=root inode_gid=root inode_dev=08:02 inode_rdev=00:00

type=FS_WATCH msg=audit(03/16/2007 14:52:59.985:55) : watch_inode=23087346 watch=passwd filterkey=password-file perm=read,write,append perm_mask=read

type=SYSCALL msg=audit(03/16/2007 14:52:59.985:55) : arch=x86_64 syscall=open success=yes exit=3 a0=7fbffffcb4 a1=0 a2=2 a3=6171d0 items=1 pid=12551 auid=unknown(4294967295) uid=lighttpd gid=lighttpd euid=lighttpd suid=lighttpd fsuid=lighttpd egid=lighttpd sgid=lighttpd fsgid=lighttpd comm=grep exe=/bin/grep

audit(03/16/2007 14:52:59:985:55)는 시간을 나타내고 uid=lighttpd gid=lighttpd는 사용자와 속한 그룹을 보여준다. -i옵션을 통해 수치를 문자로 변환할 수도 있다. exe=”/bin/grep”는 /etc/passwd에 접근하기 위해 해당명령어를 사용했다는 것을 보여주고 perm_mask=read 해당 파일을 읽었다는 뜻이다.
그러므로 위의 검색결과를 통해 lighttpd그룹의 lighttpd사용자가 grep명령어를 통해 passwd파일을 읽었음을 알 수 있다.

다른 유용한 기능

특정 시간을 검색하는 방법은 아래와 같다.
# ausearch -ts today -k password-file 
# 
ausearch -ts 3/12/07 -k password-file
특정한 행동에 대한 검색도 가능하다.
# ausearch -ts today -k password-file -x rm
# 
ausearch -ts 3/12/07 -k password-file -x rm
어떠한 사용자가 접근했는지에 대한 검색도 가능하다.
# ausearch -ts today -k password-file -x rm -ui 506
# 
ausearch -k password-file -ui 506

[리눅스] 시그널 종류와 발생 및 용도

리눅스에서 시그널함수에 void(*signal(int signo, void (*func)(int)))(int);

들어가는 첫번째 인자값  int signo 의번호, 시그널 이름, 발생 원인, 용도, 디폴트 action, 리눅스 버전 등을 좀 알려주세요

제가아는 정도는 밑에 있는 표정도 입니다.

번호 시그널 이름 발생 및 용도 디폴트 action 리눅스 버전
1 SIGHUP(HUP)  hangup 시그널; 전화선 끊어짐 종료 POSIX
2 SIGINT(INT)  interrupt 시그널; Ctrl + c ;실행을중지 종료 ANSI
3 SIGQUIT(QUIT)  quit 시그널;  Ctrl + \ 종료(코어덤프) POSIX
4 SIGILL(ILL)  잘못된 명령    ANSI
5 SIGTRAP(TRAP)  트렙 추적    POSIX
6 SIGIOT(IOT)  IOT 명령    4.2 BSD
7 SIGBUS(BUS)  버스 에러    4.2 BSD
8 SIGFPE(FPE)  부동 소수점 에러 종료 ANSI
9 SIGKILL(KILL)  무조건적으로 즉시 중지한다. 종료 POSIX
10 SIGUSR1(USR1)  사용자 정의 시그널1  종료 POSIX
11 SIGSEGV(SEGV)  세그멘테이션 위반    ANSI
12 SIGUSR2(USR2)  사용자 정의 시그널2  종료 POSIX
13 SIGPIPE(PIPE)  읽으려는 프로세스가 없는데 파이프에 쓰려고 함 종료 POSIX
14 SIGALRM(ALRM)  경보(alarm) 시그널; alarm(n)에 의해 n초 후 생성됨 종료 POSIX
15 SIGTERM(TERM)  일반적으로 kill 시그널이 전송되기 전에 전송된다. 잡히는 시그널이기 때문에 종료되는 것을 트랙할 수 있다.  종료 ANSI
16 SIGTKFLT  코프로세서 스택 실패     
17 SIGCHLD(CHLD)  프로세스 종료시 그 부모 프로세스에게 보내지는 시그널 무시 POSIX
18 SIGCONT(CONT)  STOP 시그널 이후 계속 진행할 때 사용. ; 정지 되지 않은 경우 무시됨   POSIX
19 SIGSTOP(STOP)  정지 시그널; SIGSTP과 같으나 잡거나 무시할 수 없음 프로세스 정지 POSIX
20 SIGTSTP(TSTP)  키보드에 의해 발생하는 시그널로 Ctrl+Z로 생성된다. ; 터미널 정지 문자 프로세스 정지 POSIX
21 SIGTTIN  백그라운드에서의 제어터미널 읽기  프로세스 정지 POSIX
22 SIGTTOU  백그라운드에서의 제어터미널 쓰기  프로세스 정지 POSIX
23 SIGURG  소켓에서의 긴급한 상태    4.2 BSD
24 SIGXCPU  CPU 시간 제한 초과 setrlimit(2) 메뉴얼 패이지 참조    4.2 BSD
25 SIGXFSZ  파일 크기제한 초과 setrlimit(2) 메뉴얼 패이지 참조    4.2 BSD
26 SIGVTALRM  가상 시간 경고 setitimer(2) 메뉴얼 패이지 참조    4.2 BSD
27 SIGPROF  프로파일링 타이머 경고. setitimer(2) 메뉴얼 페이지 참조    4.2 BSD
28 SIGWINCH  윈도우 사이즈 변경    4.3 BSD, Sun
29 SIGIO  기술자에서 입출력이 가능함. fcntl(2) 메뉴얼 참조    4.2 BSD
30 SIGPWR  전원 실패    System V
31 UNUSED  사용 안함 

   


출처 : http://www.superuser.co.kr/superuserboard/view.html?id=16602&code=linux&start=200&position=

◈ SIGHUP
– 터미널 인터페이스에 의해 연결의 단절이 감지되면 해당 제어 터미널과 연결된 제어 프로세스(세션 리더)에게 전달
– 세션 리더가 종료했을 때도 발생하는데 이때는 foreground 프로세스 그룹내의 모든 프로세스들에게 전달
– SIGHUP 시그널은 원래 모뎀 연결 끊김 등의 시리얼 라인이 끊어지면 발생하는 시그널이다.
– 이름 있는 시스템 데몬들은 SIGHUP 시그널을 configure file을 다시 읽어들이는 등의 초기화 신호로 해석한다.
  . bootp(8), gated(8), inetd(8), mountd(8), named(8), nfsd(8), ypbind(8)
  . pppd(8) 처럼 SIGHUP을 원래의 의도에 충실하게 세션 종료의 뜻으로 받아들이는 사례도 간혹 있는데, 요새는 보편적으로 이 역할을 SIGTERM이 맡는다.
  . daemon은 제어 단말기 없이 돌기 때문에 kernel로부터 SIGHUP 신호를 수신하지 못한다.
    그러므로 많은 daemon은 이 신호를 daemon의 구성 파일이 변경되어 daemon이 그 파일을 새로 읽어야 된다는 것을 알려주는 관리자로부터의 통지로 사용한다.
  . daemon이 수신할 수 없는 다른 두 개의 신호로 SIGINT와 SIGWINCH가 있고 이들도 역시 어떤 변화를 daemon에게 통지하기 위해 사용될 수 있다.

◈ SIGINT
– 인터럽트 키 (DELETE 또는 Control-C)가 눌렸을 때 발생

◈ SIGQUIT
– Control-backslash 에 의해 발생

◈ SIGCHLD
– 프로세스가 종료하거나 정지하면, 부모 프로세스에게 전달된다.
– 부모 프로세스는 wait() 시스템 콜을 사용하여 무슨 일이 일어났는지 알아본다.
– 이 시그널에 대한 default 처리는 무시하는 것이다. 즉 프로세스가 이 신호를 받으려고 할 때만 전달된다.

◈ SIGSEGV
– 유효하지 않은 가상 메모리 주소를 참조하거나 사용 권한이 없는 메모리에 접근할 때 프로세스로 전달된다.

◈ SIGTERM
– kill 명령에 의해 기본적으로 발생

◈ SIGKILL
 “극단의 조치(extreme prejudice)”로 프로그램을 종료하는 데 사용된다.
– 시그널 catch 하거나 무시할 수 없다.

◈ SIGALRM
 alarm()이나 setitimer() 시스템 콜로 설정한 알람 시간이 초과 했을 때 프로세스로 전달된다.

◈ SIGTSTP
 
Control-Z 키에 의해 발생
– 기본 처리 방법은 SIGCONT 신호를 받을 때까지 프로세스를 중단한다.

◈ SIGCONT
 정지한 프로세스를 계속 실행시키려 할 때 발생
– 이 신호는 받을 수 있지만 블록하거나 무시할 수 없다.
– 기본 처리 방법은 중단된 프로세스를 재시작하는 것이다. 그러나 프로세스가 신호를 받지 않는다면 신호를 버린다.
– vi 에디터를 사용할 때
. Control-Z 를 눌러 수행을 잠시 정지시키면 쉘이 키 입력을 처리하게 되는데
. 이때 fg 명령을 실행시키면 쉘은 vi 에게 SIGCONT 시그널을 전달하며
. vi는 이 시그널에 대한 처리로 화면을 다시 그리고 사용자 키 입력을 받는 상태로 돌아간다.

◈ SIGSTOP
 
SIGTSTP과 동일하나 catch 하거나 무시할 수 없다.
– 이 신호를 받으면 무조건 SIGCONT 신호를 받을 때까지 프로세스를 중단한다.

◈ SIGABRT
 abort() 함수의 호출로 발생

◈ SIGBUS
 하드웨어 결함으로 발생

◈ SIGEMT
 하드웨어 결함으로 발생

SIGFPE
 divide-by-0나 부동 소숫점 오버플로우와 같은 산술 연산 오류에서 발생

◈ SIGILL

◈ SIGINFO

◈ SIGIO

◈ SIGIOT

◈ SIGPIPE
 pipe 통신에서 수신 프로세스가 종료했을 때 송신 프로세스가 파이프에 write 하면 발생
– 프로세스가 RST를 받은 소켓에 데이터를 쓰면, 커널은 그 프로세스에 ISGPIPE 신호를 보낸다.
– 이 신호의 기본 동작은 프로세스를 종료시키는 것이므로, 프로세스가 원하지 않는 종료를 피하기 위해서는 이 신호를 포착해야 한다.

◈ SIGPOLL

◈ SIGROF

◈ SIGPWR

◈ SIGSYS

◈ SIGTTIN
 background에 있는 프로세스가 제어 터미널로부터의 읽기를 시도한다.

◈ SIGTTOU
 background에 있는 프로세스가 제어 터미널로부터의 쓰기를 시도한다.

◈ SIGURG
 SIGIO와 SIGURG 라는 두 개의 신호는 소켓이 F_SETOWN 명령으로 소유주에게 할당되었을 때만 소켓에 대해 발생한다.

◈ SIGUSR1

◈ SIGUSR2

◈ SIGVTALRM

◈ SIGWINCH

◈ SIGXCPU

◈ SIGXFSZ

 

ssh 세션 지속 시간 설정

ssh로 원격의 서버에 접속했을때 idle 상태가 오래 지속되면

접속이 자동으로 끊어진다 이때, ssh 가 주기적으로 서버측에 초 단위로 신호를

보내주어 idle 상태를 없도록 한다.

 

redhat 계열 에서는 아래와 같이

/etc/ssh/ssh_config 파일을 열어 ServerAliveInterval 300 라인을 추가한다

Null Session이란? Network

 ■ Null Session이란?

 

도메인으로 구축된 네트워크에서 Windows2000/XP가 설치된 컴퓨터에 접속하기 위해서는 User名과 패스워드를 통한 인증과정을 거쳐야 한다. 하지만 이 Null Session은 말 그대로 User名과 패스워드 없이 로그인 가능하게 해버린다.

Null Session이란 Windows가 설치된 네트워크의 다른 원격 컴퓨터에 User名과 패스워드를 NULL로 해서 접속할 수 있게 해주는 것을 의미한다.

Null Session은 DOS창에서 다음과 같이 입력하면 다른 원격 컴퓨터에 접속할 수 있게 해준다. 이 명령어를 NULL Command라고 한다.

 

C:\> net use \\[IP주소]\IPC$“” /user:””

[보충]net use로 공유폴더에 액세스하기 위해서는 아래 명령이 사용된다.

 

C:\> net use \\[IP주소]\[폴더명] [패스워드] /user:[User名]

*는 패스워드를 입력하지 않기 위한 옵션이다.

 

[보충]UNIX에서도 단지 TCP접속만을 한 상태로 어떤 요청도 데이터도 전송하지 않는 Session을 Null Session이라고 하지만 여기서는 Windows머신에 대한 연결에 한정해서 Null Session을 다루고 있음에 주의하자.

Null Session접속을 방지하기 위해서는 아래 명령을 사용한다.

 

C:\> net use /delete \\[IP주소]\IPC$
■ Null Session으로 연결되면?

 

Null Session으로 연결되면 공격자는 시스템의 User名, 공유정보 등을 열람할 수 있게 되고 심지어 레지스트리 HKEY_LOCAL_MACHINE의 일부에도 접근할 수가 있게 된다.
■ Null Session을 통한 레지스트리 접근

 

1:Target 컴퓨터에 Null Session으로 연결한다.
2:레지스트리 편집기를 실행시킨다.

> regedit
■ Null Session접속을 방지하기 위한 로컬 컴퓨터 설정

 

○절차1

1:시작>프로그램>관리툴(or 제어판 > 관리도구)>로컬 보안 정책(Local Security Policy)
2:보안(Security)설정>로컬 정책(Local Policy)>보안 옵션(Security Option)
3:「익명접속 추가를 제한한다.」를 더블클릭한다.
4:「로컬정책(Local Policy) 설정」란에서 「명시적 익명접속 권한이 없는 경우 접속을 허락하지 않는다.」를 선택한다.

[보충]Null Session을 막게되면 일부의 ThirdParty제품들의 서비스가 동작하지 않을 수 있다.

 

○절차2

1:시작>프로그램>관리툴>로컬 보안정책
2:로컬 보안(Local Security) 설정>로컬 정책(Local Policy)>보안 옵션(Security Option)
3:「네트워크 접속:SAM계정의 익명 열거를 허락하지 않는다.」를 활성화 한다.
4:「네트워크 접속:SAM계정 및 공유의 익명 열거를 허락하지 않는다.」를 활성화 한다.

 

○절차3

1:레지스트리 편집기를 실행시킨다.
2:아래와 같이 레지스트리를 수정한다.

key :「HEKY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa」,
name :「restrictanonymous」,
type/value : 「REG_DWORD=1」

로 수정한다.

긁어온곳 : http://blog.naver.com/dusttin?Redirect=Log&logNo=16429353

[NETWORK]-랜카드 제어 NETSH

랜카드 이름이 “Local Area Connection” 인 것을 “eth0″로 변경하기

 

랜카드 이름이 너무 길어서, 외우기 힘드니까, 이것을 LINUX같이 (eth0, eth1…) 짧게 만들어 봅시다.

netsh interface set interface name=” Local Area Connection” newname=”eth0″

이렇게 하면, Local Area Connection 이던 랜카드 이름이 eth0으로 변경됩니다.

 

랜카드의 IP설정 상태 보기

 

netsh interface ip show config

를 입력하면 랜카드에 설정된 IP정보를 보여줍니다.

ipconfig랑 아주 비슷하네요.

 

c0066466_4b1c612e6c40c

 

 

DHCP사용 여부, IP, MASK, Gateway IP,DNS Server, WINDS Server 정보등을 볼 수 있습니다.

 

랜카드의 IP 변경하기

eth0“라는 이름을 가진 랜카드의 IP를 192.168.0.10으로 변경해 보겠습니다.

 

netsh interface ip set address ” eth0″ static 192.168.0.10 255.255.255.0 192.168.0.254

 

또는

Netsh interface ip set address
name=”eth0″ source=static addr=192.168.0.10 mask=255.255.255.0 gateway=192.168.0.1 gwmetric=1

으로도 세팅할 수 있습니다.

 

이렇게 하면 랜카드 “eth0“이란 이름을 가진 랜카드를 IP 192.168.0.10, Subnet MASK 255.255.255.0, Gateway IP 192.168.0.254로

설정되는 것입니다.

 

랜카드의 IP를 DHCP로 부터 할당 받기

 

eth0“라는 이름을 가진 랜카드의 IP를 DHCP서버에서 할당 받도록 설정해보겠습니다.

간단합니다.

 

netsh interface ip set address “eth0” dhcp

또는

netsh interface ip set address name=”eth0″ source=dhcp

 

이렇게 하면, eth0 랜카드의 IP가 dhcp서버에서 할당 받게 되는 것입니다.

 

랜카드의 DNS 주소를 DHCP로 부터 할당 받기

eth0“라는 이름을 가진 랜카드의 DNS 주소를 DHCP서버에서 할당 받도록 설정해보겠습니다.

간단합니다.

 

netsh interface ip set dns “eth0” dhcp

 

이렇게 하면, eth0 랜카드의 DNS IP가 dhcp서버에서 할당 받게 되는 것입니다.

 

랜카드의 WINS 서버 주소 할당하기

 

netsh interface ip set wins “eth0” static 192.168.100.3

 

랜카드의 WINS 서버 주소를 DHCP Server에게서 할당받기.

 

netsh interface ip set wins “eth0” dhcp

 

현재 랜카드 정보를 파일로 저장하기

 

netsh interface dump >mycfg.txt

 

파일로 저장해 놓은 랜카드 정보 복구하기

 

netsh exec mycfg.txt

캐스팅개론

1 교정과정
2 소개
3 캐스팅 개론
3.1 유니 캐스팅
3.2 브로드 캐스팅
3.3 멀티 캐스팅
4 멀티캐스팅 자세히
4.1 인터넷(IP) 프로토콜차원에서 본 멀티 캐스팅
4.2 IGMP 프로토콜을 이용한 멀티캐스팅 데이터 수신
5 인터넷(IP)환경에서의 멀티 캐스팅
5.1 인터넷에서의 멀티 캐스팅기술 적용의 어려움
5.2 그럼 멀티캐스팅은 적어도 당분간 쓸모 없는 기술인가 ?
5.2.1 MBone망
6 멀티캐스트 소켓 프로그래밍
6.1 멀티캐스트 그룹 가입
7 IPv6와 멀티 캐스팅
7.1 IPv6 멀티 캐스트 주소 영역
8 정리
9 관련 자료들
9.1 데이터 링크

1 교정과정

  1. 2003/12/10 : multicast 주소영역 관련 내용 추가 – yundream
  2. 2010/7/13 : 내용 좀 수정

2 소개

인터네트 환경이 눈부시게 발전했지만 인터네트를 가로지르는 데이터양은 이에 초과해서 늘어나고 있다. 요즘 대두되고 있는 원격 회상 회의, 원격 교육, 인터넷 대화형 TV등의 서비스는 엄청난 양의 데이터 교환이 필요하며, 인터네트 망의 한계 때문에 특별한 경우를 제외하고 원할한 서비스가 사실상 불가능하다. 혹은 서비스질이 크게 떨어지거나 상당한 비용을 지불해야 한다.
단순하게 생각하면 돈을 투자해서 네트워크 망 환경을 크게 개선시키면 되긴 하겠지만 엄청난 비용과 시간이 필요한 작업이다. 그렇다면 이러한 망 환경의 개선과 더불어 소프트웨어적인 다른 방법을 동원해서 문제를 해결하는게 더 좋은 방법일 것이이번에는 소프트웨어적인 문제 해결방법중 하나인 멀티캐스팅에 대해서 알아보도록 하겠다.

3 캐스팅 개론

캐스팅은 “던진다”라는 뜻을 가진다. 여기에서는 정보를 전달하는 행위를 의미한다. 이 캐스팅에는 다양한 방식이 존재한다. TV나 라디오와 같이 모든 임의의 대상에 정보를 전달하는 방식이 있는가 하면, 전화와 같이 특정 상대와 1:1로 정보를 주고 받는 방식이 있다. 또한 두개 방식을 함께 사용하는 정보 전달 방식도 있다. 지휘소로 부터 1:1로 명령을 받은 다음 하위 부대에 방송하는 방식도 있다.

네트워크도 데이터를 전송하는 세가지 캐스팅 기법이 있다. 이 캐스팅 기법은 위에서 설명한 방식과 거의 동일하다. 아래 컴퓨터 네트워크에서 사용하는 캐스트의 종류를 보여주고 있다.

3.1 유니 캐스팅

WAN과 LAN상에서 이루어지는 가장 일반적인 방식으로 서버와 클라이언트가 1대 1로 연결되고 데이터를 주고 받는다. 만약 하나의 서버에 100개의 클라이언트가 연결한다면 100개의 연결이 만들어 지고 서버는 동일한 데이터를 100개 복사해서 각각의 클라이언트에게 전송하게 될 것이다. 이 방식은 구현이 간단하고 웹과 같이 각 클라이언트로 다른 데이터를 보내야 하는 분야에서는 쓸만하지만 동일한 데이터를 다수의 유저에게 전달시켜야 하는 실시간 멀티미디어 서비스에는 그리 적합하지 않다. 대량의 동일한 데이터가 유저 수만큼 복사되기 때문이다.
소켓을 통한 일반적은 네트워크 프로그램은 유니캐스트 방식으로 작동한다.

3.2 브로드 캐스팅

브로드캐스팅(boradcasting)는 보내고자 하는 정보를 모든 수신자에게 보내는 방식으로, 서브네트워크에서 하나의 호스트가 데이터를 보내면 서브네트워크의 모든 호스트로 데이터가 전송된다. 데이터를 받을지 아니면 무시할지는 순전히 받는 측에서 결정하게 된다.
브로드 캐스팅은 주로 서브 네트워크 환경에서 주변의 호스트 정보를 알아오기 위한 데이터 교환용으로 널리 사용된다. 가장 대표적인 브로드 캐스팅 데이터는 arp(:12)데이터가 될것이다. 스위칭 라우터를 예로 들어서 생각해보도록 하자. 스위칭 라우터는 외부에서 들어온 데이터를 서브네트워크의 적당한 호스트로 보내야 할것이다. 이러한 작업을 위해서 보통 IP를 사용하는데, IP는 논리적인 값으로써 변경될 수 있는 값이므로 IP만 가지고 원하는 호스트와 통신하는건 적절하지 못하다. 이러한 문제를 해결하기 위해서 이더넷카드의 물리적인 번호와 IP번호를 맵핑시키는 방법을 사용하게 된다.

이더넷카드는 전 세계에서 유일한 48bit의 고유번호를 가지고 있으며 이 정보와 IP주소를 맵핑 시킴으로써 주변의 호스트 정보를 알 수 있게 된다. 라우터는 처음 부팅시 주변 호스트의 물리적 주소와 IP주소를 알아내야 하는데 이때 사용되는 프로토콜이 arp이며, 모든 주변 호스트에 대한 정보를 알아야 되므로 arp 요청을 브로드 캐스팅 하게 된다.

이는 라우터에만 적용되는게 아닌 서브네트워크의 단일 호스트에도 적용된다. 호스트가 새로 부팅 되었을 경우 이 호스트는 주변 호스트에 대한 아무런 정보도 가지고 있지 않는다. 이 호스트의 주소가 192.168.0.25인데, 192.168.0.26로 데이터를 전송할 일이 생겼다고 가정해 보자. 이 호스트는 192.168.0.26호스트가 어디에 있는지 알지 못한다. 이를 위해서 arp 패킷을 브로드 캐스팅 형식으로 서브네트워크에 있는 모든 호스트에게 보내게 된다. 패킷의 내용은 이를 테면 “192.168.0.26 주소를 가지는 호스트는 MAC주소와 함께 응답을 달라”이다. 일치하는 주소의 호스트는 MAC 정보를 채워 넣어서 192.168.0.25로 패킷을 보내게 된다.
이 처럼 브로드 캐스팅이 유용하게 사용되는 영역도 있긴 하지만 동일한 데이터가 모든 서브 네트워크로 전송된다는 특징 때문에 네트워크에 과도한 부하를 주는 경우가 발생하기도 한다. 때문에 대부분의 라우터들은 브로드캐스팅을 허용하지 않는다. 서브네트워크에서 제한된 용도로만 사용할 수 있다.

3.3 멀티 캐스팅

유니캐스트방식은 사용하기 쉽지만 동일한 데이터를 연결갯수 만큼 서버에서 복사해야 한다는 단점이 있다. 100k로 압축된 영상 데이터를 전송한다고 가정해보자. 1000명의 유저가 들을 경우 무려 100M의 데이터를 서버에서 복사해야 한다. 멀티캐스트 방식의 경우에는 데이터 복사가 서버가 아닌 라우터에서 발생하므로 서버의 부하는 없을 것이다. 그러나 데이터를 모든 컴퓨터로 방송하므로 데이터 낭비가 생긴다. 200개의 컴퓨터로 이루어진 서브네트워크가 있다고 가정해 보자. 이중 IPTV방송을 시청하고픈 컴퓨터는 단지 10대이다. 브로드캐스팅을 하게 되면, 200개의 컴퓨터 모두에 데이터가 전달된다.
유니캐스팅과 멀티캐스팅의 차이 멀티캐스트 데이터는 라우터와 라우터 사이에는 유니캐스트 방식으로 데이터가 전달되며, 서브 네트워크에서는 멀티캐스트 채널에 참여한 컴퓨터에만 데이터가 전달된다. 200대의 컴퓨터로 이루어진 서브네트워크에서 10대의 컴퓨터가 멀니태스트 채널에 가입해 있다면, 해당 컴퓨터로만 데이터가 복사되어서 전달이 된다. 효율적으로 네트워크 자원을 사용함을 알 수 있다.
멀티캐스트은 일반적으로 UDP를 사용한다. 정해진 채널에 데이터를 일괄적으로 전송하는 것이기 때문에, TCP의 특성이 데이터 재 전송등의 기능이 필요없다. TCP를 사용한다면, 채널에 전송한 데이터의 흐름을 관리해야 할 건데, 이렇게 되면 데이터 전송이 지나치게 복잡해질 것이기 때문이다. UDP만을 사용할 수 있다는 것은 아니다. TCP도 사용할 수 있기는 하다. 하지만 멀티캐스트로 전송되는 데이터의 특성을 감안할 때, 굳이 TCP를 사용해야 할 경우는 그다지 많지 않을 것 같다.
다음은 지금 까지 다루었던 3가지의 캐스팅 방법을 비교한 그림이다.

4 멀티캐스팅 자세히

그럼 멀티캐스팅에 대해서 좀더 자세히 알아보도록 하겠다.

4.1 인터넷(IP) 프로토콜차원에서 본 멀티 캐스팅

인터넷 프로토콜(IP)상에서 어떻게 멀티 캐스팅이 이루어질 수 있는가 ?
우리는 IP프로토콜이 관리등의 이유로 여러개의 클래스(class)로 나뉘어서 관리되고 있다는 것을 알고 있다. subnetworking을 참고하하라. 참고기사를 보면 단지 A, B, C 3개의 클래스만을 생각하고 있으나 이 외에도 D클래스가 사용되고 있다. 위 문서에서는 주제를 설명하는데 있어서 D클래스가 필요 없기 때문에 제외한 것 뿐이다.
D클래스는 224.0.0.1 에서 239.255.255.254의 범위를 가지며, 멀티캐스팅을 위해서는 이들 주소범위에 있는 주소가 할당되어 있어야 한다. 네트워크 호스트 그룹에 데이터를 전송한다는 멀티캐스팅의 특징으로 보통 라우터에 멀티캐스팅 주소가 할당이 된다.
이렇게 해서 라우터까지 데이터가 도달했다면 라우터는 자신이 관리하는 여러 호스트중 데이터 수신을 원하는 호스트에만 데이터를 전송해야 할 것이다. 어떤 방식으로 원하는 호스트에게만 찝어서 데이터를 보낼 수 있는지 알아 보도록 하자.

4.2 IGMP 프로토콜을 이용한 멀티캐스팅 데이터 수신

이러한 멀티캐스팅 데이터의 수신을 위해서 IGMP프로토콜을 사용한다. IGMP는 Internet Group Management Protocol의 줄임말로 인터네트 그룹 관리 규약이라고 불리운다. IGMP패킷은 다음과 같은 형식으로 전달된다.

요청 타입 설명

Type 설명
1 Create Group Request
2 Create Group Reply
3 Join Group Request
4 Join Group Reply
5 Leave Group Request
6 Leave Group Reply
7 Confirm Group Request
8 Confirm Group Reply

Create Group Request를 이용하면 멀티캐스팅 그룹생성을 요청할수 있는데, 그룹을 생성시킬 때 Code값을 명시함으로써 Public 혹은 Private로 그룹의 성격을 결정할 수 있다.

Code 설명

Code 설명
0 Public
1 Private

호스트가 Create Group Request를 이용해서 그룹의 생성을 요청하면 요청을 받은 호스트나 라우터는 다음과 같은 응답을 보내게 된다.

응답의 종류

Code 설명
0 Request Granted
1 Request denied, no resources
2 Request denied, invalid code
3 Request denied, invalid group address
4 Request denied, invalid access key
5 – 255 Request pending

IGMP checksum은 IGMP헤더에 포함된 메시지를 체크하기 위해서 사용되는 값이다. IGMP메시지를 받은 측에서는 checksum값과 IGMP헤더의 메시지와 비교하는 방식으로 잡음등으로 인한 패킷손실이 있었는지를 검사하게 된다.

Identifier은 현재 사용되어지지 않고 있으며, 0으로 채워져 있다.
Group Address는 IGMP헤더의 실질적인 핵심으로 라우터와 호스트들은 이 그룹주소에 자신이 받기를 원하는 멀티캐스팅데이터의 주소를 명시해서 라우터에게 전송함으로써 라우터에게 “나는 이 멀티캐스팅 그룹에 join되어 있음”을 알려주게 된다. 예를 들어 225.100.1.5에서 멀티캐스팅 데이터가 225.100.1.6으로 전송된다고 가정해 보자. 225.100.1.6에 있는 호스트들이 이 데이터를 라우터로 부터 받기 위해서는 IGMP패킷에 그룹주소를 225.100.1.5를 명시해서 라우터에 보내면 된다. 그러면 라우터는 멀티캐스팅 라우팅 테이블을 검사해서 어느 호스트로 데이터를 보내야 하는지 알 수 있게 된다.
참고로 IGMP는 ICMP와 같은 레벨의 프로토콜(인터넷 프로토콜)로 IP+IGMP의 형태로 교환된다. 그러므로 라우터는 들어온 멀티캐스팅 데이터를 어느 호스트 IP로 보내야 할지를 결정할 수 있게 된다. 멀티캐스팅 라우터 테이블은 대충 아래와 같은 정보를 가지고 있다.

192.168.1.50      225.100.1.5 
192.168.1.51      225.100.1.5 
192.168.1.52      225.100.1.5 
192.168.1.85      225.100.2.5 

멀티캐스팅 라우터 테이블이 위와 같다고 할때 225.100.1.5에서의 멀티캐스팅 데이터는 50, 51, 52로 전송되고 225.100.2.5에서의 멀티캐스팅 데이터는 85로 전송될 것이다.

5 인터넷(IP)환경에서의 멀티 캐스팅

이상으로 멀티 캐스팅에 대한 개략적인 내용들에 대해서 알아보았다. 그렇다면 실제 인터넷 환경에서 멀티캐스팅이 효과적으로 이루어질 수 있는지 만약 그렇지 못하다면 다른 대안들이 있는지에 대해서 알아보도록 하자.

5.1 인터넷에서의 멀티 캐스팅기술 적용의 어려움

안타깝게도 인터넷상에서 멀티캐스팅 서비스를 하는건 그리 쉬운문제가 아니다. 이 문제에 관해서 irc의 joinc채널에서 minzkn님과 산하님과의 토론이 있었다.
토론의 결과 인터넷(WAN)환경에서의 멀티캐스팅의 전격적인 적용은 (아직 까지는)사실상 어렵다는 결론에 도달했다. 이유는 경로배정을 위한 라우터의 경우 멀티캐스트 IP를 라우팅 할 수 있어야 하는데, 현재 인터넷 상에는 멀티캐스팅 기능을 가지지 않은 장비가 상당히 존재하기 때문이며, 이 장비들을 모두 교체한다는 것이 사실상 불가능 하기 때문이다.
또하나 그게 가능한 환경이라고 할 지라도..안되는(어려운) 이유는 멀티캐스팅이 가져올 수 있는 불확실한 네트웍부하때문이다. 멀티캐스팅 IP를 가진 많은 인터넷 방송데이터들이 엄청나게 ISP의 라우터와 스위치로유입될것은 물론이거니와… 자칫 잘못하면.. 갈곳없는 데이터들이 스위치나 네트웍속을 떠돌아다닐 가능성이 존재한다. 결론은 멀티캐스팅은 공중파수준의 인터넷방송을 가능하게 할 수 있는 꿈의 기술인것은 사실이나 이것이 현실화되기위해선 전 라우터의 멀티캐스팅지원과 보다 더 우수하고 내부 대역폭이 더 큰 기가빗스위치들이 갖춰줘야 하며 ISP간의 연동망 및 백본망, 가정의 인터넷대역폭 등이 충분히 갖춰져야 하며-가정의 대역폭은 충분하다고 볼수 있겠군요- 멀티캐스팅 프로그램들이 어떤 문제를 야기시키지 않도록 잘 만들어져야만 한다는것이다-혹은 그런것을 처리해낼수 있는 라우터 내지는 스위치들이 갖춰진다면… 분명코 언젠가는 그런 환경이 될것이다… 대략 한 5년…정도 ?
사실, 월드컵 경기전에 국내의 유수 ISP 들이 모여 많은 회의를 하였었다. 월드컵 전 경기를 인터넷으로 멀티캐스팅 방송을 할것인가? 말것이가? 과연, 상업적 수익모델이 있나없나..결론은, 엄청난 돈을 들여서 국내의 모든 라우터를 멀티캐스팅이 가능한것으로-두루넷은 제가 알기로 원래부터 모든 라우터가 멀티캐스팅 가능했던걸로…- 교체한다 해봤자 그만한 수익도 없을것 같고 월드컵 이후에 그 장비들을 활용한 계속적인 컨텐츠가 없다란 결론에 도달하고 결국 포기했다. 아무리 꿈의 서비스라 할지라도 기업입장에서는 이윤을 창출 시켜야 하는데 아직은 시기상조 였던 것이다.

5.2 그럼 멀티캐스팅은 적어도 당분간 쓸모 없는 기술인가 ?

그렇지는 않다. 일단 무선환경에서의 경우 멀티 캐스팅은 필수고(무선의 특성상 원래 멀티캐스팅이 가능한 브로드캐스팅이므로), 특정한 환경(학교/연구소/회사)등에서의 화상회의와 같은 경우에 유용하게 쓰일 수 있을 것이기 때문이다.
멀티캐스팅이 관심의 대상이 되는 주된이유는,, 인터넷의 수익모델중 가장 크게 기대되는것이 바로 멀티미디어이기때문이다.. 현재 가장 비싼 광고료가 책정되는곳이 어디인가. 바로 TV이다..그만큼 동영상매체가 주는 파급효과는 큰것이다. 인터넷광고는 노출빈도수대 호감도가 반비례한다는 연구결과도 있을정도로 관심잇는 분야가 아니면 전혀 관심을 끌지 못하는것이 현재의 배너광고이다. 때문에, 이메일광고 휴대폰광고, 팝업창, 초기화면 등 여러가지 수익모델을 창출해내기 위한 인터넷기업들의 노력이 거세지고 있는 판국이다… 이러한 시점에서 공중파같은 고해상도에 버퍼링없는 인터넷방송이 가능하다면, 그것은 제 2의 TV시대가 열리는것이라고 볼 수 있겠다..
그리고 인터넷 멀티 캐스팅을 현재 인터넷 전체에 전격적으로 적용할 수 없지만 회사, 연구소, 학교등과 같은 영역에서는 충분히 멀티 캐스팅을 응용할 수 있다. 또한 다음장에 소개할 MBone와 같은 프로젝트를 이용하는등 기존에 구축되어 있는 인터넷 망을 활용하는 방법들도 존재한다.

5.2.1 MBone망
멀티캐스팅 기술이 매우 훌륭한 기술이긴 하지만 현재 인터네트 환경에 적용하기에는 무리가 따른다. 그래서 생각한 것이 멀티캐스팅 전용망인 MBone망의 구축이다.
MBone(IP Multicast Backbone on ther Internet)은 Multicast Backbone의 줄임말로 IP 멀티캐스트가 가능한 네트워크들을 상호연결한 광역 네트워크 망이다. 위에서 설명했다시피 인터넷의 모든 백본 라우터들이 IP 멀티캐스트를 지원하는게 아니므로 전체 네트워크 상에서 멀티캐스트를 지원하는건 당분간 힘든일다.
MBone은 멀티캐스팅 기능을 지원하는 백본 라우터들만을 연결해서 광역 네트워크를 가로지르는 네트워크 터널을 만드는 프로젝트이다. 아래 그림은 MBone를 통해서 만들어지는 네트워크 터널에 대한 구조를 나타내고 있다. MBone은 인터넷을 가로지리는 가상 네트워크 계층(layer)이라고 볼수 있다. 네트워크 망에 대한 별도의 확장작업 없이 이미 존재하는 망을 활용할 수 있다는 점에서 (시간적으로나 비용적으로)매력적인 프로젝트이다.
MBONE
http://1.bp.blogspot.com/-WP6DR7r2YN4/TdaSpDiiJ1I/AAAAAAAAAnU/50njSyb18lg/s1600/mbone.gif
위 그림처럼 MBone은 다른 인터넷망과는 분리된 별도의 터널을 가지게 되므로 멀티캐스트에 최적화된 패킷의 구성이 가능하다. 이들 멀티캐스트 IP패킷은 IP해더와는 다른 헤더를 가진다. 즉 출발지 목적지정보에 개별 호스트의 IP가 명시되는게 아니고 각 터널의 종점 IP주소가 명시된다. 이때 사용되는 라우팅 프로토콜로는 DVMRP와 MOSPF(Multicast Open Shortest Path First), PIM(Protocol Independent Multicast)등이 사용되고 있다. 현재는 MOSIPF와 PIM이 널리 사용되고 있다.
종점라우터에 도착된 데이터는 라우터가 관리하는 호스트중 데이터 요청을 원하는 호스트로 전송된다. 이때 IGMP가 핵심적인 프로토콜로 사용된다.

6 멀티캐스트 소켓 프로그래밍

소켓은 멀티캐스트를 지원한다. 멀티캐스트 데이터는 라우터에서 처리하는 것이기 때문에, 소켓 프로그램 입장에서는 크게 유니캐스트 방식과 크게 다른 점이 없다. 일반 A,B,C 클래스 주소 대신에

  1. 멀티캐스트 주소를 이용해서 채널에 가입하고
  2. 채널에 가입하고 탈퇴하기 위한 채널 제어

를 위한 두 가지 사항만 염두에 두고 프로그램을 개발하면 된다.

6.1 멀티캐스트 그룹 가입

소켓은 socket(:12) 함수로 만든다. 만든 소켓은 setsockopt(:2)함수를 이용해서 멀티캐스트 그룹에 가입하면 된다.
소켓 옵션 레벨은 IPPROTO_IP이고, 아래의 옵션 이름 값으로 제어할 수 있다.

  • IP_MULTICAST_LOOP : 데이터를 호스트로 루프백 시킬 것인지를 결정한다. 예를들어 멀티캐스트 채널로 자신이 전송한 메시지를 보고 싶다면 활성화 시켜야 한다.
  • IP_MULTICAST_TTL : 멀티캐스트 데이터를 서브네트워크에서만 확인할 거라면, TTL을 1로 해서 외부로 나가지 않도록 한다.
  • IP_MULTICAST_IF :
  • IP_ADD_MEMBERSHIP : 어떤 멀티캐스트 그룹에 참가할지를 알려주기 위해서 사용한다. 멀티캐스트 그룹에 참가한 프로세스로 메시지가 전달된다.
  • IP_DROP_MEMBERSHIP : 어떤 멀티캐스트 그룹에서 탈퇴하기를 위해서 사용한다.

IP_ADD_MEMBERSHIP를 이용해서 멀티캐스트 그룹에 참가시킬려면 ip_mreq 구조체에, 멀티캐스트 그룹관련 정보를 채워서 setsockopt의 옵션값으로 넘겨야 한다.

struct ip_mreq
{
	struct in_addr imr_multiaddr;
	struct in_addr imr_interface;
}
  • imr_multiaddr : 참가할 그룹의 멀티캐스트 주소.
  • imr_interface : 통신에 참가할 인터페이스 주소. 일반적으로 모든 인터페이스 주소에 대해서 참가하므로 INADDR_ANY를 사용하면 된다.

예를들어서 멀티캐스트 채널 “239.1.1.1”에 참가하고 싶다면, 다음과 같이 setsockopt를 사용하면 된다.

struct ip_mreq mreq;

mreq.imr_multiaddr = inet_addr("239.1.1.1"); 

setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))

7 IPv6와 멀티 캐스팅

7.1 IPv6 멀티 캐스트 주소 영역

IPv6 멀티캐스팅 주소는 RFC2373(IP Version 6 Addressing Architecture)에 정의되어 있다. 여기에는 멀티캐스트 주소를 위해서 고정영역(fixed scope)과 변경가능영역(variable)을 정의하고 있다.
IPv6 멀티캐스트 주소는 주소영역의 상위 한바이트(octet)의 값을 이용해서 구분한다. 만약 상위 한바이트의 주소의 값을 0xFF(11111111)로 설정하는 걸로 멀티캐스트 주소임을 명시한다. 이외의 다른 값들은 유니캐스트 주소들을 위한 용도로 사용된다.
IPv6의 경우 IPv6보다 할당된 주소영역이 매우 크므로 비교적 여유있게 자원을 사용할수 있고, 실제로 다양한 네트워크 환경의 지원이 가능하도록 주소영역들이 정의되어 있다. 다음은 현재 IPv6에서 지원되는 멀티캐스트 주소영역의 목록이다.
Node-Local Scope

   FF01:0:0:0:0:0:0:1     All Nodes Address                  [RFC2373]
   FF01:0:0:0:0:0:0:2     All Routers Address                [RFC2373]
Link-Local Scope

   FF02:0:0:0:0:0:0:1     All Nodes Address                  [RFC2373]
   FF02:0:0:0:0:0:0:2     All Routers Address                [RFC2373]
   FF02:0:0:0:0:0:0:3     Unassigned                             [JBP]
   FF02:0:0:0:0:0:0:4     DVMRP Routers                  [RFC1075,JBP]
   FF02:0:0:0:0:0:0:5     OSPFIGP                        [RFC2328,Moy]
   FF02:0:0:0:0:0:0:6     OSPFIGP Designated Routers     [RFC2328,Moy]
   FF02:0:0:0:0:0:0:7     ST Routers                    [RFC1190,KS14]
   FF02:0:0:0:0:0:0:8     ST Hosts                      [RFC1190,KS14]
   FF02:0:0:0:0:0:0:9     RIP Routers                        [RFC2080]
   FF02:0:0:0:0:0:0:A     EIGRP Routers                    [Farinacci]
   FF02:0:0:0:0:0:0:B     Mobile-Agents                 [Bill Simpson]
   FF02:0:0:0:0:0:0:C     SSDP                                [Kostic]
   FF02:0:0:0:0:0:0:D     All PIM Routers                  [Farinacci]
   FF02:0:0:0:0:0:0:E     RSVP-ENCAPSULATION                  [Braden]

   FF02:0:0:0:0:0:1:1     Link Name                       [Harrington]
   FF02:0:0:0:0:0:1:2     All-dhcp-agents                    [RFC3315]

   FF02:0:0:0:0:1:FFXX:XXXX     Solicited-Node Address       [RFC2373]
site-Local Scope

   FF05:0:0:0:0:0:0:2       All Routers Address              [RFC2373]

   FF05:0:0:0:0:0:1:3       All-dhcp-servers                 [RFC3315]
   FF05:0:0:0:0:0:1:4       Deprecated (2003-03-12)    
   FF0X:0:0:0:0:0:1:1000    Service Location, Version 2      [RFC3111]
    -FF0X:0:0:0:0:0:1:13FF  
또한 네트워크 환경 뿐만 아니라 서비스의 종류에 따라서 다양한 주소영역이 준비되어 있다. 이렇게 서비스종류에 따라서 주소영역이 세분화 되어 있으므로, 응용 애플리케이션의 개발이 쉬워지고 Qos보다 현실적으로 적용가능해 질 것이다.
Variable Scope Multicast Address

   FF0X:0:0:0:0:0:0:0     Reserved Multicast Address         [RFC2373]
   FF0X:0:0:0:0:0:0:C     SSDP                                [Kostic]

   FF0X:0:0:0:0:0:0:100   VMTP Managers Group           [RFC1045,DRC3]
   FF0X:0:0:0:0:0:0:101   Network Time Protocol (NTP)   [RFC1119,DLM1]
   FF0X:0:0:0:0:0:0:102   SGI-Dogfight                           [AXC]
   FF0X:0:0:0:0:0:0:103   Rwhod                                  [SXD]
   FF0X:0:0:0:0:0:0:104   VNP                                   [DRC3]
   FF0X:0:0:0:0:0:0:105   Artificial Horizons - Aviator          [BXF]
   FF0X:0:0:0:0:0:0:106   NSS - Name Service Server             [BXS2]
   FF0X:0:0:0:0:0:0:107   AUDIONEWS - Audio News Multicast      [MXF2]
   FF0X:0:0:0:0:0:0:108   SUN NIS+ Information Service          [CXM3]
   FF0X:0:0:0:0:0:0:109   MTP Multicast Transport Protocol       [SXA]
   FF0X:0:0:0:0:0:0:10A   IETF-1-LOW-AUDIO                       [SC3]
   FF0X:0:0:0:0:0:0:10B   IETF-1-AUDIO                           [SC3]
   FF0X:0:0:0:0:0:0:10C   IETF-1-VIDEO                           [SC3]
   FF0X:0:0:0:0:0:0:10D   IETF-2-LOW-AUDIO                       [SC3]
   FF0X:0:0:0:0:0:0:10E   IETF-2-AUDIO                           [SC3]
   FF0X:0:0:0:0:0:0:10F   IETF-2-VIDEO                           [SC3]

   FF0X:0:0:0:0:0:0:110   MUSIC-SERVICE             [Guido van Rossum]
   FF0X:0:0:0:0:0:0:111   SEANET-TELEMETRY             [Andrew Maffei]
   FF0X:0:0:0:0:0:0:112   SEANET-IMAGE                 [Andrew Maffei]
   FF0X:0:0:0:0:0:0:113   MLOADD                              [Braden]
   FF0X:0:0:0:0:0:0:114   any private experiment                 [JBP]
   FF0X:0:0:0:0:0:0:115   DVMRP on MOSPF                         [Moy]
   FF0X:0:0:0:0:0:0:116   SVRLOC                             [Guttman]
   FF0X:0:0:0:0:0:0:117   XINGTV                      <hgxing@aol.com>
   FF0X:0:0:0:0:0:0:118   microsoft-ds         <arnoldm@microsoft.com>
   FF0X:0:0:0:0:0:0:119   nbc-pro           <bloomer@birch.crd.ge.com>
   FF0X:0:0:0:0:0:0:11A   nbc-pfn           <bloomer@birch.crd.ge.com>
   FF0X:0:0:0:0:0:0:11B   lmsc-calren-1                         [Uang]
   FF0X:0:0:0:0:0:0:11C   lmsc-calren-2                         [Uang]
   FF0X:0:0:0:0:0:0:11D   lmsc-calren-3                         [Uang]
   FF0X:0:0:0:0:0:0:11E   lmsc-calren-4                         [Uang]
   FF0X:0:0:0:0:0:0:11F   ampr-info                          [Janssen]

   FF0X:0:0:0:0:0:0:120   mtrace                              [Casner]
   FF0X:0:0:0:0:0:0:121   RSVP-encap-1                        [Braden]
   FF0X:0:0:0:0:0:0:122   RSVP-encap-2                        [Braden]
   FF0X:0:0:0:0:0:0:123   SVRLOC-DA                          [Guttman]
   FF0X:0:0:0:0:0:0:124   rln-server                            [Kean]
   FF0X:0:0:0:0:0:0:125   proshare-mc                          [Lewis]
   FF0X:0:0:0:0:0:0:126   dantz                               [Yackle]
   FF0X:0:0:0:0:0:0:127   cisco-rp-announce                [Farinacci]
   FF0X:0:0:0:0:0:0:128   cisco-rp-discovery               [Farinacci]
   FF0X:0:0:0:0:0:0:129   gatekeeper                            [Toga]
   FF0X:0:0:0:0:0:0:12A   iberiagames                        [Marocho]
   FF0X:0:0:0:0:0:0:12B   X Display                         [McKernan]

   FF0X:0:0:0:0:0:0:201  "rwho" Group (BSD) (unofficial)         [JBP]
   FF0X:0:0:0:0:0:0:202   SUN RPC PMAPPROC_CALLIT               [BXE1]

   FF0X:0:0:0:0:0:0:300   Mbus/Ipv6                          [RFC3259]

   FF0X:0:0:0:0:0:2:0000
    -FF0X:0:0:0:0:0:2:7FFD  Multimedia Conference Calls          [SC3]
   FF0X:0:0:0:0:0:2:7FFE    SAPv1 Announcements                  [SC3]
   FF0X:0:0:0:0:0:2:7FFF    SAPv0 Announcements (deprecated)     [SC3]
   FF0X:0:0:0:0:0:2:8000
    -FF0X:0:0:0:0:0:2:FFFF  SAP Dynamic Assignments              [SC3]

멀티캐스팅의 특성에 맞게 멀티미디어와 관려된 많은 서비스들이 존재하고 있음을 알 수 있다. 멀티미디어 서비스 외에도 NIS, NTP, NSS와 같이 동일한 정보를 여러개의 서버로 배포하는 인터넷 서비스를 위한 주소영역도 예약되어 있음을 확인할 수 있다. X Display를 위한 서비스가 있는게 개인적으로 유독 눈에 띈다.

8 정리

9 관련 자료들

[MySQL]트리거 사용법

  • CREATE TRIGGER문법
CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_body
  • 설명
  1. DEFINER
    1. DEFINER 조항은 트리거 활성화 시간에 액세스 권한을 확인할 때 사용되는 보안 컨텍스트를 결정합니다.
  2. trigger_time
    1. trigger_time는 트리거 동작 시간입니다.트리거가 수정되는 각 행의 앞 또는 뒤에 활성화한다는 것을 가리킨다 앞 또는 뒤에이 될 수 있습니다.
  3. trigger_event
    1. INSERT
      1. 새 행이 테이블에 삽입될 때마다 트리거가 활성화됩니다.
    2. UPDATE
      1. 행을 수정할 때마다 트리거가 활성화됩니다.
    3. DELETE
      1. 행이 테이블에서 삭제됩니다 때마다 트리거가 활성화됩니다.
  4. trigger_body
    1. 트리거가 활성화 될때 실행할 수 있는 구문을 기술.
  • DB 만들기
    • mysql에 root권한으로 접속후, 테스트 데이터베이스를 만들고, User를 만듭니다.
    • mysql -u아이디 -p
create database test;
use test;
grant all privileges on test.* to test@localhost identified by 'test' with grant option;

[실행화면]

img1.png

  • 예제 테이블 만들기
    • mysql -utest -ptest로 접속한다. 그다음 아래의 명령문을 실행한다.
use test;
CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
  a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  b4 INT DEFAULT 0
);

[실행화면]

img2.png

  • 트리거 만들기
  1. 트리거 이름 “testref”이고, test1테이블의 Insert후 트리거를 동작
    1. test2테이블 a2에 test1에 추가한a1을 넣어 Insert를 함.
    2. test3테이블 test1에 추가한a1값과 같은 데이터를 지움.
    3. test4테이블 a4와 test1에 추가한a1이 같으면 b4에 1을 더한다.
delimiter |

CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END;
|

delimiter ;

[실행화면]

img3.png

  • test3테이블에 초기 데이터 Insert
INSERT INTO test3 (a3) VALUES
  (NULL), (NULL), (NULL), (NULL), (NULL),
  (NULL), (NULL), (NULL), (NULL), (NULL);
  • test4테이블에 초기 데이터 Insert
INSERT INTO test4 (a4) VALUES
  (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
  • test1테이블에 데이터 Insert
INSERT INTO test1 VALUES 
     (1), (3), (1), (7), (1), (8), (4), (4);

[실행화면]

img4.png

  • 결과 확인

select * from test1;

 [실행화면]

 img5.png

select * from test2;

 [실행화면]

img6.png

select * from test3;

[실행화면]

 img7.png

select * from test4;

[실행화면]

img8.png

트리거에 정의했던데로 값들이 바뀌어 있죠!

[참고 사이트]:http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

유용한 리눅스 커맨드 라인 트릭

참조 원문 : 20 interesting and extremely helpful Linux command line tricks

1. 두 디렉토리 사이를 효율적으로 반복해서 이동하는 방법
  A 디렉토리에서 B 디렉토리로 이동한 후 다시 A 디렉토리로 이동할 때 A 디렉토리의 경로를 쓰는 대신 ‘cd -‘를 사용하여 같은 효과를 볼 수 있습니다.

/home$ cd /var/log
/var/log$ cd –
/home
/home$


2. 콤마(,) 연산자
  첫 번째 글자나 문자열 전체를 소문자로 변환 방법

$ string=”Example of comma OPERATOR”

$ echo ${string,}
example of comma OPERATOR

$ echo ${string,,}
example of comma operator

  파일명 확장(extension)에 사용

$ touch new_file{1,2,3}
$ ls new_file*
new_file1  new_file2  new_file3

파일명을 my_filename.old에서 my_filename.new로 변경
$ mv my_filename.{old,new}


3. 파일명에 공백이 있을 때 제어하는 방법
  파일명 전체를 큰 따옴표로 감싸거나 공백 앞에 역슬래쉬(\)를 넣습니다.

$ rm “temp File”
$ rm temp\ File


4. 하이픈(-)으로 시작하는 파일명 삭제 또는 생성 방법

$ rm -1mpFile.out
rm: invalid option — ‘1’
Try `rm ./-1mpFile.out’ to remove the file `-1mpFile.out’.
Try `rm –help’ for more information.

$ rm — -1mpFile.out
$ touch — -1mpFile.out


5. 디렉토리 안에 있는 파일 중 특정 확장자가 아닌 모든 파일 삭제 방법

$ rm !(*.c|*.py)


6. touch와 find를 이용해 특정 시간 사이에 생성되거나 수정된 파일 복사
  어떤 디렉토리 안에 있고 09~17시 사이에 생성되거나 수정된 파일만 골라 복사하고 싶다고 가정했을 때 먼저 원하는 두 시간에 맞춰 타임스탬프 값을 가진 두 파일을 생성합니다.

$ touch -d “9am” temp1
$ touch -d “5pm” temp2

  이제 대상 파일이 있는 디렉토리로 이동해서 아래 명령어를 사용합니다.(또는 find에서 대상 디렉토리를 지정)

$ find . -newer ../temp1 ! -newer ../temp2 -exec cp ‘{}’ ./target/ ‘;’

  실행하면 대상 파일이 target이라는 하위 디렉토리 안에 복사됩니다. 물론 target 디렉토리를 먼저 만들어야 합니다.

7. 대상 파일이 너무 많아서 삭제가 안 될 때
  디렉토리 안에 파일이 너무 많을 때 삭제를 시도하면 아래의 에러 메시지와 함께 삭제가 안 될 수 있습니다.

-bash: /bin/rm: Argument list too long

  이럴 땐 아래의 방법을 사용합니다. 사용하기 전에 현재 디렉토리를 다시 한 번 확인하는 것이 좋습니다.

find * -xdev -exec rm -f ‘{}’ ‘;’


8. 특정 문자열을 포함한 파일 찾는 방법

$ grep -l “printf” *.c

  하위 디렉토리에 있는 파일들까지 포함하여 문자열이 포함된 파일과 그 문자열이 있는 줄을 보고 싶다면 find, xargs, grep 명령어를 활용합니다.

$ find . -name “*.c” | xargs grep -H “buff”
./bfrovrflw.c:    char buff[15];
./bfrovrflw.c:    gets(buff);
./bfrovrflw.c:    if(strcmp(buff, “MyLinuxBook”))


9. 파일 안의 내용을 모두 지우는 방법

$ > ./logfile


10. man 페이지에서 특정 문자열 검색 방법

$ man -k login
access.conf (5)      – the login access control table file
add-shell (8)        – add shells to the list of valid login shells
chsh (1)             – change login shell
faillog (5)          – login failure logging file
faillog (8)          – display faillog records or set login failure limits
getlogin (3)         – get username
getlogin_r (3)       – get username
gnome-session-properties (1) – Configure applications to start on login
hotot (7)            – lightweight & opensource microbloging client
issue (5)            – prelogin message and identification file
lastlog (8)          – reports the most recent login of all users or of a given user
login (1)            – begin session on the system
login (3)            – write utmp and wtmp entries
login.defs (5)       – shadow password suite configuration
login_tty (3)        – tty utility functions
logname (1)          – print user’s login name



11. 표준 에러 출력 메시지를 파일로 리다이렉트시키는 방법
  일반 리다이렉트로는 표준 에러로 출력되는 메시지를 담을 수 없습니다.

$ touch new > /home/himanshu/practice/logfile 
touch: cannot touch `new’: Permission denied
$ cat /home/himanshu/practice/logfile 
$
$ touch new > /home/himanshu/practice/logfile 2>&1
$ cat /home/himanshu/practice/logfile 
touch: cannot touch `new’: Permission denied

  2>&1은 표준 에러도 표준 출력으로 보내라는 뜻입니다.

12. history에 남기지 않고 명령어 사용
  앞에 공백을 넣고 명령어를 사용합니다.

$ a
a: command not found
$  vi
$ b
b: command not found
$ history | tail -3
 1055  a
 1056  b
 1057  history | tail -3


13. 영화처럼 같은 속도로 텍스트 출력

$ echo “You can simulate on-screen typing just like in the movies” | pv -qL 10


14. alias와 같은 이름을 가진 명령어가 있을 때 alias가 아닌 그 명령어 실행
  앞에 역슬래쉬(\)를 넣고 명령어를 사용합니다.

mirashi@mirashi-virtual-machine:~/test$ alias ls=’ls -al’

mirashi@mirashi-virtual-machine:~/test$ ls
합계 8
drwxrwxr-x  2 mirashi mirashi 4096  7월 17 14:33 .
drwxr-xr-x 34 mirashi mirashi 4096  7월 17 14:33 ..
-rw-rw-r–  1 mirashi mirashi    0  7월 17 14:33 test

mirashi@mirashi-virtual-machine:~/test$ \ls
test


15. 특정 파일을 사용하고 있는 프로세스 찾아내기
  파일을 지우려고 하는데 어떤 프로세스가 그 파일을 사용 중이라 지울 수 없을 때가 있습니다. 이럴 땐 fuser 명령어로 그 파일을 사용하고 있는 프로세스들의 PID를 알아낼 수 있습니다.

# fuser /var/log/httpd/access_log
/var/log/httpd/access_log: 24273 24277 24278 24279 24280 24281 24282 24283 24284 24305 24306 24307 34994 35370 35371 35372 35373 35374 35375 35376

  또한 -k 옵션을 사용하면 해당 프로세스들을 죽일 수 있습니다.

16. 복사와 붙여넣기 단축키
  먼저 복사하고 싶은 부분을 마우스로 드래그해서 선택한 후 Ctrl+Shift+C를 누르면 복사가 되고 Ctrl+Shift+V를 누르면 붙여넣기가 됩니다.

awk에서 변수 사용

참조 원문 : Using Variables With awk
관련 글 : awk 기초, awk를 이용한 검색, 6가지 awk 트릭

  awk는 내장된 변수와 유저 정의 변수를 지원하며 bash 스크립트 같은 것과 달리 사용하기 전에 미리 선언할 필요가 없습니다. 변수의 종류로는 다음의 3가지가 있습니다.

  1. 시스템 변수(=내장 변수)
  2. 일반(Scalar) 변수
  3. 배열 변수


1. 시스템 변수
  시스템 변수는 대문자로 되어 있으므로 대소문자를 주의하여 사용해야 합니다.

NR: 줄 번호(number of input lines)
  NR 변수는 매 레코드를 읽을 때마다 값이 1씩 증가하는 변수입니다.

$ awk ‘{print NR}’ processes 
1
2
3
…생략…
72
73
74


NF: 필드 번호(number of fields)
  각 레코드에는 공백 문자로 구분되는 필드들이 있습니다. 필드의 개수는 레코드에 따라 다를 수 있습니다.

$ awk ‘{print NF}’ processes 
11
12

아래는 각 레코드마다 1,2번째 필드의 내용과 총 필드의 개수를 출력하는 예입니다.

$ awk ‘{print $1,$2,NF}’ /var/log/messages.1 
Jul 24 14
Jul 24 11
Jul 24 8
Jul 24 12


FILENAME: 입력 파일 이름(name of input file)
  현재 처리 중인 파일의 이름이 담겨 있습니다. 이 변수는 BODY 섹션 이전에는 선언되지 않기 때문에 BEGIN 섹션에서는 사용할 수 없습니다.

FNR: 입력 파일들 중 현재 사용 중인 파일(used with multiple input files)
  NR과 마찬가지로 줄(레코드)번호를 뜻하지만 NR이 모든 입력 스트림을 통틀어 계산한 줄번호를 출력하는 것과 달리 FNR은 현재 처리 중인 파일 내의 줄번호를 출력합니다.

FS: 필드 구분 문자(field separator character)
  기본적으로 필드는 공백이나 탭으로 구분하지만 “-F” 옵션 뒤에 문자를 적어 해당 문자를 필드 구분 문자로 사용할 수 있습니다. 아래는 ‘:’ 문자로 필드를 구분하는 /etc/passwd 파일에서 ‘jane’이라는 문자열을 찾아 첫 번째 필드와 네 번째 필드를 출력하는 예입니다.

$ tail /etc/passwd | awk -F: ‘/jane/{print $1, “Group: “$4}’
jane Group: 502

구분 문자를 여러 개 사용하고 싶다면 정규식을 사용하여 목적을 달성할 수 있습니다. 아래는 공백, 콜론, 탭을 구분 문자로 사용한 모습입니다. 참고로 이스케이프 문자가 하나 있으므로(\t) 싱글 쿼트가 필요합니다.

$ tail /etc/passwd | awk -F'[ :\t]’ ‘/jane/{print $1, “Group: “$4}’


OFS: 출력용 필드 구분 문자(output field separator)
  출력에 사용하는 필드 구분 문자는 기본적으로 공백입니다. 아래처럼 각 필드 사이에 콤마를 사용하면 출력용 필드 구분 문자인 공백이 출력됩니다.

$ tail /etc/passwd | awk -F'[ :\t]’ ‘/jane/{print $1,$2,$3,$4,$6,$7}’
jane x 502 502 /home/jane /bin/bash

만약 콤마를 쓰지 않는다면 아래처럼 더덕더덕 붙여서 나옵니다.

$ tail /etc/passwd | awk -F'[ :\t]’ ‘/jane/{print $1$2$3$4$6$7}’
janex502502/home/jane/bin/bash


ORS: 출력용 레코드 구분 문자(output record separator)
  각 줄은 하나의 레코드로 취급하며 각 줄의 끝마다 레코드가 끝나는 것으로 취급합니다. 레코드 구분 문자(줄 구분 문자)는 줄 바꿈(new line)을 기본으로 사용합니다.

OFMT: 숫자 출력을 위한 서식(format for numeric output)
  이 변수를 통해 숫자의 서식을 제어할 수 있습니다. 기본 서식은 “%.6g”로 소수점 이하 6자리 수까지 표시합니다.

RS: 레코드 구분 문자(record separator)
  기본적으로 레코드 구분 문자는 줄 바꿈(new line)이다.

$0 변수
  파일 전체를 의미합니다.

$ awk ‘{print $0}’ processes 
USER       PID %CPU %MEM    VSZ RSS TTY STAT START TIME COMMAND
root         1  0.0  0.1  10348 720 ?   Ss   22:01 0:01 init [3]
root         2  0.0  0.0      0   0 ?   S<   22:01 0:00 [migration/0]
root         3  0.0  0.0      0   0 ?   SN   22:01 0:00 [ksoftirqd/0]
root         4  0.0  0.0      0   0 ?   S<   22:01 0:00 [watchdog/0]


2. 일반 변수
  숫자나 문자를 담는 변수입니다.

var=3 또는 var=”test_string”


3. 배열 변수
  변수의 이름과 함께 숫자가 있는 대괄호의 조합으로 사용합니다.

variable_name[0]
variable_name[1]

awk를 이용한 검색

참조 원문 : How To Search Using The Awk Utility
관련 글 : awk 기초, awk에서 변수 사용, 6가지 awk 트릭

  사실 검색만 놓고 따져보면 awk는 grep과 비교해 그리 큰 메리트가 없습니다만 awk의 본래 목적은 검색이 아니라 검색한 내용의 일부를 추출하는 것이기 때문에 awk를 사용하려면 검색 방법을 알아야 할 필요가 있습니다. 아래는 awk의 기본 문법입니다.

awk <search pattern> {<program actions>}

  awk로 검색을 할 때는 아래처럼 두 슬래시(/) 사이에 검색할 문자열을 넣습니다. 참고로 문자열에서 대소문자를 구분합니다.

/Debian/

  아래의 두 명령어는 같은 결과를 출력하는데 그 이유는 검색의 기본 기능은 화면에 대한 출력이기 때문입니다.

awk ‘/Debian/’
awk ‘/Debian/’ {print}

  만약 “debian”과 “Debian”을 모두 검색하고 싶다면 아래처럼 정규식을 사용할 수 있습니다.

/[Dd]ebian/

  줄의 시작 부분을 검색하려면 “^” 문자를, 끝 부분을 검색하려면 “$” 문자를 사용합니다.

/^Debian/
/Debian$/

  아래는 d부터 m까지 소문자를 검색하는 경우입니다.

/[d-m]/

  다음 숫자를 검색하는 경우입니다.

/[0-9]/

  두 문자열 중 하나라도 일치하는 것이 있는 줄을 검색할 때는 파이파(|) 문자를 두 문자열 사이에 넣습니다. 그리고 이렇게 파이프(|)처럼 쉘이 해석하는 문자가 포함된 경우에는 쉘이 문자열을 맘대로 해석하지 않고 awk에게 온전히 넘겨주게 하기 위해 싱글 쿼트(‘)를 사용합니다. 사실 아래의 문자열에는 달러($), 백 쿼트(`), 이스케이프(\ 로 시작) 문자가 없기 때문에 더블 쿼트(“)를 써도 같은 결과를 얻을 수 있지만 습관을 위해 awk에서는 싱글 쿼트를 쓰는 것이 좋다고 할 수 있겠습니다. 왜 싱글 쿼트(또는 아래의 경우 더블 쿼트도 포함)를 써야 하는지에 대한 자세한 정보는 이 포스트를 참고하시기 바랍니다.

awk ‘/Iceweasel|Epiphany/’ access_log

  파일의 첫 번째 필드를 검색하려면 “$1″로 첫 번째 필드를 검색할 것임을 지정하고 “~” 문자로 해당 필드에서 문자열을 검색할 것임을 알립니다.

awk ‘$1 ~ /^192.168.5.103$/’ access_log

  반대로 위의 상황에서 특정 문자열을 검색 결과에서 제외하려면 아래처럼 느낌표(!) 문자를 사용합니다.

awk ‘$1 !~ /^192.168.5.103$/’ access_log

  아래는 ‘Debian’이라는 문자열이 있는 줄을 검색한 후 각 줄의 1번째와 20번째 필드를 출력하는 방법입니다.

awk ‘/Debian/’ access_log | awk ‘{print $1,$20}’

  아래는 연속된 여러 줄을 출력하는 방법입니다.

awk ‘NR == 10,NR == 15’ access_log

  그리고 아래는 사용할 수 있는 연산자입니다.

<           미만
<=          이하
==          일치
!=          불일치
>=          이상
>           초과

  또한 AND 연산을 위한 &&와 OR 연산을 위한 ||도 사용이 가능합니다. 아래는 이를 이용하여 10번째 이상의 줄에서 첫 번째 필드가 두 IP 중 하나인 줄을 찾는 내용입니다.

awk ‘((NR >= 10) && ($1 == “192.168.5.103″)) || ($1 ==”192.168.5.104″)’ access_log

  문자열 안에 넣을 수 있는 이스케이프 문자들은 아래와 같습니다.

\n     줄 바꿈 (라인 피드)
\t     수평 탭
\b     백스페이스
\r     캐리지 리턴
\f     폼 피드