유닉스의 X 윈도우는 윈도우 테두리와 동작등을 담당하는 부분이 빠져있는데, 이 부분을 윈도우 메니저가 처리합니다. 수십 개 이상의 윈도우 메니저가 존재하며, 각각 기능이 천차만별이라 같은 X 윈도우를 사용한다고 해도 모양이나 사용방법은 전혀 틀려집니다. 같은 윈도우 메니저라 해도 설정이 자유로운것이 많아서 모양이나 동작등도 사용자들이 커스터마이징을 많이해서 사용합니다.

예전에 GNOME 데스크탑의 디폴트 윈도우 메니저였던 sawfish가 안타깝게 metacity에게 자리를 내어주었지만... 제 개인적인 생각으론 metacity는 기능이 좀 부족하더군요. 커스터마이징 면에서 낮은 점수를 받을수 밖에 없습니다. "일반 사용자들을 위한 디폴트 윈도우 메니저"로 선택되었으니 커스터마이징은 중요한 요소가 아니였나봅니다.

예전엔 이름이 sawmill이였는데... 다른 소프트웨어가 그 이름을 사용중이라고 sawfish로 바꿨습니다. sawfish는 LISP 와 유사한 언어(rep)로 커스터마이징이 가능합니다 :) 물론 LISP을 알면 더 자유로워질수 있지만(^^), 몰라도 sawfish-ui 로 커스터마이징이 가능합니다.

X 윈도우의 윈도우 메니저들은 대부분 가상 데스크탑을 지원하는데.. MS윈도우즈에 있는 가상 데스크탑 프로그램들은 많이 구해서 사용해봤는데 많이 부족하더군요. 기능이 부족하기 보다, 기본적인 기능이 제대로 동작하는걸 찾지 못했습니다. 데스크탑 이동할때 포커스를 제대로 잡아주는 프로그램을 아직 접하지 못했네요. litestep이 그나마 사용할만하지만 이건 쉡을 바꾸는거라 불편이 따르더군요. 하여간 제가 윈도우즈용 프로그램도 개발하지만, 데스크탑에 리눅스를 깐건 이 가상 데스크탑 기능이 정말 그리워서였죠. 옆에 윈도우즈 노트북이 있으니 윈도우 프로그래밍 작업은 원격으로 연결해서 작업하거나 vmware에서 작업합니다.  2000년, 2001년에 있던 회사에서는 유닉스 프로그램만 개발해서 리눅스를 데스크탑으로 썼었습니다. 이때 썼던 윈도우 메니저가 sawfish 였고요.

뭐 X 윈도우와 윈도우 메니저를 접한건 94년 정도로 올라가는데 (학교 워크스테이션실), 그때 있던게 mwm(motif)과 openlook(olwm?)과 fvwm이였죠. fvwm이 오픈소스라 fvwm을 사용했었습니다. fvwm의 추억의 색(붉은색+하늘색)은 아직도 기억에 남네요. 그후 리눅스를 PC에 깔면서 꽤 많은 윈도우 메니저를 사용해봤습니다. 대부분 쓸만하지만 저는 화려한거보다는 가볍고 빠르고 커스터마이징이 자유로운걸 사용하게 되더군요. fvwm2, icewm 등을 많이 썼었고, 결국 sawfish로 정착했습니다.

꽤 오랜만에 회사의 메인 PC에 리눅스(우분투)를 깔았습니다. 윈도우즈 개발은 원격으로 옆의 노트북이나 집 PC에 연결해서 개발합니다. 노트북의 화면을 활용하기 위해서 synergy를 사용하기도 했었는데 저는 가상 데스크탑이 더 편하더군요. 오래전에 듀얼 모니터(20인치 CRT)도 사용해봤지만 고개 왔다갔다 하는거보다 키보드로 가상화면 이동하는게 더 편하더군요.

sawfish에서 제가 좋아하는 기능이 pack window와 창채우기(maximize-fill-window) 기능입니다. 단축키 잘 할당해 놓으면 창위치 잡기 위해서 마우스로 손이 갈 필요가 거의 없습니다. 그리고 마우스로 위치와 크기 조정하는거보다 더 빠르고 잘 배치를 할수 있죠.

