486으로 만드는 한국통신 ADSL 공유서버
- IP masquerade, 커널 컴파일,
   PPP, PPPoE 설정 -

배철수/리눅스월드 발행인

 

     

    필자가 아는 장난감 업체가 인터넷으로 전자상거래를 하고 있다. 웹서버는 모 ISP의 웹호스팅 서비스를 이용하고, 동대문 근처 사무실에서 인터넷으로 웹서버를 연결해서 데이터를 입력해 왔다. 전에는 홈페이지의 데이타를 갱신하기 위해 피시 한 대에서 다이얼업 PPP로 인터넷을 연결해 사용해 왔는데 속도도 느리고 전화비도 많이 나와 한국통신의 ADSL을 신청해 연결했다.(선 나오는데 2 달 걸렸다 함) 그래서 필자가 리눅스 피시에 ADSL 라인을 연결하고 리눅스와 윈도우 피시 5 대에 랜을 설치해 윈도우 피시가 ADSL 라인을 공유하여 동시에 인터넷을 사용하게 하는 작업을 하였다.

    리눅스 호스트에 부여된 공인 IP 한 개를 랜에 연결된 여러 대의 피시에서 내부 주소로 공유하는 방법을 IP Masquerade(또는 NAT : Network Address Translation)라고 하는데, 윈도우에서는 sygate라는 비슷한 역할을 하는 프로그램이 있다. 하지만 IP Masquerade가 sygate에 비해 안정성이나 지원하는 서비스 범위 등에서 훨씬 낫다. ADSL 라인을 공유하는 것도 IP Masquerade 설정까지는 다른 인터넷 연결을 공유하는 것과 동일하다. 단지 인터넷을 연결하는 프로그램 설정 부분만 다르다. 이 글은 이러한 설정을 처음 하는 사람들을 위해 리눅스 설치부터 IP Masquerade, 커널 컴파일, ADSL 연결 프로그램 설치까지의 전 과정을 소개한다.

    아래 글은 필자가 위 업체에서 실제 작업한 순서를 기준으로 했기 때문에 중복되거나 필요 없는 부분도 있다. 그러나 모든 컴퓨터 작업이 이상적인 순서로 진행되는 경우는 없으므로 조금 지루하더라도 순서대로 읽는게 필요하다.

 

I. 사견 : IMHO(In My Humble Opinion)

    아래는 필자의 개인적 의견이니 건너 뛰어도 상관없다.

    ADSL 라인을 여러 대의 피시에서 공유하는게 불법이 아니냐는 질문을 하는 사람이 있는데 우리나라의 법 어디에도 ADSL 라인 1 개를 여러 대의 피시에서 동시에 사용하면 법 위반이란 구절이 없다. 또 어떤 사람은 한국통신의 내부 규정에 ADSL 라인을 여러 대의 피시에서 공유할 수 없도록 규정하고 있다는 말도 있다. 그러나 필자가 주위에서 ADSL 설치하는 사람을 아무리 보아도 ADSL 라인 신청시 이 라인을 피시 한 대에서만 사용하겠다는 계약을 했다는 말을 듣지 못했다. 혹시나 그런 계약을 했다면 아래 방법을 사용하지 말기 바란다.

    아래 설치 방법은 커널을 패치하고 컴파일해야 한다. 초보자는 커널 컴파일이라면 무척 겁을 내는데 커널을 컴파일해야 한다고 C 언어에 대한 이해를 필요로 하지 않는다. 리눅스에 대한 기본만 알아도 충분히 가능하다. 요즘은 커널 컴파일 대신에 커널모듈을 사용하는 경향이 있으나 커널모듈로는 안되는 경우가 많다. 이 기회에 커널 패치 및 컴파일에 대해 확실하게 배워 두기 바란다.

    아래 글은 여러 다양한 환경에서 작동하도록 최대한 주의를 기울였다. 하지만 수많은 다양한 사용자 환경을 다 고려할 수는 없으므로 혹시 아래 방법대로 따라 했는데도 잘 안된다고 머리카락 빠진 것이나 밤잠 설친 것, 또는 피시를 발로 걷어차 발가락 삔 부분 등에 대해 필자를 원망하지 말기 바란다. 비록 작동이 안되더라도 다른 많은 좋은 지식을 얻게 될 터이니까.

    이 글대로 해도 잘 안되면 일차로 필자가 알려준 사이트를 잘 살피면 분명 어딘가에 해답이 있다. 다음에 comp.os.linux.networking 이라는 뉴스 그룹에 질문을 하면 전 세계에서 답변이 쏟아질 것이다. 단 여기는 영어만 된다. 영어가 안되면 han.comp.os.linux.networking 에 올려보기 바란다.

    필자에게 메일로 질문하는 것은 별로 원하지 않는다. 필자가 메일이 마음에 들면 답변을 해 주겠지만 메일이 마음에 안 들거나 필자가 바빠서, 또는 기타등등의 이유로 답변을 안해 주면 보낸 사람이 무척 속상해 할 터이니까. 단 잘못된 부분을 지적하거나 다른 더 좋은 방법을 제시하는 메일은 환영한다. 그러나 역시 답장은 기대하지 마시길.

    필자의 메일 주소 : bae@linuxlab.co.kr

 

