리눅스에서 PPP 사용

글쓴이 : 배철수 [리눅스 월드 발행인]

 

 

이글은 리눅스 월드 창간호(1997년 10월)에 본인이 쓴 “PPP서버 만들기”에서 설명이 부족한 부분을 위주로 썼다.


1. PPP를 왜 설치하는가?
2. PPP를 리눅스에서 사용하려면
3. PPP 프로그램 설치
4. PPP 옵션 실행 순서
5. Auto PPP 설치
6. 사용자 인증

1. PPP를 왜 설치하는가?

- 당신이 ISP(Internet Service Provider)라면 리눅스에 멀티포트와 모뎀을 연결하여 사용자들에게 인터넷 접속 서비스를 제공하고자 한다.

- 당신의 ISP가 ppp 서비스를 제공하고 있다면 당신의 피시에 리눅스를 설치하고 ppp를 올리면 인터넷에 연결할수 있다. 쉘어카운트로 연결하면 인터넷의 일부 서비스를 사용할 수 없지만(예를 들면 웹이나 인터넷폰 등) ppp로 연결하면 인터넷의 모든 서비스를 제한 없이 사용 가능 하다.

- 집에 두 대의 피시가 있는데 두 피시의 시리얼 포트를 널모뎀 케이블로 연결하여 네트워크를 구축해보고 싶다. 즉 한 피시에 리눅스를 설치하여 다른 피시에서 telnet, ftp, http등을 사용해보고 싶다. 물론 랜을 깔아도 돼지만 랜카드를 구입하는 것보다야 널모뎀 케이블이 값이 싸다.

▲ top

2. PPP를 리눅스에서 사용하려면

ppp는 두 부분으로 나뉘어 있다. 한 부분은 커늘에 위치하고 다른 하나는 pppd란 사용자 프로그램이다. 따라서 리눅스에 ppp를 설치시 커늘에 포함된 ppp 코드와 pppd의 버전이 같아야 한다. ppp를 새로운 버전으로 재 설치하고자 하면 커늘도 다시 설치해야 한다.
커늘 컴파일시 ppp를 사용하고자 하면 아래 질문에 필히 Y를 눌러야 한다.(디폴트가 No이므로 Y를 꼭 눌러야 한다)

PPP (point-to-point) support (CONFIG_PPP) [N/y/m/?] Y

피시의 시리얼포트를 통해 ppp 접속을 제공하려면 make config에서 아래 질문시 Y를 눌러야 한다.

Standard/generic serial support (CONFIG_SERIAL) [Y/m/n/?]

멀티포트 카드를 사용한다면 커늘 컴파일시 해당 멀티포트 드라이버를 포함시켜야 한다. 만약 커늘에 해당 멀티포트 드라이버가 들어있지 않다면 멀티포트 제조업체에서 제공하는 리눅스용 드라이버를 별도로 설치해야 한다.

인터넷에 연결된 리눅스 시스템에 다른 사용자들이 PPP로 연결 후 인터넷을 사용할 수 있게 해주려면 아래 질문에 Y를 해야 한다.

IP: forwarding/gatewaying (CONFIG_IP_FORWARD)
[N/y/?] Y
(이 부분도 디폴트는 No이다)

▲ top

3. PPP 프로그램 설치

아래는 ppp 버전 2.3.5를 설치하는 과정이다. 물론 배포본에는 ppp 프로그램이 기본으로 설치돼어 있으므로 커늘만 컴파일해주면 작동하나 새로운 버전의 ppp를 설치하려면 아래 순서를 따라야 한다.

3.1 ppp-2.3.5를 sunsite.unc.edu에서 anonymous FTP로 다운 받는다.(디렉토리 위치는 pub/Linux/system/network/serial/ppp이다) 파일명은 ppp-2.3.5.tar.gz이다.

3.2 이 파일을 /usr/src 디렉토리에 넣은 후 아래 명령을 친다
tar zxvf ppp-2.3.5.par.gz

그러면 ppp-2.3.5라는 디렉토리가 만들어지며 그안에 ppp 소스 파일이 위치한다.
컴파일 및 인스톨을 하기 위해서는 README 및
README.linux 를 읽어야 한다.

ppp를 컴파일하려면 하기 전에 커늘 소스를 /usr/src/linux에 위치시켜야 한다. 이는 ppp 소스 프로그램의 일부가 커늘 코드에 포함되어야 하기 때문이다.

3.3 cd /usr/src/ppp-2.3.5

3.4 ./configure

3.5 make kernel

3.6 커늘 컴파일 (아래에 자세히 설명함)

※ 커늘 버전이 2.0.34부터 2.0.36인 경우 PPP-2.3.5로 업그레이드 후 커늘 컴파일시 ppp 부분에서 아래와 같은 에러가 나오면서 컴파일이 중지되는 경우가 있다.