아래는 제가 사용중인 설정입니다.
(custom-set-keymap
(quote global-keymap)
(quote (keymap
    (cycle-windows . "M-TAB")
    (show-desktop . "H-d")
    ((run-shell-command "nautilus") . "H-e")
    ((run-shell-command "vmware") . "H-v")
    ((run-shell-command "evolution --component=mail") . "H-m")
    ((run-shell-command "gnome-terminal") . "H-t")
    ((run-shell-command "firefox") . "H-f")
    ((activate-workspace 1) . "H-1")
    ((activate-workspace 2) . "H-2")
    ((activate-workspace 3) . "H-3")
    ((activate-workspace 4) . "H-4")
    ((activate-workspace 5) . "H-5")
    ((activate-workspace 6) . "H-6")
    (next-workspace . "M-C-Right")
    (pack-window-left . "C-S-Left")
    (pack-window-right . "C-S-Right")
    (pack-window-up . "C-S-Up")
    (pack-window-down . "C-S-Down")
    (maximize-fill-window-toggle . "C-F")
    (maximize-window-vertically-toggle . "C-V")
    (maximize-fill-window-horizontally-toggle . "C-H")
    (pack-window-up . "C-I")
    (pack-window-down . "C-K")
    (pack-window-left . "C-J")
    (pack-window-right . "C-L")
    (previous-workspace . "M-C-Left"))))
(custom-set-keymap
(quote window-keymap)
(quote (keymap
    (raise-and-pass-through-click . "Button1-Click")
    (size-window-subtract-column . "H-Left")
    (size-window-add-column . "H-Right")
    (size-window-subtract-row . "H-Up")
    (size-window-add-row . "H-Down")
    (send-to-next-workspace . "M-C-S-Right")
    (send-to-previous-workspace . "M-C-S-Left")
    (move-window-interactively . "W-Button1-Move")
    (popup-window-menu . "W-Button2-Click")
    (delete-window-instance . "M-F4")
    (resize-window-interactively . "W-Button3-Move")
    (lower-window . "M-C-Down")
    (raise-window . "M-C-Up"))))

가상화면 전환은 Ctrl-Alt-Left, Ctrl-Alt-Right, Win-1 ~ Win-6 까지 이용합니다. 창을 다른 가상화면으로 옮길때는 Ctrl-Alt-Shift-Left, Ctrl-Alt-Shift-Right을 이용합니다. 창이동은 Ctrl-Shift-화살표를 이용합니다. 창이동하는 함수가 pack-window-up ... 등의 함수인데.. 픽셀 단위로 움직이는게 아니라 다른 창에 붙도록 이동합니다. 익숙해지면 편합니다. 원하는 곳에 잘 붙지 않을때가 있는데... 사용해보면 익숙해집니다. 원하는 위치를 잡으면... Ctrl-Shift-f 로 빈곳을 채울수 있습니다. 다른 창 영역은 침범하지 않으니 다른 창들과 함께 창을 나눠서 쓸때 딱입니다. Ctrl-Shift-v와 Ctrl-Shift-h로 세로/가로 따로 창을 채울수도 있습니다.

저는 주로 가상화면에 한꺼번에 띄울 창들을 실행하고, 창들을 Ctrl-Shift-화살표로 원하는 곳으로 이동하고, 크게 보고 싶은 창부터 창채우기합니다. 창크기 조절을 세밀하게 하고 싶으면 Win-커서키를 눌러서 조절하던가, 마우스로 창크기를 조절하고 창채우기하면 됩니다. 창크기 조절할때 마우스로 끝 잡기가 귀찮아서 Ctrl-오른쪽 마우스(resize-window-interactively) 누르면 창크기가 바로 조절되게 세팅했습니다.

Win-e, f, m, t, v키에는 자주 사용하는 어플들을 등록했습니다. 탐색기(nautilus), Firefox, Mail, Terminal, VmWare.

스크린샷을 찍어봤지만.. 뭐 특별한건 없습니다. 일반 그놈 패널에... 가상화면마다 창들이 많이 붙어있죠. 오른쪽 메신저(Pidgin)은 MSN+nateon 같이 사용하니 편하더군요. 친구리스트는 gimp로 블라인딩처리~



원격접속(rdesktop)을 이용할때는 키보드는 모두 rdesktop으로 가게 했습니다. 가상화면 이동할수 있으면 좋겠지만... 윈도우메니저에서 먼저 키보드 처리하면, 윈도우즈 사용시 여러가지로 불편하더군요. 대신 가상화면창에서 마우스 휠을 움직입니다. 마우스 휠로 가상화면 이동이 가능합니다. 그리고 원격접속이나 vmware는 가상화면을 4,5,6번으로 고정시켰습니다. 4번은 옆의 노트북 rdesktop, 5번은 vmware, 6번은 집 rdesktop. 메일은 2번, 기타 작업 공간은 1, 3번을 쓰고 있습니다. 1번은 메신저와 가벼운 웹브라우징, 3번은 노트북(4번)과 같이 작업할때 쓰는 공간입니다. 그리고 혹시를 위해서 가상화면 7, 8번은 여유 공간입니다.

rdesktop은 아래처럼 띄웁니다.

rdesktop.sh -u 아이디 -p 패스워드 -k ko -g workarea -r disk:root=/ -r sound:local -T "rdesktop - notebook" 아이피주소

rdesktop.sh은 rdesktop을 호출하기 전에 사운드 장치를 공유할수 있도록 했습니다.