II. 참고 사이트

    이 글을 쓰는데 참고한 사이트를 소개한다.

    먼저 Jamal Hadi Salim 씨에게 감사를 드리고 싶다. PPPoE를 구현하는 여러 방법 중 필자가 이 글에 소개한 설치법은 이 분이 개발한 프로그램을 사용했다. Jamal씨의 사이트 주소는 http://www.davin.ottawa.on.ca/pppoe/ 이다. 여기에서 pppoed 프로그램(ADSL 연결 프로그램)을 다운 받았다.
    (pppoed0.47.tgz) PPP 옵션 관련과 PPPoE 관련 모든 설정은 이 프로그램 소스의 pppoed-0.47/pppoed 디렉토리에 있는 INSTALL 파일을 참고 했다.

    < 그림 1 : Jamal 씨의 사이트 >

    리눅스에서 PPPoE를 구현하는 다른 프로그램들도 많이 있으나 이들이 한국통신의 ADSL 라인에 적용 가능한지는 알지 못한다. 다른 PPPoE 관련 프로그램에 대한 자세한 정보를 알려면 http://www.rodsbooks.com/network/network-dsl.html 를 참고 하기 바란다.

    Kal Lin 씨의 사이트 [ http://www.cs.toronto.edu/~kal/hse/resource.html ]도 큰 도움이 되었다. 이 사이트는 주로 레드햇 6.1을 위주로 커널 컴파일부터 전체적인 개요를 설명하고 있다.

    < 그림 2 : Kal Lin 씨의 사이트 >

    Bruce Best<bestb@sympatico.ca>씨의 사이트[http://www3.sympatico.ca/bestb/]는 데비안에서 PPP 버전 관련 부분 및 MTU 문제에 대한 해답을 주었다.
    SuSE 리눅스의 경우 SuSE사 홈페이지에 자세한 정보가 있다. [http://www.suse.de/~bk/PPPoE-project.html]

    < 그림 3 : SuSE 사 PPPoE 웹 페이지 >

    레드햇에서 커널을 컴파일하지 않고 PPPoE를 사용할 수 있게 해주는 사용자 프로그램으로는 Roaring Penguin Software사의 pppoed 프로그램이 있다. 필자도 이 프로그램을 한국통신 ADSL에서 사용 가능한지를 시험해 보려고 한다.
    [http://www.roaringpenguin.com/pppoe.html]

    PPPoE에 대해서 전문적인 내용을 알고 싶으면 아래 사이트를 방문하기 바란다.

    PPPoE Presentation, White Papers, FAQ, RFC: http://www.redback.com/solutions/presentation/default.asp

 

III. PPPoE란?

    ADSL로 인터넷을 연결하는 경우 사용하는 외장형 장비를 보통 ADSL 모뎀이라 하는데 엄밀한 의미에서 이는 모뎀이 아니다. 모뎀은 시리얼포트에 연결하지만 ADSL 모뎀은 랜카드에 연결한다. ADSL 라인의 전송속도는 한국통신의 주장은 최대 2.5 mbps(라이트)라 하지만 필자가 외국의 사이트에서 본 바로는 1 mbps 정도가 일반적인 속도라고 한다. 어쨌든 속도가 1 mbps라고 해도 시리얼포트에는 연결이 불가능하다. 현재 피시에 기본으로 장착되는 시리얼포트의 최대 전송속도는 115k 이기 때문이다. 패러랠 포트(프린터 포트)도 역시 1 mbps 전송속도를 지원하지 못한다. 결국 가능한 다른 장치는 USB와 랜카드 밖에 없다. USB의 최대 전송속도는 얼마인지 모르나 랜카드는 모든 컴퓨터에 장착이 되어 있거니 장착이 가능하고 어느 운영체제나 다 지원한다. 그러나 USB는 아직 일반화되지 않았다. 그래서 앞으로도 피시에 직접 연결하는 고속 인터넷 연결 장치는 거의 랜카드에 연결하는 방식을 사용할 것 같다.

    시리얼포트에 모뎀을 사용해 인터넷을 연결하는 경우는 PPP라는 프로토콜을 사용한다. 윈도우에서 전화접속 네트워킹이 바로 이것이다. 인터넷에서는 컴퓨터간의 데이터 전송에 TCP/IP라는 프로토콜을 사용한다고 하는데 그러면 PPP와 TCP/IP는 어떤 관련이 있는가? TCP/IP는 화물이고 PPP는 이 화물을 싣고 가는 기차라고 보면 된다. PPP라는 기차에는 꼭 TCP/IP 라는 화물만 실을 수 있는게 아니다. 노벨 네트웨어에서 사용하는 IPX 등 다른 프로토콜도 동시에 실을 수 있다.

    랜투랜으로 인터넷을 연결한 경우는 ISP의 랜과 사용자 랜 양 쪽에 라우터라는 장비가 사용되는데 이 두 라우터의 시리얼포트를 연결하는 라인(보통 전화선 2 회선을 사용함. 즉 4 가닥임.)에는 HDLC나 PPP를 사용한다. 여기에 사용하는 PPP도 위의 피시의 전화접속에서 사용하는 PPP와 같다. 단지 피시에서는 어싱크(async) PPP를 사용하나 라우터에서는 싱크(sync) PPP를 사용한다. 싱크와 어싱크의 차이는 싱크 쪽이 속도가 빠르다는 정도다.

    PPP 는 전화선(시리얼 라인)에 TCP/IP 프로토콜을 싣는데 가장 적합하다.(원래 이 용도로 설계되었다) 시리얼 포트에 전화선을 사용해 PPP로 두 컴퓨터를 연결하는데는 거의 거리 제한을 받지 않는다. 거리 제한을 없애는 거대한 통신 인프라가 이미 만들어져 있기 때문이다.

    회사나 빌딩 내부처럼 근거리에서 TCP/IP 프로토콜로 컴퓨터 간에 데이터를 교환한다면 주로 이더넷을 사용한다. 물론 랜에는 이더넷 외에도 토큰링, ARCnet, FDDI 등 많다. 랜(이더넷)은 속도는 빠르나(10 mbps 이상) 최대 거리가 1 키로 미터 정도에 불과하다는게 단점이다.

    ADSL 모뎀에서 사용하는 PPPoE(PPP over Ethernet)라는 용어를 보면 누구나 이게 이더넷과 PPP 둘과 관계가 있다는 것을 알 수 있을 것이다. 즉 PPP를 이더넷에 싣는다는 뜻이다. 이것이 왜 필요한가?

    컴퓨터 한 대를 전화선으로 인터넷에 연결하는 경우는 PPP를 쓰는 것이 가장 적합하다. 그런데 리눅스에서 사용하는 PPP 프로그램은(윈도우의 전화접속 네트워킹도 마찬가지다.) 시리얼포트에서만 작동하도록 되어 있다. ADSL 모뎀은 컴퓨터 한 대를 전화선을 통해 인터넷에 연결해 주는 장비이므로(즉 IP 주소를 한 개만 준다는 뜻임) PPP를 사용하는게 적당하나 속도가 빨라 시리얼포트에 연결할 수 없고 랜카드(이더넷 카드)에 연결하므로 PPP를 직접 사용할 수 없기 때문이다.

    그래서 PPP 프로그램을 사용하기는 하되 그 방향을 이더넷 쪽으로 바꾸어 주는 다른 프로그램의 도움이 필요하다. PPPoE가 바로 그 역할을 한다. 그래서 PPPoE를 구현하는 프로그램을 redirector라고도 부른다.

    이 설명을 들었으면 PPP를 리눅스에 설치 해본 사람이라면 리눅스에서 PPPoE 프로그램을 사용하려면 다음 몇 가지 조건이 충족되어야 한다는 것을 알아차렸을 것이다.

    첫째로 커널에 PPP 지원이 포함되어야 한다.
    둘째로 PPPD 프로그램이 필요하다.
    셋째는 랜카드는 이더넷 방식이어야 한다.

    하나 더 추가하자면 PPP가 싱크 PPP를 지원해야 한다는 점이다. 이 부분에 대해서는 어싱크만으로도 가능하다는 이론도 있지만 한국통신에서는 싱크 PPP를 쓰는게 맞는 것 같다. 필자도 PPP 옵션에 sync를 넣었으니까. 그런데 PPP에서 sync를 지원하려면 PPP 버전 2.3.7 이상을 써야 한다.

    결론은 PPPoE를 사용하려면 우선 PPP를 설치하는 방법부터 알아야 한다. 필자도 PPP 서버라면 무수하게 설치해 보았으므로 이번 연결 때도 PPP 설명 부분은 건성으로 보았다. 그런데 필자가 설치한 데비안에 들어 있는 PPP 버전이 2.3.5 였다. 결국 sync 옵션을 무시했다가 설치에 몇 시간을 더 허비했다. 그래서 얻은 교훈은 RTFM.(Read The Fine Manual)

    참고로 PPP는 서버와 클라이언트란 구분이 없다. 서버와 클라이언트란 구분은 단지 설명의 편의를 위해서 존재할 뿐이다. 예를 들어 리눅스 피시를 한국통신의 ADSL 모뎀 공유를 위해 사용하면서 이 피시를 모뎀과 TT선으로 집의 윈도우 피시에 PPP로 연결해 집에서도 인터넷을 사용하도록 설정했다면 일반적인 용어로 리눅스 피시는 PPP 서버 및 클라이언트 두 역할을 하고 있다. 그런데 PPP에 설정한 옵션은 그 피시에 연결된 모든 장치에 적용된다.(물론 이를 특정한 장치에만 적용케 하는 방법이 있다). 그래서 PPP 연결이 여러 개인 경우 옵션 설정 시에는 주의를 해야 한다. 예를 들어 ADSL 연결에서는 옵션에 sync가 필요하지만 모뎀에는 이 옵션을 쓰면 안된다.

 

IV. 설치 환경 및 작업 순서

    아래는 필자가 설치한 환경이다. 피시나 배포본을 꼭 같이 할 필요는 없다. 필자는 단지 예산 절감을 위해 아래 사양을 썼을 뿐이다. 피시 및 랜카드 모두 있던 것 썼다.

    - 배포본은 데비안 2.1을 사용하였다. 리눅스 서버야 순전히 ADSL 공유를 위해서만 사용하므로 중고 486이면 충분하고 하드디스크도 큰 용량이 필요 없으므로 사무실에 굴러 다니는 270 메가 하드를 사용했다. 그런데 레드햇은 200 메가 용량의 하드에 까는게 너무 힘들어서 이다. 가능은 하겠지만 시행착오를 많이 거칠 것 같아서 이다.

    데비안의 경우 리눅스 기본만 설치하는데 디스켓 6장이면 족하다. 디스켓에 압축돼 있으므로 3메가라 해도 18 메가이면 기본적인 시스템 가동에는 문제가 없다. 예전에 데비안 1.2에서는 CD 설치가 지원이 안되어 6 장의 베이스 디스켓 만드느라 고생했던 기억이 난다. 하지만 2.1부터는 그럴 필요가 없다. 디스켓 없이 CD에서 기본 시스템 설치가 되기 때문이다. 데비안은 패키지를 중요도에 따라 분류해 놓았으므로 하드 용량에 따라 적절한 선택이 가능하다.

    필자는 비록 데비안이 업데이트 속도가 느려 불편한 점도 있지만 여러 면에서 데비안을 선호한다. 우선 안정성이 높다는 것이다. 다른 배포본은 자주 새 버전을 내느라 가끔씩 버그도 있지만 데비안은 버그가 거의 없다.

    - 데비안을 설치할 486에는 CD-ROM 드라이브가 없어 다른 펜티엄 피시(IBM Aptiva)에
       하드(270 메가)를 연결해서 데비안을 설치 후에 하드를 486으로 옮겼다. ADSL 공유를
       위해서는 2.2.14 버전의 커널을 컴파일해야 하나 커널은 리눅스랩의 메인 서버(펜티엄 II)
       에서 컴파일해서 옮기는 방식을 썼다. 이 서버가 제일 성능이 좋아 컴파일 시간이 적게
       걸리고 또 필자가 관리하는 모든 리눅스 서버의 커널은 이곳에 넣어두기 때문이다. 그래서
       리눅스 서버의 커널 변경이 필요하면 이곳에 있는 커널 소스 부분에서 필요한 부분만 변경
       해서 컴파일해 준다. 즉 리눅스 설치는 펜티엄, 커널 컴파일은 펜티엄 II에서 한 후 이를
       486으로 옮기는 방식을 썼다.

    리눅스를 설치할 펜티엄(IBM Aptiva)도 구닥다리여서 CD 부팅이 지원이 안되어 데비안에서 부팅 디스켓을 만들어 설치를 시작했다. 펜티엄에 연결된 CD-ROM 드라이브는 SCSI 방식이고 SCSI 콘트롤러는 advansys 제품이었으나 다행히 데비안 설치용 부팅디스켓에 있는 커널이 advansys scsi 콘트롤러를 제대로 인식했다. Advansys scsi 콘트롤러는 예전에 HP SureStore CD writer 구입 때 받은 것이다.

 

V. 준비 사항

1. 전체 구성도

    아래가 대략적인 구성도이다. 그림을 보면 이해가 가리라고 본다.

    < 그림 4>

    위의 그림을 보면 어떤 준비물이 필요한지 감이 올 것이다.

 

2. 리눅스 서버 사양

    필자가 서버로 사용한 피시는 아래와 같다. 이보다 더 낮은 사양의 피시로도 가능한지는 알 수가 없다. 단 메모리는 이 보다 낮추면 ADSL 속도에 문제가 발생한다.

    마더보드 : 대만제 저가 보드인데 플로피를 제대로 인식하지 못해 애를 먹었다.
    CPU       : 486-dx66
    하드       : 270 메가(맥스터)
    메모리    : 16메가
    FDD       : 쓰지 않았다. 리눅스를 다른 서버에서 설치해 옮겼고 커널도 랜으로 옮겼으므로.
    랜카드    : (1) rtl8019 (ISA) : 대만제
                   (2) 3com 3c509 (ISA) : 필자가 아끼던 카드였는데 ISA 카드를 구하지 못해
                                                     달아 주었다.

    리눅스를 ADSL 공유로 사용하기 위해서는 랜카드 하나로도 가능하나 설정도 복잡하고 또 한 개보다는 두 개가 속도 면에서 유리하므로 랜카드는 두 개를 사용했다.

 

3. 랜 관련 장비

    ADSL 모뎀 및 이 모뎀과 랜카드를 연결하는 케이블은 한국통신에서 준다. 따라서 리눅스에 꼽을 랜카드를 제외하면 두 번째 랜카드를 허브에 연결하기 위해 허브에 한 개의 포트가 필요하다. 또한 랜 케이블도 필요하다. 윈도우 피시들은 이미 랜이 구성되어 있다고 가정한다.

 

4. 소프트웨어

    필자는 데비안을 사용했으므로 아래 소프트웨어들이 필요했다. 레드햇(영문)의 경우 6.1 이상이라면 PPP 버전이 2.3.7이므로 ppp_2.3.11은 필요 없다. 물론 바꾸어도 상관 없다.

    1) 데비안 2.1 R2 : CD Cheapbytes 제품을 사용했다.
    2) 커널 2.2.14 : ftp.kernel.org 에 있다.
    3) pppoed0.47.tgz
        http://www.davin.ottawa.on.ca/pppoe/에 있다.
    4) ppp_2.3.11.orig.tar.gz
        ftp://ftp.debian.org/debian/dists/potato/main/source/base/에 있다.

 

VI. 데비안 설치

1. 하드디스크 구성

    하드디스크는 11H/50S/959C 이므로 용량이 270 메가이다. 파티션은 아래처럼 구성했다.

    /dev/hda1(65메가) : swap
    /dev/hda2(198메가) : linux native

    아래가 fdisk 화면이다.
     

    gtoys:~# fdisk
    Using /dev/hda as default device!

    Command (m for help): p

    Disk /dev/hda: 11 heads, 50 sectors, 959 cylinders
    Units = cylinders of 550 * 512 bytes

    Device      Boot   Start   End   Blocks    Id    System
    /dev/hda1               1    238   65425    82   Linux swap
    /dev/hda2 *          239   959  198275   83   Linux native

 

    스왑을 많이 잡은 이유는 메모리가 16 메가이기 때문에 스왑을 사용하게 될 가능성이 있기 때문이다.

 

2. 패키지 선택

    198 메가에 데비안을 깔아야 하므로 일단 최소로 설치해야 한다. 그래서 important에 속한 것은 거의 깔고 standard에 속한 것은 중요한 것만 깔았다. X-window, doc, tex 등은 모두 설치하지 않았다. man도 설치하지 않았다. 이렇게 설치하니 하드 사용은 72 메가에 불과했다. 190 메가 중 40%만 쓴 것이다.
     

    gtoys:~# df
    Filesystem 1024-blocks  Used  Available  Capacity  Mounted on
    /dev/hda2     191974     72901   109160       40%     /

 

