[서비스] IRC 서버 구축 방법

IRC 서버 구축

아래에 쓰는 모든 내용은 어디든지 공개하셔도 좋고, 수정하셔도 좋습니다.

다른 곳에 올리시는 분은 저에게 메일을 주시면 고맙겠습니다.

1. IRC 란… – 기본적인 IRC 지식. 명령어는 소개 안합니다.

2. IRC 서버 설치 – 컴파일 및 인스톨

3. IRC 서버 환경 설정 – ircd.conf, ircd.motd 만들기, ircd daemon 실행

4. IRC 클라이언트 설치 – 서버에 접속하기 위한 클라이언트 설치

5. 마치며…

==========================

1. IRC 란…

==========================

우선 기본적인 IRC 에 대해서 얘기를 하겠습니다.

IRC(Internet Relay Chaty) 가 무엇인지는 아시죠. 인터넷 채팅입니다. 88년도

핀란드의 자코 오이카리넨이란 학생이 만들어서 지금은 인터넷에서 인기있는

서비스가 되었습니다.

IRC 는 서버들간의 연계가 가능합니다. 보통 통신망(여기서는 BBS)에서는 각

통신망에 있는 사람들끼리만 채팅이 가능한데 IRC 는 그렇지 않습니다. IRC 서버

끼리 연계가 되어있다면 서로 다른 서버에 접속해 있는 유저들도 같이 채팅이

가능한 겁니다. 참고로 아래는 IRC 서버들의 연계도(?) 입니다.

┌── mail.kornet.nm.kr

├── procsys.kwangwoon.ac.kr

├── geo.skku.ac.kr

├── bubble.yonsei.ac.kr

irc.kornet.nm.kr ──┼── dragon.yonsei.ac.kr

│ ├── cosmoas.kaist.ac.kr

│ ├── bora.dacom.co.kr

│ ├── orange.interpia.net

│ ├── goldey.gbc.edu

│ ├── hong.tower.wayne.edu

│ └── irc.netizen.net



hanabbs.com ────┬── cafe.iworld.net

└── korea.usc.edu

위에서 보면 irc.kornet.nm.kr 에 접속한 유저나 cafe.iworld.net 으로 접속한

유저나 똑같은 방을 볼 수 있고, 동시에 채팅도 같이 할 수가 있습니다.

==========================

2. IRC 서버 설치

==========================

이제 IRC 서버 구축얘기를 하겠습니다.

2-1. IRC 서버 프로그램 구하기

ftp://ftp.kornet.nm.kr/pub/Hangul/network/HanIRC/server 에서 아래의 세개

파일을 받습니다.

1. README.irc2.8.20.HAN 636 바이트

2. example.conf.han 6362 바이트

3. irc2.8.21.HAN2.tgz 316677 바이트

첫 번째 파일은 안 받으셔도 좋습니다. 두 번째 파일(example.conf.han) 은

ircd 의 환경파일인 ircd.conf 파일의 예입니다. 안에 ircd.conf 설정에 대해

한글로 설명이 되어 있습니다. 마지막 파일이 서버 프로그램입니다.

2-2. 컴파일

아무디렉토리에나 irc2.8.21.HAN2.tgz 파일을 풀고 만들어진 디렉토리로

갑니다.

————————————————————————



freenet:~/new# tar xvfz irc2.8.21.HAN2.tgz

freenet:~/new# cd irc2.8.21.HAN2

freenet:~/new/irc2.8.21.HAN2#

————————————————————————

그리고 README.HAN 과 doc/INSTALL 파일(영어임)을 읽어 보시면 설치에 도



이 될겁니다. 꼭 읽어보세요.

1) include/config.h 부터 수정을 수정을 합니다.

디버그 모드를 쓰기를 원하신다면,

#undef DEBUGMODE 을

#define DEBUGMODE 으로 지정을 하세요.

아래는 ircd 관련 파일들의 경로 지정 부분입니다. 꼭 아래와 같이 안으셔도

