1. 참고 문서


2. Subversion 패키지 설치


$ yum install subversion

물론 이미 설치 되어 있다면 설치할 필요없다.


3. 저장소 생성


/home/svn 디렉토리를 SVN 서버의 홈으로 사용한다.

$ mkdir /home/svn
$ chown -R root:root /home/svn

4. 프로젝트 디렉토리 추가 - 프로젝트를 추가 할 때 마다 매번 작업


/home/svn/project_name 디렉토리를 프로젝트의 홈으로 사용한다.

project_name 부분은 프로젝트에 맞게 적절히 정하면 된다.

$ svnadmin create --fs-type fsfs /home/svn/project_name

프로젝트에 대한 권한 설정

/home/svn/project_name/conf/svnserve.conf 파일을 불러와서 아래와 같이 설정한다.

realm 은 repository 도메인 (외부에서 볼 때의 이름)이다.

[general]
anon-access = none
auth-access = write
# password-db = passwd
# authz-db = authz
realm = repositryname[sasl]
use-sasl = true
#min-encryption = 0
#max-encryption = 256

개인이 사용 할 때는 password-db 를 사용하고 use-sasl 을 막고 아이디와 비밀번호 설정을

/home/svn/project_name/conf/passwd 파일을 열어서

아이디 = 비밀번호 형식으로 관리하면 쉽다. 하지만 비밀번호가 노출되기 때문에 찝찝하면 sasl을 사용한다.



5. sasl 인증 추가 (아이디 비밀번호 추가)


saslpasswd2 명령 후에 비밀번호 및 확인 입력이 뜬다 그 때 아이디의 비밀번호를 입력한다.

sasldblistusers2 는 등록된 아이디의 목록을 볼 수 있다. 물론 비밀번호는 볼 수 없다.

$ saslpasswd2 -c -u 그룹명 아이디
$ sasldblistusers2

6. init 스크립트 만들기


부팅시 마다 subversion 서버를 실행하려면 service 스크립트를 만들어야 한다.

/etc/sysconfig/subversion 파일을 새로 생성하여 아래와 같이 입력한다.

OPTIONS="--threads --root /home/svn"

그리고 /etc/init.d/subversion 을 만들고 아래와 같이 입력한다.

#!/bin/bash
#
#   /etc/rc.d/init.d/subversion
#
# Starts the Subversion Daemon
#
# chkconfig: 2345 90 10
# description: Subversion Daemon
# processname: svnserve
source /etc/rc.d/init.d/functions
[ -x /usr/bin/svnserve ] || exit 1
### Default variables
SYSCONFIG="/etc/sysconfig/subversion"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=0
prog="svnserve"
desc="Subversion Daemon"
start() {
        echo -n $"Starting $desc ($prog): "
   daemon $prog -d $OPTIONS
   RETVAL=$?
   [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
   echo
}
stop() {
   echo -n $"Shutting down $desc ($prog): "
   killproc $prog
   RETVAL=$?
   [ $RETVAL -eq 0 ] && success || failure
   echo
   [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
   return $RETVAL
}
case "$1" in
  start)
   start
   ;;
  stop)
   stop
   ;;
  restart)
   stop
   start
   RETVAL=$?
   ;;
  condrestart)
        [ -e /var/lock/subsys/$prog ] && restart
   RETVAL=$?
   ;;
  *)
   echo $"Usage: $0 {start|stop|restart|condrestart}"
   RETVAL=1
esac
exit $RETVAL

그 다음 실행 권한을 주고 서비스로 등록한다.

$ chmod +x /etc/init.d/subversion
$ cd /etc/init.d
$ chkconfig --add subversion && chkconfig subversion on

7. 서버 시작


서비스 모드

$ service subversion start

데몬 모드

$ svnserve -d -r /svn

8. 클라이언트 프로그램으로 접속 테스트 한다.


추천 클라이언트

이클립스용 : subversive

윈도우용 : tortoiseSVN


9. 기타 


서버 포트 : 3690

리눅스 삼바 smb.conf 파일 설정하기
 
# 이 파일은 삼바의 주요 설정 파일입니다.  앞으로 나오는 옵션들을 이해하기 위해
# 서는 smb.conf(5) 맨 페이지를 꼼꼼히 읽어 보시기 바랍니다. 삼바에는 방대한 양
# 의 설정 옵션이 있지만(어떻게 보면 너무 많다고 생각하실 수 있습니다), 다음 예
# 에서는 보여지지 않는 것들이 많습니다.
#
# ; (세미 콜론) 또는 # (해쉬) 로 시작하는 줄은 모두 주석이며 무시합니다.  다음
# 예에서는 주석에 대하여 # 를 사용하며 여러분이 작동시기킬 원할 지 모르는 옵션
# 에 대해서는 ; 문자로 구별하여 처리하였습니다.
#
# 주의: 설정 파일을 수정하고 나서는 기본적인 문법 오류 여부를 검사하기 위해
# "testparm" 명령을 실행해보십시오.
#
# 작성 : 김 정 균 <http://www.oops.org>
#
# 오역을 발견하시거나 추천할 사항이 있으시면 위의 주소로 연락을 주십시오.
# 그 이외의 일반적인 질문에 대해서는 답변하지 않습니다.

# 내부변수
# - %u : Samba에 접속한 사용자의 이름
# - %U : Samba에 접근할 때 사용한 사용자 이름
# - %g : %u 이름을 가진 사용자의 그룹
# - %G : %U 이름을 가진 사용자의 그룹
# - %h : Samba가 실행되는 호스트 이름
# - %H : %U 이름을 가진 사용자의 홈 디렉토리
# - %L : Samba 서버의 NetBIOS 이름
# - %m : 클라이언트 컴퓨터의 NetBIOS 이름
# - %M : 클라이언트 컴퓨터의 호스트 이름
# - %v : Samba 버전 번호
#
#============================    전체 설정    ============================
[global]
# workgroup = NT 도메인 이름 또는 워크그룹 이름
   workgroup = WORKGROUP
# 나의 정의
   hide dot files = yes
   veto files = /.?*/
   netbios name = netbios
;  netbios aliases = nemesis
   dont descend = /proc,/dev
;  time server = true
;  sync always = yes
# server string은 NT 설명 필드와 같은 것입니다.
   server string = Linux Samba Server
# 언어 설정 :
# dos charset 은 Windows Machine 의 언어셋을 설정합니다. 보통 NT SP4 이상의 윈
# 도우즈는 UTF-8 로 지정하시면 됩니다. unix charset 은 삼바 머쉰의 언어셋을 지
# 정합니다. RH 9 부터는 UTF-8 을 사용하며, 이 이전은 보통 EUC-KR 을 사용합니다.
   dos charset = UTF-8
   unix charset = EUC-KR
# 이 옵션은 보안과 관련하여 중요한 것입니다. 이 옵션을 통해 여러분의 근거리 네
# 트웍에 있는 호스트에게만 접근을 허용할 수 있습니다.  다음 예는 2 개의 C 클래
# 스 네트웍과 "loopback" 인터페이스에 대해서만 접근을 허용하고 있습니다.  문법
# 예 # 는 smb.conf 맨페이지를 참고하시기 바랍니다.
  hosts allow = 210.224.127. 127.
# 프린터 설정을 개별적으로 하지않고 자동으로 프린터 목록을 포함시키길 원한다면
# 다음 옵션을 사용합니다.
# printcap 에서 정의한 프린터목록이 자동으로 등록됩니다. load printers = no 이
# 면 하나하나 정해주셔야 합니다.
   load printers = no
# printcap 파일의 위치를 새롭게 지정하고 싶을 때 사용하십시오.
   printcap name = /etc/printcap
# SystemV 시스템에서는 printcap name 을 lpstat 으로 해주면 SystemV 스풀 시스템
# 으로부터 프린터 목록을 자동으로 얻게 해줍니다.
;  printcap name = lpstat
# 여러분의 프린팅 시스템이 표준에서 벗어난 것이 아니라면 다음 옵션의 주석을 풀
# 필요가 없습니다.  현재 지원하고 있는 프린트 시스템은  bsd, sysv, plp, lprng,
# aix, hpux, qnx 등입니다.
;  printing = cups
# This option tells cups that the data has already been rasterized
;  cups options = raw
# 손님 사용자를 허가하고 싶을 때는 다음 행의 주석을 풀어줍니다. nobody 가 아닌
# 경우에는 /etc/passwd 항목에 설정한 손님 사용자 계정을 추가 해야 합니다.
# useradd 명령으로 사용자를 만드십시오.
;  guest account = nobody
# 다음은 삼바로 하여금 자신에 접속하는 호스트 별로 개별적인 기록 파일을 만들도
# 록 지시합니다. "/var/log/samba/접근호스트이름.log"과 같은 파일명을 가집니다.
# %m 은 삼바 설정에서 사용되는 특수한 변수입니다.
   log file = /var/log/samba/%m.log
# 한라인으로 모든 정보를 로깅 하려면 아래와 같이 설정 합니다.
;  log file = /var/log/samba/smbd.log
# 로그 파일 크기의 상한선을 Kb 단위로 설정합니다.
   max log size = 50
# 보안 모드입니다. 대부분의 사람들에겐 user 레벨의 보안이 맞습니다.  자세한 내
# 용은 security_level.txt 문서를 참고하십시오.
#
# 참고로 user 는 유닉스 계정이름/패스워드 방식의 보안 등급이며 share 는 워크그
# 룹 포 윈도우즈(WfW)와 윈도95의 기본 모드입니다. server 의 경우에는 인증을 위
# 해 NT 서버가 필요합니다.
# 삼바의 보안모델
# - share : 인증절차 필요 없음
# - user : 리눅스 삼바서버에서 인증이 필요
# - server : NT서버
# - domain : PDC(Primary Domain Controller) 
   security = user
# security = server 또는, security = domain 인 경우에만 패스워드 서버를 설정합
# 니다.
;  password server = <NT-Server-Name>
# 패스워드 레벨에서는 대/소문자 모든 조합에 대하여 _n_ 개의 문자로 이뤄진 패스
# 워드를 사용하도록 합니다.
;  password level = 8
;  username level = 8
#
# !!!!!!!! 윈도우즈 98/윈도우즈 NT 4 (SP3) 클라이언트 !!!!!!!!!
#
# 패스워드 암호화를 사용하고 싶을 때가 있습니다.  삼바 문서 중 ENCRYPTION.txt,
# Win95.txt, WinNT.txt 를 꼭 읽어보시기 바랍니다. 이 문서를 착실히 읽지않은 상
# 태에서 다음 옵션을 설정하지 마십시오.  윈도우즈 NT 4.0 서비스 팩 3 번 이상인
# 시스템에서는 패스워드 암호화가 필요합니다.  그렇지 않으면 삼바 서버에 접속조
# 차 할 수 없습니다.
#
# smbpaswd 의 사용법이 samba 3 에서 변경이 되었습니다. 기존의 smbpasswd 나, 새
# 로 smbpasswd 를 작성 하셨다면, "smbpasswd -e 유저명" 으로 해당 유저를 활성화
# 해 주셔야 접속이 가능합니다.
   encrypt passwords = yes
   smb passwd file = /etc/samba/smbpasswd
# 관련 명령으로는 smbadduser, smbpasswd가 있습니다.
# 다음 설정은 윈도우즈에서 패스워드를 바꿀 때, 리눅스 시스템의 패스워드도 자동
# 으로 갱신되도록 하고 싶을 때 사용한다.
# 주의 사항 : 위에 있는 'encrypt passwords', 'smb passwd file'과 같이 사용해야
#             한다!!!
# 주의 사항2: 워크스테이션으로부터 암호화된 SMB 패스워드만 변경할 수 있도록 할
#             때에는 필요없는 사항이다.  유닉스 패스워드와 SMB 패스워드가 항상
#             동일한 상태를 유지하도록 할 때에만 필요하다!
;  unix password sync = Yes
;  passwd program = /usr/bin/passwd %u
;  passwd chat = *New*UNIX*password* %nn *ReType*new*UNIX*password* %nn *passwd:*all*authentication*tokens*updated*successfully*
# 유닉스 사용자 이름과 SMB 사용자 이름이 달라, 둘 간의 연관 테이블을 필요할 때
# 사용합니다.
  username map = /etc/samba/smbusers
# 다음 옵션은 접속하는 각 머신마다 서로 다른 설정을 원할 때 사용합니다. 여기서
# %m 은 접속하는 호스트의 NetBIOS 이름으로 대체됩니다.
;  include = /etc/samba/smb.conf.%m
# 대부분의 경우 다음 옵션을 주면 성능 향상 효과를 볼 수 있습니다.  자세한 사항
# 은 speed.txt 와 맨 페이지를 참고하십시오.
   socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
# 삼바가 여러 개의 인터페이스를 사용하도록 설정합니다. 여러 개의 네트웍 인터페
# 이스를 가지고 있다면 그 인터페이스들을 모두 나열 하십시오.  자세한 사항은 맨
# 페이지를 참고하십시오.
# 다음 예는 삼바 서버가 192.168.12.2, 192.168.13.2 이렇게 두개의 주소를 가지고
# 있고 24비트 즉 넷매스크 255.255.255.0 를 사용하여 192.168.12.0, 192.168.13.0
# 네트웍의 호스트에 대해서 받아들입니다.
;  interfaces = 192.168.12.2/24 192.168.13.2/24
# 원격 브라우즈 목록과의 동기화에 관한 설정입니다.
#  공표 요청을 하거나 또는 브라우즈 목록 동기화해 줄 대상:
#       특정 호스트 또는 전체 서브넷을 지정할 수 있습니다. (아래 참고)
;  remote browse sync = 192.168.3.25 192.168.5.255
# 지역적인 서브넷에 자기 자신을 공표하도록 설정합니다.  윈도우즈 네트워크 환경
# 에서 삼바 서버가 잘 보이도록 할 때 유용합니다.
  remote announce = 210.125.115.
# 브라우져 제어 옵션:
# 삼바가 네트웍에 대한 매스터가 되길 바라지 않으면 local master 설정을 no로 하
# 십시오. 그렇지 않은 경우에는 일반적인 선거 규칙을 따릅니다.
;  local master = no
# OS 레벨은 매스터 브라우져 선거 과정에서 서버의 우선권을 결정합니다. 기본값이
# 적절합니다.  따라서 특별히 바꿀 이유가 없습니다.
;  os level = 33
# domain master 는 삼바로 하요금 도메인 매스터 브라우져가 되도록 해줍니다.  삼
# 바는 서브넷들로부터 브라우즈 목록을 모으는 작업을 하게됩니다. 이미 이 기능을
# 담당하고 있는 윈도우즈 NT 도메인 컨트롤러가 존재한다면, 이것을 사용해서는 안
# 됩니다.
;  domain master = yes
# preferred master 옵션을 켜두면 시동할 때, 지역 브라우져 선거를 하도록 만들고
# 선거에서 이길 수 있는 좀 더 높은 기회를 부여받습니다.
;  preferred master = yes
# 설치할 때 주 도메인 컨트롤러로 설정된 NT 서버가 존재할 때만 사용합니다.
;  domain controller = <NT 도메인 컨트롤러 SMB 이름>
# 삼바가 윈도우즈 95 워크스테이션에 대한 도메인 로그온 서버 역할을 하길 원하는
# 경우 켜둡니다.
;  domain logons = yes
# 도메인 로그온을 선택했고, 각 머신 별로 또는 각 사용자 별로 로그온 스크립트를
# 구분하여 특정 배치 파일을 작동시키길 원하는 경우 사용합니다.
;  logon script-x = %m.bat
# 사용자 이름에 의거하여 서로 다른 로그온 배치 파일을 실행시킬 때
;  logon script-x = %U.bat
# 로우빙 프로파일(roving profile)을 어디에 저장할 것인가?
#        (Win95와 WinNT에만 해당됩니다.)
#        %L 은 서버의 NetBIOS 이름으로, %U 는 사용자 이름으로 대체됩니다. 뒤에
#        나오는 [Profiles] 공유에 있는 주석을 풀어주는 것을 잊지 않도록 하십시
#        오.
;  logon path = \%LProfiles%U
# 모든 NetBIOS 이름은 IP 주소로 변환이 되어져야 한다.
# 'Nmae Resove Order' 는 "host lmhosts wins bcast" 를  기본 순서로 가지는 이름
# 변환 매커니즘을 설정할 수 있도록 한다. "host" 는 /etc/hosts 또는
# /etc/hosts.config, /etc/nsswitch.conf 또는, /etc/resolv.conf 파일에 설정되어
# 있는 것을 기본으로 사용하는 DNS 또는, NIS 의 의존하는 gethostbyname() 함수를
# 호출하는 것을 의미한다. 그 결과 "host" 는 시스템 설정에 종속적이게 된다.  이
# 파라미터는 보통, NetBIOS 이름을 IP 주소로 변환하기 위하여 DNS lookup 을 하는
# 것을 방지 하기 위하여 사용을 하며, 사용시 주의해야 한다.
;  name resolve order = wins lmhosts bcast
# 윈도우즈 인터넷 네임 서비스 WINS 지원 섹션:
# 주의: /etc/samba/lmhosts를 만들어 마치 /etc/hosts와 같이 적습니다.
# 예)
# 192.168.0.1   hamster
;  wins support = yes
# WINS 서버 - 삼바의 NMBD 로 하여금 WINS 클라이언트가 되도록 합니다.
# 주의 : 삼바는 WINS 서버 또는 클라이언트 중 하나만 될 수 있다.
;  wins server = w.x.y.z
# WINS 프록시 - 삼바로 하여금 WINS 기능을 갖추지 못한 클라이언트를 대신하여 이
# 름에 해당하는 주소 찾기 질문을 대신 답하도록 합니다. 이를 위해서는 네트웍 상
# 에 적어 한 개 이상의 WINS 서버가 있어야 합니다. 기본값은 NO
;  wins proxy = yes
# DNS 프록시 - 삼바로 하여금 DNS nslookup 을 사용하여 NetBIOS 이름을 찾을 것인
# 지 아닌지 지시합니다. 1.9.17 버전에서는 내부 기본값이 yes 였으나 1.9.18 버전
# 에서는 no 로 변경되었습니다.
   dns proxy = no
# 대소문자 보존이 필요할 때가 있습니다. 시스템 기본값은 NO 입니다.
# 주의: 각 공유별로 설정할 수 있습니다. 한글을 보기 위해서는 구별해야 합니다.
   preserve case = yes
   short preserve case = yes