3. 메모리

    메모리가 16 메가이고 늘릴 수도 없다. 4 메가를 4 개 꼽아서 더 이상 꼽을 수도 없기 때문이다. 메모리를 최대로 절약하기 위해 필요하지 않는 데몬은 모두 지웠다. 데비안의 경우도 패키지를 설치 않으면 데몬도 올리지 않으나 설치 후에 보니 NFS와 PPP는 올라와 있다. 그래서 /etc/rc2.d에서 그 둘을 지웠다. 다음에 버츄얼 터미널도 올리면 메모리를 사용하므로 tty1, tty2 두 개만 남기고 모두 막았다. 즉 /etc/inittab에서 아래처럼 지정했다.
     

    1:2345:respawn:/sbin/getty 38400 tty1
    2:23:respawn:/sbin/getty 38400 tty2
    #3:23:respawn:/sbin/getty 38400 tty3
    #4:23:respawn:/sbin/getty 38400 tty4
    #5:23:respawn:/sbin/getty 38400 tty5
    #6:23:respawn:/sbin/getty 38400 tty6

 

    - 이렇게 한 후 올라와 있는 프로세스를 보니 아래와 같다.
     

    gtoys:~# ps ax
    PID TTY STAT TIME COMMAND
      1   ?     S      0:03  init
      2   ?     SW   0:00  (kflushd)
      3   ?     SW   0:00  (kupdate)
      4   ?     SW   0:00  (kpiod)
      5   ?     SW   0:00  (kswapd)
     88   ?    S      0:01  /sbin/syslogd
     90   ?    S      0:00  /sbin/klogd
     97   ?    S      0:00  /sbin/kerneld
    103  ?    S      0:00  /usr/sbin/inetd
    111  ?    S      0:05  sendmail: accepting connections on port 25
    123  ?    S      0:00  /usr/sbin/cron
    126  1    S      0:02  -bash
    127  2    S      0:00  /sbin/getty 38400 tty2
    437  ?    S      0:01  in.telnetd: 192.168.1.11 [vt100]
    438  p0  S      0:01  -bash
    455  p0  R      0:00  ps ax
    101  ?    S      0:00  /sbin/portmap
    120  ?    S      0:00  /usr/sbin/atd

 

    위에서 sendmail은 남아 있는데 이유는 나중에 ADSL 연결 시에 유동 IP가 부여되면 그 IP를 필자에게 메일로 보내게 하기 위함이다. 그러면 데비안의 IP가 변경돼도 필자가 그 서버의 위치를 알아내 필요시 로그인 할 수 있기 때문이다.

    - 메모리 사용을 보니 아래와 같다.(top 명령을 사용)
     

    9:36am up 2 min, 1 user, load average: 0.25, 0.15, 0.06
    18 processes: 17 sleeping, 1 running, 0 zombie, 0 stopped
    CPU states: 4.5% user, 4.1% system, 0.0% nice, 91.3% idle
    Mem: 14828K av, 7020K used, 7808K free, 6056K shrd, 412K buff
    Swap: 65420K av, 0K used, 65420K free 3792K cached

    ----- 생 략 -----------------

 

    대략 7 메가를 사용하고 있다. 7 메가의 여유가 있으므로 PPP 연결 및 5 대의 피시에 IP masq를 해도 충분할 것 같다. 부족하면 swap이 64 메가나 있으니 걱정할 필요는 없다.

 

4. 네트워크 설정

    리눅스에서 랜카드를 사용하는걸 어렵게 생각하는 분들이 많다. 아래는 랜카드를 인식하는 여러 방법을 설명한다. 왜 지금 단계에서 랜카드를 필요로 하느냐 하면 필자는 커널을 다른 리눅스에서 컴파일해서 486으로 ftp로 전송하였기 때문이다.

 

    4.1 커널 모듈로 랜카드 인식하기

      이제 하드를 486으로 옮기고 RTL8019 랜카드를 꼽았다. 랜카드는 우선 한 개만 꼽았다. 랜카드를 두 개를 동시에 꼽으면 설정이 혼동이 되기 때문이다. 데비안 2.1은 기본 커널이 2.0.36 이다. 부팅에는 이상 없으나 랜카드가 안 잡힌다. 당연하다. 기본 커널에는 ne2000 드라이버가 없으니까. (8019 랜카드는 ne2000 호환임) 모듈에 ne.o 를 넣었는데 역시 랜카드가 인식이 안된다. 에러메시지는 IRQ 5를 사용할 수 없다는 말 같다. 이 랜카드는 전에 리눅스에서 사용하던 것이었는데 IO는 0x300, irq는 5번으로 설정해 놓았었다. 물론 PNP는 껐다.

      필자가 골동품으로 소장하고 있는 영문 도스 6.22 시스템 디스켓으로 부팅하고서 랜카드 셋업 프로그램을 돌려 진단을 하니 IRQ 5를 다른 장치가 사용 중이란다. IRQ 5는 두 번째 패러랠 포트에서 사용하므로 대만제 랜카드는 보통 IRQ 5로 설정하는게 일반적인데 이 피시의 IO 카드는 IRQ 5를 자기만 사용하도록 독점하는 것 같다. 그래서 자동으로 잡으라고 하니까 9번을 잡는다. IO는 300H 인데 이상 없다. 셋업을 저장하고 리눅스로 부팅해서 랜카드 모듈을 아래처럼 수동으로 올리니 랜카드가 인식된다.
       

      depmod -a
      modprobe ne.o


      랜카드 인식 여부는 dmesg 명령을 주면 된다. 아래는 dmesg 출력 중 랜카드 부분이다.
       

      ne.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)
      NE*000 ethercard probe at 0x300: 00 c0 26 ca 62 e4
      eth0: NE2000 found at 0x300, using IRQ 9.


      부팅시 마다 자동으로 랜카드 모듈이 올라오도록 /etc/modules에 아래처럼 넣었다.

      ne io=0x300

      0x300은 랜카드에서 사용하는 IO Address이다.

      *. 레드햇이라면 /etc/rc.d/rc.modules에 아래처럼 넣는다.
          (conf.modules에 지정해도 된다)

      /sbin/depmod -a
      /sbin/modprobe ne.o

      랜카드를 살 때는 필히 셋업 디스켓을 받아야 한다. 다음에 랜카드 셋업 프로그램을 돌려 PNP를 끈다. PNP를 끄지 않아도 인식되는 경우도 있으나 켜 놔서 좋을게 없다. 윈도우와의 멀티부팅에 필요하다고 하나 PNP를 꺼도 윈도우에서 랜카드를 올리는데 지장이 없다. PNP를 꺼서 윈도우에서 자동으로 랜카드를 인식하지 못하면 수동으로 IO와 IRQ를 넣으면 된다. 윈도우에서도 PNP는 완벽하지 않다. 오히려 PNP를 끄고 수동으로 자원을 지정하는게 정확하다.

 

    4.2 커널 컴파일로 랜카드 인식하기

      필자는 모듈을 좋아하지 않는다. 모듈을 자동으로 올리는 설정을 사용하면 메모리를 더 많이 사용한다. 다음에 모듈 의존관계니 이런 복잡한 설정이 귀찮다. 그래서 자주 쓰는 기능은 아예 커널에 넣어 둔다.

      이번 경우도 메모리가 중요하므로 ADSL 공유에 사용하는 모든 기능은 모듈로 올리지 않고 커널에 넣기로 했다. 또 pppoe를 사용하려면 필히 커널을 컴파일해야 하므로 아예 한꺼번에 넣어 컴파일하는게 편하기 때문이다. 즉 랜카드 드라이버, IP masquerade, PPPoE를 모두 커널에 넣어 컴파일하기로 했다.

      커널 컴파일 부분은 아래에 자세히 설명한다. 이 단계에서는 우선 랜카드 부분만 넣었다. 8019 랜카드는 ne2000 호환이다. 그래서 make menuconfig에서 아래 두 부분을 체크했다.

      [*] Other ISA cards
      <*> NE2000/NE1000 support

      커널에 랜카드 드라이버를 넣으면 /etc/modules에서는 랜카드 모듈을 지정할 필요가 없다.

      [참고] 커널 컴파일에서 왜 두 번째 랜카드인 3c509는 넣지 않았는지 궁금할 것이다.
                이 글은 필자가 실제 작업한 순서를 그대로 썼다. 원래 486에는 둘 다 대만제
                ne2000 호환 RTL-80XX 랜카드를 사용하려고 했으나 나중에 사온 두 번째
                랜카드가 PCI 방식이어서 486에 꼽히지 않아 3c509로 변경했다.

      그리고 필자가 사용한 486 마더보드가 과연 커널 2.2.14에서 정확히 작동할지를 알 수가 없어 우선 랜카드와 커널만 먼저 확인해 보기 위해서 였다. pppoe는 랜카드와 커널만 이상 없으면 작동하기 때문이다.

      마더보드를 대만제 저가형으로 쓰는 경우 특히 주의해야 한다. 필자도 여러번 대만제 저가 마더보드에서 리눅스가 제대로 설치돼지 않는 경우를 보았다. 얼마 전에도 대만제 2 CPU 마더보드에 Adeptec SCSI 콘트롤러를 꼽아 SCSI 하드를 장착한 조립 PC에 리눅스 서버를 구축해 주었는데, 설치 후에 가끔씩 하드디스크를 접근하지 못해서 마더보드를 교체한 적이 있다. 대만제 마더보드라고 다 그렇지는 않다. Asus 마더보드는 필자가 사용해본 보드 중 리눅스에서 가장 추천할 만하다.

      필자는 지금도 피시가 펜티엄 II 266이다. 리눅스를 주로 쓰므로 별로 고급 사양의 피시를 필요로 하지 않기 때문이다. 그런데 리눅스 쓸 때 좋은 피시가 있었으면 하는 때가 바로 커널 컴파일 때다. 커널 컴파일은 CPU 의존이다. 즉 하드디스크 억세스 속도나 버스클락보다 CPU 처리속도가 컴파일 속도를 좌우한다. 초창기 486-33 에서는 커널 컴파일이 1 시간이었던 것으로 기억한다. 그때는 커널 컴파일 걸어 놓고 밥을 먹고 쉬고 있었다. 486-dx66에서는 35분 이었다. 펜티엄에서 15분대로 단축되고 펜티엄 II에서 7분대로 단축되더니 요즘 최신 펜티엄 III 에서는 4 분대까지 단축되었다. 1시간 작업이 4분이니 무려 15배의 성능 향상이다.

 

    4.3 라우팅 테이블

      데비안 2.1 에서 커널을 2.2.14로 바꾸면 부팅 시 라우팅 테이블 설정에서 에러가 뜬다. 이유는 커널 2.0에서 사용하는 라우팅 테이블 설정 옵션과 2.2에서 사용하는 옵션이 다르기 때문이다. 그렇다고 route 명령을 다른 것으로 교체하지 말기 바란다. 필자의 경험으로는 system 관련 각종 데몬이나 명령에 관련된 프로그램을 배포본에 원래 있던 것과 다른 것으로 변경하는 것은 별로 바람직하지 않다.

      데비안이 다른 배포본보다 편한 부분이 바로 네트워크 설정 부분이다. 데비안에서는 네트워크 관련 스크립트를 /etc/init.d/network 한 개의 파일에서 지정하므로 이 파일 한 개만 수정하면 모든 네트워크 설정이 가능하다. 랜카드가 두 개라도 마찬가지다.

      일단 데비안 2.1 에서 커널을 2.2로 업그레이드 한 후 라우팅 테이블 설정이 제대로 안되면 아래처럼 network 파일을 고친다.
       

      gtoys:/etc/init.d# cat network
      #! /bin/sh
      ifconfig lo 127.0.0.1
      route add -host 127.0.0.0 dev lo
      IPADDR=192.168.1.3
      NETMASK=255.255.255.0
      NETWORK=192.168.1.0
      BROADCAST=192.168.1.255
      GATEWAY=
      ifconfig eth0 ${IPADDR} netmask ${NETMASK} broadcast ${BROADCAST}
      route add -net ${NETWORK} dev eth0
      route add -host ${IPADDR} dev eth0
      [ “${GATEWAY}” ] && route add default gw ${GATEWAY} metric 1


      위에서 게이트웨이는 지정하지 않았다. ADSL 연결에서는 게이트웨이가 한국통신의 ADSL 서버가 되기 때문이다. 이렇게 바꾸어도 부팅시 아래 에러메시지가 뜬다.

      “SIOCADDRT: Invalid argument”

      그러나 상관없다.
      랜카드 IP address를 왜 192.168.1.1로 하지 않느냐고 질문하는 사람도 있을 것이다. 그건 리눅스 설치 작업을 리눅스랩 사무실에서 했는데 사무실의 다른 피시에 192.168.1.1을 쓰고 있었기 때문이다. 이 서버를 현장에 설치할 때는 IP를 192.168.1.1로 변경할 것이다.

      이와 같이 지정했을 때의 라우팅 테이블은 아래와 같다.
       

      gtoys:/etc/init.d# netstat -nr
      Kernel IP routing table
      Destination  Gateway     Genmask           Flags    MSS   Window  irtt   Iface
      127.0.0.0     0.0.0.0    255.255.255.255        UH      3584        0          0      lo
      192.168.1.3  0.0.0.0    255.255.255.255       UH      1500         0          0    eth0
      192.168.1.0  0.0.0.0    255.255.255.0            U       1500         0          0    eth0


      지금까지의 네트워크 설정은 리눅스 호스트를 리눅스랩 사무실의 랜에 연결해 데비안의 네트워크 설정이 이상 없는지 점검하고 또 다른 리눅스 (192.168.1.1)에서 컴파일한 커널을 ftp로 받기 위한 임시 설정이다. 아직 랜카드는 한 개만 꼽았다.

 