% cat /usr/bin/rdesktop.sh
#!/bin/sh
LD_PRELOAD=libaoss.so exec /usr/bin/rdesktop "$@"

-k ko는 한영키를 위해서 필요하고, -g workarea 옵션을 주어 전체 공간을 사용하도록 합니다. 원격에서 리눅스 폴더 전체 보이게하고, 소리는 리눅스로 보내도록 했고, 창이름을 지정했습니다. 창 이름을 지정하여 sawfish에서 몇가지 작업을 해줍니다.

(custom-set-typed-variable
(quote match-window-profile)
(quote
    (((WM_NAME . "^rdesktop - notebook$"))
     (workspace . 4)
     (maximized . all)
     (focus-click-through . #t)
     (frame-type . none))
    (((WM_NAME . "^rdesktop - home$"))
     (workspace . 6)
     (maximized . all)
     (focus-click-through . #t)
     (frame-type . none))
    (((WM_CLASS . "^Vmware/vmware$"))
     (workspace . 5)
     (maximized . all)
     (frame-type . none))))

가상화면을 4번으로 고정시키고, 창크기를 최대화하고, 창테두리를 안그리게 했습니다. 그놈패널을 제외한 모든 영역이 윈도우즈가 차지하도록 했습니다 :)


요즘 제가 사용하고 있는 환경인데... 역시 불편한점은 있습니다. 먼저 메신저로 받은 파일을 네트워크에 공유해서 받아야하는 불편함이 있습니다. 대부분 파일들은 리눅스(오픈오피스)에서도 잘 열리지만.. (docx 포함) 편집은 아직 불편한 점이 많더군요. 왠만하면 리눅스에서 처리하고, 꼭 필요하다면 윈도우즈 쪽으로 옮겨서 작업하고 있습니다.

11월11일 추가내용: 우분투에서 설정 방법

우분투의 패키지 메니저인 synaptic에서 sawfish로 검색해서 설치했습니다. 아래처럼 설치되어있습니다.


그리고 Gnome 세션을 사용하고 홈디렉토리에 .gnomerc를 아래처럼 만들어주고 다시 로그인하면 윈도우 메니저가 sawfish로 변경됩니다.

% cat ~/.gnomerc
export WINDOW_MANAGER=/usr/bin/sawfish


전에 CentOS 4에서 lighttpd 설치하는 방법에 대한 글을 썼었는데 5에서는 설치가 많이 편해졌네요 :)

저는 CentOS 5.2 x86_64 버전에서 설치하였습니다.

lighttpd는 http://dag.wieers.com/rpm/packages/lighttpd/ 에서 바이너리를 구해서 설치했습니다. 32 비트 버전에서는 i386.rpm을 받아서 설치하세요~

# wget http://dag.wieers.com/rpm/packages/lighttpd/lighttpd-1.4.18-1.el5.rf.x86_64.rpm
# wget http://dag.wieers.com/rpm/packages/lighttpd/lighttpd-fastcgi-1.4.18-1.el5.rf.x86_64.rpm
# rpm -i lighttpd-1.4.18-1.el5.rf.x86_64.rpm lighttpd-fastcgi-1.4.18-1.el5.rf.x86_64.rpm

php는 따로 컴파일하지 않고 php-cli 패키지에 포함된 /usr/bin/php-cgi 를 이용하면 되더군요. xcache는 소스를 받아서 설치했습니다.

lighttpd와 php(php-cli) 설치하시고 /etc/lighttpd/lighttpd.conf를 편집합니다. php fastcgi설정과 sys epoll 사용하도록 설정하는건 필수죠~

fastcgi.server              = ( ".php" =>
                               ( "localhost" =>
                                 (
                                  "socket" => "/tmp/php-fastcgi.socket",
                                  "bin-path" => "/usr/bin/php-cgi",
                                  "min-procs" => 1,
                                  "max-procs" => 2,
                                  "max-load-per-proc" => 4,
                                  "idle-timeout" => 10,
                                  "bin-environment" => ( "PHP_FCGI_CHILDREN" => "16",
                                                         "PHP_FCGI_MAX_REQUESTS" => "2000" )
                                 )
                              )
                             )

server.event-handler = "linux-sysepoll"


xcache는 http://www.howtoforge.com/xcache-php5-apache2-fedora8-centos5.1 를 참고해서 설치했습니다. 과정이 다 필요한지는 모르겠지만 그냥 그대로 따라했습니다.

# yum install php-devel
# yum groupinstall 'Development Tools'
# yum groupinstall 'Development Libraries'
# wget http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz
# tar xzvf xcache-1.2.2.tar.gz
# cd xcache-1.2.2
# phpize
# ./configure --enable-xcache
# make
# make install
# cp xcache.ini /etc/php.d
# vi /etc/php.d/xcache.ini