# 도스 파일에 대한 기본 문자는 대문자입니다.
;  default case = lower
# 대소문자 구별은 주의를 요합니다. - 문제를 일으킬 수도 있습니다!
;  case sensitive = no
#
# 기타 설정
#
# LEVEL2 OPLOCKS
# --------------
#
# 레벨2 OPLOCK 은 SHARE 별로 설정 가능합니다. 주로 읽기만 하는 공유 디렉토리에
# 적용하면 읽기 속도를 크게 증진할 수 있습니다. 예를 들어 실행 파일 .EXE 만 잔
# 뜩 들어 있는 디렉토리를 공유시키는 경우에 좋습니다.
#
;  level2 oplocks = true
#==========================     공유  정의    ============================
# 섹션 정의
# - [global] : 다른 세션에 적용되는 파라미터를 정의
# - [homes] : 리눅스 홈 디렉토리 접근 설정
# - [printers] : 프린터 접근 설정

[homes]
   comment = 홈 디렉토리
   browseable = no
   writable = yes
;  create mode = 0750
;  invalid users = root
# 도메인 로그온을 위한 netlogin 디렉토리를 만들고 주석 해제합니다. 물론 도메인
# 로그온 기능을 지원할 때만 필요합니다.
; [netlogon]
;  comment = 네트워크 로그온 서비스
;  path = /home/netlogon
;  guest ok = yes
;  writable = no
;  share modes = no

# 특정한 로우빙 프로파일(roving profile) 공유를 제공하고자 한다면, 다음의 주석
# 을 풀어주십시오. 기본값은 사용자의 홈 디렉토리입니다.
;[Profiles]
;  path = /home/profiles
;  browseable = no
;  guest ok = yes

# 주의: BSD 스타일의 프린트 시스템 (현재 대부분의 리눅스 시스템이 그러함) 이라
# 면 각각의 프린터를 정의해 줄 필요 없이 자동으로 이뤄집니다.
[printers]
   comment = 모든 프린터
   path = /var/spool/samba
   browseable = no
# guest ok = yes 라고 하면 'guest account' 로 지정한 사용자들이 프린팅을 할 수
# 있습니다.  public = yes 도 같은 표현입니다.
   guest ok = yes
   writable = no
   printable = yes
# 다음은 사람들이 파일을 공유할 수 있도록 할 때 유용합니다.
# 주의: /tmp 는 시스템의 임시 작업 공간이므로, /var/tmp 와 같은 곳에 커다란 파
#       티션을 마운트하고 그곳을 사용하도록 하는 것이 좋습니다.
# 지금부터는 임의로 정의 가능한 공유 설정의 예입니다.  다음 설정들을 보면서 여
# 러분이 원하는 공유를 정의해보시기 바랍니다.
;[tmp]
;  comment = 임시 파일 공간
;  path = /tmp
;  read only = no
;  public = yes
# 공개적으로 접근 가능한 디렉토리이지만 읽기만 가능하고 "staff" 그룹에 속한 사
# 용자들만이 쓰기를 할 수 있는 설정의 예입니다.
;[public]
;  comment = Public Stuff
;  path = /home/samba
;  public = yes
;  read only = yes
;  write list = @staff

# 기타 다른 예.
# 조금은 특정 용도에 맞는 상세한 설정 예입니다.
#
# fred 라는 사용자만 이용할 수 있는 개인적인 프린터 설정.  스풀 자료는 fred 의
# 홈 디렉토리에 씌여집니다.  fred 는 지정한 스풀 디렉토리에 쓰기 권한을 가지고
# 있는 상태여야 합니다.
;[fredsprn]
;  comment = Fred 전용 프린터
;  valid users = fred
;  path = /homes/fred
;  printer = freds_printer
;  public = no
;  writable = no
;  printable = yes
# fread 만이 이용할 수 있는 개인적인 디렉토리 설정입니다.
# 디렉토리에 대하여 fred 의 쓰기 권한이 있는 상태여야 합니다.
;[fredsdir]
;  comment = Fred 개인 서비스
;  path = /usr/somewhere/private
;  valid users = fred
;  public = no
;  writable = yes
;  printable = no
# 접속하는 머신에 따라 서로다른 디렉토리를 제공하는 서비스의 좋은 예입니다. 이
# 렇게 함으로써 접속 머신에 따라 실제 설정 내용이 달라지는 효과를 얻을 수 있습
# 니다.  사용자 이름으로 구별하려면 %u 옵션을 대신 사용하면 됩니다. %m 은 접속
# 하는 머신의 이름으로 치환됩니다.
;[pchome]
;  comment = PC 디렉토리
;  path = /usr/pc/%m
;  public = no
;  writable = yes
# 모든 사용자가 읽고 쓸수 있는 공개 접근 디렉토리의 예입니다. 생성되는 모든 파
# 일은 기본 사용자의 소유가 되므로, 다른 사용자가 여러분이 만든 파일을 지울 수
# 있습니다. 당연히 주어진 디렉토리에 대하여 기본 사용자가 쓰기권한을 가지고 있
# 어야 합니다. 다른 사용자를 명시하면 기본 사용자가 아닌 그 사용자의 소유가 됩
# 니다.
;[public]
;  path = /usr/somewhere/else/public
;  public = yes
;  only guest = yes
;  writable = yes
;  printable = no
# 다음 항목은  두 사용자가 어떻게 한 디렉토리를 공유하여 사용하게 할 수 있는지
# 예시하고 있습니다. 이 설정이 제대로 작동하려면,  디렉토리는 두 사용자에 의해
# 쓰기 가능해야 하며 스틱키 (sticky) 비트를 설정하여 서로의 파일에 대하여 악의
# 적인 행동을 취할 수 없도록 해줘야 합니다.  이런 방법으로 여러 사용자가 한 디
# 렉토리를 안전하게 공유하도록 확장할 수 있습니다.
;[myshare]
;  comment =  Mary와 Fred의 것
;  path = /usr/somewhere/shared
;  valid users = mary fred
;  public = no
;  writable = yes
;  printable = no
;  create mask = 0765
;[www]
;  comment = 웹 페이지 디렉토리
;  path = /home/httpd/html
;  read only = no
ftp 계정, DB 계정, 가상호스트 추가 스크립트

apache, mysql 등의 버전차이에 따라 정상적으로 동작하지 않을 수도 있음.. ^^

- 출처 호스트웨이

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

#!/bin/sh

sleep 1
# 사용자 계정 추가
echo "ftp 계정을 추가하시겠습니까?(y/n)"

read answer1

while [[ "$answer1" != "y" && "$answer1" != "n" && "$answer1" != "Y" && "$answer1" != "N" ]]
do
echo "잘못 입력하셨습니다. y 나 n 으로 입력해 주세요."
read answer1
done

if [ "$answer1" = y -o "$answer1" = Y ]
then
        echo "추가할 계정이름을 입력해 주세요."
        read username
        echo " "
        echo "$username 에서 사용할 패스워드를 입력해 주세요."
        if /usr/sbin/useradd $username; then
                /usr/bin/passwd $username
                chmod 701 /home/$username
                echo "$username 계정이 생성되었습니다."
        else
                echo " "
                echo "계정 생성에 실패 하였습니다. ERROR 라인을 확인 하시고 다시 시도하세요."
                echo " "
        fi
else [ "$answer1" = n -o "$answer1" = N ]
        echo "ftp 계정을 생성하지 않습니다."
fi

sleep 1
echo " "

# Database 추가
echo "DB 계정을 추가 하시겠습니까?(y/n)"

read answer2

while [[ "$answer2" != "y" && "$answer2" != "n" && "$answer2" != "Y" && "$answer2" != "N" ]]
do
echo "잘못 입력하셨습니다. y 나 n 으로 입력해 주세요."
read answer2
done

if [ "$answer2" = y -o "$answer2" = Y ]
then

        if netstat -nat | grep LISTEN | grep 3306 1>/dev/null
        then
                echo "추가할 DB명을 입력하고 엔터를 치세요."
                read db
                echo " "
                echo "사용할 DB user명을 입력하고 엔터를 치세요."
                read db_user
                echo " "
                echo "$db_user가 사용할 패스워드를 입력하고 엔터를 치세요."
                read passwd
                echo " "
                echo "create database $db;" >> query
                echo "use mysql;" >> query
                echo "insert into user (host,user,password) values('localhost','$db_user',password('$passwd'));" >> query
                echo "insert into db values('localhost','$db','$db_user','y','y','y','y','y','y','y','y','y','y','y','y','y','y','y','y','y');" >> query
                echo "flush privileges" >> query
                echo "mysql root계정의 패스워드를 입력 하세요."
                echo "mysql root계정의 패스워드가 설정되어 있지 않다면, 그냥 엔터를 치세요."
                if /usr/local/mysql/bin/mysql -u root -p < query; then
                        echo " "
                        echo "mysql db 및 계정이 추가 완료되었습니다. 아래와 같이 접속을 하세요."
                        echo " "
                        echo "/usr/local/mysql/bin/mysql -u $db_user -p $db"
                        echo " "
                else
                        echo " "
                        echo "DB 생성에 실패 하였습니다. ERROR 라인을 확인 하시고 다시 시도하세요."
                        echo " "
                fi
                rm -rf query
        else
                echo "mysql 데몬이 실행되어 있지 않습니다."
                echo "mysql 데몬을 실행합니다."
                echo " "
                /usr/local/mysql/share/mysql/mysql.server start
                echo " "
                echo "추가할 DB명을 입력하고 엔터를 치세요."
                read db
                echo " "
                echo "사용할 DB user명을 입력하고 엔터를 치세요"
                read db_user
                echo " "
                echo "$db_user가 사용할 패스워드를 입력하고 엔터를 치세요."
                read passwd
                echo " "
                echo "create database $db;" >> query
                echo "use mysql;" >> query
                echo "insert into user (host,user,password) values('localhost','$db_user',password('$passwd'));" >> query
                echo "insert into db values('localhost','$db','$db_user','y','y','y','y','y','y','y','y','y','y','y','y','y','y','y','y','y');" >> query
                echo "flush privileges" >> query
                echo "mysql root계정의 패스워드를 입력 하세요."
                echo "mysql root계정의 패스워드가 설정되어 있지 않다면, 그냥 엔터를 치세요."
                if /usr/local/mysql/bin/mysql -u root -p < query; then
                        echo " "
                        echo "mysql db 및 계정이 추가 완료되었습니다. 아래와 같이 접속을 하세요."
                        echo " "
                        echo "/usr/local/mysql/bin/mysql -u $db_user -p $db"
                        echo " "
                else
                        echo " "
                        echo "DB 생성에 실패 하였습니다. ERROR 라인을 확인 하시고 다시 시도하세요."
                        echo " "
                fi
                rm -rf query
        fi
else [ "$answer2" = n -o "$answer2" = N ]
        echo "DB 계정을 생성하지 않습니다."
fi

sleep 1
echo " "

# 가상호스트 추가
echo "가상호스트 추가를 하시겠습니까?(y/n)"

read answer3

while [[ "$answer3" != "y" && "$answer3" != "n" && "$answer3" != "Y" && "$answer3" != "N" ]]
do
echo "잘못 입력하셨습니다. y 나 n 으로 입력해 주세요."
read answer3
done

if [ "$answer3" = y -o "$answer3" = Y ]
then

        today=$(date +%y-%m-%d)
        ip=$(ifconfig | grep Bcast | awk '{print $2}'|cut -d: -f2)

        echo "추가할 도메인을 입력 하세요. ex) hostway.co.kr"
        read domain

        echo "DocumentRoot 디렉토리를 입력하세요. ex) /home/hostway/public_html"
        read Documentroot

        echo "관리자 e-mail 주소를 입력하세요. ex) admin@hostway.co.kr"
        read "email"

        if cat /usr/local/apache2/conf/httpd.conf | grep vhost | grep "#" 1>/dev/null
        then
        perl -pi -e 's/\#Include conf\/extra\/httpd-vhosts.conf/Include conf\/extra\/httpd-vhosts.conf/g'  /usr/local/apache2/conf/httpd.conf
        mv /usr/local/apache2/conf/extra/httpd-vhosts.conf /usr/local/apache2/conf/extra/httpd-vhosts.conf-$today
        echo "NameVirtualHost $ip" > /usr/local/apache2/conf/extra/httpd-vhosts.conf
        echo " " >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        echo "<VirtualHost $ip>" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        echo "  ServerAdmin $email" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        echo "  DocumentRoot $Documentroot" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        echo "  ServerName $domain" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        echo "  ServerAlias www.$domain" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        echo "  ErrorLog logs/$domain-error_log" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        echo "  CustomLog logs/$domain-access_log common" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        echo "</VirtualHost>" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        sleep 1
        echo "가상호스트 추가 작업이 완료되었습니다."
        echo "ftp 접속을 하셔서 $Documentroot 디렉토리에 홈페이지 자료를 업로드 하시기 바랍니다."
        /usr/local/apache2/bin/apachectl restart
        else
        cp /usr/local/apache2/conf/extra/httpd-vhosts.conf /usr/local/apache2/conf/extra/httpd-vhosts.conf-$today
        echo " " >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        echo "<VirtualHost $ip>" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
                echo "  ServerAdmin $email" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
                echo "  DocumentRoot $Documentroot" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
                echo "  ServerName $domain" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
                echo "  ServerAlias www.$domain" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
                echo "  ErrorLog logs/$domain-error_log" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
                echo "  CustomLog logs/$domain-access_log common" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
                echo "</VirtualHost>" >> /usr/local/apache2/conf/extra/httpd-vhosts.conf
        sleep 1
        echo "가상호스트 추가 작업이 완료되었습니다."
        echo "ftp 접속을 하셔서 $Documentroot 디렉토리에 홈페이지 자료를 업로드 하시기 바랍니다."
        /usr/local/apache2/bin/apachectl restart
        fi
else [ "$answer3" = n -o "$answer3" = N ]
        echo "가상호스트를 추가하지 않습니다."

fi 

[리눅스/LINUX/LPIC] 사용자 계정 추가 쉘 스크립트




사용자 계정 추가 쉘 스크립트입니다.
아래 내용으로 newuser 라는 파일을 만들고
실행가능하도록 퍼미션 바꿔주고 실행하면 됩니다.


# chmod 777 newuser
# ./newuser


---------------------------------------------------------------------------------------------------------------
#!/bin/bash



clear



echo ==================================================================
echo "                     UserAdd Process Start                      "
echo ==================================================================



echo -n "User Name : "
read username

useradd $username

echo ------------------------

echo PassWord Setting

echo ------------------------
passwd $username



echo ==================================================================
echo "                     www root directory making                      "
echo ==================================================================

echo

echo -n "www root Directory path : "

echo /home/$username/public_html

mkdir -p /home/$username/public_html



echo ==================================================================
echo "             root directory setting & test index.php making     "
echo ==================================================================

chmod 775 /home/$username
chmod 775 /home/$username/public_html
chown $username.$username /home/$username/public_html

echo " " >>/home/$username/public_html/index.php
echo "<? phpinfo(); ?>" >> /home/$username/public_html/index.php

chown $username.$username /home/$username/public_html/index.php
chmod 775 /home/$username/public_html/index.php



echo checking -----------------------------------------------------------

ls -al /home/$username

echo checking -----------------------------------------------------------

ls -al /home/$username/public_html




echo ==================================================================
echo "                        MySQL useradd"
echo ==================================================================

echo "Username : $username"

echo "dbname : $username"

echo -n "User p/w : "
read userpw

echo " " >> mysql_useradd.sql

echo "use mysql" >> mysql_useradd.sql

echo "create database $username;" >> mysql_useradd.sql

echo "insert into user (host, user, password) values ('localhost', '$username', password('$userpw'));" >> mysql_useradd.sql

echo "insert into db values ('localhost', '$username', '$username', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');" >> mysql_useradd.sql

echo "FLUSH PRIVILEGES;" >> mysql_useradd.sql

/usr/local/mysql/bin/mysql -uroot -p97081056 < ./mysql_useradd.sql

cat ./mysql_useradd.sql
rm -rf ./mysql_useradd.sql


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

 

 

1. http://www.oracle.com 에 접속

   -> Oracle Database 10g Express Edition for Linux x86 클릭

   -> oracle-xe-10.2.0.1-1.0.i386.rpm 다운로드


2. 설치 필요 라이브러리 설치

   -> yum install glibc

   -> yum install libaio


3. 오라클 rpm 설치

   -> rpm -ivh oracle-xe-10.2.0.1-1.0.i386.rpm


4. 오라클 설정

   -> /etc/init.d/oracle-xe configure

   # Specify a port that will be used for the database listener [1521]: 오라클포트번호   

   # This can be done after initial configuration: Confirm the password: SYS 또는 SYSTEM 암호

   # Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]: 부팅후 자동 오라클을 실행할지 여부

 

5. 오라클 환경변수 설정

   -> cd /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin

   -> ./oracle_env.sh        (실행)


6. 부팅후 자동 환경변수 실행

   -> vim /root/.bash_profile

   # /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/./oracle_env.sh   (삽입)

   # export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server  (삽입)

   # export ORACLE_SID=XE

 

7. 웹브라우저 접속

   -> http://서버아이피:8080/apex

   -> 아이디 : sys  패스워드 : 위 4번 오라클설정에서 넣었던 sys 암호

7.1 oci 라이브러리 추가

    -> yum install php-pear

    -> pecl install oci8

    # php.ini 에서

    -> extension=oci8.so

7.2 아파치 설치후 다음작업

    -> /usr/local/apache/bin/./apachectl stop

8. php 설치

   -> export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server 

   # php 소스 컴파일 디렉토리에서

   -> ./configure --prefix=~~~~ --enable-pdo --with-pdo-oci=$ORACLE_HOME --with-oci8=$ORACLE_HOME --with-oracle=$ORACLE_HOME

   # 나머진 기존 php 설치법대로 진행

 

8.1 아파치 시작

   -> /usr/local/apache/bin/./apachectl start

 

9. 테스트 (PHP)

   $conn=oci_connect("아이디","패스워드","localhost/XE");
   if($conn) echo "success";

 

 

참고)

  # 오라클 시작

  -> /etc/init.d/oracle-xe start

  # 오라클 정지

  -> /etc/init.d/oracle-xe stop

  # 외부네트워크망에서 http://서버아이피:8080/apex 접속하게 하려면

  -> ./sqlplus sys/패스워드

  -> EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);

 

관리하는 쇼핑몰에서 보안서버구축 공문을 받아 작업할때 나타난 작은 에러의 해결법입니다.
서버는 Window2003+APM 입니다.
먼저 Apache에 mod_ssl 을 추가한 후 ssl.conf 파일을 호출하도록 적용하였습니다.
다음 윈도우용 Openssl 에서 [Win32 OpenSSL v0.9.8e Light] 를 설치하였습니다.
보안서버는 가장 저렴한 업체인 comodossl.co.kr 에서 인증서를 구입하였습니다.
다음 comodossl 에 나와있는 구축설명서 대로 key 파일과 csr 을 생성, 주문하여 인증서를 받았습니다.