VII. IP masquerade 설정

    IP Masquerade는 리눅서라면 대부분 아는 개념이다. 리눅스 서버에 부여된 공인 IP 한 개를 내부 주소를 갖는 여러 피시에서 공유해서 인터넷을 사용하게 해 주는 기법으로 윈도우의 sygate와 유사한 기술이다. 이를 구현하려면 크게 4 가지 절차가 필요하다.

 

    1. 커널에 ip masquerade 코드를 넣어 컴파일한다.
       즉 커널 컴파일 때 아래 옵션이 들어가야 한다.

    [*] Prompt for development and/or incomplete code/drivers
    [*] Network firewalls
    [*] TCP/IP networking
    [*] IP: firewalling
    [*] IP: masquerading

    (이 부분은 직접 관련된 부분만 나열한 것이고 다른 옵션이 많다. 관련 HOWTO를 참고 할 것)

    레드햇이나 수세에서 설치시 제공하는 커널에는 이미 masquerade 코드가 포함돼 있으므로 이 커널을 쓴다면 컴파일할 필요는 없다. 그런데 PPPoE를 사용하려면 커널을 컴파일해야 하므로 IP Masquerade 관련 커널 옵션은 뒤의 커널 컴파일에서 함께 설명한다. (IX 참조)

 

    2. IP masquerade 관련 모듈 올리기

    IP Masquerde 코드 중 아래 부분은 모듈로만 가능하므로 /etc/modules에 아래를 추가한다 IP Masquerade를 사용시 내부 랜에서 IRC, FTP, 리얼오디오 등을 사용하려면 필요하다. (web 과 telnet 만 사용한다면 필요 없다)
     

    bsd_comp
    ip_masq_irc
    ip_masq_ftp
    ip_masq_raudio
    ip_masq_vdolive


    위에서 bsd_comp는 PPP 관련 모듈이다. 이 모듈은 PPP 연결에서 데이터를 압축해서 속도를 빨리 해 준다. masquerade와 직접 관련은 없다. 이 압축은 양쪽이 모두 지원해야 사용 가능하나 한국통신 ADSL에서 bsd comp를 지원하는 지는 모른다.

    취향에 따라 다른 모듈도 더 필요하나 ADSL 공유는 이걸로 충분하다.(레드햇은 /etc/rc.d/rc.modules에 넣는다) 넣었으면 리부팅한 후 아래 명령으로 확인해 본다.
     

    gtoys:~# lsmod -l
    Module                  Size    Used        by
    ip_masq_vdolive     1068      0       (unused)
    ip_masq_raudio      2820      0       (unused)
    ip_masq_ftp           2192      0       (unused)
    ip_masq_irc           1300      0       (unused)
    bsd_comp             3640      0       (unused)


    어떤 사람은 (unused)가 나오니까 혹시 이 모듈이 올라오지 않은 게 아니냐고 걱정한다. 이는 단지 현재 이 모듈이 사용되지 않고 있다는 의미다. 만약 내부 랜의 윈도우에서 인터넷으로 ftp를 실행하면 위의 ip_masq_ftp 2192 0 (unused) 에서 unused가 사라질 것이다.

 

    3. ip forwarding 지정

    ADSL 라인은 리눅스에 연결되고 다른 윈도우 피시는 리눅스를 통해 인터넷을 연결한다. 즉 리눅스가 게이트웨이가 된다. 따라서 리눅스에는 ip forwarding을 활성화 해 주어야 한다.

    레드햇은 /etc/sysconfig의 network 파일에서 FORWARD_IPV4=true 로 하면 된다. 데비안은 /etc/rc.boot 디렉토리에 아래 스크립트를 넣는다.
     

    gtoys:/etc/rc.boot# cat 1ip_forward
    #!/bin/bash
    echo “1” > /proc/sys/net/ipv4/ip_forward


    이 파일은 실행모드(775)로 해야 한다.

 

    4. ipchains 설정

    ip masquerade 규칙을 지정하는 부분이다. /etc/rc.boot 디렉토리에 아래 스크립트를 넣는다. (레드햇은 /etc/rc.d/rc.local에 지정한다)
     

    gtoys:/etc/rc.boot# cat 2ipchains
    #!/bin/bash
    /sbin/ipchains -P forward DENY
    /sbin/ipchains -A forward -s 192.168.1.0/24 -j MASQ


    이 파일도 역시 실행모드(755) 로 해야 한다. 여기서 192.168.1.0은 내부 랜의 네트워크 주소이다. 즉 두번째 랜카드(eth1)가 속한 네트워크 주소를 지정해야 한다.(두 번째 랜카드는 아직 꼽지 않았다. 하지만 미리 지정해도 상관없다)

    [참고]
    masq를 사용하는 내부 랜에서 다이얼패드를 사용하려면 포트포워딩(port forwarding)이란 기법이 필요하다. 즉 커널 컴파일시 아래 옵션이 추가로 필요하다.

    <*> IP: ipportfw masq support (EXPERIMENTAL)
    (모듈로 올린다면 ip_masq_portfw.o 모듈이 필요하다. 레드햇 6.1 이상에는 이 모듈이 있다.)

    그 외에도 ipmasqadm 이란 프로그램도 필요하다. 아래처럼 지정한다.

    /usr/sbin/ipmasqadm autofw -A -v -u -r udp 51200 51201 -c tcp 7175
    /usr/sbin/ipmasqadm autofw -A -v -u -r tcp  51210 51210 -c tcp 7175

    포트포워딩에 대한 자세한 내용을 알려면 리눅스 월드 2000년 3월호에 쓴 본인의 글을 참고 하기 바란다.

 

VIII. 랜카드 두 개 꼽기

    ADSL 모뎀은 랜카드 두 개를 꼽아야 하므로 여기서는 두 개의 랜카드를 사용하는 설정에 대해 설명한다. ADSL을 리눅스에서만 사용한다면 랜카드는 한 개면 된다.

    원래 계획은 랜카드를 둘 다 ne2000 호환 대만제로 쓸려고 했다. 그런데 8029 칩을 쓴 대만제 랜카드를 테크노마트에서 사왔는데 PCI 용이었다. 486에는 PCI 슬롯이 없다. 8019와 8029 칩을 사용하는 ISA 랜카드는 같은 ne2000 호환이다. 그러면 랜 카드는 두 개여도 드라이버는 한 개이므로 드라이버가 다른 두 개의 랜카드를 사용하는 경우보다 커널 크기가 줄어들어 메모리도 적게 사용한다. 그런데 ISA 랜카드를 구하지 못해 두 번째 랜카드는 다른 피시에 꼽혀 있던 3c509(ISA)를 사용하기로 했다.

    커널을 다시 컴파일해서 3c509를 넣었다. 아래 두 군데를 체크한다.

    [*] 3COM cards
    <*> 3c509/3c579 support

    커널을 바꾸고 3com 카드를 추가로 꼽고 부팅하려고 생각해 보니 3com 카드의 IO Address가 아무래도 8019 랜카드와 같다는 생각이 들었다. 그래서 피시에 3c509 랜카드만 넣고 부팅해 부트 때의 메시지를 보니 IO address가 0x300이고 IRQ는 10번이다. IO Address가 8019 랜카드와 같다. 둘 중 하나를 IO Address를 변경해야 하는데 그러려면 셋업 디스크가 필요하다. 찾아보니 3c509 셋업 디스크가 없다.

    그래서 8019 랜카드의 IO Address를 바꾸기로 했다. 도스 디스켓으로 부팅하고 8019 셋업 디스크를 넣어 8019 랜카드의 IO Address를 0x320으로 변경했다. 이제 두 랜카드를 다 꼽고 피시를 리부팅 했는데 3c509는 인식이 되는데 8019 랜카드가 인식이 안된다. 아까 IO를 0x300으로 설정하고 단독으로 꼽았을 때는 인식되었으므로 IO를 변경한게 그 원인인 것 같다.(리눅스에서 ne2000 호환 랜카드는 IO Address가 0x300 인 경우는 자동 인식되나 다른 주소인 경우는 잘 안 된다). 셋업 디스켓으로 IO 주소를 다른 주소로 변경해 다시 시험해 볼 수는 있지만 그런 시행착오를 거치는 것보다 가장 확실한 방법을 쓰기로 했다. 즉 lilo에서 지정하는 방법이다.

    lilo.conf에 아래 라인을 넣고 lilo를 다시 실행했다.

    append=”ether=9,0x320,eth0 ether=10,0x300,eth1”

    리부팅하니 랜카드가 두 개 다 인식된다. 아래는 dmesg 명령 내용이다
     

    ne.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)
    NE*000 ethercard probe at 0x320: 00 c0 26 ca 62 e4
    eth0: NE2000 found at 0x320, using IRQ 9.
    eth1: 3c509 at 0x300 tag 1, 10baseT port, address 00 60 8c ec 79 4f, IRQ 10.
    3c509.c:1.16 (2.2) 2/3/98 becker@cesdis.gsfc.nasa.gov.


    [주의]
    랜카드가 둘 다 ISA 방식인 경우 두 카드의 IO Address 및 IRQ가 각각 달라야 한다.
              랜카드 살 때 받은 셋업 디스크를 도스에서 부팅해 설정을 바꾸면 된다. 설정을 할 때는
              랜카드 두 개를 동시에 꼽지 말고 한 개 씩 꼽아 설정을 하는 것이 좋다. 또 랜카드의
              IO Address와 IRQ를 다른 ISA 보드에서 사용하는지 여부도 검사해야 한다. 어떤 보드
              의 경우 ISA 랜카드인 경우는 CMOS 셋업의 PCI 설정에서 그 카드에서 사용하는 IRQ를
              PCI 슬롯에서 사용하지 않도록 지정해야 한다.

    두 번째 랜카드에 IP Address를 부여하고 라우팅 테이블을 설정하는것도 /etc/init.d/network 파일에서 지정한다. (레드햇은 /etc/sysconfig/network-scripts 디렉토리에 ifcfg-eth1 파일을 추가한다)

    최종으로 완성된 네트워크 셋업은 아래와 같다. (두번째 랜카드의 IP 주소를 192.168.1.1로 바꾸었다) 아래에서 eth0는 8019 랜카드, eth1은 3c509이다. 8019 랜카드가 eth0인 이유는 lilo.conf에서 그렇게 지정했기 때문이다.
     

    #! /bin/sh
    ifconfig lo 127.0.0.1
    route add -host 127.0.0.0 dev lo
    IPADDR=192.168.2.1
    NETMASK=255.255.255.0
    NETWORK=192.168.2.0
    BROADCAST=192.168.2.255
    GATEWAY=
    ifconfig eth0 ${IPADDR} netmask ${NETMASK} broadcast ${BROADCAST}
    route add -net ${NETWORK} dev eth0
    route add -host ${IPADDR} dev eth0
    ifconfig eth1 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255
    route add -net 192.168.1.0 dev eth1
    route add -host 192.168.1.1 dev eth1
    [ “${GATEWAY}” ] && route add default gw ${GATEWAY} metric 1


    eth0는 ADSL 모뎀과 연결되는데 여기에는 내부용 IP 중 eth1에 사용하지 않는 것을 부여한다. 필자는 192.168.2.1을 부여했다. (ADSL 모뎀과 연결되는 랜카드의 IP Address를 0.0.0.0으로 설정하는 것은 별로 권하지 않겠다. 이는 디폴트 게이트웨이를 의미하는 IP 주소이므로 나중에 PPP 연결시 생성되는 디폴트게이트웨이와 혼동이 온다.)

    게이트웨이는 지정하지 않아야 한다. ADSL 연결 시 ADSL 서버의 IP Address가 게이트웨이가 되야 하기 때문이다. 이는 ppp의 옵션 중 defaultroute 옵션이 이에 해당한다.

    필자가 사용해본 바로는 랜카드의 MTU 값은 디폴트 값인 1500을 쓰는게 좋다. 1490 이하로 설정할 필요가 없다. PPP와 윈도우 피시의 랜카드의 MTU 값은 1490으로 변경해야 한다.

    ifconfig 및 route 명령 결과는 아래와 같다.
     

    gtoys:/etc/ppp# ifconfig
    lo     Link encap:Local Loopback
            inet addr:127.0.0.1 Mask:255.0.0.0
            UP LOOPBACK RUNNING MTU:3924 Metric:1
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
            Collisions:0

    eth0  Link encap:Ethernet HWaddr 00:C0:26:CA:62:E4
            inet addr:192.168.2.1 Bcast:192.168.2.255             Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
            RX packets:7912 errors:0 dropped:0 overruns:0 frame:0
            TX packets:6947 errors:0 dropped:0 overruns:0 carrier:0
            Collisions:2
            Interrupt:9 Base address:0x320

    eth1  Link encap:Ethernet HWaddr 00:60:8C:EC:79:4F
            inet addr:192.168.1.1 Bcast:192.168.1.255         Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
            RX packets:6916 errors:24 dropped:0 overruns:24 frame:24
            TX packets:7639 errors:0 dropped:0 overruns:0 carrier:0
            Collisions:0
            Interrupt:10 Base address:0x300

    gtoys:/etc/ppp# netstat -nr
    Kernel IP routing table
    Destination    Gateway       Genmask          Flags    MSS    Window    irtt   Iface
    192.168.1.1    0.0.0.0     255.255.255.255       UH          0           0          0     eth1
    192.168.2.1    0.0.0.0     255.255.255.255       UH          0           0          0     eth0
    127.0.0.0        0.0.0.0     255.255.255.255       UH          0           0          0      lo
    192.168.2.0    0.0.0.0     255.255.255.0            U           0           0          0    eth0
    192.168.1.0    0.0.0.0     255.255.255.0            U           0           0          0    eth1

     

    [참고] 랜카드를 두 개 이상 꼽을 때 lilo.conf에서 지정하지 않고 자동으로 인식되는 경우
              특정 랜카드에 특정 인터페이스 이름을 부여 해야 할 경우가 있다. 예를 들어 내부랜이
              100메가인 경우 10메가와 100메가 두 개의 랜카드를 꼽을 때 ADSL 쪽에 연결되는
              10메가 랜카드가 eth0여야 한다. ADSL 연결에 사용하는 대부분의 pppoed 프로그램은
              기본으로 eth0에 ADSL 라인이 연결된 것으로 가정하기 때문이다.
              (이는 물론 변경이 가능하다)

    랜카드 드라이버를 커널에 넣어 컴파일해서 자동 인식되는 경우 각 랜카드의 인터페이스 이름(ethx)을 부여하는 순서에 대해서 학설이 분분하다. 랜카드가 ISA인지 PCI 인지에 따라서도 여러 학설(?)이 있다.

    일단 ISA 랜카드가 여러 개인 경우의 인터페이스 명 부여 순서에 대한 학설은 크게 3 가지다.

    1) IO Address
    2) IRQ
    3) MAC address (이더넷 어드레스)

    필자의 견해는 1)번이다.

    PCI 랜카드가 여러 개인 경우 이름 부여 순서에 대해서는 여기에 4) PCI 슬롯 우선순위(마더보드에서 지정) 라는 또 다른 학설이 있다. ISA와 PCI 랜카드가 섞여 있다면 그 때는 어떤 순서가 되나요? 너무 골치가 아파 생략하는게 낫겠다. 혹시 이 부분에 대한 이론을 확실하게 아는 분은 리눅스 월드로 원고 보내주기 바란다.

    이제 1단계 작업은 완료되었다. 지금까지의 작업은 리눅스에 IP Masquerade 기능을 부여해 게이트웨이로 사용하는 설정이다. 즉 eth0를 인터넷에 연결하고 공인 IP를 부여한 후 eth1이 속한 네트워크에 다른 윈도우 피시를 연결하면 윈도우 피시는 리눅스의 IP를 공유해서 인터넷 사용이 가능하다.(단 커널에 ip masquerade 코드가 들어 있어야 한다. 대부분의 배포본 기본 커널에는 IP masquerade 코드가 들어 있다.) 다음부터의 설명은 eth0에 ADSL 모뎀을 연결하는 경우만 필요하다.

 

