Chapter 7
Serial Line IP


D.M.Z CONTENT PRE NEXT

7.1 General Requirements
7.2 Slip Operation
7.3 Using dip
7.4 Running in Server Mode

시리얼 라인 프로토콜인 SLIP과 PPP는 가난한 이도 인터넷에 연결할 수 있게 해준다. 모뎀과 FIFO 버퍼를 장비한 시리얼 보드외엔 어떠한 하드웨어도 필요치 않다. 그것을 사용하는 것은 mailbox보다 복잡하지도 않고, 또한 모든사람이 지불할 수 있을 정도의 가격에 다이얼업 IP를 제공하는 개별조직의 수가 늘어나고 있다.

리눅스에선 SLIP과 PPP 드라이버 모두 지원된다. SLIP은 지원된지 꽤 오래되었고, 상당히 신뢰성 있게 동작한다. PPP 드리이버는 현재 Michael Callahan과 AI Longyear에 의해 개발중이다. 그것에 대해선 다음 장에서 적고자 한다.


7.1 General Requirement

SLIP이나 PPP를 사용하기 위해선, 이전 장에서 얘기하였던 몇가지 기본적인 네트웍 기능을 설정해 주어야만 한다. 적어도 loopback 인터페이스를 셋업하고 name resolution정도는 제공해야한다. 인터넷에 연결할 때, 당신은 물론 DNS를 사용하고자 할 것이다. 가장 단순한 해결방법은 resolv.conf 파일에 몇몇 네임서버의 주소를 집어 넣은 것으로, SLIP 링크가 활성화되면 곧바로 이들 서버에 쿼리를 보낼 것이다. 네임서버가 당신이 dial in하는 지점과 가까운 곳에 있을 수록 좋다.

그러나, 이러한 해결책이 최적이진 않다. 왜냐하면 모든 네임 검색이 여전히 당신의 SLIP/PPP 링크를 통해 지나기 때문이다. 만약 이에 소비되는 bandwidth가 아깝다고 생각되면, 당신은 caching-only 네임서버를 셋업할 수 있다. 그것은 하나의 도메인을 실제로 제공하진 않지만, 당신의 호스트에서 만들어내는 모든 DNS 쿼리에 대한 릴레이처럼 동작한다. 이러한 구조의 잇점은, 캐쉬를 만듦으로써 대부분의 쿼리가 한번만 시리얼 라인을 통해 보내지는 것이다. caching-only 서버를 사용하도록 설정된 named.boot파일은 다음과 같다.

     ; named.boot file for caching-only server
     directory                            /var/named
     primary     0.0.127.in-addr.arpa   db.127.0.0 ; loopback net
     cache       .                      db.cache  ; root servers

named.boot 파일과 더불어, db.cache 파일에 적절한 root 네임서버를 넣어주어 셋업해야 한다. 이는 Resolver Configuraton 장의 마지막 부분에서 기술한 바 있다.


7.2 SLIP Operation

다이얼업 IP 서버들은 종종 특수한 계정을 통해 SLIP 서비스를 제공한다. 그와 같은 계정으로 로그인해 들어가면 커맨드 쉘로 들어가는 것이 아니라, 대신 시리얼 라인에 대한 서버의 SLIP 드라이버를 구동하고 고유의 네트웍 인터페이스를 설정하는 프로그램이나 쉘 스크립트가 실행된다. 그러면 당신쪽에서도 비슷한 일을 해 주어야 한다.

어떤 운영체제 상에선, SLIP 드라이버가 user-space 프로그램이다; 리눅스에서 그것은 커널의 일부이며, 이 경우가 더 빠른 속도를 낸다. 그러나 이에는 시리얼 라인이 SLIP 모드로 명백히 전환되어야할 필요가 있으며, 이는 특수한 tty 라인 규율(line discipline)인 SLIPDISC에 의해 이루어진다. tty가 보통의 라인 규율(DISC0)에 통제 받는 경우, 그것은 보통의 read(2)write(2)를 사용하여 오직 사용자 프로세스와 데이터를 교환할 것이고, 그러면 SLIP 드라이버는 tty에 읽고 쓰기를 할 수 없다. SLIPDISC 내에서 역할은 반전된다. 즉, 이제 user-space 프로세스는 tty에 읽고 쓰기가 차단되며 시리얼 포트로 들어오는 모든 데이터는 SLIP 드라이버에 직접 넘겨질 것이다.

