배철수 / 리눅스월드 발행인
|
|||||||||
1. PPP 프로토콜의 개요. PPP(Point to Point Protocol)란 시리얼라인에 인터넷용 프로토콜인 TCP/IP를 싣기위해 IETF(Internet Engineering Task Force)에서 제정한 표준 규약이다. 이는 RFC(Request For Comments) 1332, 1334, 1661, 1662에 규정되어있다. PPP는 본래 IP 프로토콜을 전송하기 위해 만들어졌지만 IPX 등 다른 프로토콜도 동시에 전송 가능하므로 멀티 프로토콜을 필요로 하는 라우터에서도 사용되고있다. 또한 PPP는 전송매체와는 독립적으로 작동하므로 싱크, 어싱크 연결에서 모두 사용된다.
2. PPP 프로토콜의 탄생 배경 인터넷의 초창기에는 TCP/IP 를 WAN(Wide Area
Network)에서 사용하기 위해 전용회선과 고가의 전용장비를 사용하였다.
그러나 인터넷 사용이 확산되면서 한 두대의 개인용 피시를 인터넷에
연결하여 사용하려는 사람들이 늘었으나 이런 사용자들은 고가의
전용회선 및 장비를 갖출 능력이 없었다. 따라서 피시에서 흔히
통신용으로 사용되는 모뎀과 전화선으로 IP 프로토콜을 전송할 수
있는 방법이 필요하였고 이것이 바로 SLIP(Serial Line IP)와 PPP이다.
3. 리눅스에서 PPP 프로토콜 리눅스는 커늘버전 1.X에서부터 PPP와 SLIP를
지원하고 있다. PPP의 경우는 커늘 드라이버와 데몬 프로그램(PPPD)으로
나누어져 있으며 커늘 레벨에서는 패킷 어셈블과 디스어셈블이
이루어지고 데몬은 링크와 인터페이스 셋업을 담당한다.
4. PPP서버를 랜(LAN)에 연결하기 리눅스를 PPP서버로 사용하는 경우는 여러가지가
있겠지만 여기서는 가장 흔한 경우, 즉 랜투랜(LAN to LAN)으로
인터넷을 연결하여 사용 중인 회사의 랜에 리눅스 PPP서버를 설치하여
회사 직원이 집에서 피시와 전화선 및 다이얼업 모뎀을 써서
인터넷을 사용할 수 있게 해주는 경우를 기준으로 설명한다. 이때
PPP클라이언트, 즉 연결을 시도하는 피시의 운영체제는 WIN 3.1,
WIN 95, 리눅스 어느 쪽도 상관이 없다. 아래에 랜 연결 작업단계를 살펴본다. a. PPP서버 하드웨어 사양 피시를 PPP서버로만 쓴다면 높은 사양의 피시를
요하지 않는다. PPP는 거의 커늘에서 작업이 이루어지므로 하드디스크를
자주 억세스 하거나, 많은 메모리를 필요로 하지 않기 때문이다.
486급에 16메가의 메모리를 갖고 있으면 PPP서버로 충분하다고 본다. PPP서버로 쓸 피시에서 가장 중요한 건 RS-232C
포트와 모뎀이다. RS-232C 포트는 보통 시리얼포트라고 부르는데
이 포트에 사용된 UART(Universal Asynchronous Receiver-Transmitter)
칩이 PPP 전송 속도를 좌우한다. UART 칩에는 세가지 종류가 있는데
8250, 16450, 16550 이다. 이중 8250과 16450은 시리얼포트 속도를
19,200bps 이상으로 올릴 수 없으므로 16550A 이상의 칩을 쓴 시리얼포트를
사용해야 한다. 피시의 시리얼포트는 2개만 사용할 수 있으므로
3개 이상의 PPP를 동시에 써야 한다면 멀티포트 카드를 장착해야
한다. 멀티포트카드를 고를 때는 반드시 리눅스용 드라이버가 있는지를
확인해야 하며 멀티포트에 별도의 CPU가 있는 인텔리전트형 카드를
써야 여러개의 PPP데몬을 동시에 띄울 수 있다. b. 리눅스 설치 및 네트워크 설정 다음은 피시에 리눅스를 설치해야 한다. 리눅스
설치는 배포본에 따라 다르며 간단히 설명할 수 있는 내용이 아니므로
여기서는 생략한다. 한가지 유의할건 설치시 PPPD 프로그램이 선택되어있는지를
확인해야 한다는 것이다. 보통은 PPPD 프로그램이 자동으로 설치에
포함되어 있지만 그렇지 않은 경우도 있다. 아래는 debian의 network 파일 예이다.
* 192.168.x.x 는 인터넷에서 내부 랜 전용으로
할당한 주소이므로 인터넷과 위에서 192.168.1.1은 C 클라스 주소 체계이므로 192.168.1 까지는 네트워크 주소이고, 마지막의 1은 호스트 주소이다. netmask는 인터넷 주소 중 네트워크 부분과 호스트 부분을 구분하는데 사용되므로 서브네트 마스킹을 않을 경우는 255.255.255.0이다. 호스트 주소 부분은 8bit이므로 0부터 255까지 256개이나 0번은 네트워크를 가르키고 255는 broadcast에 사용되므로 C 클라스에서는 총 254개의 호스트에 IP address를 부여할 수 있다. 게이트웨이(gateway)는 두 네트워크와 동시에 연결된 라우터나 호스트를 말하는데 게이트웨이(gateway) 중 특히 중요한 건 디폴트 게이트웨이(default gateway)이다. 즉 해당 랜이나 연결된 다른 네트워크에서 주소를 찾을 수 없을 경우 무조건 패킷을 보내는 라우터를 디폴트게이트웨이라 부르는데, route add default gw가 default gateway를 지정하는 명령이다. 따라서 인터넷과 연결된 랜에서는 default gateway는 ISP(Internet Service Provider)와 연결된 라우터의 이더넷 쪽 주소이다. c. 랜카드 드라이버 올리기 리눅스에서 랜카드에 ifconfig 명령으로 ip address를
할당하려면 그전에 커늘에서 그 랜카드에 인터페이스를 설정해야
한다. 예를 들어 이더넷 첫번째 랜카드의 인터페이스 네임은 eth0이다.
커늘에서 랜카드를 인식하려면(즉 인터페이스 네임을 설정하려면)
랜카드용 드라이버가 커늘에 들어있어야 한다. 리눅스 설치시 기본으로
설치되는 커늘에 포함된 랜카드 드라이버는 3com사의 3c509 카드이며
다른 랜카드는 커늘을 컴파일해서 해당 랜카드의 드라이버를 커늘에
포함시켜 주어야 한다. 아래는 3COM 사의 3C509 랜카드가 커늘에서 인식되었을 경우의 부트 때의 메시지이다.(dmesg명령으로도 확인이 가능하다.) eth0: 3c509 at 0x300 tag 1, 10baseT port, address 00 60 8c ec 79 4f, IRQ 10 1) eth0 는 첫번째 이더넷 카드라는 의미 2) 0x300은 IO Address 3) 10baseT는
랜카드의 포트중(3C509는 AUI와 10baseT 두개의 포트가 4) address
이하는 그 랜카드의 이더넷 어드레스(48bit로 구성되며 5) IRQ 10 은 인터럽트 10번이 사용된다는 뜻이다. 랜카드 드라이버가 커늘에 들어있는데도 랜카드가
인식되지 않는 경우는 랜카드의 셋업이 리눅스 시스템에 장착된
다른 하드웨어와 IO Address, IRQ, DMA 등에서 충돌할 경우이다.
리눅스 커늘에는 극히 최근에 발표된 랜카드를 제외하고 거의 대부분의 랜카드 드라이버가 포함되어 있으므로 커늘 컴파일 단계에서 자신의 랜카드 모델에서 YES만 해주면 되나, 커늘 컴파일시 make config에 자신의 랜카드 모델이 안나오면 인터넷에서 자신의 랜카드 드라이버를 구해서 커늘을 패치해야 한다. 최신 랜카드 드라이버는 주로 NASA(미 항공우주국)의 홈페이지에 있다. 이상의 과정을 거친후 리부팅하면 리눅스는 랜에
연결된다.
위에서 마지막 줄의 0.0.0.0 줄은 default gateway
를 지정하는 부분이다. 이상으로 PPP 서버가 랜에 연결되지만 리눅스에서 인터넷을 연결하려면 다른 몇 개의 파일을 수정 해주어야 한다. 물론 이 파일도 리눅스 설치시 네트워크 셋업에 관한 질문에 정확히 대답하였으면 수정의 필요가 없지만 나중에 랜 관련 셋업이 바뀔 경우에는 관련 파일을 수동으로 수정해 주어야 한다. 리눅스 시스템이 인터넷에 연결되기 위해 필요한 다른 파일들을 보면 - /etc/host.conf order hosts,bind 위는 호스트 이름으로 ip address를 찾을 때 첫번째는 /etc/hosts 파일을, 그 다음은 DNS 서버를 참조하라는 뜻이다. - /etc/resolv.conf search linuxlab.co.kr 위에서 search는 사용자가 호스트네임만 지정하였을 경우 뒤에 덧붙일 도메인네임이며 nameserver는 그 랜에서 사용하는 네임서버의 주소이다. 마지막으로 리눅스서버에서 telnet 이나 ping 명령으로 인터넷 연결을 테스트해 보아야 한다. 예를 들면 하이텔을 인터넷을 통해 연결하는 명령은 telnet home.hitel.co.kr이다. 하이텔이 연결되면 일단 ppp 서버의 인터넷 연결은 끝났다. 만약 PPP서버를 메일서버나 웹서버로 겸하고 싶다면 PPP서버의 호스트네임과 ip address를 네임서버에 등록해 주어야 한다.
5. PPPD 설치와 커늘 컴파일 PPP서버를 인터넷과 연결하였으면 커늘에 ppp드라이버를 올리고 pppd 프로그램을 설치해 주어야 한다. a. pppd 컴파일 및 설치 pppd는 리눅스 설치시 포함되어 설치되지만,
만약 구버전의 pppd를 업그레이드하거나 리눅스 설치시 pppd를 넣지
않았다면 pppd를 설치해야 한다. tar zxvf ppp-2.2.0f.tar.gz 그러면 ppp-2.2.0f라는 디렉토리가 만들어지고
그 안에 ppp 소스를 비롯한 README 파일들이 위치한다. 컴파일 및
인스톨은 README 및 README.linux 파일에 잘 나와있다. 컴파일 순서 - ./configure c. 커늘 컴파일 리눅스 인스톨시 pppd를 설치했어도 반드시 커늘을
다시 컴파일해서 설치해주어야 ppp를 쓸 수 있다. 커늘 컴파일 방법은 아래와 같다. 1. 커늘 소스를 /usr/src에서 푼다. 2. linux라는
디렉토리가 생성되고 그 안에 README라는 파일이 있는데 3. 커늘을
컴파일이 끝나면 /usr/src/linux/arch/i386/boot 디렉토리에
ppp드라이버가 커늘에 설치되었으면 부팅시 아래
메시지가 나온다.
6. 시리얼포트 셋업 PPP 접속에 사용될 모뎀이 연결될 시리얼포트에
38,400bps 이상의 속도를 내려면 시리얼포트에 사용된 UART 칩이
16550A 이상이어야 하며, 이는 부팅시의 메시지나 dmesg 명령으로
확인할 수 있다. tty00 at 0x03f8 (irq = 4) is a 16550A 위의 부트 메시지는 시리얼포트 1번(0x3f8) 의
IRQ가 4이고 UART 칩이 16550A 임을 보여주고 있다. /bin/stty crtscts < /dev/ttyS0 다음에 시리얼포트 속도를 57,600이나 115,200bps로 설정하려면 setserial 명령이 필요하다. /bin/setserial /dev/ttyS0 spd_vhi 위에서 spd_vhi는 시리얼포트 속도를 115,200bps로
설정할 때이고 57,600bps라면 spd_hi 명령을 준다.
다이얼업 모뎀의 경우는 최대 4배까지 데이타
압축이 이루어질 수 있으므로 14.4k 모뎀은 시리얼포트 속도를 57.6k로
28.8k 모뎀은 115.2k로 맞추는게 좋다.
7. getty 프로그램 설치 리눅스에서 PPP 접속을 하려면 우선 두 모뎀간에
연결이 이루어져야 하며, 모뎀이 전화를 받을려면 getty 프로그램이
필요하다. 이하는 mgetty 프로그램을 기준으로 getty 프로그램 설치
과정을 설명한다. 아래는 시리얼포트 1번(ttyS0)에 포트속도를
115,200bps로 설정한 경우의 mgetty.config 파일 예이다.
다음에 /etc/inittab에 다음 줄을 넣는다. m1:2345:respawn:/usr/local/sbin/mgetty ttyS0 위에서 m1은 구별자로서 inittab 파일내에 다른
줄의 맨앞에서 사용하지 않아야 한다. 이상으로 mgetty 설치가 끝났으면 minicom 이나
kermit 프로그램을 사용하여 모뎀에 ats0=0&w 명령을 준다.
즉, mgetty는 다른 getty 프로그램과 달리 수신모뎀 즉 mgetty가
설치된 포트에 연결된 모뎀을 자동 응답으로 설정하지 않아야 작동한다.
또한 mgetty에서는 모뎀에 ate1q0v1 명령을 필수적으로 주어야 한다. 모든 준비가 끝났으면 init q 명령을 준다. 이상이
없다면 외장모뎀의 경우 TR( Terminal Ready)에 불이 들어오고 다른
피시에서 리눅스로 전화를 연결하면 login 프롬프트가 뜬다.
8. PPP에서 IP address 할당 다른 피시가 PPP서버로 PPP로 연결할 때 그 피시에
한개의 IP address가 할당된다. 그런데 IP address를 할당할
때 두가지 방법이 가능하다. 하나는 동적 IP address 할당으로서
연결시마다 사용자의 IP address가 바뀌는 경우이다. 예를 들어
리눅스 시스템에 4개의 시리얼포트가 있고 4개의 전화선이 연결돼
있다면 첫번째 포트에 연결된 전화번호에 대표전화를 부여하면 사용자가
전화를 걸때 사용않는 포트가 전화를 받게 되고 사용자는 그 포트에
할당된 IP address를 배정받는 방식이다. 이 경우는 포트수만큼
IP address가 필요하다. 다이얼업모뎀 사용자는 전화비가 많이 나가므로 항상 연결하여 놓고 고정 IP를 사용할 수 없으므로 ppp서버는 대부분 이 방식을 쓴다. 그러나 드문 경우이겠지만 만약 사용자가 다이얼업으로 연결하면서도 항상 고정된 IP address를 요청한다면 이때는 사용자만큼 IP address가 필요하다. 사용자가 특정 포트에 전용선을 연결하여 사용하는 경우는 사용자는 항상 고정 IP address를 배정받는다.
9. ppp 계정 만들기 mgetty에는 컴파일시 autoppp라는 옵션을 부여하면 전화 연결과 동시에 ppp 접속이 이루어지지만 대부분의 경우 연결 상대방의 ppp 사용 권한을 파악하기위해 패스워드 파일에서 ppp 사용자명과 패스워드를 확인 후 pppd를 띄운다. 사용자의 PPP 계정을 만들 때 쉘어카운트와 다른 점은 login shell을 /usr/sbin/pppd 로 지정한다는 점이다.
10. PPP 옵션 PPPD는 여러 파일에서 옵션을 지정할 수 있는데 옵션 실행 순서는 다음과 같다. 1) /etc/ppp/options 위에서 ~/home/는 사용자의 홈디렉토리를 말한다. options.tty??은 ppp 연결이 이루어지는 포트명을 말한다. 두 파일에서 서로 중복하여 지정시는 나중에 나온 파일의 옵션이 우선한다. options는 모든 ppp 접속시에 실행되므로 pppd에 공통적인 옵션만 지정하며 .ppprc는 특정 사용자에게만 실행되므로 그 사용자에게만 필요한 옵션을 지정한다. 예를 들어 어느 사용자에게 항상 고정된 IP address를 배정하고 싶으면 그 사용자의 ppp계정 홈디렉토리에 .ppprc를 만들어 여기에 ip address를 지정해주면된다. 그러면 사용자의 연결 포트가 바뀌어도 ip address는 바뀌지 않는다. options.tty??에서 tty??은 연결포트의 dial-in 장치명이다. 시리얼포트 1번은 options.ttyS0 이다. 이 파일에는 그 포트에만 필요한 옵션을 지정한다. 예를들어 포트별로 모뎀 속도가 다를 경우 이 파일에서 속도를 지정해주면 된다. PPPD의 옵션은 상당히 많으므로 자세한 사항은 man pppd명령으로 확인하기 바라며 아래는 자주 쓰이는 옵션을 위주로 설명한다. /etc/ppp/options lock - lock : ppp접속이 이루어지는 동안 다른 프로그램이
그 시리얼포트를 사용 - modem : 모뎀포트라는 뜻으로 상대가 모뎀 연결을 종료하면
전화를 - crtscts : 하드웨어플로우컨트롤(RTS/CTS)을 사용한다.
1) -detach : pppd 프로그램이 백그라운드로 실행되지 않도록하는 역할을 담당한다. 2) asyncmap 0 : 시리얼라인에서 송신되어서는
않될 콘트롤캐릭터(ASCII 31 이하)를 지정한다. 예를들어 XON XOFF
플로우컨트롤을 사용하는 모뎀에서 XON XOFF 문자가 그대로 전송되면
모뎀이 데이타전송을 중단한다. 3) 115200 : 전송 속도를 지정한다. 이속도는 setserial 및 getty에서 지정한 포트 속도와 일치시켜야 한다. 4) mru (maximum receive unit) : 전송받는 최대의 패킷 크기(바이트)를 지정한다. 고속모뎀에서는 552byte를 주로 쓴다. 5) mtu (maximum transmit unit) : 전송하는 최대의 패킷 크기(바이트)를 지정한다. 고속모뎀에서는 552byte를 주로 쓴다. *. FTP를 주로쓰면 mru, mtu가 높은게 좋고 WEB이나 Telnet에서는 낮은게 좋다. 6) proxyarp : PPP서버가 랜을 통해 인터넷과 연결돼 있을 경우에만 필요하며 클라이언트에는 필요가 없는 옵션이다. 만약 이 옵션이 없으면 클라이언트는 오직 PPP서버와만 연결이되고 PPP서버와 같은 랜에 있는 다른 호스트나 인터넷 쪽으로는 연결이 되지 않는다. 7) :192.168.1.3 : PPP에서 자신의 IP address
와 상대의 address를 지정하는 명령은 ABCD:WXYZ 이다. ABCD는 자신의
IP Address이며 WXYZ는 상대방(클라이언트)의 address 이다. 랜에
연결된 PPP서버의 경우 이미 이더넷포트에 IP address가 지정되어있으므로
자신의 어드레스를 생략하면 PPP는 서버의 PPP 어드레스로 이더넷에
부여된 IP address를 같이 사용한다.
11. PPP 클라이언트 셋업 ppp 클라이언트가 리눅스라면 다른 과정은 ppp서버와 같다. 단지 옵션 부분만 달라진다. (물론 랜에 연결 안돼 있으면 랜 연결 과정은 필요없다) 클라이언트의 경우는 ppp 연결이 한개만 이루어지므로 /etc/ppp/options 파일에 ppp 옵션을 지정하는게 좋다. 나머지는 ppp 연결 쉘스크립트에 넣는다. /etc/ppp/options에 필요한 옵션은 아래와 같다. lock ppp 연결 쉘스크립트는 다음과 같다.
자세히 설명하면 1) connect : 전화 연결시 사용할 명령을 지정하는데 한개의 파리메타만을 필요로 하므로 여러개의 변수를 넣을때는 컴마로 묶는다. 2) /usr/sbin/chat : 모뎀과 대화 형식으로 명령을 수행하는 프로그램임. 3) "" : chat는 먼저 상대방 즉 시리얼포트로부터 어떤 문자열이 전송되기를 기다려 다음 액션을 취하므로 "" 을 넣는다. 즉 모뎀으로부터 아무런 전송도 없다는 뜻임. 4) atdt456-5690 : 모뎀에게 PPP서버의 전화번호를 누르는 명령임. 5) ogin : PPP서버가 전화를 받으면 getty 프로그램에서 login: 프롬프트를 보낸다. 이하 패스워드 입력까지 끝나면 pppd 프로그램이 실행되며 /dev/ttyS0 이하는 PPPD에 건내주는 옵션이다. 다른 옵션은 서버의 옵션과 동일하나 다른 부분은
noipdefault 와 defaultroute 이다. 그런데 만약 클라이언트가 랜에 연결돼 있어서 리눅스
설치시의 네트워크 셋업에서 게이트웨이를 리눅스 자신의 랜카드
IP 어드레스로 지정하였거나 또는 클라이언트가 속한 랜의 다른
라우터로 지정하였으면 네트워크 설정파일(슬랙웨어라면 /etc/rc.d/rc.inet1)에
디폴트게이트웨이가 이미 지정되어 있다. * PPP 자동 재연결 쉘스크립트 TT선 또는 CO-LAN 등의 전용선으로 PPP 접속을 하는 경우 회선 문제나 서버의 리부팅 등으로 PPP 연결이 끊기는 경우가 가끔 있다. 클라이언트에 메일서버나 웹서버를 운영하는 경우 PPP 연결이 끊긴걸 모르고 지나치면 심각한 문제이다. 그렇다고 수시로 연결 여부를 확인할 수도 없다. 아래 방법을 쓰면 PPP 연결이 끊기면 30초 이내에
자동 재연결이 이루어지니 설치하여 사용하길 바란다. 필자가 예전에
co-lan을 쓸 때 유용하게 사용하였다. /sbin/redial & (마지막의 &가 중요하다) 다음 /sbin에 아래 내용의 redial 파일을 만들고
chmod 755 redial 명령을 준다
위에서 /usr/sbin/pppd 이하는 각자의 시스템에 맞게 수정하여야 하나 -detach 옵션은 필히 있어야 한다. 이제는 ppp 연결이 끊길 걱정을 않아도 될 겁니다. |