IX. 커널 패치 및 컴파일

 

    1. 커널 컴파일 준비작업

    커널 컴파일에는 몇 가지 링크가 필요하다. 이 링크는 리눅스 설치 후에 한번만 해주면 되고 다음에는 필요가 없다. 일부 배포본은 리눅스 설치 때 커널 소스 설치를 선택하면 자동으로 링크가 이루어 지나 안전을 위해서 리눅스를 새로 설치했다면 첫 번 커널 컴파일 전에 아래 작업을 필히 해주기 바란다. 아래 작업은 root 계정으로 실행해야 한다.

    1) cd /usr/include
    2) rm -rf asm linux scsi
    3) ln -s /usr/src/linux/include/asm-i386 asm
    4) ln -s /usr/src/linux/include/linux linux
    5) ln -s /usr/src/linux/include/scsi scsi

    링크가 정확한지를 필히 확인한다. 아래처럼 나와야 한다.
     

    churlsu:/usr/include# ls -l asm linux scsi
    lrwxrwxrwx 1 root root 32 May 9 10:11 asm
    -> /usr/src/linux/include/asm-i386/
    lrwxrwxrwx 1 root root 29 May 9 10:11 linux
    -> /usr/src/linux/include/linux/
    lrwxrwxrwx 1 root root 28 May 9 10:11 scsi
    -> /usr/src/linux/include/scsi/

     

    위 작업을 했으면 새로운 커널을 컴파일할 때는 /usr/src/linux라는 디렉토리만 지우고 새로운 커널 소스를 설치한 후 아래의 3. 번 내용대로 하면 된다.

    아래처럼 하면 된다.
    (2.2.14 버전의 경우)

    (1) 새 커널 소스를 /usr/src 디렉토리에 넣는다.
    (2) cd /usr/src
    (3) rm -rf linux
    (4) tar zxvf linux-2.2.14.tar.gz

    (/usr/src 디렉토리에 linux라는 디렉토리가 만들어 지고 그 안에 커널 소스가 위치한다.)

 

    2. 커널 패치

    Jamal 씨의 pppoe를 사용하려면 2.2.14 커널을 패치해야 한다. (다른 버전에서도 될 가능성은 있다. 시간이 나는 사람은 시험해 보기 바란다) 커널을 패치하려면 커널 소스가 /usr/src/linux에 설치되어 있어야 한다. (위의 “(1)”에서 “(4)”까지를 실행해야 한다.

    커널 소스에 pppoe 소스를 패치하는 방법은 pppoed 디렉토리 내의 INSTALL 파일에 나와 있다. 아래가 그 부분이다.
     

    ------------------------------------------------------
    2) Assuming your kernel sources are at: /usr/src/linux for example in the case of the 2.2.13 patch, the kernel is version 2.2.13. Lets say you have installed the pppoed.tgz at the absolute path: /absolute-path/somewhere/ as defined in 1) above. Basically, /absolute-path/somewhere/ is the output of pwd when you cd to pppoed above.

    cd /usr/src/linux
    cat /absolute-path/somewhere/kernelversion-pppox |patch -b -p1

    [kernelversion-pppox is the appropriate kernel patch for your kernel. eg 2213-pppox is the patch for kernel 2.2.13]
    ------------------------------------------------------

       

    실제로 작업을 하면서 이 글의 번역을 보자.

    우리는 /usr/src 디렉토리에서 pppoed의 압축을 해제한다.(pppoed0.47.tgz 파일을 /tmp 디렉토리에 다운받았다고 가정한다.) 아래처럼 한다.

    (1) cd /usr/src
    (2) cp /tmp/pppoed0.47.tgz .
    (3) tar zxvf pppoed0.47.tgz

    이제 /usr/src 에 pppoed-0.47 디렉토리가 만들어 진다.

    (4) cd /usr/src/linux
    (5) cat /usr/src/pppoed-0.47/kernel-patches/2214-pppox | patch -b -p1

    이제 커널 패치는 끝났다. 다음은 컴파일 단계다.

 

    3. 커널 컴파일

    1) make menuconfig : 이 부분은 아래에 자세히 설명한다.
    2) make dep
    3) make clean
    4) make bzImage

    이 단계까지 마치면 /usr/src/linux/arch/i386/boot 디렉토리에 bzImage 라는 이름으로 새 커널이 만들어 진다. 하지만 만들어질 따름이지 이 커널이 기존에 메모리에 들어 있는 사용중인 커널을 대치해 주는 것은 아니다. lilo를 수정 후 리부팅해야 커널이 바뀐다.

    아래는 커널 모듈을 만든다. ip masquerade는 모듈로만 가능한 부분이 있으므로 필히 아래 단계가 필요하다. 모듈은 /lib/modules/KERVEL-VERSION 디렉토리에 위치한다. 즉 2.2.14 커널을 컴파일하고 아래 두 명령을 실행하면 /lib/modules/2.2.14 디렉토리에 모듈이 만들어 진다.

    5) make modules
    6) make modules_install

 

    4. 커널 설치

    커널 컴파일이 끝 난 후 새로 만든 커널을 메모리에 올리려면 lilo를 수정하고 리부팅 해야 한다. 리눅스의 대부분의 프로그램은 리부팅 하지 않고 교체가 가능하나 커널은 예외다.

    (1) 새 커널을 /boot 디렉토리에 복사한다.

    cp /usr/src/linux/arch/i386/boot/bzImage /boot

    (2) /etc/lilo.conf 파일에 지정된 디폴트 부팅 커널에 이 새 커널을 지정한다. 즉 lilo.conf에서 맨 처음 나오는 “image=” 다음에 새 커널 이름을 넣는다. (절대 경로로)

    image=/boot/bzImage

    (3) /usr/src/linux에 있는 System.map 도 /boot에 복사한다.

    rm -rf /boot/System.map
    cp /usr/src/linux/System.map /boot

    (4) lilo 명령을 실행한다.

    lilo <enter>

    혹시 에러 메시지가 뜨는지 잘 살필 것. 이제 리부팅하면 새로운 커널이 메모리에 올라온다.

    [참고]
    커널을 다른 곳에서 컴파일해서 옮길때는 커널 이미지만 옮기면 안된다. 모듈도 컴파일해서 /lib/modules/ 에 있는 x.x.x (x.x.x는 커널 버전) 디렉토리 (하위 디렉토리 포함)을 옮겨야 한다. ip masquerade 관련 모듈도 여기에 있다. 또 /usr/src/linux/System.map도 옮겨야 한다. tar로 묶어 옮기는게 편하다. (아래는 2.2.14 버전의 경우임)

    cd /lib/modules
    tar cvf modules.tar ./2.2.14

    다음에 커널을 변경한 486의 /lib/modules 디렉토리에 modules.tar 파일을 넣고 아래 명령을 준다.

    tar xvf modules.tar

    --------------------------------------------------------------------
    *. 커널 컴파일 옵션

    커널 컴파일 시 make menuconfig에서 ip masquerasde 및 pppoe를 사용하기 위해 지정해야 할 옵션이다. 아래는 필자의 피시에서의 경우이므로 랜카드가 달라지거나 하드디스크 종류 또는 다른 기능이 필요하면 달라진다.
     

    (1) Code maturity level options --->
    (2) Processor type and features --->
    (3) Loadable module support --->
    (4) General setup --->
    (5) Plug and Play support --->
    (6) Block devices --->
    (7) Networking options --->
    (8) Telephony Support --->
    (9) SCSI support --->
    (10)Network device support --->
    (11)Amateur Radio support --->
    (12)IrDA subsystem support --->
    (13)ISDN subsystem --->
    (14)Old CD-ROM drivers (not SCSI, not IDE) --->
    (15)Character devices --->
    (16)Filesystems --->
    (17)Console drivers --->
    (18)Sound --->
    (19)Kernel hacking --->

     

    (1)
    [*] Prompt for development and/or incompletecode/drivers : #1

    (2)
    (486/Cx486) Processor family
    (1GB) Maximum Physical Memory
    [ ] Math emulation
    [ ]MTRR (Memory Type Range Register)support
    [ ] Symmetric multi-processing support

    (3)
    [*] Enable loadable module support : #2
    [ ] Set version information on all symbols for modules
    [ ] Kernel module loader

    (4)
    [*] Networking support
    [ ] PCI support
    [ ] MCA support
    [ ] SGI Visual Workstation support
    [*] System V IPC
    [ ] BSD Process Accounting
    [*] Sysctl support
    <*> Kernel support for a.out binaries
    <*> Kernel support for ELF binaries
    <*> Kernel support for MISC binaries
    < > Kernel support for JAVA binaries(obsolete)
    < > Parallel port support
    [ ] Advanced Power Management BIOS support

    (5) 선택 없음

    (6)
    <*> Normal PC floppy disk support
    <*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
    --- Please see Documentation/ide.txt for help/info on IDE drives
    [ ] Use old disk-only driver on primary interface
    <*> Include IDE/ATA-2 DISK support
    <*> Include IDE/ATAPI CDROM support
    < > Include IDE/ATAPI TAPE support
    < > Include IDE/ATAPI FLOPPY support
    < > SCSI emulation support
    [*] CMD640 chipset bugfix/support
    [ ] CMD640 enhanced support
    [ ] Other IDE chipset support
    --- Additional Block Devices
    < > Loopback device support
    < > Network block device support
    [ ] Multiple devices driver support
    < > RAM disk support
    < > XT hard disk support
    < > Parallel port IDE device support

    (7)
    <*> Packet socket
    [*] Kernel/User netlink socket
    [*] Routing messages
    < > Netlink device emulation
    [*] Network firewalls : #2
    [ ] Socket Filtering
    <*> Unix domain sockets
    [*] TCP/IP networking #1
    [ ] IP: multicasting
    [*] IP: advanced router #1
    [ ] IP: policy routing
    [ ] IP: equal cost multipath
    [ ] IP: use TOS value as routing key
    [ ] IP: verbose route monitoring
    [ ] IP: large routing tables
    [ ] IP: kernel level autoconfiguration
    [*] IP: firewalling : #2
    [ ] IP: firewall packet netlink device
    [ ] IP: transparent proxy support
    [*] IP: masquerading : #2
    --- Protocol-specific masquerading support will be built as modules.
    [*] IP: ICMP masquerading #2
    --- Protocol-specific masquerading support will be built as modules.
    [*] IP: masquerading special modules support : #2
    < > IP: ipautofw masq support (EXPERIMENTAL)
    <*> IP: ipportfw masq support (EXPERIMENTAL) : #3
    < > IP: ip fwmark masq-forwarding support (EXPERIMENTAL)
    [ ] IP: optimize as router not host
    < > IP: tunneling
    < > IP: GRE tunnels over IP
    [ ] IP: aliasing support
    [ ] IP: ARP daemon support (EXPERIMENTAL)
    [ ] IP: TCP syncookie support (not enabled per default)
    --- (it is safe to leave these untouched)
    < > IP: Reverse ARP
    [*] IP: Allow large windows (not recommended if <16Mb of memory)
    < > The IPv6 protocol (EXPERIMENTAL)
    ---
    < > The IPX protocol
    < > Appletalk DDP
    < > CCITT X.25 Packet Layer (EXPERIMENTAL)
    < > LAPB Data Link Driver (EXPERIMENTAL)
    [ ] Bridging (EXPERIMENTAL)
    [ ] 802.2 LLC (EXPERIMENTAL)
    < > Acorn Econet/AUN protocols (EXPERIMENTAL)
    < > WAN router
    [ ] Fast switching (read help!)
    [ ] Forwarding between high speed interfaces
    [ ] CPU is too slow to handle full bandwidth
    QoS and/or fair queueing --->

    (8) 선택 없음.

    (9) 선택 없음.

    (10)
    [*] Network device support
    ARCnet devices --->
    <M> Dummy net driver support
    < > EQL (serial line load balancing) support
    < > Ethertap network tap
    < > General Instruments Surfboard 1000
    <*> tty support for PPP over X : #4
    Ethernet (10 or 100Mbit) ---> : #4
    [*] 3COM cards
    <*> 3c509/3c579 support
    [*] Other ISA cards
    <*> NE2000/NE1000 support
    Ethernet (1000 Mbit) --->
    [ ] FDDI driver support
    [ ] HIPPI driver support (EXPERIMENTAL)
    <*> PPP (point-to-point) support : #4
    --- CCP compressors for PPP are only built as modules.
    < > SLIP (serial line) support
    [ ] Wireless LAN (non-hamradio)
    Token ring devices --->
    [ ] Fibre Channel driver support
    < > Red Creek Hardware VPN (EXPERIMENTAL)
    < > Traffic Shaper (EXPERIMENTAL)
    Wan interfaces --->
    < > SBNI12-xx support

    (11) 선택 없음.
    (12) 선택 없음.
    (13) 선택 없음.
    (14) 선택 없음.

    (15)
    [*] Virtual terminal
    [ ] Support for console on virtual terminal
    < > Standard/generic (dumb) serial support
    [ ] Extended dumb serial driver options
    [ ] Non-standard serial port support
    [*] Unix98 PTY support
    (256) Maximum number of Unix98 PTYs in use (0-2048)
    [ ] Mouse Support (not serial mice)
    Joysticks --->
    < > QIC-02 tape support
    [ ] Watchdog Timer Support
    < > /dev/nvram support
    [ ] Enhanced Real Time Clock Support
    Video For Linux --->
    < > Double Talk PC internal speech card support
    Ftape, the floppy tape device driver ---> 

    (16)
    [ ] Quota support
    <*> Kernel automounter support
    < > ADFS filesystem support (read only) (EXPERIMENTAL)
    < > Amiga FFS filesystem support
    < > Apple Macintosh filesystem support (experimental)
    < > DOS FAT fs support
    <*> ISO 9660 CDROM filesystem support
    [ ] Microsoft Joliet CDROM extensions
    < > Minix fs support
    < > NTFS filesystem support (read only)
    < > OS/2 HPFS filesystem support (read only)
    [*] /proc filesystem support
    [*] /dev/pts filesystem for Unix98 PTYs
    < > QNX filesystem support (EXPERIMENTAL)
    < > ROM filesystem support
    <*> Second extended fs support
    < > System V and Coherent filesystem support
    < > UFS filesystem support
    < > SGI EFS filesystem support (read only) (experimental)
    Network File Systems --->
    Partition Types --->

    (17)
    [*] VGA text console
    [ ] Video mode selection support
    < > MDA text console (dual-headed) (EXPERIMENTAL)
    [ ] Support for frame buffer devices (EXPERIMENTAL)

    (18) 선택 없음
    (19) 선택 없음

    #1 : ip masquerade와 pppoe에 모두 필요하다.
    #2 : ip masquerade에 필요하다.
    #3 : port forwarding에 필요하다. (ip masquerade 설정 후)
    #4 : pppoe에 필요하다.

    선택을 마치고 “ESC”키를 누르면 “Do you wish to save...” 메시지가 나온다. → Yes

    -------------------------------------------------------------------

 