됩니다. ( 아래는 저의 경우입니다.)

#define DPATH “/usr/local/lib/ircd”

#define SPATH “/usr/local/bin/ircd”

#define CPATH “/usr/local/lib/ircd.conf”

#define MPATH “/usr/local/lib/ircd.motd”

#define LPATH “/tmp/ircd.log” /* debug모드때 저장 파일 */

#define PPATH “/var/run/ircd.pid”

DPATH = 서버를 위해 사용할 디렉토리입니다.

SPATH = ircd daemon 이 있는 디렉토리를 지정합니다.

엄밀히 말하면 디렉토리와 ircd daemon 파일

CPATH = ircd daemon 의 환경파일입니다.

MPATH = irc client 가 접속한 후에 보여 줄 motd(Message Of The Day) 파일

을 지정합니다. telnet 의 경우를 예로 들면, telnet 으로 접속을 할

경우 login 후에 보여주는 메시지와 같은 역할을 하는 파일이라고

생각 하시면 됩니다.

LPATH = 디버그모드일 때 사용할 log 파일을 지정합니다. 디버그모드를 지정

하지 않았으면 /dev/null 을 넣으시기 바랍니다.

PPATH = ircd daemon 이 실행될 때 PID 가 저장될 파일입니다.

config.h 의 아래 부분은 고칠 것이 특별히 없습니다.

2) 이제 ircd/ircd.c 파일을 수정합니다.

이 것은 ircd daemon 을 root 로 실행하기 위한 것입니다. 보안을 위해 root

로 실행하기를 바라지 않을 수도 있습니다. 하지만 저의 경우 /etc/rc.d/rc.local

에서 부팅시에 바로 ircd daemon 이 실행 되도록하기 위해서 수정을 했습니다.

if ((int)getuid() == 0) 을

if ((int)getuid() == 1) 으로 고치면 됩니다.

3) Makefile 파일을 수정합니다.

위의 config.h 파일에서 지정한 곳(SPATH= 에서 지정한 곳)에 ‘ircd’ 파일이

install 되도록 하기위해서 고치는 겁니다.

IRCDDIR=/usr/local/src/ircd 을

IRCDDIR=/usr/local/lib/ircd 으로 고치면 됩니다.

4) make; make install 을 합니다.

make 을 하게되면 자동으로 ./Config 파일이 실행이 되고, 컴파일하기 위한

환경을 설정하게 됩니다.

Which compiler do you use, gcc or cc or…?

[cc] -> gcc

위의 경우만 gcc 로 하고, 나머지는 엔터만 쳐도 컴파일이 잘 됩니다. 그리고

컴파일할 때 발생하는 몇몇 경고는 무시하기 바랍니다. (경고도 없앨 수 있는

실력자(?)이면 더욱 좋겠지만…)

다 컴파일이 끝나면 make install 을 합니다.

5) 이제 맨페이지를 인스톨 합니다.

이게 참 귀찮더군요. 4 번에서 make install 하면 알아서 맨페이지도 설치

까지 해 주면 좋은데, 그렇지 못합니다. 그래서 우선 doc 디렉토리에 가서

make install 을 하시기 바랍니다. irc.1, ircd.8 맨페이지가 설치됩니다.

컴파일하는데 도움을 주신 김광욱(arsenel@arsenel.paichai.ac.kr, 나우 ID도

arsenel)님께 감사드립니다.

ircd.conf 및 ircd.motd 만드는 것과 클라이언트 설치하는 것은 다음강좌에…

==========================

3. IRC 서버 환경 설정

==========================

3-1. ircd.conf 만들기

include/config.h 에서 CPATH 로 지정한 곳에 down 받은 example.conf.han



ircd.conf 이름으로 복사를 합니다. 이 ircd.conf 파일은 모두 13가지(더 정확히

는 14가지)를 지정을 해주어야 합니다. 하지만 보통 5- 7가지 정도만 지정하면