마지막 ini 파일 편집시 zend_extension은 모두 주석처리하고 extension = xcache.so만 주석을 풀었습니다.

마지막으로 시스템 시작할때 lighttpd 실행할수 있도록, 아파치 대신 lighttpd를 실행되도록 했습니다.

# /usr/sbin/apachectl stop
# /sbin/chkconfig httpd off
# /sbin/chkconfig --add lighttpd
# /sbin/chkconfig lighttpd on
# /etc/init.d/lighttpd start

방화벽(iptables)은 설치할때 22와 80번 포트는 풀어줬었습니다. 혹시 방화벽이 안 풀려있다면... /etc/sysconfig/iptables 파일을 편집해서 다음 라인을 적당한 곳(REJECT 이전)에 넣고...

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

iptables를 다시 시작하고 설정을 저장~ (저장 안하면 리부팅하면 설정 날라가요)

# /etc/init.d/iptables restart
# /etc/init.d/iptables save

그리고 selinux 기능을 사용중이고 일반 사용자 계정에서 웹페이지가 서비스 되게 하려면...

# su - webuser
$ chmod og+x ~
$ chcon -R -t httpd_user_content_t public_html


lighttpd 모듈

UNIX 2007/10/18 11:16
lighttpd 사용하면서 여러 모듈 덕을 많이 보고 있는데, 정리를 좀 해봤습니다.

기본 모듈:
URL 처리 관련 모듈:
보안 모듈:

연동 모듈:

퍼포먼스 향상 모듈:

  • mod_cache : 요청한 내용 파일로 캐싱
  • mod_mem_cache : 요청한 내용 메모리에 캐싱
  • mod_expire : Expire 값 조정. (이미지등 재요청 오랫동안 안하게)
  • mod_compress : 내용 압축해서 보내기 (캐시 파일로 저장)
  • mod_secdownload : URL 암호화, 타임아웃
  • mod_trigger_b4_dl : 특정 URL 방문후 다운로드 가능하도록
  • mod_cml : cache meta language (mod_magnet이 대체)
  • mod_magnet :mod_cml 대신 새로나온 모듈. request 처리 로직 변경할수 있음. 헤더/페이지 조회/수정. Lua 언어로 프로그래밍 가능.

virtual hosting: 설정 파일만으로도 설정 가능.
기타 :

lighttpd 1.5에서 부터 지원할것.

사용환경: FreeBSD 6.x, tcsh 또는 bash, 윈도우용 putty 터미널.

리눅스에 비해 FreeBSD를 사용하면 기본적으로 쉘상에서 색상이 거의 안나오는데, 몇가지 설정을 하면 리눅스 부럽지 않게 화려(?)해집니다.

tcsh 사용자는 .cshrc에 아래를 적당한 위치에 추가합니다.

setenv CLICOLOR
setenv LSCOLORS Exfxcxdxbxegedabagacad

set mch = `hostname -s`
alias prompt 'set prompt = "%{\033[1;33m%}$mch%{\033[0m%}:%{\033[1;34m%}$cwd%{\033[0m%}> "'

첫줄은 ls에서 기본적으로 색이 출력되도록 합니다. 두번째 줄은 폴더에 할당된 색이 기본적으로 파랑색인데 putty에서 파랑색이 눈에 잘 띄지 않아서 밝은 파랑으로 바꿔주었습니다. 자세한 것은 man ls

밑에서는 쉘 prompt에 색상이 출력되도록 했습니다. 색 지정은 이 페이지를 참조했습니다.

bash 사용자라면 .profile에 아래를 등록하세요.

export CLICOLOR=1
export LSCOLORS=Exfxcxdxbxegedabagacad
export PS1="\[\033[1;33m\]\h\033[0m\]:\[\033[1;34m\]\w\]\033[0m\]> "

이렇게 하고 이전글에서 설명했던대로 .screenrc를 설정하면 아래와 같은 화면이 나옵니다:



GNU screen

UNIX 2007/06/07 20:37
Linux Reality에서 screen에 대한 Podcast를 듣고 screen에 대해서 모르던걸 알게됐네요. GNU screen은 하나의 물리적인 터미널 안에서 여러 터미널을 사용할수 있도록 해주는 프로그램입니다. 한 터미널에서 여러 작업을 할때 매우 유용합니다. 또한, 작업하던 세션을 종료하지 않고 빠져나온 다음에 다른 곳에서 세션을 이어서 작업할수 있기 때문에 회사와 집 등 여러곳에서 작업할때 같은 환경에서 그대로 작업을 할수 있습니다. Podcast 들으면서 새롭게 안 기능은 여러 터미널에서 같은 screen 세션에 동시에 접속해서 작업할수 있다는 내용인데, 직접 해보니 Pair Programming할 때 아주 유용할거 같습니다. 그래서 검색을 해보니 위키(한글)에도 이러한 내용이 소개되어 있네요.