하지만 Apache 에 SSL 을 적용후 재시작하는 과정에 에러가 나와 error.log 파일 확인결과 아래와 같은 에러나타났습니다.

[error] Init: SSLPassPhraseDialog builtin is not supported on Win32 (...

인증서 주문시 서버 선택이 있는데 iis 로 주문한것(클라이언트가 주문)이 잘못되었나 싶어 apache 로 바꾸어 재요청여 인증서를 다시 받았으나 위와 같은 오류가 계속 납니다.

원인을 해결하기 위해 구글링 한 결과 다음과 같은 내용을 찾을 수 있었습니다.

Error: Init: SSLPassPhraseDialog builtin is not supported on Win32
Unfortunately Apache on Windows does not support encrypted private keys. To resolve this you will need to remove the private key password.

It is possible to create an unencrypted copy of the key using this command: openssl rsa -in file1.key -out file2.key

file2.key will contain your unencrypted key.

If you now point your server at this key file, it will not prompt you for a pass phrase.

즉, 키를 만들때 [암호화를 하면 Window 용 Apache 에서는 동작할 수 없다]는 내용입니다.

그렇게 하여 comodossl 의 개인키 생성시 사용한 옵션 중 -des3 라는 구문을 사용하지 않고 만들었습니다.

"openssl>genrsa -des3 -out domain.key 1024 "를
"openssl>genrsa -out domain.key 1024 " 로 key 로 생성

그리고 comodossl 에 찾은 내용을 메일로 보내고 다시 인증서를 받아 설치하고 Apache를 재시작 하니 올바르게 시작되었습니다.
다만 암호화를 하지 않은 키파일이기 때문에 사용시에 암호를 확인하지 않으니 복사에  신중을 기해야합니다.

사실.. 단순히 보안인증서버를 위한것이기 때문에 누군가 받아간다고 해도 걱정할 필요는 전혀 없습니다. ㅡ_ㅡ;;

다른 분들은 삽질하지 마시길.. ㅠㅡㅠ

'공부 해 Boa요. > Windows Server' 카테고리의 다른 글

IIS에서 PHP설치하기  (0) 2008.07.15

웹 호스팅 서비스를 이용해서 블로그를 운영중이신 분들의 경우에만 사용할 수 있는 방법입니다.
.htaccess라는 파일이 있습니다. 이 파일은 웹을 통해 파일을 접근하려고 할때 그 규칙을 정의해줄 수 있는 파일입니다. 이 파일은 이용자가 접근하려는 파일보다 먼저 실행되며, .htaccess 파일이 존재하면 그 하부 디렉토리에도 전부 같은 규칙이 적용되는 특징이 있습니다. 테터툴즈나 텍스트큐브도 이 .htaccess 파일을 이용해서 php 실행파일을 숨기고 퍼머링크나 각종 처리를 하도록 되어 있지요.

이런 특징을 이용해서 제 블로그에 있는 이미지를 남이 긁어가서 트래픽을 낭비하는 일을 예방할 수 있습니다. 예를 들어


RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?skystory.kr [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]


라는 코드를 .htaccess 라는 이름의 텍스트파일로 만들어서 attach 디렉토리에 업로드하면 skystory.kr이 리퍼러에 있는 경우에만 이미지가 접근됩니다. 그외의 주소에서는 접근이 안되서 깨진 그림이 나오지요. (리눅스등의 계정에서 앞에 점이 있는 파일은 숨겨져 있는 파일을 의미합니다. 따라서 파일을 업로드 하실때는 FTP프로그램에서 숨김파일 표시 옵션을 주셔야 합니다.)


이것을 응용해서 마지막 줄을 고치면 접근이 안되는 경우 깨진 그림이 아니라 아래와 같은 경고 이미지가 나오게 할 수도 있습니다.

사용자 삽입 이미지


RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?skystory.kr [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ http://skystory.kr/attach/1/1186470511.jpg [NC,R,L]


다만 이 방법을 사용할 경우 문제점은, 퍼간 사람들이 이미지를 못보는것은 좋은데, 네이버나 올블로그 등 다른 서비스들에서 이미지를 못가져간다는 것입니다. 사람들이 이상하게 생각할 수도 있겠죠. 그래서 방문자들이 자주 이용하는 검색엔진, RSS리더, 블로그 메타나 자신의 보조 도메인들은 전부 허용하도록 주소를 넣어줘야 합니다. 예를 들면 이런식으로요.


RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?skystory.kr [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?skystory.co.kr [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?allblog.net [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?hanrss.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?blog4u.kr[NC]
RewriteCond %{HTTP_REFERER} !search\.naver\.com [NC]
RewriteCond %{HTTP_REFERER} !feedburner\. [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !metalooks\. [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ http://skystory.kr/attach/1/1186470511.jpg [NC,R,L]


이런 코딩이 어렵다면  http://www.htaccesstools.com/hotlink-protection/ 이 웹서비스에 가셔서 해당 빈칸을 채워넣으며 원하는 기능의 코드를 얻을 수 있습니다.


.htaccess 파일을 attach 디렉토리에 업로드 하신 후 http://www.htaccesstools.com/test-hotlink-protection/ 에서 자신의 첨부 이미지 주소를 테스트 삼아 넣어보면 차단이 잘 되었는지 확인할 수 있습니다.


※ 주의 : .htaccess 는 ANSI 문자셋으로 작업되야 합니다. UTF-8로 작업할경우 500 서버 에러를 일으킬수 있습니다.

최근에는 리퍼러를 이용한 광고가 일반화되어 있습니다.

이런 불필요한 리퍼러들을 제거하기 위한 .htaccess 팁입니다.


사용자 삽입 이미지


디렉토리에는 .htaccess 가 이미 설정되어 있을것입니다.
그 파일을 열어서 다음과 같이 두줄을 추가해줍니다.

SetEnvIfNoCase Referer "sex|casino|porno|adult|mature|xxx|fuck|lesbian|nude|gambling|LIVSOP|poker|goodslim|betting|buy|n95bD0l34bS2z3|slots|renter|<iframe|viagra|fillbest" hacker
Deny from env=hacker

차단이 필요한 단어는 단어1|단어2 이런식으로 계속 추가해주면 됩니다.
해당 단어가 리퍼러 주소에 포함되어 있으면 블로그에 접근 자체가 불가능합니다.


파일묶기
파일묶기    tar cvf 파일명.tar 파일(디렉토리)
묶은파일보기   tar tvf 파일명.tar 파일(디렉토리)
묶은파일풀기   tar xvf 파일명.tar 파일(디렉토리)



gzip(gunzip) 사용해서 압축

묶고압축    tar cvfz 파일명.tar.gz 파일(디렉토리)
묶고압축된 파일 보기  tar tvfz 파일명.tar.gz 파일(디렉토리)
묶고압축된파일 풀기   tar xvfz 파일명.tar.gz 파일(디렉토리)



gzip(gunzip) 사용 및 퍼미션유지해서 압축
묶고압축    tar cvfpz 파일명.tar.gz 파일(디렉토리) -> 가장좋음

묶고압축된 파일 보기  tar tvfpz 파일명.tar.gz 파일(디렉토리)
묶고압축된파일 풀기   tar xvfpz 파일명.tar.gz 파일(디렉토리) -> 가장좋음



bzip2(bunzip2) 사용해 압축

퍼미션유지해서 압축
묶고압축    tar cvfpj 파일명.tar.bz2 파일(디렉토리)
묶고압축된 파일 보기  tar tvfpj 파일명.tar.bz2 파일(디렉토리)
묶고압축된파일 풀기   tar xvfpj 파일명.tar.bz2 파일(디렉토리)



tar옵션

-c : tar파일 생성할 때 사용 (기본사용)  -> 풀때는 -x 옵션 사용
-t : tar파일의 내용을 확인할 때 사용
-f : tar파일을 사용할 때 사용 (기본사용)
-p : tar파일을 생성or풀때 원본 파일속성(퍼미션) 유지
-v : 묶거나 풀 때 과정 보기 (거의기본사용)
-z : gzip(gunzip) 사용 옵션
-j : bzip(bunzip2) 사용 옵션

리눅스에서 IDE 하드 디스크 튜닝법

요즘은 대부분 SATA 하드 디스크를 많이 쓰니 필요없는 정보 일지도 모르지만 자료 정리 차원에서 올린다.

1. single mode로 부팅해야한다. !!!

2. hdparm -Tt /dev/hda
    : 디스크 I/O 성능 확인
    : T(Cash) t(test)

3. hdparm /dev/hda
    : 드라이브의 주소 지정을 알아본다.

4. option 정보
    multcount : 다중 섹터 카운트 단일 I/O 인터럽트를 통해 디스크에서 가져오는 섹터의 양을 조절 (5~50%까지 성능 향상)
    I/O support : 매우중요
    unmaskirq : 디스크 인터럽트시 다른 인터럽트를 처리 하게 한다. network 인터럽트를 처리할 수 있다. 성능 향상 좋아지지
    using_dma : dma 사용 주위해야한다. 시스템이 뻗을 수 있다.

5. ex)
    hdparm -c3 -m16 /dev/hda
    -> multcount : 16, I/O support : 3 (32-bit w/sync)

    hdparm -X66 -d1 -u1 -m16 -c3 /dev/hda
    -> multcount : 16, I/O support : 3 (32-bit w/sync)
    -> unmaskirq : 1, using_dma : 1, xfermode : 66

6. 리부팅 하면 설정을 다시 해줘야한다.
    -> rc#.d 스크립트에 추가해야한다
    -> fsck 후 설정 해야함

Linux 파일 시스템 관리

리눅스 부팅 과정

전원 -> BIOS(POST작업) -> 부팅매체의 0번 섹터(MBR) -> Boot Loader(LILO or GRUB) -> Kernel booting -> init.d(PID 1) 실행 -> 실행레벨에 따른 부팅 -> 로그인

Partition
  1. 하나의 물리적 디스크를 여러 개의 논리적 디스크로 분할하는 기술
  2. 한 파티션이 손실되더라도 다른 파티션 영역은 손실로부터 보호할 수 있는 확률을 높이기 위한 수단
장치 번호와 장치 이름
  1. 리눅스는 4개의 Primary 파티션(Logical 파티션을 쓰고 있다면 3개)을 가질 수 있고, 디스크 하나 당 SCSI의 경우 최대 15개, IDE는 최대 63개의 파티션을 가질 수 있다.
  2. 리눅스에서는 디바이스 파일이 파티션을 나타낸다. 디바이스 파일은 c(버퍼 캐쉬를 쓰지 않는 "character" 디바이스)나 b(버퍼 캐쉬를 사용하는 "block"디바이스) 형식을 갖는 파일이다. 리눅스에서는 모든 디스크가 block 디바이스로만 표시된다.
     
[root@localhost ~]$ ls -al /dev/hda
brw-rw---- 1 root disk 3, 0 1월 4 23:07 /dev/hda
[
root@localhost ~]$ ls -al /dev/hda1
brw-rw---- 1 root disk 3, 1 1월 4 23:07 /dev/hda1
-> disk 다음에 나오는 숫자 3은 주번호, 0, 1은 부번호
File System
  1. 운영체제가 파일을 시스템의 디스크상에 구성하는 방식
  2. 운영체제는 시스템의 디스크 파티션상에 파일들을 연속적이고
    일정한 규칙을 가지고 저장하는데 파일 시스템은 이러한 규칙들의 방식을 제시
File System 구조
  1. Super Block : Super Block은 파일 시스템에 의존하는 정보를 가지며 파일 시스템의 크기 등과 같은 파일 시스템의 전체적인 정보를 가진다.
  2. inode : inode는 파일의 이름을 제외한 해당 파일의 모든 정보를 가지고 있다. 파일 이름은 inode 번호와 함께 디렉토리 안에 저장된다.
  3. Data Block : Data Block은 inode에 포함된다. inode는 여러 개의 XXXX
  4. Directory Block : 파일 이름과 inode번호를 저장하기 위해 사용된다.

 

관련 명령어
df
1) 현재 마운트되어 있는 파일 시스템의 사용 정보 출력
2) 공간 정보의 기본 표현단위는 1KB

-a : 파일 시스템의 크기가 0인 것도 모두 출력
-h : 공간 정보의 단위를 Giga Byte, Mega Byte, 또는 Kilo Byte 단위로 표현
-i : 블럭 사용 정보 대신에 inode 사용 정보를 출력

ex) # df /dev/hda1 -> 마운트 되어 있는 hda1의 정보 출력

 

du
1) Disk Usage를 의미하며, 지정된 디렉토리의 디스크 사용량 출력
2) 사용 공간 정보의 기본 표현단위는 1KB

-a : 디렉토리가 아닌 모든 파일에 대한 정보를 출력
-k : 결과 값을 KB 단위로 출력(기본값)
-m : 결과 값을 MB 단위로 출력
-h : 사용자가 이해하기 쉬운 용량의 단위를 표시((ex) KB,MB,GB)
-s : 사용량의 총 합계만 출력한다.

ex) # du -hs /home -> /home 디렉토리 내의 사용량의 총합 출력

 

fdisk
1) 파티션 관리자 명령
2) 새로운 파티션의 생성, 기존 파티션의 삭제, 파티션의 타입 결정 등의 작업 수행
3) 파티션 테이블이 출력될 때마다, 파티션 테이블에 오류가 없는지 항상 확인
4) fdisk는 독자적인 명령어를 가지고 있다. m이나 help를 치면 관련 명령어를 볼 수 있다.

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

ex) # fdisk -l -> 현재 시스템의 파티션 테이블을 나열

 

mke2fs
1) 확장 파일시스템(ext2, ext3) 생성
2) 파티션 이후 파일시스템 설정시 필요, 포맷기능

ex) # mke2fs -j /dev/hdb1 -> slave 디스크 파티션1을 ext3로 포맷

 

mount
1) 파일 시스템 마운트 명령, 장치를 사용할 때 필요한 명령
2) 유닉스 계열 시스템의 모든 파일들은 거대한 트리 구조로 나누어져 있고 그 뿌리는 '/'(root directory)이다.
3) mount 명령은 각 장치에 구성된 파일 시스템을 전체 파일 트리 구조에 붙이는 명령이다.(기본 사용법 : #mount -t type device directory)
4) umount 명령은 트리 구조로부터 떼어내는 명령이다. (기본 사용법 : # umount -t type)
5) 현재 마운트 되어 있는 파일시스템 정보는 '/etc/mtab'에 저장된다.
6) 시스템 부팅 시에 로컬 또는 원격 파일시스템으로부터 마운트 할 정보는 '/etc/fstab'에 저장된다. 그러므로 부팅할 때 항상 마운트 해야 하는 파 일시스템들은 이 파일에 등록해주면 자동으로 마운트가 이루어지게 된다.

 

lsattr
확장 파일시스템 상의 파일 속성을 출력한다.

ex) # lsattr -a -> 현재 디렉토리 내의 '.'의 파일까지 속성을 출력
ex) # lsattr -R -> 디렉토리와 그 안의 내용에 대해 회귀적으로 속성값을 출력

 

chattr
1) 확장 파일시스템 상의 파일 속성을 변경한다.
2) 보안 관련 설정 시 주로 사용된다.(백도어 파일 삭제시 등)
3) '+'연산자는 주어진 속성을 파일 속성에 추가한다.
4) '-'연산자는 주어진 속성을 제거한다.
5) '='연산자는 파일이 갖는 속성을 주어진 속성만 가지게 한다.

* 속성
a 파일을 쓸 때(write) 추가만 가능
c 커널에 의해 디스크 상에 압축 상태로 저장
i 파일의 수정 불가능(삭제, 이름변경, 수정, 링크) - 슈퍼유저만 가능
u 파일이 삭제되면 그 내용이 저장됨, 사용자는 다시 복구할 수 있음

* 옵션
-R 디렉토리와 이하 모든 내용의 속성을 회귀적으로 변환
-V 변화된 속성에 대하여 자세히 출력

ex) # chattr +i file -> 파일의 소유자도 'read-only'만 가능하고 root도 chattr로 설정한 것을 해제(-i)하지 않으면 절대 삭제가 불가능

 

[ 사용방법 ]

1. 클래스 하나만 디컴파일시
           test.class   를 디컴파일시  
           jad.exe 를 디컴파일할 파일과 동일한 폴더에 놓는다.
           Command 창에   jad -o -sjava test.class    
   결과물 : test.java 

2. Package 를 디컴파일시    
         test  폴더 아래의 모든 클래스파일을 디컴파일시  
         폴더와 같은 폴더에 jad.exe  를 위치하고
         Command 창에    jad -o -r -sjava -dsrc test/**/*.class  
         결과물 : 폴더내에 [src] 폴더가 생성된다.


다른 사용 방법...

1. 설치
    jad.exe 파일을 원하는 곳에 복사
    내컴퓨터-등록정보-고급-환경변수
    path에 경로 추가

2. cmd 실행

3. 클래스가 있는 곳으로 이동

4. 실행
    jad -t -nonlb -s .java *.class

'공부 해 Boa요. > Java' 카테고리의 다른 글

자바 보안 구조를 이용하기 위한 10가지 팁!  (0) 2007.12.14

#!/bin/sh

#iptables Path
iptables=/sbin/iptables

# SERVER IP 받아오기.
HOST_IP="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"
NETMASK="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $4}' | cut -d : -f 2`"

# rule delete
# 모두 지우고 다시 재설정합니다.
$iptables -F

######### 비정상적 패킷은 드롭시킨다. 로그에 남긴다. ###############
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

#iptables -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "NMAP-XMAS:"
#iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/FIN:"
#iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/RST:"


#Drop RST/ACKs to limit OS detection through pinging
iptables -A FORWARD -p tcp --tcp-flags RST RST,ACK -j DROP
#iptables -A FORWARD -p tcp --tcp-flags RST RST,ACK -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "RST/ACK:"

# INPUT Rules 설정
$iptables -Z INPUT
$iptables -P INPUT ACCEPT

# local 과 자기자신의 IP 는 허용.
$iptables -A INPUT -i lo -j ACCEPT
$iptables -A INPUT -s 도메인 -j ACCEPT

#  알 수 없는 패킷 즉,  NETWORK 상태가 INVALID 인 패킷들을 막아 버린다.
#  정상적인 접근에서는 나올 수 없는 상태.
$iptables -A INPUT -m state --state INVALID -j DROP

# ssh service
# ssh 접속 지역 지정.
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 22 -j ACCEPT
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 22 -j ACCEPT