됩니다. 각 지정 값들은 /etc/passwd 파일과 같이 ‘:’ 문자로 구분을 합니다.

example.conf.han 에는 설정할 내용을 한글로 설명이 되어 있습니다. 아래는

이 파일을 토대로 설명하겠습니다.

1) M: 서버 이름을 정합니다.

필드의 순서는 ‘호스트이름’, 공란, ‘서버 이름’, ‘포트번호’입니다.

포트번호는 일반적으로 6667로 하면 된다.

M:203.232.99.228:*:FreeNetworK:6667

‘*’ 표가 있는 3번째 필드는 사용하지 않는 부분입니다. 그냥 아무것도 쓰지

않아도 됩니다.

2) A: 관리자 정보를 지정합니다.

세개의 필드로 되어 있으며, 어떠한 텍스트가 들어가도 된다.

A:FreeNetworK:전남 나주 – Naju, Chonnam, KR:Jinho Hwangbo

(길어서 두 줄로 나눕니다.)

어떻게 쓰셔도 상관이 없습니다. 위의 내용은 client (linux 용IRC client나

mIRC 등을 말합니다.) 에서 /admin 명령으로 볼 수 있는 내용을 지정하는 것

입니다. 아래는 IRC client 에서 /admin 할 때 나오는 내용입니다.

————————————————————————



*** Administrative info about 203.232.99.228

*** FreeNetworK

*** 전남 나주 – Naju, Chonnam, KR

*** Jinho Hwangbo

————————————————————————

3) Y: 커넥션 클래스를 지정합니다.

서버의 클래스는 여기서 정해줍니다. 필드의 순서는 클래스 번호, ping

frequency (초단위), connection frequency(초단위), 최대 서버 링크 갯수,

최대 클라이언트 링크 갯수입니다. 저는 특별히 고치지 않았습니다. 링크 갯수

를 조정할 분은 하시기 바랍니다.

# 클라이언트용.

Y:0:900:0:10:10000

# 이 아랫 라인은 허브용.. 링크의 갯수가 50개.

Y:1:1700:90:50:10000

# 이 아랫 라인은 리프용.. 링크의 갯수를 30개로.

Y:2:1000:90:30:10000

4) I: 접속이 가능한 클라이언트를 정의합니다.

도메인 이름이나, IP 주소, 또는 와일드카드를 사용할 수 있고, 두번째 필드

는 암호, 생략가능한 다섯번째 필드는 클래스를 정의합니다.

(첫번째는 보통 숫자, 세번째는 보통 글자 주소를 씁니다.)

I:*::*:0

위의 것은 모든 곳에서 이 IRC 서버에 접속할 수 있도록 한 것입니다. 특별히

제한할 IP, 도메인이 없는 경우 그대로 쓰시면 됩니다. 아래는 168.126.63.*,

*.kornet.nm.kr 에서 들어오는 것을 막는 것입니다.

I:168.126.63.*::*.kornet.nm.kr::1

5) O: 아이알씨 오퍼레이터를 지정합니다.

필드는 순서대로 오퍼레이터의 호스트 이름, 암호, 오퍼레이터의 별명(보통

IRC 에서는 ‘닉’이라고 영어로 짧게 말합니다.)입니다.

O:203.232.108.1:2VAGf9rQ91LcU:truefeel

위의 경우 203.232.108.1 에서 들어오는 truefeel 이 암호화된 위의 암호를

쓰는 사람이 오퍼레이터라는 것을 지정합니다. 위의 것은 /etc/passwd 나

/etc/shadow 와 같이 암호화 된 것입니다. 암호화를 지정할 것인지 안할 것인지

는 include/config.h 에서 CRYPT_OPER_PASSWORD 로 합니다.

#define CRYPT_OPER_PASSWORD (초기값)으로 암호화되어 쓰도록 지정한 것

이며,

암호화를 쓰지 않을 것이면 #undef 으로 지정을 하면 됩니다.

오퍼레이터의 passwd를 암호화하여 ircd.conf 에 저장하는 방법은