SLIP 드라이버 자체는 SLIP 프로토콜의 다양한 변종을 이해한다. 보통의 SLIP과는 별개로, 그것은 CSLIP, 즉 송출되는 IP 패킷에 대해 Van Jacobson compression이라 불리는 것을 수행하는 것, 역시 이해한다. 이는 인터랙티브 세션의 처리량을 향상시켰고, 게다가 이들 프로토콜 각각에 대한 six-bit 버전도 존재한다.

시리얼 라인을 SLIP 모드로 전환하는 가장 단순한 방법은 slattach툴을 사용하는 것이다. 당신의 모뎀이 /dev/cua3에 달려있고, SLIP 서버에 성공적으로 로그인해 들어갔다면, 이렇게 실행하면 된다.

     # slattach /dev/cua3 &

이는 cua3의 라인 규율을 SLIPDISC로 전환하고, 그것을 SLIP 네트웍 인터페이스중 하나에 붙일 것이다. 만약 이것이 첫번째로 활성화되는 SLIP 링크라면, 라인은 sl0에 접합되고, 두번째는 sl1에 되는 식이다. 현재의 커늘을 8개 까지의 SLIP 링크를 동시에 지원한다.

slattach가 선택하는 디폴트 캡슐화(encapsulation) 방식은 CSLIP이다. 다른 모드를 원한다면 -p 스위치를 사용하면 된다. normal SLIP (압축화하지 않는)을 사용하려면 다음처럼 하라.

     # slattach -p slip /dev/cua3 &

그 외의 모드로는, cslip, slip6, cslip6(SLIP의 six-bit 버전을 위한 것), 그리고 adaptive SLIP을 위한 <adaptive가 있다. 마지막 것은 리모트 쪽이 사용하는 SLIP 캡슐화 방식이 어떤 것인지를 커널이 찾아내도록 한다.

상대쪽이 사용하는 것과 같은 캡슐화 방식을 사용해야 한다는 데 주의하자. 예를 들어, cowslip이 CSLIP을 사용한다면 당신도 그렇게 해야 한다. 서로 맞지않는 경우의 징후는 리모트 호스트에 ping 했을 때 되돌아 오는 어떠한 패킷도 수신하지 못하는 것이다. 만약 다른 호스트가 당신의 호스트에 ping한다면, 당신의 콘솔에서 "Can't build ICMP header"라는 메시지를 볼 수 있을 것이다. 이러한 난제를 피하는 방법은 adaptive SLIP을 사용하는 것이다.

사실상, slattach는 단지 SLIP 뿐 아니라 시리얼 라인을 사용하는 다른 프로토콜, 즉 PPP나 KISS(ham radio 사용자가 이용하는 또다른 프로토콜) 역시 사용가능하게 해 준다. 자세한 내용을 원한다면 slattach(8)매뉴얼 패이지를 참고하라.

시리얼 라인을 SLIP 드라이버에 인계하고 난 후, 당신은 네트웍 인터페이스를 설정해 주어야 한다. 또다시 우리는 ifconfigroute 커맨드를 사용하여 이렇게 한다. vlager에서 cowslip이라는 서버에 다이얼업했다고 가정하고 다음을 실행하면 된다.

     # ifconfig sl0 vlager pointopoint cowslip
     # route add cowslip
     # route add default gw cowslip 

첫번째 커맨드는 인터페이스를 cowslip으로의 point-to-point링크로 설정한다. 두번째와 세번째 커맨드는 cowslip으로의 루트를 추가하고 cowslip을 게이트웨이로 사용하는 기본 루트를 추가한다.