# etc service
# 25(메일), 80(웹)은 모든 곳에서 ACCEPT 입니다. 반드시...
$iptables -A INPUT -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

# AUTH 는 서비스를 하지 않더라도 열어야 합니다. 클라이언트에서 요청합니다.
$iptables -A INPUT -p tcp --dport 113 -m state --state NEW,ESTABLISHED -j ACCEPT

# mysql
# 기본적으로 mysql 은 local에서만 접속하면 됩니다. DB 공유를 할 경우 대역 지정.
$iptables -A INPUT -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

# mysql DB공유 대역설정
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 3306 -j ACCEPT

# ICMP service
# ping은 별 의미가 없지만...
$iptables -A INPUT -s 아이피.0.0/16 -p icmp --icmp-type echo-request -j ACCEPT

# 서버로 들어오는 SYN packet 을 모두 거절한다.
$iptables -A INPUT -p tcp --syn -j REJECT

# Drop All packet
# 원활한 서비스를 위해 65535 포트까지만 DROP 을 합니다. 물론 다 막아도 상관 없습니다.
$iptables -A INPUT -p tcp --dport 0:65535 -j DROP
$iptables -A INPUT -p udp --dport 0:65535 -j DROP
$iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT

# 각종 서비스들에 대해 최대의 성능을 발휘할 수 있도록 TOS 설정을 한다.
$iptables -t mangle -A OUTPUT -p tcp -s 0/0 --sport 80 -j TOS --set-tos 0x10
$iptables -t mangle -A OUTPUT -p tcp -d 0/0 --dport 22 -j TOS --set-tos 0x10
$iptables -t mangle -A OUTPUT -p tcp -d 0/0 --dport 21 -j TOS --set-tos 0x10
$iptables -t mangle -A OUTPUT -p tcp -d 0/0 --dport 20 -j TOS --set-tos 0x08
$iptables -t mangle -A OUTPUT -p tcp -s 0/0 --sport 23 -j TOS --set-tos 0x10

# 외부 서비스를 위한 설정. / udp service
# dns 상호 쿼리를 위해서...
#$iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT

# TCP service
# ftp-data, 서버자체가 클라이언트가 될 경우...
$iptables -A INPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
$iptables -A INPUT -i eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

# ftp service
# ftp 를 이용할 수 있는 대역을 지정하였습니다. 좀더 세밀해 질 수 있겠죠.
#$iptables -A INPUT -s 아이피.0.0.0/8 -p tcp --dport 21 -j ACCEPT
#$iptables -A INPUT -s 아이피.0.0/16-p tcp --dport 21 -j ACCEPT
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 21 -j ACCEPT

# telnet
# telnet은 현재 서비스 하지 않습니다.
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 23 -j ACCEPT

# pop3s 를 이용하는 관계로 995번을 열고 있습니다.
#$iptables -A INPUT -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT

# ip 대역 예제.
# ip 대역뿐만 아니라 아래와 같이 상태접속을 지정할 수도 있습니다.
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

# UDP service
# udp 서비스는 하나뿐이죠?
#$iptables -A INPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT

echo -e "\nDone.\n"

exit;

[php4.4.5 설치]

1. php.org에서 php4.4.5 윈도우즈용 바이너리를 다운받자.

2. 받은 파일을 압축을 풀고 디렉토리 이름을 php로 변경하자.

3. php 디렉토리를 c:\에 복사하자.

4. php-default.ini는 삭제 , php-dist.ini는 php.ini로 변경하고,
php.ini를 Windows폴더에 복사하자.

5. Windows폴더의 php.ini를 수정하자.

5.1 register_globals = Off 로 되어 있는 항목을 확인하자.
    (On이라고 되어 있다면 $_ 로 시작하는 시스템 변수를 사용할 수 있다.
     기본으로 Off로 세팅하자.)
5.2 extension_dir = ".\"를  php폴더의 extensions폴더와 맞춰주자.
    -> extension_dir = "c:\php\extensions\"
5.3 ;Windows Extensions 항목을 검색한 후 자신이 사용할 dll들을 추가해주자.
    -> extension=php_mbstring.dll   // 문자열 연산을 위한 모듈
    -> extension=php_domxml.dll  // XML DOM를 사용하기 위한 모듈
    -> extension=php_iconv.dll  // 문자열를 안시나 유니코드로 변환하기 위한 모듈
    -> extension=php_mssql.dll  // MS-SQL를 위한 모듈

5.4 error_reporting  =  E_ALL & ~E_NOTICE 를 찾아서
    error_reporting  =  E_ALL로 변경해주자. 코딩 시 디버깅을 위해서..

5.5 display_errors 항목을 검색해서
    display_errors = On로 되어 있는지 확인하자.

5.6 mssql.textlimit를 항목을 검색하자.
    mssql.textlimit = 4096으로 되어 있다.
    4096값을 최대값 2147483647 으로 변경하자.

   
5.7 mssql.textsize를 항목을 검색해서 5.6과 같이 최대값으로 변경하자.

6. PHP DLL을 Windows\System32폴더에 복사하자.
6.1 c:\php\php4ts.dll
6.2 c:\php\dlls의 모든 dll (ntdblib.dll은 제외)
6.3 c:\php\extends의 모든 dll

7. inetmgr을 실행시켜서 IIS를 창을 띄운다.

8. 기본 웹 사이트의 속성 -> ISAPI 필터 -> 추가 -> 필터이름 : php, 실행파일 : c:\php\sapi\php4isapi.dll

9. 기본 웹 사이트의 속성 -> 홈 디렉터리 -> 구성 -> 매핑 -> 추가 -> c:\php\sapi\php4isapi.dll

10. 웹사이트를 재시작하자.
        net stop w3svc
        net start w3svc

11. PHP가 IIS에 제대로 설치되었나 확인하기 위해 test.php파일을 만들자.
<? phpinfo(); ?> 까지 적고 test.php로 저장하자.

IIS에서 test.php가 있는 디렉토리에 가상디렉토리를 만들고 test.php가 제대로 보여지는지 확인하자! 제대로 보여지지 않는다면 1번부터 11번까지의 다시 확인하자.

* 여기까지 PHP를 윈도우에 설치하고 IIS에 세팅하는 법이다.*

** php.ini를 수정하거나 iis의 속성을 변경하였을 경우 항상
웹서비스를 재시작하도록 하자! **

1. 사이트 방문후 최신버전 다운로드
  http://webdav.todo.gr.jp/download/

# wget http://webdav.todo.gr.jp/download/experimental/mod_encoding.c.apache2.20040616


2. 파일 이름 변경 (편의상 변경합니다.)
# mv mod_encoding.c.apache2.20040616 mod_encoding.c


3. 소스 수정
  80번째 라인
#include <iconv_hook/iconv.h>
===>
#include <iconv.h>

(설명)
  SULinux 를 비롯한 대부분의 리눅스는 iconv 라이브러리를 glibc에서 가지고 있습니다.
glibc-headers,glibc-devel 패키지만 설치되어 있다면, 가능합니다.


4. 아파치 모듈로 설치
# /usr/local/apache/bin/apxs -iac mod_encoding.c


5. 환경설정
  (환경설정 예제는 소스파일(mod_encoding.c)의 68번째 라인에 있습니다.)

<IfModule mod_encoding.c>
  EncodingEngine on
  SetServerEncoding EUC-KR
  AddClientEncoding SJIS   "Microsoft .* DAV"
  AddClientEncoding SJIS   "xdwin9x/"
  AddClientEncoding EUC-JP "cadaver/"
</IfModule>

  위와같이 진행하면 됩니다.

6. 테스트
환경 : SULinux 1.5
기타 버전 : Apache 2.0.59, PHP 4.4.4, Mysql 4.1.27
테스트 내용 : 환경설정 및 아파치 정지, 시작. 일본어파일 테스트 다운로드 테스트

환경2 : SULinux 1.0
기타 버전 : Apache 2.0.55, PHP 4.4.2, Mysql 4.1.18
테스트 내용 : 환경설정 및 아파치 정지, 시작. 일본어파일 테스트 다운로드 테스트

[로그 파일 관리하기]
시스템 관리자들은 정기적으로 로그 파일을 체크하고 관리해야 합니다.
리눅스에는 보안과 시스템 등에 관련된 다양한 로그 파일들이 존재하며, 주로 /var/log 디렉토리에 싸이게 됩니다.

dmesg
Linux가 시작될 때 나타나는 메시지들을 기록한 파일로 터미널에서 dmesg 명령을 입력하면 보여지는 내용과 동일합니다.
주로 시스템의 구동과 종료시에 문제점이 발생하는 경우 그 원인을 체크해 볼 수 있는 중요한 파일입니다.

messages
다양한 서버의 데몬이나 xinetd와 관련된 서비스를 사용할 때 기록되는 로그파일로 데몬에 문제가 발생할 경우 체크합니다.

secure
시스템에 로그인하거나 인증을 요하는 작업을 한 경우 기록되는 파일로 보안상 매우 중요한 로그입니다.

lastlog
각 사용자가 마지막으로 로그인한 날짜를 기록하고 있습니다. lastlog 명령어를 사용하여 확인할 수 있습니다.

wtmp
시스템에 접속한 모든 사용자의 로그를 기록하는 파일로 last, 명령어로 확인 할 수 있습니다.

xferlog
FTP 서비스의 엑세스를 기록하는 로그입니다.

로그 파일의 관리에 소홀하면, 로그 파일이 계속 커져 시스템 FULL 과 같은 장애가 발생하고
디스크에도 심각한 문제를 일으킬 수 있으므로, logrotate와 같은 프로그램으로 자동으로 로그파일을 순환시켜야 합니다. 

유닉스 및 리눅스 명령어

  유닉스 및 리눅스 명령어 팁

1. 서브 디렉토리까지 파일안의 문자열 모두 검색
find ./ -name "*" -exec grep 'abc' {} ; -print
find . -name -print -exec grep abc {} ;
grep -r abc *

2. haha와 huhu가 동시에 들어있는 행 뽑기
grep haha foo.txt | grep huhu

3. 찾아서 지우기
find / -name "*.eml" -exec rm -f {} ;

4. 공사중에 로그인 막기
/etc/nologin 이라는 파일을 만들어,공사중 또는 Under Construction이라는 공지를 넣으면 됨

5. 크기가 가장 큰 파일, 디렉토리 찾기
du -S | sort -n

6. 가장 큰 파일을 찾으려면
ls -lR | sort +4n

7. 현재 디렉토리의 크기만을 파악할때
# du -c -h --max-depth=0 *

8. 시스템 정보 감추기
/etc/inetd.conf 파일을 열어서,
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h

9. 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기
ps -aux | sort +4n 또는 ps -aux | sort +5n

10. FTP로 들어온 사용자 확인하기
ftpwho,ftpcount

11. 원하지 않는 사용자 죽이기
skill -KILL sunny
위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다.
그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는 skill -KILL -v pts/14 이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.

12. less 결과를 vi로 보기
less상태에서 v를 누르면 바로 vi로 감

13. vi에서 블럭 설정하기
alt+v 하면, 라인 단위로 블럭 설정을 할 수 있으며, 해제 하시려면 Esc를 누르면 됩니다.
또한 ctl+v를 하시면, 블럭 단위로 블럭을 설정하실 수 있습니다. 블럭을 설정 하신 뒤, 삭제를 하려면 x 복사를 하려면 y 붙여넣기는 p

14. man 페이지 프린트하기
man -t vi 0.0.0.15 ping 무시하기
echo 1 0.0.0.16 LILO 다시 살리기
boot : vmlinuz root=/dev/hda6

17. 특정 사용자 ftp 접근 막기
/etc/ftpusers 파일에 로그인 네임을 추가하면 됩니다.

18. X 윈도우에서 TV보기
리눅스에서 TV보기 위해서는 드라이버 파일과 TV를 보는 프로그램이 필요합니다.
이 글에서는 미지 리눅스 OS에 탑재된 bttv 칩셋을 사용하는 TV 카드를 기준으로 설명합니다.
만일 커널을 새로 컴파일 하실 분은 반드시 Character devices -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 를 실행하십시오.

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

20. 현재 rpm패키지의 의존패키지
rpm -qR 패키지명

21. 현재 디렉토리크기
du -h --max-depth=1 .

22. 바로 이전 디렉토리로 가기
cd -