irc2.8.21.HAN2.tar.gz 을 풀었을 때 ircd/crypt/crypter 을 이용합니다. 단지

암호가 abcd 일 때 위에서,

O:203.232.108.1:abcd:truefeel

라고 쓰고 crypter 프로그램을 이용하면 자동으로 바꿔줍니다. 하지만 저의 경우

이렇게 안되더군요. ircd/crypt/Makefile 파일을 수정해 봤지만 안되었습니다.

그래서 ircd/crypt/mkpasswd.c 파일을 컴파일해서 만들어진 암호화된

passwd 를

직접 ircd.conf 파일에 써 주었습니다.

————————————————————————



freenet:~/new/irc2.8.21.HAN2/ircd/crypt# ls

. Makefile crypter mkpasswd mkpasswd.o

.. README exec mkpasswd.c sums

freenet:~/new/irc2.8.21.HAN2/ircd/crypt# rm -f mkpasswd

freenet:~/new/irc2.8.21.HAN2/ircd/crypt# gcc mkpasswd.c -o mkpasswd

freenet:~/new/irc2.8.21.HAN2/ircd/crypt# ./mkpasswd

plaintext: <- 여기에 오퍼레이터가 사용할 passwd 를 씁니다.

vh3JG0hIzc3Wk <- 암호화된 passwd 출력

————————————————————————

6) L: 리프 노드를 지정합니다.

이 것은 IRC 서버들 끼리 연계를 하기 위해서 사용합니다. 저는 comment 처리

를 했습니다. 첫번째 ‘1. IRC 란…’ 에서 연계도에서 오른쪽에 표시한 서버들

이 리프 서버들입니다. 나무에서 나무가지라고 생각하면 됩니다.

자기가 연결할 호스트가 리프 노드임을 명시해 줍니다. 첫번째 필드에 리프에

접속이 가능한 마스크, 두번째는 안쓰임, 세번째 필드는 리프 노드의 서버 이름,

생략가능한 네번째 필드는 그 리프가 가질 수 있는 트리의 깊이 (depth)를 나타

냅니다.

# korea.slip.umd.edu 는 단순 리프로 지정이 됨.

L:::korea.slip.umd.edu

7) H: 허브를 지정합니다.

이 것도 위의 6번과 마찬가지로 서버끼리 연계를 하기 위해서 사용을 합니다.

첫번째 ‘1. IRC 란…’ 에서 연계도에서 왼쪽에 표시한 서버들이 허브 서버들

입니다. 이 것도 저는 comment 처리 했습니다.

자기가 연결할 호스트가 허브일 경우 꼭 기술해 줘야합니다.

(자신이 허브일 경우.)

H:*::korea.stanford.edu

여기서 부터는 일반적으로 거의 쓰지 않거나 수정할 필요가 없는 설정이어서

example.conf.han 내용을 그대로 아래에 옮깁니다.

#

# U: 옛날 irc 의 경우 어느 서버로 접속해라 정보인데 쓸디없음.

# (안해도 됨.)

#

# U:hayes.ims.alaska.edu:password:hayes.ims.alaska.edu:6667

#

# C: [NETWORKED]. 우리 서버 보고 어디로 접속해라고 갈쳐주는 것.

# N: [NETWORKED]. 어느 서버에서 우리 서버로 접속해도 된다고 갈쳐주는 것.

#

# 참고로 요 두개는 쌍으로 보통 쓴다.

#

# 에또, 그럼 두개의 형식은..

#

# C:연결할 서버 주소:암호:연결할 서버 이름:포트:연결클래스

# N:연결될 주소:암호:연결될 서버 이름:호스트마스크:클래스

#

# 호스트 마스크는 자기 호스트 이름을 다르게 보이고 싶을때, 그 갯수를 쓴다.

# 예를 들면 ara.kaist.ac.kr 일때 호스트 마스크가 1이면 *.kaist.ac.kr 이