X. PPPD 설치

    1. pppd 2.3.11 설치

    ppp_2.3.11.orig.tar.gz 파일을 /usr/src 디렉토리에 넣는다.

    1) tar zxvf tar zxvf ppp_2.3.11.orig.tar.gz
    2) cd ppp-2.3.11
    3) ./configure
    4) make
    5) make install

    pppd가 /usr/sbin 디렉토리에 만들어진다.
    -r-sr-xr-x 1 root root 138508 May 15 10:40 pppd

    [주의] pppd가 setuid root(-r-s)임을 주의할 것. 다른 곳에서 pppd를 복사해 올 때 특히
              유의할 것.
              setuid를 만들려면 아래 명령이 필요하다.

      chmod 4555 pppd

 

    2. ppp 옵션 설정

    pppoed는 실행시 아래 PPP 옵션을 필요로 한다. /etc/ppp/options 파일에 지정한다.

    lock
    local ; 연결하는 장치가 모뎀이 아님.
    nocrtscts ; rtscts 흐름제어 사용 않음
    noauth ; 상대에게 인증을 요구하지 말 것
    mru 1490 ; Maximum Receive Unit
    mtu 1490 ; Maximum Transmit Unit
    noaccomp ; 주소 및 제어코드 부분에 대한 압축을 하지 말 것.
    name xxxx : xxxx에는 한국통신이 부여한 ADSL 연결 계정 이름을 넣음.
    defaultroute ; ADSL 서버 IP를 디폴트게이트웨이로 설정할 것.
    hide-password
    sync
    debug
    nodetach
    lcp-echo-interval 90 ; 회선 절단 등으로 PPP 연결이 끊겼는지를 알기 위해 90초 간격으로
                                     연결 여부를 체크하는 패킷을 보냄
    lcp-echo-failure ; 위의 패킷에대해 2번 응답이 없으면 PPP 연결을 끊음.

    ( ; 뒤는 필자가 설명을 위해 넣은 것임. 입력하지 말 것: mtu 값에 대한 설명은 뒤에 나온다. )

    [주의] 혹시 이 리눅스 서버의 시리얼 포트에 다른 모뎀이 연결되어 ppp 를 사용한다면
              options에 지정한 내용이 그 라인에도 적용된다. 이 경우 options에 지정한 내용 중
              일부는 그 라인에 맞지 않으므로 option.ttyS?에서 달리 지정해야 한다.

 

    3. pap-secrets 파일 설정

    PPP에서 사용하는 사용자 인증(사용자가 정당한 사용자인지를 확인하는 것) 방법에는 pap와 chap 가 있다. pap는 /etc/ppp 디렉토리의 pap-secrets 파일을 chap는 chap-secrets 파일을 사용한다. 그 안에 지정하는 방법은 동일하다.

    형식은 아래와 같다.
    client   server   secret   IP address

    1) client에는 인증을 하는 사람의 계정명을 입력한다. ADSL 의 경우 인증을 요청하는 쪽은
        한국통신의 서버이다. 따라서 client 에는 한국통신에서 부여한 계정명(예 linuxlab)을
        넣는다.

    2) server 에는 이 계정(즉 linuxlab)을 사용해서 인증을 하는 서버의 주소(IP)를 넣는다.
        즉 한국통신 ADSL 서버의 주소이다. 그러나 이 주소가 바뀔 수도 있으므로 * 을 넣으면
        아무 주소나 상관 없다는 뜻이 된다.

    3) secret에는 한국통신에서 위의 계정(linuxlab)에 부여한 암호를 넣는다.

    4) IP address 난은 인증을 요청하는 측(한국통신)에서 리눅스에 부여하는 IP를 지정하는데
        현재는 변동 IP이므로 지정할 필요가 없다. 공백으로 놔 두던가 * 을 넣는다.

    gtoys:/etc/ppp# cat pap-secrets
    account * password

    pap-secrets 파일은 파일허가 모드가 600 이어야 한다

    -rw------- 1 root root 17 May 14 18:35
    pap-secrets

    [조크] 왜 내 피시만 한국통신서버에게 인증을 해야 하는가? 나도 내 리눅스를 연결하는
              한국통신의 ADSL 서버가 정당한 서버인지 확인하기 위해 pap 인증을 요청해야겠다고
              생각하면 /etc/ppp/options 파일에서 noauth를 빼고 pap를 넣는다. 그리고서 계정과
              암호를 만들어 pap-secrets 파일에 넣고 한국통신에 통보해서 내가 만든 계정과 암호
              를 그 쪽 서버에 입력하도록 요청한다. 이 요청이 안 받아 들여 지면 ADSL 연결이
              안되니 신중히 결정하도록.

 

    4. ip-up 스크립트

    /etc/ppp/ip-up 스크립트는 PPP 연결이 이루어 질 때 실행되는 스크립트이다. 예를 들어 PPP 연결이 이루어 질 때 마다 원격지의 메일서버에서 자신의 메일을 가져오는 명령 등을 넣을 수 있다. 필자의 경우 리눅스 서버에서 ADSL 연결이 이루어 지면 리눅스에 부여된 IP 주소를 필자에게 메일로 알리는 명령을 넣었다.(물론 sendmail 의 설정을 해 주어야 한다) 그러면 필자는 메일만 체크하면 지토이즈(gtoys)의 리눅스 서버의 IP 주소를 알 수 있어 필자의 사무실에서 로그인해 서버의 상태를 알 수 있기 때문이다. 필자가 지금 리눅스랩 사무실에서 글을 쓰면서 지토이즈 서버의 설정을 체크할 수 있는 것도 이 때문이다. 아래는 그 부분이다.

    mail -s “$4” bae@linuxlab.co.kr
    (위에서 $4는 PPP 연결 시의 리눅스에 부여되는 IP 주소이다.) 

    이렇게 설정하면 필자에게 아래처럼 메일이 온다.
     

    Subject: 211.54.52.137
    Date: Sun, 22 May 1994 11:19:43 +0900
    From: root <root@mail.gtoys.co.kr>
    To: bae@www.linuxlab.co.kr

     

    [주의] 리눅스에 ppp 연결이 여러 개면 모든 ppp 연결시 마다 ip-up 스크립트가 실행된다.
              만약 각 ppp 연결 마다 다른 명령이 실행되도록 하려면 ip-up 스크립트에 조건문을
              넣는다.

    예를 들면 아래와 같다. ADSL 연결시만 특정 명령이 실행되도록 하고 싶다면 ADSL에서 사용하는 장치는 /dev/pppox0 이므로 아래 방식으로 넣는다.
     

    case “$2” in
    ‘/dev/pppox0’)
    명령
    ;;
    case “$2” in
    ‘/dev/ttyS0’)
    명령
    ;;
    esac

     

    (위에서 $2는 ppp 연결시 사용된 장치명으로서 pppd가 ip-up 스크립트에 넘겨준다.)

    [참고] /etc/ppp/ip-down 스크립트는 ip-up와는 반대로 ppp 연결이 끊길 때 실행되는
              스크립트이다. 이 스크립트를 이용해서 PPP 연결이 끊길 때마다 자동으로 ADSL을
              재접속하는 명령을 만들 수도 있다.

 