23. 프로세스명으로 프로세스 죽이기
killall 프로세스명
kill -9 `pidof 프로세스명

24. 하드웨어 시계맞추기
배포본을 설치하고 나면 시간이 맞지 않는 경우가 많다. 간단히 어느정도 정확한 시간을 설정하는 방법이다.

[root@dev /down]# rdate -s time.kriss.re.kr
[root@dev /down]# clock -w

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


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

ln -sf /www/dir_1/r_photo /www/dir_2/r_photo


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 으로 해주셔야 합니다.

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 만)

29. =====>  맨아래..

30. 각자가 사용하는 컴퓨터의 정보를 알고 싶을때
[root ...]#more /proc/cpuinfo
위와 같이 치면 사용자의 컴퓨터 정보를 볼수 있으며,

[root ...]#more /proc/meminfo
라고 치면 사용자의 메모리 정보를 볼수 있습니다.

31. 전체 메일
먼저 보낼 내용을 텍스트로 파일로 만들어야 합니다.어디에서든지 가능하지요! [root@aromi /root]# vi nea
안녕하세요! 저희 서버에서는 웹서버를 오늘부터 시작합니다. 사용자 여러분의 많은 관심과 이용을 부탁드립니다.

:wq [root@aromi /root]#

만약, 한글을 사용하지 못하면 윈도우95에서 먼저 쓴다음에 ftp를 이용해서 올리면 됩니다. [root@aromi /root]# mail -s "[공지]" `cat /etc/passwd|gawk ?F :'{print$1}'`

[공지]-

32. 디렉토리만 빠르게 검색
ls -al | grep "^d"

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 명령을 내리시면 됩니다.

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

35. 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어
[root@aromi /root]# uname -a

36. 열려있는 포트 알아내기
netstat -anp | grep LISTEN

37. 텔넷 모든 접속자에게 메세지 보내기
wall 내용... Ctrl-D

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

39. 사용자가 어디에서 무엇을 하는지 알아내기
w라는 명령어를 사용하시면 된답니다. 이 때, w [-s] 를 붙여주시면 -s 옵션이 긴 정보 대신에 필요한 짧은 정보만 알려 준답니다.

40. 텔넷 화면 수정
로그인화면: /etc/issue.net 로그인후화면: /etc/motd

41. 하위 디렉토리 한꺼번에 만들기
mkdir -p music/koreanmusic/ost

42. 특정디렉토리의 모든 파일 안의 특정 문자열 치환
for i in $*; do
sed "s//opt/arm//opt/arm-linux/g" < $i > $i.new
mv -f $i.new $i
done (chihwan.sh를 포함하지 않는 디렉토리면)
find ./ -type f -exec 'chihwan.sh' {} ; s

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

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

45. vi 검색, 치환
구호스트 서비스 오늘 날짜에서 분류코드가 110100인 파일 찾기 :%s/./U&/g 모든문자-

46. 파일내의 중복되는 행을 제거 : uniq
입력 파일에서 연속되는 행을 비교하여, 두 번째 이상의 동일한 행들을 제거하고 나머지는 출력파일로 출력 연속되어 표시되지 않으면 동일한 행이 존재할 수 있음. sort 명령을 사용하여 정렬한 후 사용하는 것이 타당 사용법uniq [-cdu] [+|숫자] [입력파일 [출력파일]] -c : 각 행이 연속적으로 나타난 횟수를 행의 시작부분에 표시 -d : 연속적으로 반복되는 행만 출력 -u : 연속적으로 반복되지 않는 행만 출력 +숫자 : 행의 처음 '숫자' 만큼의 문자는 무시 -숫자 : 행의 처음 '숫자' 만큼의 필드는 무시

47. 파일의 결합
여러 개의 텍스트 파일을 하나의 파일로 순차적으로 묶는데 사용 cat [파일명1] [파일명2] ...
% cat

행단위 결합 : paste 여러 파일에 대해여 행간 결합을 수행하거나 하나의 파일에 대해 연속되는 행들을 결합 둘이상의 파일에 대해서 테이블상의 하나의 열과 같이 취급하여 동일한 행번호 끼리 결합 paste [파일명1] [파일명2].. paste -d리스트 [파일명1] [파일명2] ... paste -s [-d리스트] [파일명] d : 행간 결합시 행간 구분문자들의 리스트 s : 한파일의 연속되는 행을 결합 % cat 두 파일을 동일한 필드 값에 따라 행 단위 결합 : join

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

48. 파일의 암호화 : crypt
파일을 암호화 하여 키를 알지 못하는 사람은 내용을 볼 수 없도록 함 표준 입출력 사용

% cat < crypt.data1
Enter key:hello
test test
안녕하십니까?
%

49. 개행을 제외한 화면내의 보이지 않는 문자 출력
cat -v http://comp-cse.sch.ac.kr/~pl/lecture/linux/file2.html

50. 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기
grep -h '20030305......01' ./R00*

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"
--------------------------------------------------------------------------------

52. 어제 날짜 구하기
$ date -v-1d "+%Y-%m-%d" [컴퓨터분류]

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

[root@dream /root]# skill -KILL -v pts/14
이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.

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

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

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로 다시 압축하기)

iptables은 강력한 패킷필터링 툴입니다.
기존의 iptables에 관한 자세한 문서들이 많이 나와있지만
이 문서는 리눅스 환경을 전제로 하며 iptables의 초심자들을 위해 설명을 하고자 합니다.
오타나 틀린 내용이 있으면 홈페이지에 관련부분을 기제해주기바랍니다.


작성일 2002.10.13

작성자 : 김창현 [CTCquatre] http://www.eyetolife.com




[ 패킷필터링 지식 ]


패킷필터링이란?

패킷필터링은 지나가는 패킷의 해더를 보고 그 전체 패킷의 운명을 결정하는 것을 말한다.
(iptables의 경우 많은 개발중인 기능에서 헤더에 그치지 않고 data의 내용을 검토하기도 한다. 가장 대표적인것이 string match기능이다.)

*:(일반적으로 패킷은 헤더와 데이타를 가진다. 헤더에 필터링할 정보인 출발지IP:PORT,도착지 IP:PORT, checksum,프로토콜 옵셋등을 가지며 데이터는 각각의 전송데이터가 들어간다.)



리눅스 박스의 패킷필터링의 역사

리눅스는 커널 1.1버젼 부터 패킷필터링을 포함하기 시작했다.
제 1세대는 BSD의 ipfw을 기본으로 하였고
2.0버젼에서 ipfwadm이 사용되었으며
1998년에 2.2기반 패킷필터링툴인 ipchains를 내놓았다.
그리고 이글에서 논의하고자 하는 제 4세대 필터링툴인 iptables이 2.4커널을 위해
만들어졌다.



netfilter?

일반 iptables사용자들이 가장간과하기 쉬운부분중 한 부분이다.
iptables이 패킷을 필터링 하는것이 아니다.
패킷필터링은 커널에 탑제된 netfilter기능으로 하며
iptables은 단지 netfilter의 룰을 세워줄 뿐이다.
즉 다시 말하자면 iptables은 룰셋구축 툴이라는 말이다.







[ 패킷필터링 ]


iptables에 대해

iptable에 기본 Chain은 아래와 같다.

INPUT chain
FORWARD chain
OUTPUT chain

위의 3가지가 기본 체인이다. 체인들의 모식도는 아래와 같다.


------>INPUT------> Linux Box ------>OUTPUT--------->
---------↕----------------------------↕
---------└--------- FORWARD ----------┘


여러분의 Linux box를 도착지로 삼는 모든패킷은 INPUT Chain을 통과하게 되며
여러분의 Linux box에서 생성되 외부로 보내지는 모든패킷은 OUTPUT Chain을
통과하게 된다.

Forward chain은 *엄밀히 말하자면 도착지가 여러분의 Linux box가 아닌 패킷이 통과하게 되는 체인이다.

*:(다음문서에 다루게 될 Masqurading시에 패킷의 destnationIP정보는 여러분의 Linux box이지만 패킷의 최종도착지는 내부네트워크의 어떠한 컴퓨터일것이다)



지금 커맨드라인에 아래와 같이 쳐보기 바란다.

# iptables -A INPUT -j DROP

엔터키를 누르는 즉시 여러분의 Linux box로 오는 패킷은 모두 거부당할것이다. 즉 모든 통신이 끊어진다.

위의 룰을 굳이 말로 옮기자면

-A:룰을 추가한다
INPUT: 패킷이 들어오는 체인에
-j:패킷의 운명을 결정한다.
DROP: 패킷을 버려라.

즉, INPUT체인으로 들어오는 패킷을 모두 버리는 룰을 추가하는 명령이다.

적용시킨 룰을 보고 싶다면

# iptables -L

이라는 명령을 치면된다.

-A와 같은 위치에 있는 옵션은 아래와 같다.

체인에 새로운 규칙을 추가하기 (-A)
체인의 어떤 지점에 규칙을 삽입하기 (-I)
체인의 어떤 지점의 규칙을 교환하기 (-R)
체인의 어떤 지점의 규칙을 제거하기 (-D)
체인에서 일치하는 첫번째 규칙을 제거하기 (-D)

이제 위에서 내린 룰을 지워 통신이 되게 하자.
아래와 같이 명령을 내리면 된다.
# iptables -D INPUT 1
또는
# iptables -D INPUT -j DROP 하면 될것이다.

첫번째 방법은 index(룰의 순서)를 지정해서 지우는 방법이고, 두번째는 룰의 내용으로 지우는것이다.

-I,-R은 첫번째 방법과 유사하게 쓸수있다.





룰을 다시 세우고 목록을 보자.

# iptables -A INPUT -j DROP
# iptables -L

살펴보면

Chanin INPUT (policy ACCEPT)

위와 같은 줄을 볼수있을것이다.
저 줄 밑에는 여러분들이 세운 룰의 정보를 볼수있을것이다.

(policy ACCEPT)를 설명하자면 여러분들이 세운룰에 해당되지 않을때
마지막으로 기본정책을 따라 패킷의 운명을 결정하게 된다. 여기서는 ACCEPT이므로
패킷은 받아드려질것이다. 아지만 이것을 DROP으로하면 패킷은 버려질것이다.

그리고 패킷필터링을 알아가면서 여러룰들을 세울것이다.
기본적으로 룰은 세워진 순서대로 패킷을 검사한다.

이제 기본정책을 바꾸어 보자.

# iptables -P INPUT DROP

위의 명령을 내리고 다시 iptables -L을 하면

Chanin INPUT (policy DROP)으로 된걸 볼수있다.


-P와 동등 위치의 옵션은 아래와 같다.

새로운 체인 만들기 (-N).
비어있는 체인을 제거하기 (-X).
※ 이 두옵션은 직접체인을 만들었을경우와 제어할경우에 해당된다. 기본체인(INPUT,OUTPUT,FORWARD) 에는 해당되지 않는다.

미리 만들어진 체인의 정책을 바꾸기 (-P)
어떤 체인의 규칙들을 나열하기 (-L)
체인으로부터 규칙들을 지우기 (-F)
체인내의 모든 규칙들의 패킷과 바이트의 카운드를 0 으로 만들기 (-Z)




[ 패킷의 목적지또는 출처 제어 ]


패킷출처 제어옵션 -s

# iptables -A INPUT -s 192.168.10.10 -j DROP

위에 같은 명령을 내렸다면 192.168.10.10으로 부터 온 패킷은 모두 버려지게 된다.

-s(--source,--src와 같은 옵션이다.) : 패킷의 출처 IP 지정




목적지 제어옵션 -d

# iptables -A INPUt -d 192.168.10.12 -j DROP

위와 같은 명령을 내렸다면 192.168.10.12의 IP를 도착지로 가지고있는 패킷은 모두 버려지게된다.

-d(--destination,--dst와 같은 옵션이다.): 패킷의 도착지 IP지정


※ IP지정 이외에 몇 가지 방법이 더 존재한다.
-s www.xxxx.com : 도메인으로 제어
-s 192.168.10.0/24 : 네트워크 또는 집단으로 제어
-s 192.168.10.0/255.255.255.0 :위와 동일

※ 보통 프로그래밍 약속기호처럼 !는 역('not')이라는 것을 표시한다.
ex) -s ! 192.168.10.10 이라고 하면 "출발지가 192.168.10.10이 아닌" 이라는 뜻이된다.





[ 프로토콜 제어 ]

프로토콜제어 옵션은 -p이다

-p옵션의 인자는 TCP,UDP,ICMP가 될수있다.

# iptables -A INPUT -p TCP -j ACCEPT

라는 명령을 내렸다면 tcp프로토콜을 쓰는 모든 패킷은 ACCEPT에 의해 허락될것이다.

※ -p의 인자로 TCP,UDP,ICMP의 프로토콜번호를 알고있다면 번호를 써도 상관없다.

포트 제어

포트제어 옵션은 --sport와 --dport이다

--sport는 패킷의 출발지 포트이다.( --source-port와 같은 옵션이다.)

--dport는 패킷의 도착지 포트이다.( --destination-port와 같은 옵션이다.)


# iptables -A INPUT -p tcp --dport 80 -j DROP

위와 같은 명령은 tcp프로토콜의 80(www:웹서버포트)번 포트를 목적지로 하는 패킷을
버리는 것이다.

※ --dport나 --sport의 인자로 서비스이름을 적어도 된다.
ex) --dport www

※ 여러 포트를 지정해야 된다면 --dport 1024:65535 와 같이 지정할수있다.
뜻은 1024 부터 65535번까지라는 뜻이다.






[ 인터페이스 지정 ]

인터페이스는 -i (input interface), -o (output interface)로 지정할수있다.

# iptables -A INPUT -i eth0 -p tcp --dport 80 -j DROP

위의 명령은 -i eth0옵션을 빼고는 port지정 예와 같다.

-i eth0는 eth0로 들오는 모든 패킷을 뜻한다.

보통 리눅스 박스처럼 인터넷과 연결된 디바이스가 1개라면 필요없는 옵션이 되겠지만
만약 eth0, eth1등 2개이상의 인터페이스가 인터넷과 연결되어있다면 위의 옵션은 유용하게 쓰일것이다.

※ INPUT 체인은 -i 옵션만 쓸수 있고, OUTPUT 체인에는 -o옵션만 쓸쑤있다.
반면에 FORWARD 체인은 -i,-o 옵션 두가지 다 쓸쑤있다. 이유는 다음문서에서 다루겠다.



총괄적인 예:

# iptables -A INPUT -i eth0 -d 192.168.10.10 -p tcp --dport 80 -j DROP

해설: INPUT 체인에 - 입력인터페이스가 eth0이고 도착지가 192.168.10.10이고
프로토콜은 tcp이며 도착 포트는 80(www)인 패킷은 DROP시켜라.





이제까지는 별 다른 지식이 없이도 이해할수있는 부분이었다.
하지만 지금부터 나오게될 내용은 tcp/ip의 기반적인 지식을 가지고있어야
이해하기 쉬울것이다.
tcp/ip지식이 필요한 옵션에 대해서는 그에따른 자세한 설명을 하겠지만
이해가 되지 않는 부분은 다른 문서나 책을 찾아보길 바란다.





[ 패킷의 행동 유형에 따른 필터링(--tcp-flags,m state --state) ]


! 주의 : 밑에 나오는 모든옵션은 TCP프로토콜옵션(-p TCP)가 먼저
선행되어 있어야 적용되는 옵션이다.



1)
--tcp-flags 옵션은 상태에 따라 유용하게 설정할수있다.
이 옵션을 설정하는 가장 큰 예는 한방향으로만 통신이 되게끔설정하기 위해
많이 사용한다.
tcp/ip는 3핸드쉐이크의 접속방식이다.
즉. 접속요청패킷,접속허가 패킷,확인패킷

접속 단계를 좀더 자세하게 보면

C: Client S:Server

1) C --------- syn -------▷ S
2) C ◁------- syn ack ----- S
3) C --------- ack -------▷ S

이런식으로 접속절차가 이루어진다.

syn패킷은 접속요청 플래그(syn)가 설정된 패킷이므로 syn패킷만 막으면 상대편에서 접속을 할수 없다는 것이다.

※ Dos공격의 일종인 Syn Flooding이 서버에 위에서 말한 syn형패킷을 무수히 많이
보내는 것이다.


이제 본격적으로 --tcp-flags옵션으로 syn 접속형 패킷을 막는것을 하겠다.

# iptables -A INPUT -p TCP --tcp-flags SYN,RST,ACK SYN -j DROP

--tcp-flags에 첫번째 인자는 검사할 리스트 마스크이다.
두번째 인자는 설정되어있어야할 플래그다.
즉 syn,rst,ack플래그중 syn이 set이 1로 되어있으면 위의 --tcp-flags설정에
해당이 되므로 패킷은 DROP된다.


위의 옵션과 같은 뜻을 가진것이 있는데 그것은 --syn이다.
--syn은 '--tcp-flags SYN,RST,ACK SYN'의 뜻을 가지고 있다.





2)
--tcp-flags보다 더 간단하게 설정하는 방법이 있다.
바로 tcp의 상태천이 다이아그램을 축소시켜 놓은듯한 느낌을 받는 상태에 따른 패킷분류를 iptables은 지원한다.

이것은 확장기능이므로 -m 플래그로 설정은 한다.

사용옵선은 -m state --state 이다.

인자값으로 들어가야할 상태에따른 리스트는 아래와 같다.



NEW : 새로운 접속을 만드는 패킷

ESTABLISHED :존재하는 접속에 속하는 패킷 (즉, 응답 패킷을 가졌던 것)
즉 접속이 허가되고 통신하면서 발생되는 패킷이다.

RELATED :기존의 접속의 부분은 아니지만 연관성을 가진 패킷으로 .
ICMP 에러 나 (FTP 모듈이 삽입 되어있으면) ftp 데이터
접속을 형성하는 패킷.

INVALID :어떤 이유로 확인할 수 없는 패킷. 알려진 접속과 부합하지 않는 ICMP 에러와
'out of memory' 등을 포함한다. 보통 이런 패킷은 DROP 된다.



이제 이 state 옵션을 사용해보자

위의 --tcp-flags옵션에서 예제와 같은 작용을 하는 룰을 만들어보겠다.

# iptables -A INPUT -p TCP -m state --state NEW -j DROP

왜 룰이 이렇게 되는지 차근차근 읽어보았다면 쉽게 이해가 될것이다.

일반적으로 서버는

# iptables -A INPUT -p TCP --dport 특정포트 -m state --state NEW,ESTABLISHED -j ACCEPT

이렇게 룰을 많이 세운다.
뜻은 tcp 특정 포트에 new:접속패킷과,established:통신패킷(정확히 쉽게 설명할
단어가 생각나지 않아 부적절하지만 통신패킷이라 부른다)을 허용하라.


그리고 클라이언트 측에서는 위의 state상태에서 NEW를 빼고 사용한다.

# iptables -A INPUT -p TCP --sport 특정포트 -m state --state ESTABLISHED -j ACCEPT

왜 NEW를 뺄까? 그 이유는
그 이유는 클라이언트입장에서 보면 접속을 허가해달라는 패킷이 필요없다는것이다.
더 쉽게 말하자면 클라이언트는 접속허가를 요청하는 위치이지 요청받는
위치가 아니라는 말이다.
그러므로 ESTABLISHED만 있으면 일반적으로 통신하는데 아무런 문제가 없다

그리고 주의깊게 본 사람이라면 위에 --sport가 쓰여진것을 볼수있을것이다.

왜 서버에서는 --dport로 제어를 하면서 클라이언트는 --sport로 제어를 할까?

지금 리눅스 박스라면 wget을 쓰던지 x-windows에서 브라우져를 쓰던지 아무런 웹사이트에 접속을 하고 바로 콘솔에서 'netstat -nat'라는 명령을 내려보자.

무슨말인지 알겠는가?

서비스를 한번이라도 해본적있는 사람이면 알겠지만 서버는 특정PORT를 열어놓고 접속을 기다린다.
클라이언트는 특정 서버에 접속을 하기 위해 별도로 포트를 생성하고 접속을 시도한다.
이때 클라이언트가 생성하는 포트번호는 1024이후의 랜덤값이다. 이런이유로 클라이언트입장에서는
--dport로 제어를 하지않는게 보통이다. 제어를 하더라도 상관없다. 하지만 그것은
상당한 비효율적인 룰이 될것이다.



[ftp를 위한 상태천이를 이용해 룰 설정]


ftp는 참 유별난 프로토콜이다. 특히 마스커레이드때 쓰이는 nat과 잘 맞지도 않을뿐더러.
ftp서버에서 passive모드로 운영을 할시 iptables로 제어하고 싶다면 따로 모듈이 필요하다.


passive로 1025:65535까지 임이의 데이타 전송포트를 쓸때
상태천이로 제어를 하자면,보안상 NEW를 사용하지 않는다.
즉,새로운 접속을 허가하지 않고
RELATED로 기존접속에 관련된것만 접속을 허용한다.

즉 실제 룰을 보면 아래와 같다

# iptables -A INPUT -p tcp --dport 1024:65535
-m state --state ESTABLISHED,RELATED -j ACCEPT

※ 만약 NEW를 사용한다면 방화벽 구실을 못할것이다.
왜그런지는 직접 생각해보라 위에서 이미 충분히 설명하였다.


ftp에서 위처럼 RELATED로 방화벽룰을 설정했다면
ip_conntrack_ftp라는 모듈없이 연결이 제대로 되지 않을것이다.

ip_conntrack_ftp는 ftp서버의 ftp접속 추적 모듈이다.





[ 조각(Fragments) 처리하기 ]


때때로 하나의 패킷이 한 번에 한 회선을 통과하기에는 너무 큰 경우가 발생한다.
이 때는 패킷이 `조각'으로 나뉘어 여러 개의 패킷으로 전송된다.
받는 쪽에서는 이 조각을 모아 하나의 패킷으로 재구성한다.


패킷 필터링 HOWTO에서는 nat이나 접속추적을 할때에는 분절패킷이 하나의 패킷으로

재구성되어 필터링되기때문에 해당되지 않는다고 명시되어 있다.

하지만 위와 같은 상황이 아니라면 조각을 처리해야하나 안전성을 이유로 처리하지
않는 것을 권장하고 있다. 그 이유는 아래에 설명할것이다.

일반적으로 패킷이 분절(토막)될때 필터링을 할 정보인 특히 발신지 포트,
목적지 포트, ICMP 유형, ICMP 코드 또는 TCP SYN 플래그등은 첫번쩨 패킷의
헤더에 밖에 포함되지 않는다. 즉 두번째 분절패킷부터는 그 정보가 없다는 말이다.
이를 위해서 우리는 분절된 패킷을 처리하기 위해 -f 옵션을 사용한다.

하지만 -f옵션을 권장하지 않는다. 왜냐하면 첫번째 필터링정보가 담긴 헤더를 보고
필터링을 할때 그 패킷이 거부하는 룰에 적용되어 거부되면 분절된 패킷이 거부되지
않고 오더라도 그것은 하나의 패킷으로 재구성 되지 않고 버려지기 때문이다.


사용법은

# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP

처럼 사용한다.
위의 뜻은 192.168.1.1을 항해 나가는 분절된 패킷은 모두 버린다 이다.

다시 한번 말하지만 꼭 필요한경우를 제외하고 이 옵션은 권정하지 않는다.






이정도로 iptables의 기본 사용법에 대해 마치고자 한다.
이문서에서는 방화벽설정에서 자주 사용하게 되는 옵션에 대해서만 언급했다.
아니 이정도 옵션들이면 어느정도 방화벽은 구성할수 있을것이다.
나머지 옵션들은 man패이지나 패킷필터링 HOWTO에서 찾아보기 바란다.
여기서 다루지 않은 forward체인과 nat구성,mangle테이블사용은
다음문서에서 다룰것이다.

'공부 해 Boa요. > Linux Server' 카테고리의 다른 글

리눅스 로그파일 관리하기  (0) 2008.03.25
유닉스 및 리눅스 명령어  (0) 2008.03.25
Apache Tunning  (0) 2008.03.10
리눅스 가상 IP 설정Ⅱ  (0) 2007.11.23
리눅스 가상 IP 설정Ⅰ  (0) 2007.11.23
1. 웹 페이지 로딩시간 확인
#time -pa lynx -source http://www.gwise.com > /dev/null
real 0.74
user 0.16
sys 0.09
-------------
실제 접속시간 : 0.74-(0.16+0.09)=0.49초

2. 아파치 벤치 마킹
#man ab 사용법 보기
-n requests 요청을 수행할 개수
-c concurrency 요청을 만들 개수로 동시 사용자 개념으로 이해하면 되겠다.
-v verbosity 얼마나 자세한 정보를 화면에 출력해 줄 것인지 결정
-w HTML 문서형식으로 테이블로 만들어 결과를 화면에 출력
-k HTTP 프로토콜의 지속연결 (KeepAlive) 기능을 사용