약 5년전에 하이텔(?)에 올렸던 글이 있어서 약간 내용 보충해서 올립니다.

-----

원격에서 작업하다 보면 여러창을 보고 싶을때가 많지만, 따로 로그인 하기도 귀찮고, 여러창 왔다갔다 할때도 어느 터미널이 어느 기계인지 많아지면 관리가 안되죠 --; 이럴때 사용하면 편리한 것이 screen입니다.

screen은 한 터미널 화면에서 여러 쉘과 프로그램을 띄울수 있으며, 또한 세션 관리 기능도 지원해서 터미널을 종료해도 나중에 다시 그 세션으로 복귀할수 있기 때문에 정말 편리합니다. 저는 이제 로컬에서도 screen을 애용하고 있네요.

먼저 시작은

% screen

또는

% screen -S 세션명

으로 시작하고, screen 실행후 모든 명령은 Ctrl-a로 시작합니다:

Ctrl-a, c : (create) 새로운 쉘이 생기면서 그 쉘로 이동
Ctrl-a, a : 바로 전 창으로 이동
Ctrl-a, n : (next) 다음 창으로 이동
Ctrl-a, p : (previous) 이전 창으로 이동
Ctrl-a, 숫자 : 숫자에 해당하는 창으로 이동
Ctrl-a, d : (detach) screen 세션에서 빠져나옴
Ctrl-a, x : lock screen

Ctrl-a, [ : 화면에서 텍스트 선택하여 클립보드로 복사 (화면 스크롤 가능)
            이때 vi와 동일하게 커서 이동할수 있고, space로 영역을 선택
Ctrl-a, ] : 클릭보드 텍스트 붙이기

Ctrl-a, S : (split) 창을 나눔 (region)
Ctrl-a, Tab : 다른 region으로 이동
Ctrl-a, Q : 현재 region을 제외한 나머지 숨기기

Ctrl-a, : : 명령모드로 들어갑니다.


위 명령 정도를 알고있으면, 불편하지 않게 사용할수 있으며, detach 시 세션이 종료되는 것은 아니고

% screen -r 세션명


으로 그전 세션을 다시 불러들일수 있습니다. 여러 창을 쓴다는 장점도 있지만, 세션 관리가 되는것도 아주 큰 장점입니다.

세션이 여러개 있으면 screen -list 하면 세션명이 쭉 나오고 (-S로 지정하지 않았으면 자동으로 이름이 할당됩니다)

세션을 완전히 종료하기 위해서는 모든 창에서 빠져나오면(exit 등으로) screen을 빠져나옵니다. 한번에 종료할려면 Ctrl-a : quit 하면 전체 창이 종료됩니다. 하지만 창을 하나씩 확인하면서 종료하는게 안전하겠죠.

split으로 화면을 나누면, 나눠진 공간(region) 별로 다른 창으로 전환할 수 있습니다.

% screen -x 세션명

-x는 -r과 동일하지만 그 전에 연결된 터미널을 끊지않고 세션에 동시에 연결합니다. 같은 세션을 여러명이 공유할수 있고, 세션에서 같은 화면을 보고 있으면 작업하는 내용이 실시간으로 보입니다.