SLIP 링크를 해체할 때 , 당신은 가장먼저 routedel 옵션을 주고 사용하여 cowslip을 통하는 모든 루트를 제거하고, 인터페이스를 해체한뒤, slattach에 hangup 시그널을 보내주어야 한다.

     # route del default
     # route del cowslip
     # ifconfig sl0 down
     # kill -HUP 516


7.3 Using dip

이제, 그것이 얼마간 단순할 지라도, 위에서 본 모든 단계를 커맨드 하나로 처리할 수 있도록 하기위해 위 단계를 자동화 하길 원할 것이다. 이것이 dip이 존재하는 이유로, 이 글을 쓰고있는 현재의 버전은 3.3.7이다. 이것은 많은 사람들에 의해 하주 심해게 패치되었으므로, dip 프로그램에 대해 더이상 왈가왈부할 수 없을 것이다. 이러한 서로다른 개발의 노력은 미래의 버전에 반영될 것이다.

dip은 모뎀을 조정하고 라인을 SLIP모드로 변환하고 인터페이스를 설정하는 단순한 스크립트언어의 해석기(interpreter)를 제공하는데, 이것은 다소 원지적이고 제한적이나, 거의 모든 경우를 충족시킨다. dip의 새로운 릴리즈는 보다 폭넓은 용도의 언어를 언젠가 제공할 것이다.

SLIP 인터페이스를 설정할 수 있게 하기 위해선, dip은 root 권한을 필요로 한다. 그러면 모든사용자에게 root 억세스를 줄 필요없이 그들이 SLIP 서버에 다이얼업할 수 있도록 diproot로 setuid 해줘야 할 것 같은 기분이 들겠지만, 이는 매우 위험한 생각이다. 왜냐하면, dip으로 허위의 인터페이스와 기본로트를 설정하여 당신의 네트웍의 라우팅을 붕괴시킬수 있기 때문이다. 더 심한경우, 이는 사용자가 어떤 SLIP 서버에도 연결할 수 있는 권한을 주며 당신의 네트웍에 위험한 어택을 시작하게 만든다. 그러므로, 만약 사용자가 SLIP 연결을 할 수 있게 하려면, dip이 특정파일을 읽어 연결을 수립할 수 있게하는 작은 wrapper 프로그램을 예상되는 SLIP 서버마다 만들어 두면 된다. 그러면, 이러한 프로그램은 안전하게 root로 setuid될수 있는 것이다.

7.3.1 A sample Script

     # Sample dip script for dialing up cowslip
 
     # Set local and remote name and address
     get $local vlager
     get $remote cowslip

     port cua3	                	# choose a serial port
     speed 38400	                # set speed to max
     modem HAYES	                # set modem type
     reset 	                	# reset modem and tty
     flush  	               	        # flush out modem response

     # Prepare for dialing.
     send ATQ0V1E1X1\r
     wait OK 2
     if $errlvl != 0 goto error
     dial 0123456789
     if $errlvl != 0 goto error
     wait CONNECT 60
     if $errlvl != 0 goto error

     # Okay, we're connected now
     sleep 3
     send \r\n\r\n
     wait ogin: 10
     if $errlvl != 0 goto error
     send Cvlager\r
     wait ssword: 5
     if $errlvl != 0 goto error
     password      #better not leave your password in ascii (thanx noud)
     wait running 30
     if $errlvl != 0 goto error

     # to set up your remote and local IP
     get $remote remote
     print remote = $remote
     if $errlvl != 0 goto error
     wait to 3
     get $local remote
     print local = $local
     if $errlvl != 0 goto error

     # We have logged in, and the remote side is firing up CSLIP.
     print Connected to $remote with address $rmtip
     default		                  # Make this link our default route
     mode CSLIP			          # We go to CSLIP mode, too
     # fall through in case of error

     error:
     print CSLIP to $remote failed.
그림 7.1: 샘플 dip 스크립트

그림 7.1은 샘플 스크립트이다. 이는 dip에 스크립트 네임을 인자로 주어 cowslip에 연결하는데 사용된다.

     # dip cowslip.dip
     DIP: Dialup IP Protocol Driver version 3.3.7 (12/13/93)
     Written by Fred N. van Kempen, MicroWalt Corporation.

     connected to cowslip.moo.com with addr 193.174.7.129
     # 