# 되고, 2이면 *.ac.kr 로 표시가 된다. (내 서버가 그쪽에 그렇게 알려짐.)

#

# 보안을 위해서 암호 두개는 다르게 씁시다. 음냐.

#

# 다음 두 줄은 korea.slip.umd.EDU에 접속을 자동으로 이루자고 하는

# 내용이다. (뭐 별거 없음.)

# 클래스를 2번으로 정했음. (리프노드)

#C:korea.slip.umd.EDU:BigCheese:korea.slip.umd.EDU:6667:2 <- 저는 이부

분을

#N:korea.slip.umd.EDU:CheeseBig:korea.slip.umd.EDU::2 <- comment 함.

# 요 아랫 부분은 별로 중요하지 않으니까 관심있으면 해석해서 써먹으세요.

#

# K: kill a user automatically upon connecting. This is used to deny

# troublesome users access to your server. The fields are, in order,

# hostname (wildcards are allowed), time of day, and username.

#K:*.alaska.edu::FSSPR

#K:acad3.alaska.edu:0900-1200,1400-1700:*

#R:kaja.gi.alaska.edu:/usr/local/lib/irc/does-eric-get-in:ejo

#Q::server is run by weenies:poe.acc.virginia.edu

P:*:::6666

3-2. ircd.motd 만들기

이 것도 ircd.conf 와 마찬가지로 include/config.h 에서 MPATH 로 지정한 곳

에 만들면 됩니다.

저의 ircd.motd 내용입니다.

————————————————————————



안녕하세요. 여기는 Linuxer 들을 위한 IRC 서버입니다.

* IP : 203.232.99.228 or 168.126.127.226

사정에 따라 바뀔 수 있습니다.

* Port : 6667

* 기본적인 irc 명령어입니다.

– /help 도움말 보기

– /nick <별명> 닉네임을 변경.

– /list 방이름, 사람수, 제목을 보여줍니다.

– /who -here IRC 서버에 접속한 모든 사용자 목록

/who * 현재 방에 있는 모든 사용자 목록

– /join <#방명> ‘#방명’ 으로 들어갑니다.

– /leave * 현재 방을 나갑니다.

– /quit IRC 종료

* 문의는 bluefine@nownuri.net

truefeel@arsenel.paichai.ac.kr

————————————————————————

실제 irc client 로 서버에 접속했을 때 처음에 나오는 화면은 다음과 같습니다.

————————————————————————



*** Connecting to port 6667 of server 203.232.108.1

*** Welcome to the Internet Relay Network truefeel (from 203.232.99.228)

*** If you have not already done so, please read the new user information

with /HELP NEWUSER (길어서 두 줄로 씁니다.)

*** Your host is 203.232.99.228, running version 2.8.21.HAN2

*** This server was created Tue Jun 24 1997 at 00: 53:54 KST

*** umodes available oiws, channel modes available biklmnopstv

*** There are 1 users and 0 invisible on 1 servers

*** This server has 1 clients and 0 servers connected

*** – 203.232.99.228 Message of the Day –

*** – 25/6/1997 18:09

*** –

*** – 안녕하세요. 여기는 Linuxer 들을 위한 IRC 서버입니다.

*** –

*** – * IP : 203.232.99.228 or 168.126.127.226

*** – 사정에 따라 바뀔 수 있습니다.

*** – * Port : 6667

*** –

*** – * 기본적인 irc 명령어입니다.

*** – – /help 도움말 보기

*** – – /nick <별명> 닉네임을 변경.

*** – – /list 방이름, 사람수, 제목을 보여줍니다.

*** – – /who -here IRC 서버에 접속한 모든 사용자 목록

*** – /who * 현재 방에 있는 모든 사용자 목록

*** – – /join <#방명> ‘#방명’ 으로 들어갑니다.

*** – – /leave * 현재 방을 나갑니다.

*** – – /quit IRC 종료

*** –

*** – * 문의는 bluefine@nownuri.net

*** – truefeel@arsenel.paichai.ac.kr

