2007년 4월 21일 토요일

GLS3

lucene의 검색기능과 linux usermode filesystem과의 결합이라고 생각된다. 좀더 자세한 것은 관련 문서를 살펴보아야 알 수 있을 것 같다.

하지만, 현재까지의 상황만을 보아도 만약 embedded 단말에 적용만 가능하다면 엄청난 기능을 제공할 것으로 판단된다.

다만, GPL이라 사용이 가능할지 모르겠다.

http://www.glscube.org

LUFS & FUSE

Linux User Mode Filesystem을 작성하기 위한 framework 이다.

다양한 예제가 존재하므로 참조할만 하다. 현재 작업중인 프로젝트에서 이 기술을 사용할 수 있기를 기대한다.

http://lufs.sourceforge.net/lufs/

그런데, 이놈의 프로젝트가 개발을 2003년 이후로 중단한 것 같다. 새로운 프로젝트 FUSE가 더 유력하다.

FUSE는 http://fuse.sourceforge.net/ 에서 참조하자.

LD_ASSUME_KERNEL

이 환경변수를 설정하여 NPTL이 아닌 linuxthread를 사용하게 할 수 있다. 그렇다고 디버깅이 더 편해지지는 않겠지만...

LD_ASSUME_KERNEL=2.2.5 or 2.4.1

2007년 4월 1일 일요일

ssh tunneling

ssh는 다양한 기능이 많은데, 그중에 하나가 tunneling 기능이다. 여기서 설명할 상황은 다음과 같다.

notebook 한대가 있는데, 이것은 사무실과 집 등 다양한 장소에서 사용이 가능하다. 그런데, 집에서 회사의 특정 server에 접속하려고 하는데, 이 server는 firewall 설정으로 인해 외부로 부터의 접속을 차단하고 있어, 접속할 수가 없다.
하지만, 나에게는 회사에 ssh 접속이 가능한 linux가 설치된 desktop이 있다.
이제, notebook에서 desktop을 거쳐 회사의 server에 ssh로 접속하는 방법에 대해 알아 보도록 하자.

간단히 요약하면 과정은 다음과 같다.
  • desktop에서 다음 명령을 실행하고, 접속을 계속 유지시킨다. (즉, 터미널 창을 닫지 말고 유지해야 한다.)
$ ssh -R 5000:server:22 desktop_user@desktop

이것은 desktop의 port 5000으로부터 수신되는 모든 packet을 server의 port 22로 전달하는 일을 하는 ssh 프로그램을 기동하는 것이다.
  • notebook에서 다음 명령을 실행하고, 접속을 계속 유지시킨다.
$ ssh -L 5000:server:22 desktop_user@desktop

이것은 notebook과 desktop 사이의 tunneling을 유지하는 ssh 프로그램을 기동하는 것이다. 이제 notebook의 port 5000으로 입력되는 모든 packet이 desktop port 5000으로 전달 되는 것과 같은 효과를 가진다.
이 방법은 5000 포트를 이용하여 desktop에 접속할 수 없는 경우에, ssh 연결을 통해 5000 포트를 이용하는 것과 같은 효과를 보인다.
  • 다음 명령을 이용하여 서버에 접속한다.
$ ssh server_user@localhost -p 5000

이제 localhost의 포트 5000에 접속을 하면, ssh에 의해 packet이 desktop에 전달 되고, 다시 desktop에서 server로 전달된다.

사실, 항상 ssh -L 옵션에 해당하는 명령을 실행하고 접속을 하기 때문에, 이 명령의 역할이 이 글에 나열된 것과 동일한지 확인치 못했다.

이것저것 확인하기 귀찮으면, 이 방법을 그대로 따라해도 된다. 또한, 5000 이라는 포트 번호만 바꿔 주면, MSN등의 다른 서비스에 대한 터널링도 가능하다. 이러한 터널링은 외부 접속이 차단된 어떤 단체 내부에서 차단된 서비스를 이용하고자 할때 외부에 서버를 설치하고, 터널링을 연결하는 경우에도 사용할 수 있다.

ssh의 경우 port 22번을 기본으로 사용하지만, 외부 서버의 설정을 바꾸면 80 포트와 같이 http를 위한 포트를 ssh로 사용할 수 있기 때문에, 거의 어떠한 경우에도 적용이 가능한 방법이다.