#./ab -n 100 -c 10 http://www.gwise.com:80/
10 명의 유저가 동시에 http://www.gwise.com/index.html 을 요청하는 것을 모
의 실험.
각각의 시뮬레이트 유저는 요청을 10 번씩 하게 됩니다

# ab -n 1500 -c 50 http://www.apache.kr.net:80/
요청을 30 x 50 (50 명의 사용자가, 각각 30 번의 요청)

Requests per second: 80.48
초당 80.48개를 요청 했음.

'MaxRequestsPerChild’ 는 메모리 누수현상(?) 등이 발생하지 않는다면 가능
한 이 값을 높게 설정하시고요(파라미터의 값을 0 으로 설정해 무한대로 하실
수도 있습니다) StartServers’ 는 프로세스가 active 되어 있는 경우가 적을
경우 값을 낮게 설정하시고, 접속량이 아주 많을 경우는 MaxClients 에 가깝
게 조절하시기 바라며, MaxSpareServers 를 MaxClients 와 같게 설정합니다.
MaxClients 는 너무 낮게 설정하지 않도록 주의하시기 바라며, 그렇다고 또 너
무 크게 잡으셔도 안됩니다


3. 웹 서버 삽질 막기
BrowserMatch "WebZip" go_out
BrowserMatch "Teleport" go_out
BrowserMatch "GetRight" go_out

[CODE]<Directory "/home/gwise/public_html"> .... Deny from env=go_out </Directoy>[/CODE]

4. 아파치 튜닝
일반 서버에서는 다른것은 그냥 Default 값으로 둔다.
(대형 서버의 경우 말고는 특히 쓸 일어 없을 것이다.)

증가 시킬 경우 배수로 한다. 꼭 이렇게 해야 한다가 아니라
이렇게 하면 좋다.

Timeout 300
클라이언트의 요청에 의해서 Server와 연결 되었을때
클라이언트와 서버간의 아무런 메시지가 발생하지 않았을때
오류로 처리하는 시간
네트워크 속도가 나쁠수록 수치값을 높게 한다.

KeepAlive on
지속적인 접속, 즉 서버 연결에 대하여 한번 이상의 요청을 허용 여부.

MaxKeepAliveRequests 100
클라이언트가 접속된 시간동안 아파치 서버에 요청할 수 있는 처리 process 개


StartServers 5 X ? =20 -> 초반에 뜰 process 그 이상 그이하의 의미도 없
다.
MinSpareServers 5 X ? =20 -> Spare 프로세스가 이것 이하 일때 끌어 올려
준다.
MaxSpareServers 10 X ? =40 -> Spare 프로세스가 이것 이상 일때 진정(?)시
켜 준다.
말 그대로 Spare.... 언제 있을지 모를 요청에 대해서 컴퓨터 스스로가
조절해 준다.

MaxClients 150
클라이언트들이 동시에 최대로 접속했을때 가능한 최대 서버이 수를 지정.
Ulimit -a ~~~ max process...이 수치 이상 증가 못함.
httpd.h
HARD_SERVER_LIMIT=250 조정해서 다시 컴파일 가능

MaxClient 150 -> 동시에 떠 있을수 있는 최대 process
더 많은 수를 원할시 httpd.h 소스 파일의
HARD_SERVER_LIMIT 값을 수정 한 다음 다시 컴파일 해야 한다.

#ulimit -a
core file size (blocks) 0
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes 2048
pipe size (512 bytes) 8
open files 1024
virtual memory (kbytes) 2105343
-----------------------
위의 max user processes 의 수를 초과 할 수 없다.

MaxRequestPerChild 100
한 프로세스가 몇 번의 서비스를 하고 소멸될 것인지 정한다.
M$계열에서는 별 의미가 없으므로 0을 한다.
하지만 Unix 계열은 0을 사용하지 않는 것이 좋다.

가장 중요한 것은Timeout 설정입니다. 위에서 keep-alive 를 설정해 놓은
경우, 하나의 connection에서 계속해서 다음 request를 처리할 수 있기 때문
에 효율적
이라고 하지만, 실제로는 그렇지 않습니다. keep-alive 를 허용하고 그
timeout을
5초로만 설정해도, 하나의 request를 처리한 후 적어도 5초동안은 그 httpd가
다른
작업을 하지 못하고 다음 request를 기다리게 됩니다.

보통 웹브라우저들은 서버로 동시에 4개의 connection을 만들게 됩니다. 한 페
이지를
보는데 이미지 등등 해서 보통 4개의 connection을 만드는 것은 기본이죠. 이
렇게 되면
httpd가 100개 떠 있다고 해도, 실제로는 동시에 25명의 방문자밖에 처리하지
못합니다.

그리고 keep-alive timeout이 5초인 경우, 한 명의 방문자를 처리한 후 적어
도 5초동안은
계속해서 기다리면서 httpd가 놀게 됩니다.(그렇다고 해서 httpd의 수를 늘여
주면 앞의
문제 때문에 load가 몰릴 때 순간적으로 부하가 지나치게 많이 걸리게 됩니
다. 어떤
request는 수초가 지난 후 답을 받는 등 quality of service가 많이 떨어지
죠.)

결국 한 명의 방문자를 처리하는데 4개의 httpd가 5초동안 작업한다는 뜻이
고, 100개의
httpd를 띄워봐야 1초에 5명의 방문자밖에 처리하지 못하는 셈입니다. ( 1
명 / 5 sec /
4 httpd = 5 / 1 sec / 100 httpd )

그래서 검색엔진 서비스 등 traffic이 많은 사이트에서는 keep-alive 옵션을
반드시 꺼
놓게 됩니다. 그리고 connection timeout도 상당히 짧게 설정해 놓죠. 4~5초
이내로 말입니다


5. 아피치 튜닝-2(로그기록 로테이트로)
/home/apache/conf/httpd.conf
CustomLog /home/apache/logs/access_log common
TransferLog "|/home/apache/bin/rotatelogs /home/apache/logs/access_log
86400"
TransferLog "|/home/apache/bin/rotatelogs /home/apache/logs/error_log
86400"
--------------
24시간 마다 로그 화일을 갱신해 준다.
24X60X60=86400초

6. 아파치 에러 메시지 바꾸기
httpd.conf
Customizable error response (Apache style)
2) local redirects
ErrorDocument 404 /cgi-bin/missing404.pl

missing404.pl
---------------
[CODE]#!/usr/bin/perl print<<"(END_HTML)"; Content-type: text/html\n\n <head><title> 요청한 URL 이 없습니다. </title> <meta http-equiv="content-type" content="text/html;charset=EUC-KR"> </head> <body> <br/><br/><center> <b><h2>요청하신 http://www.gwise.com$ENV{'REQUEST_URI'} 이 <br/> 존재 하지 않습니다.<br/></h2></b> <br/><br/><h4> <a href="mailto:gwise\@orgio.net"> 서버관리자 </a> 에게 문의 바랍니다.</h4><br/> (END_HTML) exit;[/CODE]
---------------

7. 아파치 에러 코드
HTTP 1.1 status codes [TOP]

100 : Continue
101 : Switching protocols
200 : OK, 에러없이 전송 성공
201 : Created, POST 명령 실행 및 성공
202 : Accepted, 서버가 클라이언트 명령을 받음
203 : Non-authoritative information, 서버가 클라이언트 요구 중 일부만 전

204 : No content, 클라언트 요구을 처리했으나 전송할 데이터가 없음
205 : Reset content
206 : Partial content
300 : Multiple choices, 최근에 옮겨진 데이터를 요청
301 : Moved permanently, 요구한 데이터를 변경된 임시 URL에서 찾았음
302 : Moved temporarily, 요구한 데이터가 변경된 URL에 있음을 명시
303 : See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음
304 : Not modified
305 : Use proxy
400 : Bad request, 클라이언트의 잘못된 요청으로 처리할 수 없음
401 : Unauthorized, 클라이언트의 인증 실패
402 : Payment required, 예약됨
403 : Forbidden, 접근이 거부된 문서를 요청함
404 : Not found, 문서를 찾을 수 없음
405 : Method not allowed, 리소스를 허용안함
406 : Not acceptable, 허용할 수 없음
407 : Proxy authentication required, 프록시 인증 필요
408 : Request timeout, 요청시간이 지남
409 : Conflict
410 : Gone, 영구적으로 사용할 수 없음
411 : Length required
412 : Precondition failed, 전체조건 실패
413 : Request entity too large,
414 : Request-URI too long, URL이 너무 김
415 : Unsupported media type
500 : Internal server error, 내부서버 오류(잘못된 스크립트 실행시)
501 : Not implemented, 클라이언트에서 서버가 수행할 수 없는 행동을 요구

502 : Bad gateway, 서버의 과부하 상태
503 : Service unavailable, 외부 서비스가 죽었거나 현재 멈춤 상태
504 : Gateway timeout
505 : HTTP version not supported

'공부 해 Boa요. > Linux Server' 카테고리의 다른 글

유닉스 및 리눅스 명령어  (0) 2008.03.25
IPTABLE 기본 사용법  (0) 2008.03.10
리눅스 가상 IP 설정Ⅱ  (0) 2007.11.23
리눅스 가상 IP 설정Ⅰ  (0) 2007.11.23
리눅스시스템 정보 보는 방법  (0) 2007.11.10
OpenCV 프로젝트 사이트
http://sourceforge.net/projects/opencvlibrary


OpenCV 국내 커뮤니티
http://www.opencv.co.kr/

OpenCV 라이브러리를 이용하기 위한 Microsoft Visual Studio 6.0 및 .NET 설정
http://cafe.naver.com/opencv/1

영상처리 관련 책(OpenCV 이용)
http://www.hanb.co.kr/look.php?isbn=978-89-7914-490-1

'공부 해 Boa요. > C & C++' 카테고리의 다른 글

getchar()  (0) 2006.11.02
http://www.developer.com/net/csharp/article.php/3710176

params 키워드를 이용하여 메서드에 가변인자 전달하기.

public void ObjectParams(string Message, params object[] p)
{
Console.WriteLine(Message);
for (int i = 0; i < p.Length; i++) {
Console.WriteLine(p[i]);
}
}




ObjectParams("Variable Object Parameters", 12, 'z', "Test");


아니면 배열로 만들어 전달하기.
int[] TestIntArray = new int[5] { 11, 12, 13, 14, 15 }; IntParams("Integer Array Parameter", TestIntArray);

'공부 해 Boa요. > C# & .NET' 카테고리의 다른 글

c# 과 .net ( 닷넷 ) 이란 무엇인가 ?  (0) 2008.01.11

- .net ( 닷넷 ) 은 무엇인가 ?

Microsoft .NET은 Microsoft XML 웹 서비스 플랫폼입니다.
 XML 웹 서비스는 운영 체제, 장치 또는 프로그래밍 언어에 관계 없이 인터넷을 통해 응용 프로그램에서 데이터를 통신하고 공유할 수 있게 해줍니다.
Microsoft .NET 플랫폼은 개발자에게 XML 웹 서비스를 만들고 이들을 서로 통합하는 데 필요한 기술을 제공하고, 일반 사용자에게는 완벽하고 안전한 환경을 제공합니다.


- C#.NET이란?

C#은 닷넷 기술의 중심에 있는 언어로서 닷넷 기술을 제대로 구현하기 위해서 탄생한 언어라고 할 수 있다. 닷넷 기술은 C, C++, Visual Basic이나 Java로도 구현할 수 있지만, 닷넷 기술에 맞게 구현된 언어이기 때문에 C#이야말로 닷넷에 가장 적당한 언어라고 할 수 있다.
닷넷 기술의 중심에 있는 C#은 자바를 겨냥해서 만든 언어라는 얘기도 있는데, 자바에 대해서 주도권을 잃어 가는 MS가 자바에 대항해서 만든 언어라고 하기에, 자바와 흡사한 부분이 Common Language Runtime도 자바의 Virtual Machine에 유사하기 때문이다. 따라서 향후 MS의 강력한 마케팅 때문에 C#이 앞으로 전망이 있지 않을까 하는 생각을 업계에서는 하고 있다.


- C#.NET의 특징

C#의 특징은 기본적으로 콤포넌트 기반의 언어라고 하는데, 콤포넌트란 쉽게 말해서 기계의 부품이라고도 볼 수 있다. 즉, 자동차를 만들 때 자동차 부품을 자동차 회사에서 다 만들지 않는 것처럼 자동차 부품들은 별개의 자동차 부품회사에서 만든다.
그러면 자동차 회사에서는 그러한 부품들을 조립하여 자동차를 만들게 되듯이 프로그램도 자신이 프로그램 전체를 개발하지 않고 다른 사람이 만든 콤포넌트를 자신의 프로그램에 삽입하여 프로그램을 완성하는 것이다.
C나 C++도 이러한 기능을 갖고 있지만, 여러 문제점을 갖고 있기 때문에 이러한 문제점들을 극복하려는 목적으로 만들어진 언어인 C#은 콤포넌트로 구성하고 콤포넌트를 삽입하기 적당한 언어이다.
기존의 무선인터넷 기술인 WAP, ME 등이 Browser 기반으로 단순한 텍스트와 제한된 이미지 제공의 한계를 가져 이용 활성화가 어려웠음에 반하여, GVM은 사용자가 필요한 어플리케이션을 자유롭게 선택한 후 다운로드하여 실행함으로써 무선 단말기의 기능을 무한하게 확장할 수 있도록 한 기술이다.

'공부 해 Boa요. > C# & .NET' 카테고리의 다른 글

C#의 가변인자 전달  (0) 2008.01.18
저자: 스콧 오크스, 역 이호재
 
보안을 고려하는 것은 자바 플랫폼의 디자인에 많은 영향을 미친다. 이러한 예로는 전자 서명을 위한 클래스를 포함한 보안 메니저와 J2SE(자바 2 표준 버전)가 있다. 또한 자바 2 1.3 버전에는 세 가지 중요한 보안 확장이 있다. 더군다나 보안은 자바의 클래스 로더의 디자인과 배열 경계 체크 등의 많은 언어 규칙과 java.lang.String 클래스와 같은 많은 클래스의 구현에 영향을 미친다.
 
자 어디서부터 시작해야 할까? 『Java Security, 2nd Edition』(『자바 시큐리티 프로그래밍』, 한빛미디어, 2001)에서는 자바 보안 구조의 개관부터 시작해서, 중요한 자바 보안 도구를 이용하는 방법과 로드하는 클래스의 추가적인 퍼미션을 위해 URL 클래스 로더를 사용하는 것, 그리고 P와 Q라는 특별한 매개변수(DSA 키를 계산하는데 사용되는 매개변수)를 통해 DSA 키를 생성하는 것까지 자바 보안과 관련된 모든 것을 다룬다. 이 기사에서는 여러분들이 어디서부터 시작해야 할지를 알려주는 가장 중요한 팁들을 간추려 놓았다. 그러면 지금부터 자바 보안 구조를 이용하기 위한 10가지 팁을 살펴보도록 하자.
 

자바 시큐리티 프로그래밍
 
1. 모든 것은 보안 관리자와 함께 실행시켜라.
 
가장 잘 알려진 자바 보안 구조의 양상은 애플릿이 특정 옵션을 수행함에 있어 제한적이라는 점이다. 이 제한은 보안 관리자에 의해 강제로 통제된다.
 
그렇지만 보안 메니저는 단지 애플릿을 위한 것이 아니라는 점을 알아두어야 한다. RMI 서버와 같은 애플리케이션도 올바르게 작동되기 위해서는 보안 관리자를 설치해야 한다. 물론 모든 애플리케이션은 보안 관리자로부터 이득을 얻을 수 있다. Acme 소프트웨어로부터 자바 애플리케이션을 방금 다운받았다고 가정해보자. Acme는 믿을만한 소프트웨어 회사이기 때문에 그 소프트웨어에 바이러스를 심어놓지는 않았을 것이다. 하지만 우연하게 소프트웨어에 바이러스가 포함될 수는 있으며 심지어 아주 유명한 소프트웨어 회사도 자신들도 모르는 사이에 바이러스에 감염된 소프트웨어를 배포한 사실이 있다.
 
Acme에서 제작한 소프트웨어가 C++로 작성되었다면 발송하기 전에 소프트웨어가 바이러스에 감염되지 않았기를 바라는 것 이외에는 할 수 있는 게 별로 없다. 하지만 소프트웨어가 자바로 제작되었다면 이야기는 달라진다. 여러분은 그 소프트웨어를 보안 관리자의 보호 아래 실행 할 수 있기 때문이다. 따라서 소프트웨어가 중요한 시스템 파일이나 기타 다른 중요한 문서에 접근하거나 삭제할 수 없게 방지할 수 있다.
 
보안 관리자를 사용하는 것은 모든 자바 프로그램에 있어서 선택사항이다. 애플릿을 실행하는 컨테이너(애플릿뷰어나 자바 사용 가능한 브라우저 등)의 경우 자동으로 보안 관리자를 설치한다. 그렇지 않으면, 보안메니저를 설치하는 것은 여러분에게 달려있다. 만약 여러분이 애플리케이션을 만든다면 이것은 프로그램 절차에 따라 실행될 수도 있지만 자바를 시작할 때 -Djava.security.manager라는 플래그를 포함하여 명령 라인에서 보안 관리자의 사용을 명세해 주는 것이 훨씬 더 쉽다.
 
자바 초창기에는 자바 보안 모델의 '심각한 결점'(명령행에서 실행하는 애플리케이션이 파일을 읽을 수 있거나 네트워크 연결을 할 수 있다는 점 등등)에 대해 사람들이 말하는 것을 종종 들을 수 있었다. 그렇지만 지금은 대부분의 사람들이 이러한 관점에서 애플리케이션과 애플릿의 차이는 구분해 낸다. 그리고 그들 중 아주 소수만이 보안 관리자와 함께 애플리케이션을 실행해야 함을 깨닫고 다음 단계로 더 발전해 나간다
 
2. 인증서의 사용을 고려하라.
 
자바 보안 인프라의 특징 중 대다수가 디지털 인증서(정확히는 X509 인증서)에 기초하고 있다. 여러분은 .jar 파일 안에 들어있는 코드에 더 많은 퍼미션을 주기 위해 .jar 파일에 디지털 인증서로 서명을 한다. 또한 SSL(Secure Socket Layer)을 사용하는 서버를 설치하기 위해 디지털 인증서를 사용하며, 암호화를 위해 디지털 인증서를 사용할 수도 있다.
 
100% 완벽한 세상에서는 우리 모두가 디지털 인증서를 가지고 있기 때문에 그것을 아주 간단하게 사용할 수 있다. 하지만 실제 세계는 100% 완벽이라는 말과는 거리가 멀다. 디지털 인증서는 다루기가 어려우며, 자바에 들어있는 도구들은 기업은 말할 것도 없고 워크그룹을 위한 디지털 인증서 집합을 다루기에도 적합하지 않다. 설상가상으로 자바 애플리케이션과 다른 애플리케이션 간의 디지털 인증서를 공유하는 것은 어렵다.
 