[1] truefeel * type /help for help

————————————————————————

3-3. ircd daemon 실행

단순히 ircd 라고만 하면 됩니다. 저는 리눅스 부팅시 실행되도록 하기 위해서

/etc/rc.d/rc.local (저는 슬랙유저입니다.) 에 등록을 했습니다.

# IRC Server

# echo “IRC Server starting…”

/usr/local/bin/ircd

제대로 IRC 서버가 동작하는지 보기 위해서는

freenet:~# irc truefeel localhost 을 하면 됩니다. truefeel 은 IRC 에서 사용

할 닉네임입니다. 즉, IRC 에서 사용하는 이름을 나타냅니다. 만약 irc client

가 설치가 되어 있지 않다면 다음 강좌를 읽어보시기 바랍니다.

==========================

4. IRC 클라이언트 설치

==========================

단순히 나열식으로 쓰겠습니다. 어제(?) 제가 han.comp.os.linux 에 답변으로

포스팅한 내용을 약간 수정한 것입니다.

ftp://ftp.kornet.nm.kr/pub/Hangul/network/HanIRC 에서 파일 두개를 받습니

다.

1. ircii-2.8.HAN2-roman.tar.gz <- 클라이언트

2. ircii-2.8help.tar.gz <- 도움말 파일

(클라이언트에서 /help 했을 때 나오는 것들입니다.)

1) 적당한 곳에 압축을 풉니다.

tar xvfz ircii-2.8.HAN2-roman.tar.gz

INSTALL, README.korean 파일을 읽으면 도움이 될 겁니다.

2) include/config.h 을 수정합니다.

#define DEFAULT_SERVER “36.16.0.36” 을

#define DEFAULT_SERVER “168.126.63.15” 으로 고칩니다.

위의 경우 irc client 를 실행하면 디폴트로 irc.kornet.nm.kr

(168.126.63.15)로 접속하도록 설정한 것입니다. IRC 서버를 자체에 만들었

다면 그 IP 나 도메인을 쓰면 좋겟죠. (도메인도 지정 가능)

아래는 이미 되어 있으니 수정할 것이 특별히 없습니다.

#define DEFAULT_EIGHT_BIT_CHARACTERS 1

3) configure

4) make; make install

설치는 /usr/local/bin 과 /usr/local/lib/irc/* 에 됩니다.

5) 도움말은 /usr/local/lib/irc 에서 풀면 됩니다.

tar xvfz ircii-2.8help.tar.gz

도움말 경로는 irc client 내에서 /set HELP_PATH 으로 변경가능합니다.

==========================

5. 마치며…

==========================

끝까지(끝에만 읽으셨을지도 모르지만. 하하) 읽어주셔서 감사합니다. 꼭

성공하기를 바라며, IRC 의 매력를 느끼시길 바랍니다. 이번에 IRC 붐이 일어날

것 같은 느낌도 들군요. 김상기(gelo@nownuri.net) 님이 power.taegu.net 에

IRC

서버를 구축하실꺼라고 하셨는데 이 글이 좋은 길잡이가 되었으면 합니다.

아울러, 리눅스사용자모임의 서버에 IRC 서버가 설치(하드웨어가 여러 서비스

를 하고 약간의 힘이 남아 IRC 서버까지 할 정도가 된다면…) 되기를…

이미 irc.kornet.nm.kr 에 #linux 방이 있는데 그럴 필요가 있을까 하고 생각

되시면 직접 가서 구경해보면 알겁니다. 히히.

저는 임시로 203.232.99.228 에서 서비스를 하고 있습니다. 이 컴은 집에 있는

컴이라서 항상 켜놓지는 않습니다. 또한 IP 가 바뀔 수도 있습니다.

잘 못된 곳이나 궁금한 점(궁금한 것 질문하기 전에 INSTALL 파일을 읽어보고,

man ircd 도 해보기 바람)이 있으면 아래 주소로 메일 주시기 바랍니다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.