XI. pppoed 컴파일

    “IX” 에서 커널 패치를 위해 이미 pppoed 소스를 /usr/src에 압축을 해제해서 pppoed-0.47 이라는 디렉토리가 만들어져 있으므로 아래 순서로 pppoed를 컴파일한다. pppoed-0.47/pppoed 내에 INSTALL 파일에 잘 나와 있다.

    1) cd /usr/src/pppoed-0.47/pppoed
    2) ./configure
    3) make
    4) make install

    이 과정을 끝내면 pppoed 파일이 /usr/local/sbin에 만들어 진다.(Jamal씨의 설명은 /usr/local/bin으로 나와 있으나 오타 이다)

    -rwxr-xr-x 1 root staff 79762 May 21 13:54 pppoed

    그리고 Jamal씨는 이 과정을 마치면 /dev/ 디렉토리에 pppox0라는 장치가 만들어 진다고 하나 필자의 경우 만들어 지지 않았다. 그래서 다음 단계에서 수동으로 만들었다. 장치 부분에 대한 Jamal 씨의 설명이다.
     

    5) You dont need this step if you made a “make install” above.

    create /dev/pppox0:
    mknod /dev/pppox0 c 144 0

     

    *. MTU 문제

    pppoed 사용시 내부 랜의 피시는 mtu 값을 1490 이하로 잡아야 한다. 즉 윈도우 피시는 레지스트리를 편집해야 한다.(아래 “XIV. 내부 랜에 연결된 피시의 네트워크 설정” 1. 참고)

    레드햇 6.X 사용자는 pppoed-0.47/contribs 디렉토리 내의 mssclampfw 프로그램을 설치하면 내부 랜의 피시에서 MTU 변경이 필요 없다. 아래는 설치 순서이다. (설치하고 리부팅하면 커널 모듈이 올라온다.)

    (1) cd pppoed-0.47/contribs
    (2) tar zxvf mssclampfw-1.2.tar.gz
    (3) cd mssclampfw-1.2
    (4) make install

    필자는 데비안을 사용하므로 이 부분은 설치해 보지 않았다.

 

XII. 장치 만들기

    mknod 명령으로 다음 두 개의 장치를 만든다.

    1) mknod /dev/pppox0 c 144 0
    2) mknod /dev/pppox1 c 144 1
     

    gtoys:/dev# ls -l ppp*
    crw-r--r-- 1 root root 144, 0 May 22 14:07 pppox0
    crw-r--r-- 1 root root 144, 1 May 22 14:07 pppox1

     

 