하지만 다행스럽게도 디지털 인증서를 위한 인프라가 최근 몇 년 동안 급격히 발전했다. 사실 디지탈 인증서를 얻는 일이 이보다 더 쉬운 때는 없었던 것 같다. 단순히 Thawte 웹사이트를 방문한 다음 '개인 인증서'를 클릭하면 되기 때문이다. 일단 웹사이트의 개인 인증서 프로그램에 등록했다면 여러분은 모든 자바 애플리케이션에서 사용할 수 있는 여러분만의 인증서를 갖게 된 것이다. 이것은 무료일 뿐만 아니라 획득하기도 쉽다.
 
하지만 자바의 가장 중요한 보안 기능을 이용하기 위해 반드시 인증서가 필요한 것은 아니라는 점을 기억하고 있는 것이 좋다. 특히 추가적인 퍼미션을 갖기 위해서 코드를 서명할 필요는 없다는 뜻이다. 자바가 작업을 수행하는 퍼미션은 코드가 로드되는 위치와 코드를 서명한 사람의 조합에 기초하여 결정된다. 이 조합의 두 부분은 모두 선택적이다. 만약 oreilly.com에 있는 코드가 시스템에 있는 파일들을 읽을 수 있는 퍼미션을 갖게 하려면, 단순히 java.policy 파일에 다음과 같은 항목만 만들면 된다.
 
grant codebase "http://www.oreilly.com/" {
    permission java.io.FilePermission "<<ALL FILES>>", "read";
};
 
만약 인터넷과 같이 네임 서버를 신뢰할 수 없는 네트워크상에 있다면 위와 같이 오직 URL에만 의존한 퍼미션은 실행하기에 위험한 일이다. 하지만 만약 안전한 네트워크상에 있거나 클래스를 파일 시스템으로부터 로딩하고 있다면 이것은 실행하기에도 안전하다고 말할 수 있다. 만약 당신이 작성한 자바 애플리케이션을 배포하려 한다면 사용자로 하여금 애플리케이션을 https 상에서 다운받게 하고 애플리케이션 .jar 파일을 로컬에 설치하게 하고 적절한 파일에 근거한 URLs 적절한 퍼미션을 부여하게 하는 것이 좋다.
 
3. 자바 플러그인과 RSA 인증서를 사용하라.
 
만약 인터넷상에서 애플리케이션을 실행하고 그것에 추가적인 퍼미션을 할당하기를 원한다면 애플리케이션을 포함하고 있는 .jar 파일에 서명을 하고 사용자에게 서명한 .jar 파일에게 추가적인 퍼미션을 허용하도록 요구하는 방법밖에 없다.
 
극소수의 브라우저만이 자바 2 보안 모델을 지원한다(넷스케이프 6과 오페라 브라우저만이 자바 2 보안 모델을 지원함). 인터넷 익스플로러나 이전 버전의 넷스케이프를 포함한 다른 브라우저들은 자바 플러그인을 통해서만 자바 2 보안 모델을 지원할 수 있다. 즉 이러한 브라우저에 내장된 자바 가상 머신은 자바 2 보안 모델을 지원하지 않는다(자바 2의 고분고분한 요구에도 불구하고).
 
이 경우 여러분이 할 수 있는 최선의 방법은 자바 플러그인을 사용하는 것이다(넷스케이프 6 및 오페라는 자동적으로 자바 플러그인을 사용하도록 되어있음). 그리고 자바 플러그인을 사용함으로써 얻을 수 있는 추가적인 이익이 있다. 대개 사용자들은 policytool을 실행하거나 특정 지역에서 로딩된 코드를 위해 명시적으로 퍼미션을 나열하거나 특정 조직에 의해 서명된 하나 또는 그 이상의 java.policy 파일을 편집함으로써 퍼미션을 부여한다. 하지만 만약 애플릿을 RSA 인증서를 통해 서명하고 자바 플러그인 1.3 버전 이상을 통해 실행한다면 사용자는 정책 파일을 수정할 필요가지는 없다(물론 정책 파일이 무엇인지 알고 있을지라도 수정할 필요가 없다). 자바 플러그인이 RSA 인증서에 의해 서명된 애플릿을 만나면 자바 플러그인은 그 애플릿이 보안 관리자가 애플릿에게 부여하는 모든 제약들을 무시해도 되는지를 물어보게 된다. 사용자는 그 애플릿이 현재 세션에 있는 모든 제약을 풀어주도록 허용할 수 있다. 현재 세션뿐만 아니라 항상 그러한 권한을 줄 수도 있고, 아예 안 줄 수도 있다.
 
특별한 정책 파일도 없을 뿐만 아니라 특별한 퍼미션도 필요 없다. 사용자가 조작할 수 있는 간단한 대화상자만이 필요할 뿐이다.
 
4. 보안 확장 모듈을 설치하라
 
자바 보안 구조를 위한 3가지 중요한 확장 모듈이 있다. 첫번째로 JCE(Java Cryptography Extension)는 다양한 알고리즘을 사용하는 강력한 암호화 모듈로 이를 이용해 코드를 개발할 수 있게 해준다(추가로 보안키 교환 같은 작업도 가능). 두 번째로 JSSE(Java Secure Sockets Extension)은 SSL 자바 인터페이스를 제공한다. 마지막으로 JAAS(Java Authentication and Authorization Service)는 프로그램을 실행시키는 엔드유저의 신분을 확인하고, 특정 엔드유저만이 특정 작업을 수행하도록 인증한다.
 
현재는 자바 2 플랫폼 1.3 버전을 위한 확장 모듈이 있다. 즉 이 모듈들을 각각 다운받아야 하며 번들되거나 번들되지 않은 확장 모듈로 사용해야 함을 의미한다. 이것들은 번들된 확장 모듈로 사용하는 것이 훨씬 쉽다. 이 경우 .jar 파일을 $JAVAHOME/lib/ext에 설치하면 세팅이 끝난 것이기 때문이다. 그러나 번들되지 않은 확장 모듈의 경우 애플리케이션을 위해 .jar 파일을 classpath에 포함시켜야 하는 수고를 더 들여야만 한다.
 
위에서 언급한 확장 모듈을 어떻게 설치하든 간에 이러한 확장 모듈에 대해 알아둘 필요는 있다. 개발자들에게 있어 확장 모듈은 자바와 함께 아주 유용한 보안 API를 제공한다. 핵심 플랫폼 API는 메시지 개요나 전자 서명을 만들 수 있기는 하지만 개발자들은 데이터를 암호화하고 사용자를 인증하는데 더 많은 흥미를 보이고 있다.
 
이 확장 모듈들은 자바 1.4의 핵심 릴리즈에 포함될 예정이다. 바로 이런 이유로 인해 이 확장 모듈은 번들된 확장 모듈로 취급되고 있으며 자바 1.4로 업그레이드 될 때 사용하게 될 방법으로 자리잡을 것이다.
 
현재 JCE와 JSSE는 확장 모듈로서 사용 가능하다. 그리고 모듈은 더 이상 미정부 수출 금지 품목에 포함되어 있지 않다. 이전 버전의 확장 모듈들은 미국과 캐나다 내에서만 사용될 수 있었으며 이것은 이 확장 모듈을 사용하는 프로그램들도 인터넷에서 사용할 수 없음을 의미했다. 미정부의 정책 변화로 썬 마이크로시스템즈는 이 확장 모듈을 전 세계로 배포할 수 있게 됐다. 물론 일부 나라는 이 패키지 수입을 여전히 제한하고 있기 때문에 몇몇 나라에서는 이 모듈을 사용할 수 없다. 더 자세한 사항을 알고 싶다면 Java Secure Socket Extension(JSSE) 1.0.2를 보기 바란다.
 
5. SSL 서버 이름을 검증하라.
 
JSSE는 SSL을 사용하기 위해 API를 제공한다. SSL은 소켓 프로토콜이기 때문에 API는 자바의 표준 소켓 의미 규칙을 따르는 클래스를 제공한다. 예를 들어 SSLSocket 클래스는 Socket 클래스를 상속받으며, SSLServerSocket 클래스는 ServerSocket 클래스를 상속받는다. 이는 그냥 소켓과 SSL 소켓이 상호 변환 할 수 있게 해준다. 사실상 JSSE는 이러한 추상화를 위해 소켓 생성기를 제공한다.
 
하지만 이 모든 것에는 다음과 같은 한 가지 복잡한 사항이 있다. SSL 소켓과 보통 소켓은 호스트와 포트의 연결을 통해 생성되는데 이는 소켓 생성기가 제공하는 인터페이스이다. 하지만, 극도의 안전을 위해서라면 SSL 소켓은 추가적인 초기화 작업이 반드시 필요하다.
 
SSL 클라이언트가 SSL 서버에 접속할 때 내부적으로는 많은 일들이 일어난다. 서버는 클라이언트에게 자신의 인증서를 전송하고, 클라이언트는 인증서를 검증하는데, 이때 클라이언트와 서버는 사용할 암호화 알고리즘 등을 결정한다. SSLSocket 객체가 생성되면 이와 같은 모든 초기화 작업은 끝나게 된다. 그러나 이때 클라이언트는 서버가 제공한 인증서의 유효성을 검증하였지만 서버의 신원을 확인하지는 못했다. 이 시점에서 모든 클라이언트들은 서버가 클라이언트가 신뢰하는 인증서 발급 기간에서 발급된 유효한 인증서를 소유하고 있다는 것을 알고 있다.
 
애플리케이션이 올바른 서버에 접속되어 있는 것을 보증하고 더 발전된 단계로 나아가는 것은 애플리케이션 개발자들이 책임져야 할 의무이다. 이 작업은 보통 인증서 내에 포함되어 있는 이름을 검색함으로써 수행된다. 인증서의 이름은 인증서를 소유하고 있는 사이트의 이름과 일치해야 한다. 그래서 만약 www.sun.com의 SSL server에 접속한다면 인증서 내의 이름이 여러분을 www.sun.com으로 전송시켜 줄 것이다. 따라서 애플리케이션 개발자는 인증서 내에 있는 이름을 검색하는 코드를 제공해야 하며 애플리케이션이 접속하고자 하는 호스트의 이름과 인증서의 이름이 일치하는지도 검사해야 한다.
 
종종 여러 가지 사정으로 이름이 일치하지 않을 때도 있다. 애플리케이션이 호스트 이름을 사용하지 않고 IP 주소를 지정했을 때 또는 어떤 사이트가 잘못된 이름으로 된 인증서를 갖고 있을 때 등이 이런 경우의 적절한 예가 될 것이다. 따라서 인증은 철저해야 한다. IP 주소를 받아서 다른 것들과 비교해 보아야 하며 만약 서로 뜻이 통한다면 애플리케이션은 사용자에게 이름이 서로 맞지 않을 경우 인증서를 수락할 것인지 아닌지를 물어볼 수 있다.
 
그러므로 인증을 어떻게 다룰 것인지는 애플리케이션에 종속적일 수 밖에 없다. 그러나 소켓 API의 프로토콜 독립적인 특징들로 인해 여러분이 이와 같은 중요한 단계를 수행하지 못하게 하지는 말아라.
 
6. 여러분의 기업환경에 맞는 구현을 계획하라.
 
자바의 핵심 보안 구현은 단일 플랫폼 상의 단일 유저에게는 안정맞춤이다. 그렇지만 다른 해결책을 원할 경우 어떻게 해야 할까? 인증서는 keytool이 관리하는 파일 안에 있다. 이 파일은 로컬 워크그룹 내에 공유할 수 있다. 그러나 도쿄와 오사카처럼 서로 멀리 떨어진 사무실에서 공유하고자 한다면 어떻게 해야 할까? 다양한 java.policy 파일의 항목에 있는 엔트리에 근거하여 코드에 퍼미션이 부여되는데 이것을 집중된 한 장소에 저장하고자 한다면 어떻게 해야 할까? JAAS는 JAAS를 인증한 사용자에게 퍼미션을 주도록 설치되어 있다. 하지만 이러한 퍼미션이 사용자의 이름과 같은 임시변통적인 원칙에 따라 정의되길 원한다면 어떻게 해야 할까?
 
여기서 언급한 것 이외에도 더 많을 수도 있지만 이러한 모든 일들은 고유의 몇몇 키 및 자바 클래스(핵심 자바 클래스) 구현을 제공함으로서 이룰 수 있다. 자바의 보안 구조는 기본값이 설정되는 방식으로 정의되는데 이러한 클래스의 포컬 사용자 기반의 구현은 여러분이 처한 환경에 적합하게 조정된 구현에 의해 쉽게 대체될 수 있을 수 있다. 각 클래스에 부여되는 퍼미션을 결정하는 Policy 클래스의 기본값 구현을 바꾸는 것이 극단적인 일처럼 보일 수 있지만 사실은 그렇지 않다. 이는 많은 환경에서 매우 당연한 일이며 보안 API에 의해 정의된 기본 작동이기 때문이다.
 
자바의 기본 보안 클래스를 이러한 방법으로 확장 가능하게 하는 서드 파티 패키지들이 점점 늘고 있다. 더 다양한 솔루션이 필요하다면 솔루션 시장을 검사해보길 바란다.
 
7. 올바른 암호화 매개변수를 사용하라.
 
JCE는 DES, DESede(또는 triple DES), Blowfish 등 다양한 알고리즘을 사용해서 암호화를 수행하는 API를 제공한다. 알고리즘이 작동할 모드는 사용할 알고리즘을 선택하는 것만큼 중요한 것이다. 따라서 암호화하고자 하는 데이터 종류에 따라 모드를 선택해야 한다.
 
암호화의 기본 모드는 ECB(Electronic CookBook)이다. 이 모드는 한번에 데이터를 한 블록(8바이트)씩 암호화 한다. 암호화된 텍스트가 재정렬 된다 하더라도 암호화된 텍스트는 여전히 성공적으로 해독될 수 있을 것이다(물론 결과물로 나온 암호화 이전의 텍스트는 그 순서가 바뀌게 되겠지만…). ECB 모드는 패턴을 검색함으로서 성공적으로 공격 당할 수 있다. 이러한 이유로 텍스트 데이터를 암호화하는 것은 적절하지 못하다. 즉, 이는 바이너리 데이터를 위해서만 사용되어야 한다.
 
어떤 종류의 텍스트는 CBC(Cipher Block Chaining) 모드를 사용해 암호화는 것이 적당하다. email 헤더에서처럼 이 모드는 텍스트의 첫 부분에 패턴이 발생하지 않는 한 텍스트 데이터 내의 패턴을 숨길 수 있다. 이 모드는 키 교환 기술에 사용되는 PBEwithMD5AndDes 등과 같이 특별한 알고리즘을 위해 가장 잘 사용된다.
 
텍스트는 OFB(output FeedBack) 모드나 CFB(Cipher Feedback) 모드를 사용해 더 잘 암호화 된다. 이 모드는 텍스트의 모든 패턴을 숨길 수 있다. OFB는 모뎀과 같이 전송 중 노이즈가 발생할 수 있는 라인에서 사용하기 위해 고안되었다. 다른 모드로 암호화된 데이터에서 한 비트의 데이터가 바뀌면, 8바이트짜리 블록 전체를 잃어버리게 되며 OFB모드에서는 오직 1비트만을 잃어버리게 된다. 만약 자동적으로 데이터를 해독, 암호화하는 입출력 스트림을 사용하고자 한다면 숫자 8로 확장된 모드 중 하나를 사용해야 한다(예: CFB8). 이는 데이터가 8비트짜리 블록으로 처리되기 때문이다. 그렇지 않으면 스트림은 데이터를 처리하기 전에 64비트 데이터를 버퍼링 할 것이다.
 
8. 외부 환경을 이해하라.
 
필자는 최근에 필자와 필자의 친구가 일 때문에 종종 접근하는 웹사이트의 사용을 자동화하는 프로그램을 만들었다. 이 웹사이트는 사용자 이름과 패스워드를 요구하고, 사용자가 데이터를 다 입력하고 나면 다시 문서로 되돌아 가게 되어있다. 즉 자동화 프로그램을 이용하여 문서를 불러오는 스크립트를 간단히 실행만 하면 된다.
 
우리는 패스워드를 어떻게 다룰까에 대해서 고민하였다. 스크립트가 임의의 시간에 자동으로 실행할 수 있기를 원했기 때문에 실행할 때마다 패스워드를 입력할 수 없었기 때문이다. 그리고 내 동료 중 몇몇은 스크립트에 보호 받지 못하는 패스워드를 남겨 놓는 것에 대해 걱정스럽게 생각했다. 따라서 패스워드가 스크립트 내에 저장되기 위해서는 암호화할 필요성이 있다.
 
내가 행한 정정 작업은 물론 JCE의 강력한 암호화 API를 사용한 것이다. 이상적으로 그것은 모든 사람의 개인 인증서에 기초하여 작업할 수 있지만 그렇게까지 하지는 않았다. 필자는 필자의 동료도 몇 시간 내에 알아낼 수 있는 취약한 암호를 구현하였다(그는 한 번에 그 사실을 발견하였음).
 
필자는 필자가 꽤 게으른 프로그래머라는 것과 가장 간편한 방법을 찾아 구현한 암호화였음을 시인한다. 하지만 다른 관점(우리가 접속하는 웹사이트가 https를 사용하지 않는다는 점)에서 보면 이치에 맞다. 따라서 필자의 패스워드에 관심이 있는 사람은 필자의 스크립트를 찾아내 암호화 기술을 깨뜨림으로써 패스워드를 훔칠 수 있을 것이다. 그러나 굳이 그렇게 복잡한 방법 대신 암호화 되지 않은 패스워드가 웹 서버로 전달 될 때 필자의 네트워크를 스누핑함으로써 훨씬 간단하게 패스워드를 얻을 수 있다.
 
보안은 자바를 둘러싼 것들 중에 있어 애매모호한 것 중의 하나이고 결과적으로 자바에서 보안에 관련된 것들은 다른 환경적 요인들보다 훨씬 더 정밀한 주제에 속한다. 그러나 자바가 얼마나 안전한지 또는 자바 애플리케이션에 어떤 보안 요소들을 추가할 수 있는지는 중요하지 않다. 나머지 환경이 안전하지 않을 경우 이러한 자바의 장점들은 별로 도움이 되지 않기 때문이다.
 