: /usr/src/linux-2.0.34/include/asm/string.h: In function
: `__constant_c_and_count_memset’:
: /usr/src/linux-2.0.34/include/asm/string.h:594: warning: control reaches end
: of non-void function
: ppp.c: In function `ppp_init_ctrl_blk’:
: ppp.c:465: structure has no member named `ddinfo’
: ppp.c:466: structure has no member named `ddinfo’

이때는 ppp-2.3.5/linux/ppp.c 파일의 3079 라인의 < 을 >= 로 바꾼 다음 이를 /usr/src/linux/drivers/net 에 복사한 후 컴파일하면 된다.

즉 #if LINUX_VERSION_CODE < VERSION(2,1,86) 을
#if LINUX_VERSION_CODE >= VERSION(2,1,86) 로 바꾼다.

3.7 make
만약 쉐도우 패스워드를 사용한다면 쉐도우 패스워드 관련 파일을 /usr/include 와 /usr/lib 디렉토리에 넣은후 make 명령 대신 make HAS_SHADOW=1 을 사용한다.
3.8 make install
이제 pppd 및 chat 등이 /usr/sbin 디렉토리에 위치하고 셋업 파일은 /etc/ppp 디렉토리에 위치한다.(options, chat-secrets, pap-secrets 등)

3.9 시스템 리부팅
위의 과정이 끝난후(커늘을 변경한 후) 시스템을 리부팅하면 커늘의 PPP 코드가 2.3.5 버전으로 바뀐다. dmesg 명령을 실행하면 아래의 메시지가 있을것이다.

PPP: version 2.3.5 (demand dialling)
TCP compression code copyright 1989 Regents of the University of California
PPP line discipline registered.


※ 커늘 컴파일 순서

(1) 커늘 소스를 /usr/src디렉토리에 넣고 아래 명령을 준다.

- tar zxvf linux-2.0.36.tar.gz

linux란 디렉토리가 만들어지면서 그안에 커늘 소스가 위치한다. README 파일에 커늘 컴파일에 필요한 사전 과정이 있다.
(아래 명령은 리눅스 설치후 한번만 실행하면 되며 이후의 커늘 컴파일때는 실행할 필요가 없다)

cd /usr/include
rm -rf asm linux scsi
ln -s /usr/src/linux/include/asm-i386 asm
ln -s /usr/src/linux/include/linux linux
ln -s /usr/src/linux/include/scsi scsi

(2) cd /usr/src/linux
(3) make config
(4) make dep
(5) make clean
(6) make zImage

이상의 과정이 끝나면 /usr/src/linux/arch/i386/boot 란 디렉토리에 zImage란 이름으로 커늘이 만들어진다. 이 커늘을 /etc/lilo.conf의 “image= “에서 지정한 위치에 복사한다. 예를들어 lilo.conf에 image=/vmlinuz 로 지정돼 있으면 cp zImage /vmlinuz 명령을 준다. 그다음 lilo 명령을 실행해주면 커늘 변경이 완료된다.
(또는 make zImage 대신 make zlilo 명령을 주면 위의 과정이 자동으로 실행된다)

▲ top

4. PPP 옵션 실행 순서

PPPD는 4가지 방법으로 옵션을 줄 수 있다. 실행되는 순서는 아래와 같다.

4.1 /etc/ppp/options 파일
4.2 ~/.ppprc 파일
pppd를 실행하는 사용자 홈디렉토리에 있는 .ppprc
4.3 pppd 명령행
/usr/sbin/pppd /dev/ttyS1 115200 crtscts modem
4.4 /etc/ppp/options.ttyXX 파일
ttyXX는 pppd가 사용하는 시리얼 포트 명임. (ttyS1은 com2임)
중복하여 지정시는 나중에 지정한 옵션이 사용된다.

▲ top

5. Auto PPP 설치

리눅스에서 PPP 서비스를 제공할 때 상대방의 운영체제가 Win95라면 일반적인 PPP 연결 절차는 윈95의 전화접속 네트워킹에서 전화건 후 터미널 창 표시를 선택해서 login: 프롬프트가 나오면 계정과 패스워드를 입력해 pppd가 실행되는 방법을 쓴다. 하지만 mgetty의 auto ppp 기능을 사용하면 윈95의 터미널 창 표시 없이 전화접속 네트워킹에서 사용자명과 암호만 넣고 연결을 누르면 바로 ppp 접속이 이루어진다. 아래에 mgetty를 사용 auto ppp를 구현하는 과정이다.