cowslip에 연결하고 SLIP을 사용할 수 있도록 하고나면, dip은 터미널에서 분리되어 백그라운드로 동작한다. 그러면 당신은 SLIP 링크에서 일반적인 네트워킹 서비스를 사용할 수 있다. 연결을 철거하려면, -k 옵션을 주어 dip을 실행시켜라. 이는 /etc/dip.pid에 적힌 프로세스 id를 사용하여 dip프로세스에 hangup 시그널을 보낸다.

     # dip -k

dip의 스크립트 언어에서 달러($) 심볼이 앞에 붙은 키워드는 변수명을 나타낸다. dip은 선정된(predefined) 변수 세트를 지니며, 이는 아래에 나열되어 있다. 예를들러, $remote$local은 SLIP 링크에 수반되는 로컬과 리모트 호스트 네임을 지닌다.

샘플 스크립트내의 처음 두 선언문은 get 커맨드로, dip의 변수를 지정하는데 쓰인다. 여기선 로컬과 리모트 호스트네임이 vlagercowslip으로 각각 지정된다.

그 다음 다섯개의 선언문은 터미널 라인과 모뎀을 셋업한다. reset은 모뎀에 리셋 문자역을 보낸다; Hayes 호환 모뎀의 경우, 이는 ATZ 커맨드이다. 그 다음 선언문으로 모뎀의 response를 방출하게되고, 그리하여 다음 몇 라인내의 로그인 chat을 적절히 수행될 것이다. 이 chat은 꽤 직선적이다. 즉, 그것은 단순히 cowslip의 전화번호인 0123456789로 전화를 걸고, Cvlager 계정에 password라는 패스워드를 써서 로그인 해 들어간다. wait 커맨드는 첫번째 인자로 주어진 문자역을 dip이 기다리도록 만든다. 두번째 인자로 주어진 숫자는, 만약 그와 같은 문자열이 주어지지 않을 경우, 그 만큼의 초 동안 기다린뒤 타임아웃 하게 만드는 것이다. 로그인 프로시저내에 군데군데 있는 if 커맨드는 커맨드를 실행하는데 에러가 발생하지 않았는지를 체크한다.

로그인한 후에 실행되는 마지막 커맨드들은, SLIP 링크를 모든 호스트로의 기본 루트로 만드는 default와, 라인을 SLIP 모드로 바꾸고 인터페이스와 라우팅 테이블을 설정해 주는 mode이다.

7.3.2 A dip Reference

dip이 널리 사용됨에도 불구하고, 아직 문서화가 잘 되어 있지 않다. 그리하여 이 절에서는, dip의 커맨드 대부분을 설명하고자 한다. dip을 테스트 모드로 실행시키고 help 커맨드를 입력하면 모든 커맨드를 개관할 수 있다. 커맨드의 문법을 알고자 한다면, 그 커맨드를 인자 없이 입력하라. 물론 인자 없는 커맨드의 경우엔 되지 않을 것이다.

      DIP> help
      DIP knows about the following commands:

              databits default  dial     echo     flush
              get      goto     help     if       init
              mode     modem    parity   print    port
              reset    send     sleep    speed    stopbits
              term     wait

      DIP> echo
      Usage: echo on|off
      DIP>

이후로, DIP> 프롬프트가 표시되는 예제는 테트스 모드에서 어떻게 커맨드를 넣고 그것이 배출하는 아웃풋은 무언인지를 보여준다. 이 프롬프트가 없는 예제는 스크립트에서 발췌한 것으로 보면된다.

The Modem Commands

시리얼라인과 모뎀을 설정할 수 잇도록 dip이 제공하는 커맨드가 몇가지 있는데, 이들 중 몇개는 시리얼 포트를 선택하는 port와, 일반적인 라인 파라미터를 지정하는 speed, databits, stopbits 그리고 parity 같이 명료하다.