ssh keychain

내 컴퓨터에서 다른 컴퓨터로 ssh로 login을 할 때 매번 암호를 물어 보는게 귀찮은 경우 사용한다.
주로, cvs나 svn을 ssh를 이용하여 사용할 때 유용한데, cvs의 경우 update, commit 등 각 명령어 마다 ssh 암호를 물어 본다. 이건 아주 귀찮은 작업이다.

  • 먼저 사용중인 컴퓨터를 위한 공개키/개인키를 생성한다.
일단 키를 생성한다. 다음 명령어를 사용하여 진행한다.

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/king/.ssh/id_dsa): (hit enter)
Enter passphrase (empty for no passphrase): (enter a passphrase)
Enter same passphrase again: (enter it again)
Your identification has been saved in /home/king/.ssh/id_dsa.
Your public key has been saved in /home/king/.ssh/id_dsa.pub.
The key fingerprint is:
a4:e7:f2:39:a7:eb:fd:f8:39:f1:f1:7b:fe:48:a1:09 king@blue
키는 $HOME/.ssh 디렉토리에 생성되며, id_dsa는 개인키이고, id_dsa.pub 는 공개키다.
  • 공개키를 접속하기를 원하는 컴퓨터에 등록한다.
생성된 공개키 id_dsa.pub 파일을 Target의 $HOME/.ssh/authorized_keys 에 추가한다.
추가 방법은 다음과 같다.

$ scp $HOME/.ssh/id_dsa.pub user@target:~/.ssh
$ ssh user@target
$ cat .ssh/id_dsa.pub >> .ssh/authorized_keys
이제 접속을 하면 조금 다른 인증 과정을 거친다. 키를 만들때 등록한 암호를 통하여 접속하게 된다.

$ ssh user@target
Enter passphrase for key '/home/king/.ssh/id_dsa':

여기까지의 결과는 일반적인 접속 방식과 크게 다를 바가 없다. 하지만, 생성된 키를 keychain을 통해 관리하게 되면 상황이 달라진다.
  • keychain을 이용하여 키를 관리하도록 한다.
먼저 keychain을 설치한다. 사실 진실로 키를 관리하는 것은 ssh-agent 라는 놈이다. 이놈이 키를 관리하지만, 이러한 관리에 도움을 주는 도구가 keychain이다.
keychain을 사용하면, session 형태의 관리를 지원하므로, 한번의 설정으로 접속시 물어보는 암호 확인 절차를 생략할 수 있다.

다음과 같은 명령으로 keychain을 실행한다.

$ /usr/bin/keychain id_dsa
Copyright 2002-2004 Gentoo Foundation; Distributed under the GPL

* Initializing /home/king/.keychain/blue-sh file...
* Initializing /home/king/.keychain/blue-csh file...
* Initializing /home/king/.keychain/blue-fish file...
* Starting ssh-agent
* Initializing /home/king/.keychain/blue-sh-gpg file...
* Initializing /home/king/.keychain/blue-csh-gpg file...
* Initializing /home/king/.keychain/blue-fish-gpg file...
* Starting gpg-agent
* Error: Failed to start gpg-agent
* Adding 1 ssh key(s)...
Enter passphrase for /home/king/.ssh/id_dsa: (enter a passphrase)

$ source $HOME/.keychain/tal-sh
$ ssh user@target

이 명령어 중에 keychain을 실행 시키는 명령은 단 한번만 실행하면 되고, tal-sh를 실행 시키는 과정은 .bashrc 에 등록하여 매번 shell이 동작할 때 마다 해 주어야 하는 작업이다.

keychain이 동작시 생성되는 환경 변수를 $HOME/.keychain 디렉토리에 저장한다. 이 환경 변수를 설정하면 암호 확인 없이 target에 접속할 수 있게 된다.

때문에, .bashrc에 다음과 같은 간단한 명령을 추가하는 것이 좋다.

if [ -f $HOME/.keychain/tal-sh ]; then
source $HOME/.keychain/tal-sh
fi

더불어 keychain을 간단히 다음과 같이 등록하여 사용해도 좋다.

keychain() {
/usr/bin/keychain id_dsa
source $HOME/.keychain/tal-sh
}