5.1 mgetty 구할수 있는곳
mgetty는 리눅스용 getty 프로그램 중 가장 성능이 뛰어난다. 모뎀 뿐 아니라 팩스도 지원하고 음성 기능까지 가능하다. ftp.leo.org 에서 anonymous ftp로 다운받을수 있고 디렉토리는 pub/comp/os/unix/networking/mgetty 이다. 현재 최신 버전은 1.1.19이다.

5.2 설치 절차
- mgetty1.1.19-Nov24.tar.gz을 임의의 디렉토리에서 아래 명령을 준다.
tar zxvf mgetty1.1.19-Nov24.tar.gz

- mgetty-1.1.19 란 디렉토리가 만들어지고 이안에 소스 파일이 위치한다.
- policy.h-dist 를 policy.h로 복사하고 이 파일을 사용자의 필요에 맞게 수정한다.

여기에는 mgetty가 사용하는 각종 파일들이 위치할 디렉토리와 모뎀 명령, 포트 속도 login prompt 등을 지정한다. 고칠 필요성이 있는 부분은 아래와 같다.(꼭 고쳐야 하는 건 아니다.)

#define DEFAULT_PORTSPEED 38400

시리얼포트의 속도를 지정하는 부분인데 모뎀이 33.6k라면 115200으로 바꾼다.
그리고 setserial 에서 spd_vhi를 지정한다.

#define MODEM_INIT_STRING
“ATS0=0Q0&D3&C1”
(모뎀에 맞게 수정한다)

mgetty는 모뎀을 자동응답으로 설정하면 안된다. (즉 s0=0)
e1q0v1 을 지정하는게 필요하다. E1은 사용자가 모뎀에게 주는 명령을 echo 하라는 뜻이고 q0 는 명령 처리 결과를 보내라는 뜻( 보통은 OK 임) 이며 v1 은 결과를 영어로 보내라는 뜻이다.

&D3는 DTR 가 off로 바뀌면 모뎀을 리셋하라는 뜻이다. 이는 사용자가 모뎀 연결을 종료하는 경우 모뎀의 설정 값을 원래대로 돌려 놓는 역할을 한다.

#define MODEM_CHECK_TIME 3600
(3600 대신 -1을 쓰는 게 낫다)

- Makefile의 110번째 라인을 아래처럼 변경한다.
CFLAGS=-O2 -Wall -pipe -DAUTO_PPP
(Auto PPP를 쓰려면 필히 고쳐야 한다)

- make
- make testdisk
- make install
- mgetty의 실행 파일은 /usr/local/sbin에 위치하고 셋업 파일은 /usr/local/etc/mgetty+sendfax 에 위치한다.
(mgetty.config)

- /usr/local/etc/mgetty+sendfax 디렉토리의 login.config 파일에서 /FIDO/ uucp fido /usr/local/lib/fnet/ifcico @
라인을 없앤다. (첫 칸에 # 를 넣으면 된다)

#/AutoPPP/ - ppp /usr/sbin/pppd auth -chap +pap login kdebug 7 debug 를 아래처럼 수정한다.
/AutoPPP/ - - /usr/sbin/pppd auth -chap +pap login debug

- 두번째 “-”는 사용자의 login 명을 who 명령으로 확인할 때 필요하다.
- auth 는 사용자 인증(Authentication)을 사용한다는 뜻
- -chap +pap 는 인증에서 chap을 안쓰고 pap를 쓴다는 뜻.
- login은 리눅스의 패스워드 파일을 pap으로 사용한다 는 뜻
- debug 는 ppp 접속 과정을 로그 파일에 기록해준다.

▲ top

6. 사용자 인증

auto ppp에서는 사용자가 login을 하는 과정이 없으므로 정당한 사용자인지의 여부를 ppp 내에서 체크한다. 이에는 두가지 방법이 있는데 pap와 chap이다. 둘다 형식은 같다.

pap는 /etc/ppp/pap-secrets 에 chap는 /etc/ppp/chap-secrets에서 설정한다.

아래는 두 파일의 형식이다.
#client server secret IP addresses
churl hyun Linuxlab *
(첫번째 줄은 주석임)

위에서 client는 상대 호스트의 이름, server는 PPP 서버의 이름이고 secret는 패스워드를 가르키고 IP address는 상대방이 사용하는 IP address를 지정하는 부분이다. 만약 pap를 쓰면서 pppd 옵션에 login을 지정하면 리눅스의 패스워드 파일을 인증에 사용하므로 이때는 pap-secrets 파일을 없애든가 아래처럼 지정한다.
#client server secret IP addresses
* * “” *

그리고서 사용자의 계정을 리눅스에서 부여하여야 한다. 사용자는 윈95 전화접속 네트워킹에서 사용자란에 리눅스 계정명 암호란에 리눅스의 패스워드를 넣고 연결을 누르면 된다.

 

▲ top

 

home으로...