modem 커맨드는 모뎀 타입을 선택한다. 현재 지원되는 타입은 오직 HAYES (대문자로 사용해야 한다)뿐이다. 반드시 dip에 모뎀 타입을 지정해 주어야 한다. 그렇지 않으면 그것은 dialreset 커맨드의 실행을 거부할 것이다. reset 커맨드는 모뎀에 리셋문자열을 보낸다; 그 문자열은 선택한 모뎀 타입에 영향을 받으며, Hayes 호환 모뎀의 경우 그것은 ATZ이다.

flush 코드는 모든 모뎀의 response를 배출해 버리는데 사용되며, 그렇게 하지 않을 경우 reset 다음의 chat 스크립트가 혼돈될 수 있다. 왜냐하면 이전 커맨드의 OK response를 읽기 때문이다.

init 커맨드는 다이얼링하기 전에 모뎀에게 넘겨줄 초기화 문자열을 선택한다. Hayes 모뎀의 경우, 디폴트 값은 "ATE0 Q0 V1 X1"이며, 이는 커맨드와 긴 결과물을 가지는 코드의 echoing을 켜며, blind 다이얼링 (다이얼 톤에 대한 체크를 하지 않음)을 선택한다.

dial 커맨드는 최종적으로 초기화 문자열을 모뎀에 보내고 원격 시스템에 다이얼업한다. Hayes 모뎀의 기본적인 dial 커맨드는 ATD이다.

echo and term

echo 커맨드는 디버깅을 돕기위해 제공된다. echo on을 사용하면, dip은 시리얼 디바이스로 보내는 모든것을 콘솔에 뿌려준다. 이는 echo off로 다시 끌 수 있다.

dip은 스크립트 모드를 잠시 떠나 터미널 모드로 들어갈 수 있게 하는데, 이 모드에서 당신은 dip을 다른 어떤 보통 터미널 프로그램처럼 사용하여 시리얼 라인에 읽고 쓰기를 할 수 있다. 이 모드를 벗어나기 위해선 Ctrl-]를 입력하라.

The get Command

get 커맨드는 dip에서 변수를 지정하는 방법이다. 가장 단순한 형태는 위의 예제에 전반적으로 사용된바와 같이, 변수를 상수로 지정하는 것이다. 그러나 ask 키워드를 값대신에 지정함으로써 사용자가 입력하도록 프롬프트를 띄울수도 있다.

     DIP> get $local ask
     Enter the value for $local: 

세번째 방법은 리모트 호스트에서 그 값을 얻으려 시도하는 것이다. 기묘하게도 이것은 몇가지 경우에있어 유용하다. 어떤 SLIP 서버는 SLIP 링크상에서 당신의 소유인 IP 주소를 사용하지 못하게 하는 대신, 당신이 dial해 들어간 곳이 지닌 주소들 중 하나를 당신에게 할당하여, 그 주소에 관한 정보를 알려주는 어떤 데시지를 출력한다. 만약, 그 메시지가 "Your address: 193.174.7.202"와 같다면, 다음에 보이는 dip 코드의 일부는 당신이 그 주소를 얻을 수 있게끔한다.

     ... login chat ...
     wait address: 10
     get $locip remote

The print Command

이것은 dip을 실행시킨 콘솔로 텍스트를 출력하는 커맨드이다. 어떠한 dip의 변수는 print 커맨드내에 다음처럼 사용될 수 있다.

     DIP> print Using port $port at speed $speed
     Using port cua3 at speed 38400

Variable Names

dip은 오직 선(先)정의된 변수 세트만을 이해한다. 변수 명은 언제나 달러 심볼로 시작하여야 하고, 반드시 소문자로 쓰여져야 한다.

$local$locip 변수는 로컬 호스트네임과 IP 주소를 가진다. 호스트네임을 세팅해준 dip은 canonical 호스트네임을 $local에 저장하고, 그에 상응하는 IP 주소를 $locip에 할당한다.