(그렇다고 해서 이것을 변명하는데 사용하지는 말아라. 언젠가 필자와 필자의 친구가 사용하는 웹사이트가 이러한 방법의 어리석음을 깨닫고 https를 사용하기 시작할 수 있다. 이때는 필자의 프로그램을 수정할 수 밖에 없을 것이다. 시작할 때부터 올바르게 하는 것이 더 좋은 방법이다.)
 
9. 사용자를 그들 자신으로부터 보호하라.
 
자바의 보안 구조는 6번 팁에서 언급했듯이 아주 유연하다. 이는 그들 자신이 무엇을 하는지를 이해하는 사람들에게 있어서는 안성맞춤 이기는 하지만 때때로 사용자들이 그들 자신들로부터 보호 받길 원하는 환경에 있을 수 있다. 참고로 내가 그러한 오만한 시스템 관리자라는 것은 아니다.
 
사용자들이 빠지기 쉬운 가장 큰 위험은 신뢰할 수 없는 코드가 허용되어서는 안되는 작업을 수행하게 하는 엔트리가 정책 파일에 있는 것이다. 기본값으로 각 사용자는 그러한 퍼미션을 부여하는 $HOME/.java.policy 파일을 가지고 있다. 또한 이러한 퍼미션은 사용자가 -Djava.policy 인자를 명령 라인에서 지정하는 것 뿐만 아니라 $JAVAHOME/lib/security/java.policy 파일에 나열되어 있는 것에 추가할 수도 있다.
 
여러분은 $JAVAHOME/lib/security/java.security 파일을 아래와 같이 수정함으로써 보안 구조의 이러한 성질을 해제할 수 있다.
 
   아래와 같이 쓰여 있는 라인을 삭제하라.
   policy.url.2=file:${user.home}/.java.policy
 
   아래와 같이 쓰여있는 것을 주석 처리하라.
   policy.allowSystemProperty=true
 
이와 같이 수정한 후, 자바 애플리케이션을 실행할 때 오직 $JAVAHOME/lib/security/java.policy에 나열되어 있는 퍼미션만이 유효할 것이다. 사용자는 어떠한 자바 클래스에 추가적인 퍼미션을 부여할 수 없을 것이다.
 
물론 이것을 완벽하게 효과적으로 사용하기 위해서는 최종 사용자가 $JAVAHOME/lib/security 디렉토리에 있는 파일을 수정할 수 없게 해야 한다.
 
10. 최근의 일에 귀를 기울여라.
 
만약 당신이 정말로 자바의 보안에 대해 지대한 관심을 갖고 있다면 자바 세계에서 일어나는 최근의 일에 귀를 기울여야 한다. 특히 java.snu.com를 방문해보면 자바 보안 구조와 관련된 모든 사이트들과 링크가 잘 되어있다. 자바 보안 모델의 구현에 있어서 버그가 발견된다면 물론 버그 관련사항도 이 사이트에 포스팅이 된다.
 
스콧 오크스는 1987년부터 썬 마이크로시스템즈에서 근무한 자바 기술자이다. 그곳에서 기술자로 근무하면서 그는 SunOS 커널에서 네트워크 프로그래밍과 RPC 등에 이르는 일관적인 기술들을 전문적으로 개발하였다. 1995년 이후로 자바관련 사업을 주로하고 있으며 자바 기술을 엔드유저에게 소개하고 있다.

가상 아이피를 설정하는 또다른 방법은

직접 가상장치에 대한 네트웍 설정 파일을 만드는것이다.


eth0 장치에 대한 설정을 하고 가상아이피를 설정을 하고자 하면


# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.123.250
GATEWAY=192.168.123.254
NETMASK=255.255.255.0



# vi /etc/sysconfig/network-scripts/ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.123.251
GATEWAY=192.168.123.254
NETMASK=255.255.255.0


위와같이 두개의 파일을 만들고 서비스를 다시 시작해야 하는데


# service network restart  혹은  # /etc/init.d/network restart

이렇게 해주면 된다.


####### 그외의 옵션들 #######

DEVICE="eth0"
ONBOOT="yes"
BOOTPROTO="none"
IPADDR="61.1.2.3"
NETMASK="255.255.255.0"
#GATEWAY=210.221.183.1
IPXNETNUM_802_2=""
IPXPRIMARY_802_2="no"
IPXACTIVE_802_2="no"
IPXNETNUM_802_3=""
IPXPRIMARY_802_3="no"
IPXACTIVE_802_3="no"
IPXNETNUM_ETHERII=""
IPXPRIMARY_ETHERII="no"
IPXACTIVE_ETHERII="no"
IPXNETNUM_SNAP=""
IPXPRIMARY_SNAP="no"
IPXACTIVE_SNAP="no"


####### 네트웍 관련된 다른 설정 파일들 #######

/etc/hosts 호스트이름과 IP주소를 적는파일.
/etc/resolv DNS 서버주소를 적는 파일
/etc/sysconfig/network 호스트이름,게이트웨이가 들어 있는 파일
/etc/sysconfig/static-routes Static 경로가 있는 경우 적는 파일
/etc/sysconfig/ipchain ipchain 이라고 Masquerading(NAT) 또는 Firewall관련 설정
/etc/sysconfig/firewall firewall 관련 설정
/etc/sysconfig/network-scripts/ifcfg-eth0 eth0에 대한 설정. IP주소, 넷마스크 등이 들어감
/etc/sysconfig/network-scripts/ifcfg-eth1 eth1에 대한 설정.

'공부 해 Boa요. > Linux Server' 카테고리의 다른 글

IPTABLE 기본 사용법  (0) 2008.03.10
Apache Tunning  (0) 2008.03.10
리눅스 가상 IP 설정Ⅰ  (0) 2007.11.23
리눅스시스템 정보 보는 방법  (0) 2007.11.10
리눅스명령어 - 시스템 정보  (0) 2007.11.10

가상 IP를 설정하는건 의외로 아주 간단하다.

# ifconfig <장치명> <가상의 IP>


먼저 기본적인 네트웍 설정상태를 먼저 확인해 보면

# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:07:E9:40:7D:E6
          inet addr:192.168.123.250  Bcast:192.168.123.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:397962 errors:0 dropped:0 overruns:0 frame:0
          TX packets:405098 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:49081880 (46.8 Mb)  TX bytes:416655013 (397.3 Mb)
          Interrupt:20 Base address:0x1400 Memory:fe7e0000-fe7e0038

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1332 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1332 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:95987 (93.7 Kb)  TX bytes:95987 (93.7 Kb)


만약 이더넷 카드가 두개라면

eth1 이라는 정보가 하나 더 표시될것이다.


장치 이름은 기본 장치명에 콜론(:)을 붙이고 가상 장치에 순번을 붙이면 된다.

예) eth0:0, eth0:1, eth0:2 ....


# ifconfig eth0:0 192.168.123.251


이렇게 입력하고 다시 확인해 보면 eth0:0 라고 확장된 장치를 볼 수 있다.


eth0      Link encap:Ethernet  HWaddr 00:07:E9:40:7D:E6
          inet addr:192.168.123.250  Bcast:192.168.123.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:397962 errors:0 dropped:0 overruns:0 frame:0
          TX packets:405098 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:49081880 (46.8 Mb)  TX bytes:416655013 (397.3 Mb)
          Interrupt:20 Base address:0x1400 Memory:fe7e0000-fe7e0038

eth0:0    Link encap:Ethernet  HWaddr 00:07:E9:40:7D:E6
          inet addr:192.168.123.251  Bcast:192.168.123.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:20 Base address:0x1400 Memory:fe7e0000-fe7e0038

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1332 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1332 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:95987 (93.7 Kb)  TX bytes:95987 (93.7 Kb)


이런 방법으로 가상아이피는 제한된 갯수까지 늘릴수가 있지만

이러한 경우 서버를 재부팅할 경우 다시 설정해 주어야 하는 단점 때문에

장치에 대한 설정을 파일로 저장하고 부팅시 자동으로 실행 시키는 것이 좋다.

'공부 해 Boa요. > Linux Server' 카테고리의 다른 글

IPTABLE 기본 사용법  (0) 2008.03.10
Apache Tunning  (0) 2008.03.10
리눅스 가상 IP 설정Ⅱ  (0) 2007.11.23
리눅스시스템 정보 보는 방법  (0) 2007.11.10
리눅스명령어 - 시스템 정보  (0) 2007.11.10

[배포버전이름]

#cat /etc/redhat-release

[리눅스버전]

#cat /proc/version

[cpu]

#cat /proc/cpuinfo

[memory]

#cat /proc/meminfo

'공부 해 Boa요. > Linux Server' 카테고리의 다른 글

IPTABLE 기본 사용법  (0) 2008.03.10
Apache Tunning  (0) 2008.03.10
리눅스 가상 IP 설정Ⅱ  (0) 2007.11.23
리눅스 가상 IP 설정Ⅰ  (0) 2007.11.23
리눅스명령어 - 시스템 정보  (0) 2007.11.10
1. ps ( process )
- 현재 진행중인 프로세스의 정보를 출력합니다.

2. pstree ( process tree)
- ps 에 의해 출력되는 프로세스 정보를 트리 형태로 나타냅니다.

3. top
- cpu와 메모리를 사용하는 작업들에 대한 시스템 정보를 출력합니다.

4. arch (architecture)
- 현재 사용하고 있는 cpu의 모델을 출력합니다.

5. cal (calendar)
- 현재의 달을 출력합니다. (ex : 원하는 월 ,연도)
* -j :율리우스달력

6. clock
- CMOS 설정 시간의 출력, 변경을 합니다.

7. date
- 현재 시간과 날짜를 출력합니다.

8. df (disk free)
- 하드의 전체 용량, 남은 용량을 알기위해 사용합니다.
* -h(human) 바이트 단위 출력

9. du (disk usage)
- 각각의 디렉토리, 파일들의 디스크 용량을 출력합니다.

10. free (free memory)
- 현재 사용중인 시스템 메모리 상태를 출력합니다.
* -m(Megabyte) 메가 바이트 단위 출력
* -k (Kilobyte) 킬로 바이트 단위 출력

11. hostname
- 자신의 컴퓨터에 부여된 이름을 출력합니다.

12. lsdev (list devices)
- 현재 시스템에 연결되어 있는 하드웨어에 관한 입출력 정보, IRQ 값 등을 출력합니다.

13. quota
- 각각의 사용자들이 사용할 수 있는 디스크의 용량을 나타냅니다.

14. rdev (root device)
- 내부에 ramsize, swapdev, vidmode, rootflag의 프로그램이 구성되어 있습니다.

15. uname (unix name)
- 사용중인 운영체제에 대한 정보를 출력합니다.
* - a(all) 현재 사용중인 운영체제, 커널의 컴파일 정보 등을 출력

16. su
- 다른 사용자로 login합니다.


17. shutdown
- 시스템을 종료 합니다.
* - t n 옵션 t 뒤에 n 초 후에 경고 메시지와 kill 신호 보냄
* - h (halt) 완전히 닫음
* - r (reboot) 종료후 재부팅
* - f (fast) 빠른 리부팅(파일 시스템 검사 생략 )
* - c (cancel) 예약 되어 있는 종료 취소
* - k (kidding) 정상상태에서 종료 시간시 프로그램 정지

18. reboot
- 재부팅을 합니다.
* - q 현재의 실행프로그램을 종료하지 않고 재부팅

19. kill
- 프로세스 종료, 현재 실행중인 프로세스를 강제 종료시 사용합니다.
* -2 : 실행 중인 프로세스에게 인터럽트 키 신호 보냄
* -9 : 가장 확실하게 실행 중인 프로세스를 종료

20. tty
- 현재 사용하고 있는 단말기 장치의 경로명, 파일명을 알려줍니다.

21. whereis
- 실제 프로그램이 어떤 디렉토리에 존재하는지 모든 경로명을 보여줍니다.

22. fsck (file system check)
- 파일 시스템의 상태 검사하고 잘못된 것을 수정 합니다.
* - a : 검사도중 발견된 에러를 자동 복구
* - r : 검사도중 에러가 발견되면 복구 여부 확인
* - s : 순차적인 방법으로 검색
* - V : 검색 중 각종 정보 보여줌
* - N : 실제로 검사 작업 미 실시

'공부 해 Boa요. > Linux Server' 카테고리의 다른 글

IPTABLE 기본 사용법  (0) 2008.03.10
Apache Tunning  (0) 2008.03.10
리눅스 가상 IP 설정Ⅱ  (0) 2007.11.23
리눅스 가상 IP 설정Ⅰ  (0) 2007.11.23
리눅스시스템 정보 보는 방법  (0) 2007.11.10

getchar()

: Enter Key를 누를 때까지 버퍼에 data를 입력받아 맨 앞 data 1문자를 읽어온다.


- 버퍼에서 읽어온 문자 1개를 특정 변수에 저장하는 방식은 다음과 같다.

   a = getchar();


- getchar는 scanf와 비슷하지만 차이가 있다.

   scanf는 다양한 타입과 서식을 지원해, 프로그래머가 원하는 방식으로 입력받을 수 있는 것에 반해 getchar는 오직 문자 1개만 입력받을 수 있다.


- getchar는 'Enter'키의 입력도 하나의 문자로 간주한다.

   때문에 *.exe 파일을 실행했을 때 출력문을 채 보기도 전에 프로그램이 종료되는 현상을 코드의 마지막에 getchar()를 넣음으로써 막을 수도 있다.


- getchar와 scanf는 버퍼에 저장된 것을 읽어오기 때문에 주의해야한다.

   여러 번에 걸쳐서 getchar나 scanf를 사용할 경우, 버퍼에 누락된 'Enter'키 같은 data를 읽어올 수 있다. 따라서 여러 번에 걸쳐서 getchar나 scanf를 사용할 때는 'fflush(stdin)' 명령어를 이용하여 버퍼를 비워주어야 한다.

'공부 해 Boa요. > C & C++' 카테고리의 다른 글

OpenCV(Open Computer Vision Library) 관련  (0) 2008.01.18
  • 이 Server는, Client로 접속했을 때 입력한 값을 그대로 돌려주는 Echo Server이다.
  • vi editor를 이용해서 아래의 source code를 입력한 후 Shift + Z + Z로 저장한다.
  • gcc를 이용하여 컴파일 한 후 Client보다 먼저 실행한다.
  • 이 때 파일명 뒤에 port number를 입력해주게 되는데, 이 port number는 Client와 같아야 한다.
  •     ex) vi echo_server.c
  •           gcc echo_server.c -o echo_server
  •           ./echo_server 50000

 

아래는 echo_server.c에 입력할 souce code이다.


 

#include<sys/wait.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define BUF_LEN 128


void clean();


int main(int argc, char* argv[]) {
     struct sockaddr_in server_addr, client_addr;
     int master_skt, slave_skt;
     int len, len_out;
    int port;
     char buf[BUF_LEN+1];

    if(argc != 3){

          printf("사용법 : %s port\n", argv[0]);

          return -1;

     }

     port = atoi(argv[2]);

     if(master_skt = socket(PF_INET, SOCK_STREAM, 0) < 0){
          printf("서버 소켓 생성 실패\n");
          return -1;
     }

     bzero((char *)&server_addr, sizeof(server_addr));
     server_addr.sin_family = AF_INET;
     server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
     server_addr.sin_port = htons(port);

    if(bind(master_skt, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
          printf("서버 주소 연결 실패\n");

          return -1;
     }

     listen(master_skt, 5);
     signal(SIGCHLD, clean);

    while(1) {
          printf("Server : Waiting to accept request.\n");
          len = sizeof(client_addr);

          if(slave_skt = accept(master_skt, (struct sockaddr *)&client_addr, &len) < 0){
               printf("Fail to accept the server\n");
              return -1;
          }


          printf("Server : Client connected.\n");

          switch(fork()) {
               case 0 :
                    close(master_skt);
                    len_out = read(slave_skt, buf, sizeof(buf));
                    write(slave_skt, buf, len_out);
                    exit();

               case -1 :

                    exit();

               default :

                    close(slave_skt);
          }
     }
}

void clean(){
     union wait status;

    while(wait3(&status, WNOHANG, (struct rusage *)0) >= 0){ }
}

'공부 해 Boa요. > Network' 카테고리의 다른 글

Client  (0) 2006.10.15
Raw Socket  (0) 2006.09.29
Consol Echo Client  (0) 2006.09.27
실전 네트웍 프로그래밍 - 4 - IOCP Echo Server  (0) 2005.06.29
'실전 네트웍 프로그래밍 -3  (0) 2005.06.29
  • Linux의 Echo Server에 접속할 Client이다.
  • 항상 Server가 먼저 실행된 상태에서 접속해야한다.
  • vi editor로 작성한 다음 아래의 code를 입력한 뒤 저장해 Client 소스 파일을 만든다.
  • gcc를 이용해 Client 소스 파일을 컴파일 하고, Server가 실행된 상태에서 Client를 실행한다.
  •     ex) vi Client.c
  •           source code 입력 후 Shift + Z + Z로 저장.
  •           gcc Client.c -o Client.out

아래는 입력할 source code이다.


#include
<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#define BUF_LEN 80

int main(int argc, char* argv[]){
    int skt, n, len_in, len_out;
    struct sockaddr_in server_addr;
    char* host_addr;
    char buf[BUF_LEN+1];

    if(argc != 3){
        printf("사용법 : %s ip_address\n", argv[0]);
        return -1;
    }

    host_addr = argv[1];


    if(skt = socket(PF_INET, SOCK_STREAM, 0) < 0){
        printf("소켓 생성실패\n");
        return -1;
    }

    bzero((char *)&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(host_addr);
    server_addr.sin_port = htons(atoi(argv[2]));

    if(connect(skt, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
        printf("연결 실패\n");
        return -1;
    }

    printf("문자열을 입력하시오: ");

    if(fgets(buf, BUF_LEN, stdin)){
        buf[BUF_LEN] = '\0';
        len_out = strlen(buf);
    }
    else{
        printf("오류\n");
        return -1;
    }

    write(skt, buf, 80);

    printf("서버로부터 되돌아 온 문장: ");

    for(len_in = 0, n = 0; len_in < len_out; len_in += n){
        if((n = read(skt, &buf[len_in], len_out - len_in))<0){
            printf("read 오류\n");
            return -1;
        }
    }

    printf("%s", buf);
    close(skt);

    return 0;
}

'공부 해 Boa요. > Network' 카테고리의 다른 글

동시형 서버  (0) 2006.10.27
Raw Socket  (0) 2006.09.29
Consol Echo Client  (0) 2006.09.27
실전 네트웍 프로그래밍 - 4 - IOCP Echo Server  (0) 2005.06.29
'실전 네트웍 프로그래밍 -3  (0) 2005.06.29

+ Recent posts