XIII. 연결

    이제 모든 준비가 끝났다. 다시 한번 위의 설정들을 점검하고 이상 없으면 케이블을 연결한다. ADSL 모뎀은 첫 번 랜카드에 연결하고(한국통신에서 제공한 케이블을 쓸 것.) 두 번째 랜카드는 윈도우 피시가 연결된 허브에 연결한다.

     

    1. 연결 명령

    연결은 아래 명령을 주면 된다.

    /usr/local/sbin/pppoed

    피시를 끄면 이 명령의 효력은 사라진다. 부팅시에 이 명령이 자동으로 실행되도록 데비안은 /etc/rc.boot 디렉토리에 아래 스크립트를 넣는다. 이 스크립트는 모드를 755로 한다.
     

    gtoys:/etc/rc.boot# cat 9adsl_connect
    #!/bin/bash
    /usr/local/sbin/pppoed

     

    레드햇이라면 /etc/rc.d/rc.local 파일에 위의 줄을 넣는다.

 

    2. 연결 확인

    2.1 리눅스에 다른 ppp 연결이 없다면 연결 여부는 ifconfig 명령으로 확인 가능하다. 아래처럼 ppp0라는 인터페이스명이 추가된다.
     

    gtoys:/etc/rc.boot# ifconfig
    lo     Link encap:Local Loopback
            inet addr:127.0.0.1 Mask:255.0.0.0
            UP LOOPBACK RUNNING MTU:3924 Metric:1
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
            Collisions:0

    eth0  Link encap:Ethernet HWaddr 00:C0:26:CA:62:E4
            inet addr:192.168.2.1 Bcast:192.168.2.255              Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
            RX packets:10368 errors:0 dropped:0 overruns:0 frame:0
            TX packets:8919 errors:0 dropped:0 overruns:0 carrier:0
            Collisions:2
            Interrupt:9 Base address:0x320

    eth1  Link encap:Ethernet HWaddr 00:60:8C:EC:79:4F
            inet addr:192.168.1.1 Bcast:192.168.1.255              Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
            RX packets:8508 errors:31 dropped:0 overruns:31 frame:31
            TX packets:9439 errors:0 dropped:0 overruns:0 carrier:0
            Collisions:0
            Interrupt:10 Base address:0x300

    ppp0  Link encap:Point-to-Point Protocol
             inet addr:211.54.52.137 P-t-P:211.54.49.4               Mask:255.255.255.255
             UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1490               Metric:1
             RX packets:10366 errors:0 dropped:0 overruns:0 frame:0
             TX packets:8918 errors:0 dropped:0 overruns:0 carrier:0
             Collisions:0

     

    211.54.52.137은 자신의 IP 주소이고 211.54.49.4는 한국통신 ADSL 서버의 IP 주소이다.

    2.2 이 리눅스의 시리얼 포트에 모뎀이 연결되어 다른 PPP 연결이 있다면 이 경우는 ppp0는 이들 모뎀이 사용할 수도 있다. 이 경우는 ps ax 명령으로 아래 두 줄이 나오는가 확인하는 것이다.
     

    gtoys:~# ps ax
    99   ?  S  0:00   /usr/local/sbin/pppoed
    101 ?  S  0:03   pppd /dev/pppox0 38400

     

    2.3 /var/run 디렉토리에는 아래 두 파일이 만들어 진다.

    -rw-r--r-- 1 root root 4 May 22 14:47 ppp0.pid
    -rw-r--r-- 1 root root 3 May 22 14:47 pppoed.pid
    ( ppp 연결이 ADSL 한 개인 경우 임)

    이 파일에는 ASCII 텍스트 파일로 ppp0.pid 에는 위의 2.2의 “ps ax” 명령에서 “/usr/local/sbin/pppoed” 맨 앞의 PID가(위의 경우는 99) 그리고 pppoed.pid 에는 “pppd /dev/pppox0 38400” 맨 앞의 숫자가 들어있다.(101)

    PPP 연결이 여러개 일 때 ADSL 연결에서 리눅스에 부여한 IP 주소를 알아 내려면 다음 순서를 밟는다.

    (1) ps ax 명령으로 “pppd /dev/pppox0 38400” 줄을 찾아 맨 앞의 숫자(PID)를 읽는다.
         (예를 들어 101)
    (2) /var/run 디렉토리에서 ppp?.pid 파일을 cat 명령으로 확인해 그 숫자가 (1)의 숫자와
         같은 파일을 확인한다. 예를 들어 ppp5.pid에 101이라는 숫자가 들어 있다.
    (3) Ifconfig 명령에서 ppp5 라인 다음 줄의 inet addr: 다음이 ADSL이 리눅스에 부여한 IP
         주소이다.

    2.4 그리고 /var/lock 디렉토리에 아래 파일이 만들어진다.
          (단 ppp 옵션에 lock 이 지정 되야 한다)

    -rw-r--r-- 1 root root 11 May 22 14:47 LCK..pppox0

    이 파일 안에는 ps ax 명령의 “pppd /dev/pppox0 38400” 라인 맨 앞의 PID 가 들어 있다.(위에서는 101) 이 파일은 pppd가 사용하는 장치인 /dev/pppox0 를 다른 프로그램에서 사용하지 못하게 하는 역할을 한다.

    2.5 ADSL 연결이 이루어진 경우 라우팅 테이블은 아래와 같이 나와야 한다.
     

    gtoys:~# netstat -nr
    Kernel IP routing table
    Destination  Gateway        Genmask        Flags MSS Window irtt Iface
    192.168.1.1  0.0.0.0    255.255.255.255         UH     0       0       0   eth1
    211.54.49.4  0.0.0.0    255.255.255.255         UH     0       0       0  ppp0
    192.168.2.1  0.0.0.0    255.255.255.255         UH     0       0       0   eth0
    127.0.0.0     0.0.0.0    255.255.255.255          UH     0       0       0     lo
    192.168.2.0  0.0.0.0    255.255.255.0              U      0       0       0   eth0
    192.168.1.0  0.0.0.0    255.255.255.0              U      0       0       0   eth1
    0.0.0.0       211.54.49.4  0.0.0.0                    UG     0       0       0  ppp0

     

    여기서 마지막의 0.0.0.0 다음이 디폴트게이트웨이 주소이다. netstat 명령으로는 PPP 연결에서 자신에게 부여된 IP 주소를 알 수 없다. 오직 상대방의 IP 주소만 나온다.
    위에서 두 번째 줄에 나오는 211.54.49.4는 한국통신 ADSL 서버 포트의 IP 주소이다. 이것이 자신의 IP 주소인 211.54.52.137 가 되어야 하지 않느냐고 질문할 수도 있지만 이 줄의 의미는 211.54.49.4 의 주소로 가는 패킷을 ppp 인터페이스(ppp0)로 보내라는 의미다. 마지막 줄의 의미는 192.168.1.0 과 192.168.2.0 네트워크 및 211.54.49.4 주소로 가는 패킷을 제외한 다른 패킷은 모두 211.54.49.4 주소 즉 한국통신의 ADSL 서버로 보내라는 뜻이다. 그래야 인터넷 사용이 가능해 진다.

     

    3. IP 주소

    한국통신의 ADSL 라인에서 부여하는 IP 주소는 공인/변동 IP이다. 내부 IP가 아니므로 인터넷의 모든 서비스가 다 가능하나(공인) 연결시마다 IP가 달라진다.(변동) 피시를 끄지 않는다고 IP 주소가 그대로 유지되지는 않는다. 일정 시간 사용을 않으면 연결이 종료 되도록 설정이 돼 있다. (시간 설정은 모른다)

    IP를 부여하는데 DHCP(IP pool)를 사용하지 않으므로 리눅스에 DHCP 클라이언트를 설치할 필요는 없다. 필자의 견해로는 ADSL 서버의 포트 별로 IP를 할당해 놓은 것 같다. 사용자는 연결시 마다 순서대로 포트를 할당 받으므로 IP가 계속 바뀌는 것이다.

     

    4. 연결 끊기

    얼마동안 사용 않으면 연결이 끊기겠지만 연결을 끊고 싶으면 ps ax 명령에서 /usr/local/sbin/pppoed 라인의 맨 앞에 나오는 숫자(PID) 를 kill 명령 뒤에 넣는다. 위의 경우는 “kill 99” 이다.

 

    5. 자동 재접속

    ADSL이 한번 연결되면 연결이 끊기지 않도록 해주는 방법을 여러 곳에서 제시하고 있으나 별로 권하고 싶지 않다. 쓰지 않으면서 연결을 계속 유지한다면 다른 사용자의 사용에 지장을 주는 결과가 되기 때문이다. 리눅스에서 일정 간격으로 한국통신의 ppp 서버에 ping을 쏘는 방법도 회선 장애로 인한 끊김에는 효과가 없다. 끊김을 방지하는 방법은 별 실효가 없고 오히려 끊겼을 때 재연결해 주는 방식이 의미가 있다. 이때는 끊겼다는 사실을 어떻게 확인하는가가 중요한데 ifconfig 에서 ppp0를 확인하는 것도 확실한 방법이 아니다. 리눅스에 다른 PPP 연결이 있다면 ppp0 가 ADSL 연결이라는 보장이 없다.

    ppp 옵션 중

    lcp-echo-interval 90
    lcp-echo-failure 2

    위 둘은 끊김을 방지하는 옵션이 아니라 ppp 연결이 끊겼는데도 ppp 데몬(즉 ppp0)가 계속 살아 있어서 재연결에 지장을 주지 않기 위해 필요하다. 즉 90초 간격으로 2 번 lcp-echo 패킷을 보냈는데도 상대에게서 응답이 없으면 ppp 연결을 종료하라는 뜻이다.

    이부분을 ppp 옵션에 넣으면 데비안의 경우 /var/log/daemon.log 에 90초 간격으로 아래 2개의 라인이 나타난다.
     

    May 22 15:28:05 gtoys pppd[101]:
    sent [LCP EchoReq id=0x1b magic=0xfebb0c97]
    May 22 15:28:05 gtoys pppd[101]:
    rcvd [LCP EchoRep id=0x1b magic=0xf6386cd]

     

    첫 번 라인은 리눅스에서 한국통신 서버에 보낸 응답 요청 패킷이고 (즉 너 살아 있니?) 아래는 한국통신 서버에서의 답장이다.( 나 잘 있다.) 선 연결이 끊기거나 한국통신의 서버가 다운되면 2번째 라인이 나타나지 않는다. 90초 후 다시 응답 요청 패킷을 리눅스에서 보내도 한국통신 서버가 회신을 않으면 그 때는 PPP 데몬이 죽는다.

    따라서 끊김을 확실히 아는 방법은 위의 PPP 옵션을 넣고 ps ax 명령에서 “pppd /dev/pppox0 38400” 라인이 있는지 체크하는 것이다.

    끊김을 확인하고 자동으로 재 연결하는 방법은 아래의 방법이 가능할 것 같다.

    (1) cron 으로 일정 시간마다 확인하는 방법(끊김 확인은 “ps ax” 명령을 쓰는게 낫다.)

    (2) /etc/ppp/ip-down 스크립트를 사용하는 방법 : ip-down 은 ppp 연결이 끊길 때 실행되는
         명령이므로 가장 확실하다. 단 회선이 물리적으로 절단되면 ip-down 에서 재 연결 명령을
         주어도 소용 없다. 이에 대한 대비가 필요하다.

    [참고] pppoed-0.47/contribs 디렉토리에 ppp 연결이 ADSL 하나일 경우 ppp 자동 재연결
              스크립트가 있다. 아래가 그 내용이다.( 파일명이 keepalive.ppp 임) 이 스크립트를
              부팅 시 자동으로 실행되도록 한다.(pppoed가 위치한 /usr/local/sbin 디렉토리가
              “export PATH=”에 지정되어야 한다.)
     

    #!/bin/sh
    # restart the ppp connection whenever it goes down

    export PATH=/bin:/usr/bin:/sbin:/usr/local/sbin
    export LOG=”logger -p daemon.notice -t `basename $0`[$$]”

    $LOG “Monitoring PPP connection”
    while [ 1 ]
    do
              if `ifconfig | grep -q ^ppp0`
              then
                           $LOG “PPP connection ok”
              else
                           $LOG “Starting pppoed”
                           pppoed
              fi
              sleep 60
    done

 

 

XIV. 내부 랜에 연결된 피시의 네트워크 설정

    1. MTU 수정

    ADSL 연결을 공유할 윈도우 피시는 레지스트리를 수정해 MTU 값을 리눅스의 /etc/ppp/options에 지정한 MTU 값과 같게 지정한다.(레드햇 6.X 에서 mssclampfw 프로그램을 설치했으면 필요 없다.)
    아래는 윈98에서의 수정 방법이다.

    1) 시작 -> 실행 -> “열기”에 regedit 를 입력 후 “확인”

    2) HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans 에
        000? 으로 시작하는 이름의 파일 중에서 그 내용에 윈도우의 랜카드에 부여된 IP 주소가
        있는 파일을 선택한다.(즉 IPAddress “192.168.1.X” 라인)

    3) 편집기의 상단 메뉴에서 “편집” -> “등록” -> “문자열 값(s)”을 선택하면 “New value”가
        나온다. 이를 MaxMTU 로 바꾼다.

    4) 이 부분을 선택 한 채 메뉴에서 “편집” -> “수정” 을 선택하면 “값의 데이터” 입력 창이
        나온다. 여기에 1490을 입력한다. (/etc/ppp/options 의 mtu 다음에 지정한 값과 같아야
        한다)

    필자는 1490으로 지정해서 사용하고 있는데 아무런 문제가 없다. (고속일수록 MTU 값은 높은게 바람직하다.)

    이 부분에 대한 다른 윈도우 에서의 수정은
    http://www.speedguide.net/Cable_modems/cable_registry.shtml 를 참고 하기 바란다.

     

    2. IP 주소

    내부 랜의 윈도우 피시에는 192.168.1.2부터 254까지 중복되지 않게 지정한다.

     

    3. 게이트웨이 주소

    내부 랜의 윈도우 피시의 게이트웨이는 리눅스의 두 번째 랜카드(eth1)IP 주소이다. 필자의 경우는 192.168.1.1이다.

     

    4. DNS 서버 주소

    리눅스와 윈도우 피시의 네임서버에는 다른 사이트에 자신의 DNS 서버가 설치되어 있으면 그 IP 주소를 넣는다.(반드시 숫자를 사용할 것) 자신의 DNS 서버를 꼭 지정할 필요가 없다면 (자신의 DNS 서버가 혹시 다운되었는지 수시로 체크해 볼 필요가 있다면 자신의 DNS 서버를 지정하는게 좋다.) 한국통신의 DNS 서버 주소(168.126.63.1)를 지정해야 연결 시간이 조금이라도 단축된다. 리눅스에서 DNS 서버 지정하는 파일은 resolv.conf이다. 아래처럼 지정한다.
     

    gtoys:~# cat /etc/resolv.conf
    search gtoys.co.kr
    nameserver 168.126.63.1

     

 

XV. 설치 후기

    한국통신의 ADSL을 사용해 본 결과 속도는 만족스러웠다. 비록 2 mbps는 안 나오지만 1 mbps 이상은 나오는 것 같다. 이 정도로도 인터넷의 각종 서비스를 이용하는데는 충분하다. 또 연결 속도도 매우 빠르다. 연결 명령 후 2~3 초 이내에 연결이 이루어 지는 것 같다.

    한국통신에 바램이 있다면 고정 IP 서비스를 제공해 달라는 것이다. 회사에서 웹서버를 인터넷에 1 mbps 속도로 연결하려면 현재는 랜투랜으로 연결해야 하는데 월 비용이 100만원이 넘는다. 게다가 라우터 및 CSU 등의 장비를 임대해야 하고 회선도 4선식을 사용해야 한다. 그런데 기존의 전화선에 단지 ADSL 모뎀 하나로 1 mbps 속도로 홈페이지를 운영할 수 있다면 중소 규모의 회사나 SOHO 경영자들에게 큰 환영을 받을 것이다.

    조금 알 수 없는 부분은 한국통신의 서버에서 1분 간격으로 LCP Echo 패킷이 날라온다는 점이다.
     

    May 22 16:29:52 gtoys pppd[101]: rcvd [LCP EchoReq id=0x68 magic=0xf6386cd]
    May 22 16:29:52 gtoys pppd[101]: sent [LCP EchoRep id=0x68 magic=0xfebb0c97]
    May 22 16:30:52 gtoys pppd[101]: rcvd [LCP EchoReq id=0x69 magic=0xf6386cd]
    May 22 16:30:52 gtoys pppd[101]: sent [LCP EchoRep id=0x69 magic=0xfebb0c97

 

    이는 PPP 연결 여부 즉 사용자가 ADSL을 사용 중인지를 파악하기 위함 인 것 같은데 이렇게 자주 확인할 필요가 있는지 의문이 간다. 이 패킷도 대역폭을 사용하므로 조금 간격을 늘리는게 바람직할 것 같다.




▲ top

home으로...