$remote$rmtip 변수는 리모트 호스트의 네임과 주소에 대하여 같은 일을 한다. $mtu는 커넥션의 MTU 값을 가진다.

이 다섯개의 변수들만이 오직 직접적으로 get 커맨드를 사용하여 값을 지정할 수 있는 것이다. 다른 변수들은 그에 상응하는 커맨드를 통해 설정되나, print 구문에서 그것을 사용할 수는 있다. 이러한 것들은 $modem$port, $speed이다.

$errlvl을 통해, 당신은 마지막으로 실행한 커맨드의 결과에 접근할 수 있다. 에러 레벨 0은 성공을, 그 외의 값들은 에러를 가리킨다.

The if and goto Commands

of 커맨드는 흔히 말하는 if가 아니라, 조건부 분기점(conditional branch)이다. 그것의 문법은

     if var op number goto label

으로, 표션법은 $errlvl$locip, $rmtip 같은 변수들 중의 하나간의 단순한 비교여야 한다. 두번째 오퍼랜드(operand)는 정수여야만 한다. 그리고 연산자 op==,!=,<,>,<=,>=들 중 하나이어야 한다.

goto 커맨드는 스크립트의 실행이 라벨(label)을 가진 라인 다음에서부터 계속되게 만든다. 라벨은 라인의 첫번째 토큰(token)으로 나타나야하고, 바로뒤에 콜론이 붙어 있어야 한다.

send, wait and sleep

이들 커맨드는 dip내의 단순한 chat 스크립트의 수행을 도와준다. send는 주어진 인지를 시리얼 라인으로 배출한다. 그것은 변수를 지원하지 못하지만, \n과 \b같은 모든 C 스타일의 백슬래쉬 캐릭터 시퀀스는 이해한다. 틸드 캐릭터 (~ : tilde - 흔히 갈매기라 불리기도 한다. - 역자주)는 캐리지 리턴/뉴라인 캐릭터의 약어로 사용된다.

wait는 인자로 한 단어를 받아, 이 단어를 인식할 수 있을때까지 시리얼 라인상의 모든 input을 스캔한다. 이 단어에는 공백이 없어야 한다. 선택적으로, 두번째 인자로 wait에 timeout 값을 줄 수도 있다. 만약 기대하고 있는 단어가 그 만큼의 초(second)동안 수신되지 않는다면, 그 커맨드는 $errlvl에 1의 값을 주어 리턴할 것이다.

sleep 구문은 일정량의 시간동안, 가령 로그인 시퀀스가 완결될 때까지 참을성있게 기다려야하는 경우, 대기하도록 하는데 사용된다.

mode and default

이들 커맨드는 시리얼 라인을 SLIP모드로 돌리고 인터페이스를 설정하는데 사용된다.

mode 커맨드는 dip이 데몬 모드로 전환되기 전에 마지막으로 실행되는 커맨드이며, 에러가 발생하지 않는 한, 그 커맨드는 리턴하지 않는다.

mode는 인자로 프로토콜 네임을 받는다. dip은 현재 SLIPCSLIP을 적절한 이름으로 인식한다. 그러나 현재의 dip 버전은 adaptive SLIP을 이해하지 못한다.

시리얼 라인에 SLIP 모드를 켠 후, dip은 인터페이스를 point-to-point 링크로 설정하기위해 ifconfig을, 그리고 리모트 호스트로의 루트를 지정하기위해 route를 실행한다.

게다가, 스크립트가 mode 전에 default 커맨드를 실행한다면, dip은 SLIP 링크를 가리키는 기본 루트를 역시나 만들 것이다.


7.4 Running in Server Mode

SLIP 클라이언트를 셋업하는 것은 까다로운 부분이었다. 이번엔 반대로, 당신의 호스트를 SLIP 서버로 동작하게 해보자. 이것은 보다 쉬울 것이다.

이를 위한 한가지 방법은 dip을 서버모드로 사용하는 것이며, 그것을 diplogin이라고 실행시키는 것이다. 그것의 주 설정 파일은 /etc/diphosts이며, 이 파일은 로그인 네임을 이 호스트에 할당된 주소에 연결해 놓았다. 그 대신에, 당신은 sliplogin을 사용할 수도 있는데, 그것은 BSD에 기원을 둔 툴로써 보다 유연성있는 설정 체계를 제공하여 당신이 연결되어 있든지 아니든지 쉘 스크립트를 실행할 수 있게하는 것으로, 현재 Beta이다.

두 프로그램 모두 SLIP 클라이언트당 하나의 로그인 계정을 만들어 줄 것을 요구한다. 예를들어, 당신이 dent.beta.com의 Arthur Dent에게 SLIP 서비스를 제공한다고 가정하면, 당신은 passwd 파일에 다음과 같은 한 라인을 추가하여 dent라는 이름의 계정을 생성할 것이다.

     dent:*:501:60:Arthur Dent's SLIP account:/tmp:/usr/sbin/diplogin

이후, passwd 유틸리티를 사용해 dent의 패스워드를 지정한다.

이제, dent가 로그인할 때 dip은 서버로 구동될 것이다. 그가 정말로 SLIP을 사용하도록 허용되어있는지 찾아내고자, 그것은 /etc/diphosts에서 유저네임을 검색할 것이다. 이 파일은 접근권한과 커넥션 파라미터를 각 SLIP 유저별로 세부화 시켜 놓았다. dent의 샘플 엔트리는 이와 같을 것이다.

     dent::dent.beta.com:Arthur Dent:SLIP,296

콜론으로 나뉘어진 첫번째 필드는 사용자가 로그인할 때 쓰는 이름이다. 두번째 필드는 추가적인 패스워드(아래를 보라)를 포함할 수 있다. 세번째는 전화거는 호스트의 호스트네임 또는 IP 주소이다. 그 다음은 (아직까지는) 별다른 특별한 의미없는 정보필드이고, 마지막 필드에 커넥션 파라미터가 적혀있다. 이는 콤마(쉼표)로 구분되며, 프로토콜을 (현재는 SLIP이나 CSLIP 중의 하나) 정하고, 그 뒤에 MTU를 지정한다.

dent가 로그인할 때, diplogindiphosts파일에서 그에대한 정보를 분할하여, 두번째 필드가 비어있지 않다면 "external security password"에 대한 프롬프트를 띄운다. 사용자가 입력한 문자열은 diphosts의 (암호화되지 않은) 패스워드와 비교되고, 일치하지 않는다면 로그인 시도는 거부된다.

그렇지 않을 경우, diplogin은 시리얼 라인을 CSLIP 또는 SLIP 모드로 돌리고, 인터페이스와 루트를 셋업한다. 이 커넥션은, 유저가 연결을 끊거나 모뎀이 라인을 놓쳐버릴 때까지 성립된채로 남겨진다. 커넥션의 철회되면 diplogin은 라인을 보통의 라인규율로 되돌리고 종료한다.

diplogin은 슈퍼유저 권한을 요한다. 만약 diproot로 setuid되어 있지 않다면, diplogindip의 단순한 링크가 아닌 별개의 복사본으로 만들어 두어야 한다. 그러면 dip 자체의 상태에 영향을 주지 않고서도 diplogin을 안전하게 setuid할 수 있다. (dip이나 diplogin이 argv[0]에 대한 체크를 하지않으면 이러한 보안책은 무의미한 것이다. -역자주)

Other Chapters

1. Introduction to Networking
2. Issues of TCP/IP Networking
3. Configuring the Networking Hardware
4. Setting up the Serial Hardware
5. Configuring TCP/IP Networking
6. Name Service and Resolver Configuration
7. Serial Line IP
8. The Point-to-Point Protocol
9. Various Network Applications
10. The Network Information System
11. The Network File System
12. Managing Taylor UUCP
13. Electronic Mail
14. Getting smail Up and Running
15. Sendmail+IDA
16. Netnews
17. C News
18. A Description of NNTP
19. Newsreader Configuration

Appendix

A. A Null Printer Cable for PLIP
B. Sample smail Configuration Files
C. The GNU General Public License