스크린 사용하면 원래 사용하는 터미널의 히스토리 버퍼가 정상적으로 동작하지 않는데, 이때 Ctrl-a, [ 또는 Ctrl-a, ESC 를 이용하면 지나간 텍스트를 볼수 있습니다. 버퍼 크기는 .screenrc에서 "defscrollback 라인수"로 정할수 있으며 디폴트 값은 약간 작은 100 라인 입니다.

다음은 제 .screenrc 파일입니다. hardstatus는 여기를 참고했습니다.

vbell off
defscrollback 500
hardstatus alwayslastline
hardstatus string '%{gk}[%{wk}%?%-Lw%?%{=b kR}(%{W}%n*%f %t%?(%u)%?%{=b kR})%{= kw}%?%+Lw%?%?%= %{g}][%{Y}%l%{g}]%{=b C}[%H]%{W}'

hardstatus를 설정해서 맨 아래줄에 화면 리스트와 load average, 호스트명 등을 표시해줍니다.



FreeBSD blackhole 기능

UNIX 2007/05/06 01:59
FreeBSD에서 DoS 공격을 근본적으로 막을 방법은 뾰족히 없지만 좀 느리게 만드는 방법입니다. PF(Packet Filter)로 잘 설정하고 싶지만 연결을 많이 유지하는 서버에서 PF가 성능저하가 있는거 같아서 일단 다른방법으로 대처했습니다.

man blackhole 하면 자세한 설명 볼수 있으며,

net.inet.tcp.blackhole와 net.inet.udp.blackhole을 세팅하면 됩니다.

# sysctl -w net.inet.tcp.blackhole=1
# sysctl -w net.inet.udp.blackhole=1

포트 스캔할때, 닫혀있는 포트에 대해서는 리셋(RST) 패킷이 날라가는데 이걸 아예 안보내게 합니다. tcp.blackhole의 경우 1이면 연결(SYN) 패킷에 대해서 RST를 안보내며, 2로 세팅하면 모든 패킷에 대해서 RST를 안보냅니다. UDP는 따로 연결 패킷이 없기 때문에 1로 세팅하면 닫혀있는 포트로 오는 패킷에 대해서 RST 응답을 안보내고 무시합니다.

포트스캔을 하면 없는 포트로 많은 패킷이 오기 때문에 RST 패킷이 많이 나가게 됩니다. 이럴 경우 시스템에 부하를 일으킬 소지가 있으므로, FreeBSD에서는 RST를 보낼때 1초에 200개의 RST 패킷만 보내도록 제한이 되어있습니다. 이를 넘을 경우 아래와 같은 경고 메시지가 dmesg 등에 나타납니다.

Limiting closed port RST response from 286 to 200 packets/sec
Limiting closed port RST response from 463 to 200 packets/sec

여기 IP 정보가 나오지 않기 때문에 정보를 보기 위해서는

# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1

하지만 이렇게 하면 로깅되는 정보가 너무 상당히 때문에 시스템에 더 큰 부하를 일으킬 가능성이있습니다. 공격을 당하는 서버에서는 잠깐동안 기능을 켰다가 끄도록 아래처럼 실행하세요.

# sysctl -w net.inet.tcp.log_in_vain=1; sleep 5; sysctl -w net.inet.tcp.log_in_vain=0

위에 처럼 서버(SERVER_IP)에서 돌리고, 원격 서버(SCANNER_IP)에서 nmap을 돌려봤습니다. 스캔 당하는 SERVER_IP에서는 blackhole 기능은 끈상태입니다.

Connection attempt to TCP SERVER_IP:25 from SCANNER_IP:38947 flags:0x02
Connection attempt to TCP SERVER_IP:1723 from SCANNER_IP:38947 flags:0x02
Connection attempt to TCP SERVER_IP:3389 from SCANNER_IP:38947 flags:0x02
... (생략)
Limiting closed port RST response from 233 to 200 packets/sec
... (생략)
Limiting closed port RST response from 262 to 200 packets/sec
... (생략)
Limiting closed port RST response from 279 to 200 packets/sec

blackhole=1로 설정한 상태에서는 Limiting closed port... 메시지가 나타나지 않고, nmap의 실행속도가 많이 느려집니다. 글쓰면서 실행해봤는데 몇분이 지나도 끝나지가 않는군요. 답답해서 nmap 실행창에서 엔터를 쳤더니 다음과 같은 메시지가 나오네요. ㅎㅎ 콘솔 프로그램인데 이런거까지 신경써주는군요. ^^

Stats: 0:06:49 elapsed; 1 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 72.17% done; ETC: 01:59 (0:02:37 remaining)


한가지 문제가 blackhole 기능을 켜두면 원격에서 서버 모니터링할때 서버가 죽어도 응답이 바로 오지않는 문제가 있는데, PF를 통해서 포트에 따라서 선택적으로 blackhole 기능처럼 RST 보내지 않도록 설정하는것이 더 좋을거 같네요.


정말 오랜만에 오프라인 모임에 나가보았습니다. 온라인으로도 활동을 거의 안하긴 하지만... 얼마전부터 다른 사람들의 블로그 글들을 꾸준히 읽다보니 제가 뒤쳐지는 느낌도 들고, 회사 내에서 회사일만 하기도 바쁘다보니 보는 시야가 너무 한정되는거 같아서 오프라인 모임 같은곳에 한번 나가야겠다는 생각은 했었습니다.

스마트플레이스에서 "Unix/Linux 엔지니어, 개발자, IT 매니저와의 대화"글을 보고 설문에 참여했었는데 연락 주셔서 어제 모임에 참석하게 되었습니다. 모임의 성격은 약간 애매했던거 같은데, 개발자가 아닌 다른 입장에서 왜 유닉스를 사용하는지에 대해서 들을수 있어서 도움이 되었습니다. 또한 작은 기업에서 서비스 운영하다보니 싼 서버에 오픈 소스 유닉스만 사용하고, 최적화의 끝을 찾아헤매는데, CPU 32개 이상 서버, 문제있을때 4시간만에 출장은 다른 나라 얘기같더군요. 그래도 최적화를 하면서 많은 보람을 느끼는데 최적화를 통해서 다른 곳에서 하지 못하는 서비스를 언젠가 할수 있다고 믿고 싶네요.

모임은 스플 멤버 외에 참가한 사람들의 소개로 시작해서 소개로 끝났습니다. 많은 얘기 나누지는 못했지만 참가한 모든 사람들의 열정적인 모습 보고 많은 자극 받았습니다. 블로그 들어가서 보니 참 많은 생각 하시고, 부지런한 분들이시더군요.

앞으로도 오프모임 자주 참석해서 사람들 많이 만나봐야겠다는 생각이 드네요.

그리고 준비해주신 기념품 너무 고맙게 받았습니다. ^^

이번에 회사에서 새 서버들을 구매해서 IDC에 들어왔습니다. Dell PowerEdge SC1435로 AMD기반 옵테론 CPU라서 FreeBSD보다는 Linux가 좋을거 같더군요. 전에도 델서버 들어왔었는데 FreeBSD에서 네트워크 디바이스가 정상적으로 동작을 안하더군요. 델서비스에 연락했더니 Redhat Enterprise Linux(RHEL)구해서 설치하라고 해서 설치했었는데 네트워크 드라이버를 따로 구해서 설치해야되더군요. 서버에는 원래 엑스를 설치를 잘 안해서 고생했습니다. 일단 이미 설치된 다른 서버에 X 설치하고 웹에서 다운로드하는데 문서가 exe 파일이더군요! 황당 --; 집으로 VNC로 연결하여 실행하여 풀어보니 별거 없더군요 --; 설치했던 서버는 PE2950이었습니다. 다행히 USB 메모리가 있어서 네트워크를 잡을수 있었습니다...  그때 RHEL4를 받아서 설치했었는데 유료사용자가 아니면 업그레이드가 안되더군요. 그래서 이번에는 RHEL 소스를 이용하여 바이너리 호환이 되는 CentOS (Community Enterprise OS) AMD64 버전을 받아서 설치했습니다.

서버 여러대 설치하느라 시간이 좀 남아서(DVD 한장만 궈서갔음) FreeBSD 6.2(AMD64)도 설치해봤는데 별 이상없이 깔리더군요. 근데 SC1435에 PS/2 포트가 없어서 USB포트로 키보드와 마우스를 연결(Y케이블 이용해서 PS/2 키보드와 마우스연결)했는데 뺐다가 끼면 키보드와 마우스가 인식이 안되더군요.. 관리편의상 동시에 들어오는 서버는 같은 OS를 설치하는게 편하기 때문에 다시 밀고 CentOS를 설치하고, 업데이트까지 무사히 마치고 왔습니다. 업데이트는 정말 편하더군요. (#yum update) 그리고 네트워크 드라이버도 추가 설치없이 바로 잡히더군요.

이제 CentOS(AMD64)에서 lighttpd와 친구들 설치 방법에 대해서 설명드릴께요^^

AMD64의 php는 fastcgi가 컴파일안되어 있어서 lighttpd와 php를 fastcgi와 연결하기 위해서 php를 컴파일했습니다.

# cd /opt
# wget http://isoredirect.centos.org/centos/4/os/SRPMS/php-4.3.9-3.15.src.rpm
# rpm -i php-4.3.9-3.15.src.rpm
# vi /usr/src/redhat/SPECS/php.spec
       --enable-force-cgi-redirect \
      앞줄에
       --enable-fastcgi \
      를 넣어줍니다.

# rpmbuild -bb php.spec

이때 필요한 패키지를 설치하고 해야할수도 있습니다. 오류에 뭐가 필요하다고 나옵니다.
  ( # yum update aspell-devel httpd-devel pcre-devel ...)
컴파일 완료되면 /usr/src/redhat/RPMS/x86_64 (또는 i386)에 바이너리 rpm이 생깁니다.

컴파일후 원하는 패키지를 업데이트 합니다. 버전번호 때문에 업그레이드가 안되면 --force를 이용해서 강제로 업데이트하면 됩니다.


lighttpd는 src rpm을 받아서 컴파일 합니다.

# wget http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# rpmbuild --rebuild lighttpd-1.3.15-1.src.rpm


xcache 역시 src rpm을 받아서 설치합니다.
# wget http://www.jasonlitka.com/media/files/SRPMS/php-xcache-1.2.0_0.2.src.rpm
# rpmbuild --rebuild php-xcache-1.2.0_0.2.src.rpm

rpm 바이너리 파일은 /usr/src/redhat/RPMS/x86_64 나 i386 등에 생깁니다. 적당히 원하는 패키지를 설치해주면 됩니다. 5대 서버에 설치하느라 한곳에서 컴파일하고 다음 스크립트를 이용하여 여러서버에 설치하였습니다.

#!/bin/sh
# install_lighttpd.sh

/usr/sbin/apachectl stop

rpm -ivh lighttpd-1.4.13-1.x86_64.rpm
rpm -Uvh --force php-4.3.9-3.15.x86_64.rpm php-devel-4.3.9-3.15.x86_64.rpm  php-pear-4.3.9-3.15.x86_64.rpm php-ldap-4.3.9-3.15.x86_64.rpm  php-mysql-4.3.9-3.15.x86_64.rpm
rpm -ivh php-xcache-4.3.9_1.2.0-0.2.x86_64.rpm

mkdir -p /etc/lighttpd
cp ./lighttpd.conf /etc/lighttpd
adduser -s /sbin/nologin www
/sbin/chkconfig httpd off
/sbin/chkconfig --add lighttpd
/sbin/chkconfig lighttpd on

touch /var/log/lighttpd.access.log
touch /var/log/lighttpd.error.log

chown www:www /var/log/lighttpd.access.log
chown www:www /var/log/lighttpd.error.log

/etc/init.d/lighttpd start

lighttpd.conf는 freebsd에서 사용하던걸 그대로 가져와서 server.event-handler 등 몇가지만 바꿨습니다. 주석등의 라인은 삭제했습니다.

# lighttpd.conf
server.modules              = (
                               "mod_redirect",
                               "mod_alias",
                               "mod_access",
                              "mod_status",
                              "mod_fastcgi",
                              "mod_userdir",
                               "mod_accesslog" )
server.document-root = "/var/www/html/"
accesslog.filename          = "/var/log/lighttpd.access.log"
server.errorlog             = "/var/log/lighttpd.error.log"
index-file.names            = ( "index.php", "index.html",
                               "index.htm", "default.htm" )
server.event-handler = "linux-sysepoll"
mimetype.assign             = (
  생략...
)

userdir.path = "public_html"
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
server.pid-file            = "/var/run/lighttpd.pid"
server.username            = "www"
server.groupname           = "www"
fastcgi.server              = ( ".php" =>
                               ( "localhost" =>
                                 (
                                  "socket" => "/tmp/php-fastcgi.socket",
                                  "bin-path" => "/usr/bin/php",
                                  "min-procs" => 1,
                                  "max-procs" => 2,
                                  "max-load-per-proc" => 4,
                                  "idle-timeout" => 10,
                                  "bin-environment" => ( "PHP_FCGI_CHILDREN" => "16",
                                                         "PHP_FCGI_MAX_REQUESTS" => "2000" )
                                 )
                              )
                             )

server.max-fds = 4096

그리고 로그가 계속 쌓이지 않도록 /etc/logrotate.d/lighttpd 파일을 만들었습니다.
/var/log/lighttpd.*.log {
  rotate 30
  daily
  missingok
  notifempty
  compress
  sharedscripts
  postrotate
       touch /var/log/lighttpd.access.log
       touch /var/log/lighttpd.error.log
       chown www:www /var/log/lighttpd.access.log
       chown www:www /var/log/lighttpd.error.log
       /bin/kill -HUP `cat /var/run/lighttpd.pid 2>/dev/null` 2> /dev/null || true
  endscript
}

참고 URL:
http://www.cyberciti.biz/tips/redhat-enterprise-linux-lighttpd-fastcgi-php.html
http://www.jasonlitka.com/2006/12/20/php-caching-and-acceleration-with-xcache/



UTF-8, putty, VIM, screen

UNIX 2006/10/15 14:10
원래 EUC-KR로 터미널에서 작업했었는데, 태터툴즈를 깔고 나서 UTF-8로 일부 변경하고 있습니다. 사용하는 환경은 윈도우즈에서 putty를 이용하여 FreeBSD 서버에 SSH로 접속해서 screen을 띄우고 vim을 이용하여 편집합니다.

putty설정: "창-변환-수신한 데이타를 이 문자셋으로 가정"에서 UTF-8로 바꾼후 설정 저장.

vim설정: .vimrc에 다음 추가합니다. euc-kr 파일도 편집이 가능하며, 새로운 파일을 저장할때는 UTF-8로 저장됩니다. 기존 euc-kr 문서는 그대로 저장됩니다.

set encoding=utf-8
set fileencodings=utf-8,euc-kr

screen: -U 옵션 사용.  처음 세션 만들때 뿐만이 아니라, 세션을 resume할때도 -U 옵션을 주어야합니다! 아직 .screenrc에 어떻게 넣어야 적용되는지 모르겠습니다.

% screen -US mysession
[Ctrl-A][Ctrl-D] (detach screen)
% screen -Ur mysession

.cshrc: .cshrc에 LANG을 아래와 같이 정해주면 screen에서 -U 옵션을 주지 않아도 되더군요.
setenv LANG ko_KR.UTF-8

bash 사용자는
export LANG=ko_KR.UTF-8




lighttpd 1.4.12 bug

UNIX 2006/10/08 19:27
1.4.12로 업그레이드한 후 서버가 가끔씩 죽었었는데 버그 찾아보니 해결되었네요. 1.4.11로 다운그레이드했었는데 소스 패치해서 다시 올려야겠네요. 1.4.11은 POST할때 가끔 먹통되는 버그가 있었는데, 해결은 아래 링크를 참조: