ADSL 자동 재연결 설정

배철수 : bae@linuxlab.co.kr/ 리눅스월드 발행인

 

 

    한국통신의 adsl 라이트나 프로의 경우 보통 30분 정도 사용을 않으면 연결이 끊어진다. 리눅스로 연결할 경우도 마찬가지다. 그래서 연결이 끊기지 않도록 일정 시간 간격으로 ping을 쏘는 방법도 있으나 이 방법은 회선이나 한국통신측의 사정으로 끊기는 경우에는 효과가 없다. 즉 이 경우는 다시 수동으로 연결 명령을 주어야 한다.

    아래에 소개하는 방법은 pppoed-0.47/contribs 디렉토리에 있는 keepalive.ppp 스크립트를 이용해서 일정 시간 간격으로 ppp 연결 여부를 체크해 연결이 끊기면 pppoed 연결 명령을 다시 실행하는 것이다. 따라서 선로 사정이나 한국통신측의 사정으로 끊긴 경우에도 장애의 원인이 제거되면 ADSL 연결이 다시 이루어 지므로 ping을 쏘는 것보다 유리하다.

    이 자동 재연결 방법은 한국통신에서는 별로 좋아하지 않을 것 같다. 사용하지도 않는데 ADSL 포트 하나를 계속 점유하기 때문이다. 따라서 꼭 필요한 경우에만 제한적으로 사용하길 권한다.

 

1. 사전 절차

    리눅스에 ADSL을 연결해 여러 대의 피시에서 내부 주소로 인터넷을 사용하는 방법은 리눅스월드 2000년 6월호에 이미 소개했으므로 여기서 설명하지 않는다. 그리고 아래 설명은 ADSL 모뎀이 eth1에 연결되어 있고 내부 랜은 eth0에 연결된 경우이다. 배포본은 데비안을 기준으로 한다.(버전은 무관함.)

 

2. 연결 명령

    데비안의 경우 부팅 시에 자동 실행되는 사용자 스크립트는 /etc/rc.boot 디렉토리에 넣는다. 그러면 ls 명령에 나타나는 순서대로 부팅시 실행된다. 레드햇의 rc.local 파일과 유사하지만 더 편하다. 그 디렉토리에 원하는 작업 내용을 담은 스크립트를 넣고 이름을 내용에 맞게 짓는다. 실행 순서를 지정하려면 이름 맨 앞에 숫자를 넣으면 된다.

    아래는 필자가 이 글을 쓰는데 참고 한 사이트의 /etc/rc.boot 디렉토리 예이다.

      -rwxr-xr-x  1 root  root  10122 Sep 9 1998  0setserial
      -rwxr-xr-x  1 root  root  53 Oct 25 01:51     1ip_forward
      -rwxr-xr-x  1 root  root  95 Oct 25 01:52     2ipchain
      -rwxr-xr-x  1 root  root  51 Oct 25 19:00     3adsl
      -rwxr-xr-x  1 root  root  62 Oct 27 20:17     4del-log
      -rwxr-xr-x  1 root  root  33 Oct 26 18:41     5chk-adsl

    위에서 0setserial 은 시리얼 포트 셋업, 1ip_forward 은 ip forwarding 지정, 2ipchain은 ip masquerade 설정이다. 3adsl이 바로 adsl 연결 명령이다. 내용은 아래와 같다.

      #!/bin/bash
      /usr/local/sbin/pppoed -I eth1
      sleep 6

    위에서 -I eth1 은 ADSL 모뎀이 두 번째 랜카드에 연결되어 있기 때문이다. 다음에 sleep 6를 넣은 이유는 ADSL 이 연결이 이루어 지는데 3 ~ 5 초의 시간이 걸리기 때문에 그 시간 내에 다른 스크립트나 명령이 실행돼 ADSL 연결을 방해하지 않도록 하기 위함이다.

    연결이 이루어지면 아래처럼 라우팅 테이블이 만들어 진다.

    linuxlab:/etc/rc.boot# 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    eth0
    192.168.2.1      0.0.0.0     255.255.255.255    UH      0         0          0    eth1
    211.196.60.9    0.0.0.0     255.255.255.255    UH       0        0           0    ppp0
    127.0.0.1         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    eth1
    192.168.1.0      0.0.0.0     255.255.255.0         U       0         0          0    eth0
    0.0.0.0        211.196.60.9      0.0.0.0             UG       0        0           0   ppp0

  

3. 끊김 확인 및 재연결

    끊김 확인 및 재연결은 아래의 keepalive.ppp 스크립트가 담당한다. 이 파일을 /etc 디렉토리에 넣고 /etc/rc.boot 디렉토리에 5chk-adsl 스크립트로 이 스크립트를 연결한다. 위 두 파일은 모드가 755 여야 한다. (/etc/rc.boot 디렉토리의 모든 스크립트는 실행 모드여야 한다.)

 

3.1  /etc/rc.boot/5chk-adsl

    #!/bin/bash
    /etc/keepalive.ppp &

    * 백그라운드로 실행해야 한다.(&)

 

3.2  /etc/keepalive.ppp

    #!/bin/bash
    # 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"
    sleep 5
    while [ 1 ]
    do
          if `ifconfig | grep -q ^ppp0`
          then
                        $LOG "PPP connection ok"
          else
                        $LOG "Starting pppoed"
                        pppoed -I eth1
          fi
          sleep 120
    done
    #Matthew Darwin                             Westend Family Cinema
    #Community Volunteer                     The home of great family movies!
    #matthew@davin.ottawa.on.ca          webmaster@familycinema.org
    #http://www.davin.ottawa.on.ca/~matthew/
                                                          http://www.familycinema.org

    * 스크립트의 작성자는 Matthew Darwin 씨이다. pppoed-0.47/contribs 디렉토리에 들어
       있다. 원 내용 중 몇 가지를 수정했다.(아래 수정은 각자의 구성에 맞게 해야 한다. 단 1)은
       꼭 필요하다.)

    1) PATH= .... /usr/local/sbin 을 추가함 : pppoed를 컴파일하면 /usr/local/sbin 디렉토리에
        pppoed가 생성되므로 이 디렉토리가 PATH에 들어가야 한다.

    2) pppoed -I eth1 : 원 스크립트에는 pppoed 만 있다. ADSL 모뎀이 eth0에 연결된 경우는
        수정이 필요 없다. 필자의 예는 eth1에 연결돼 있으므로 -I eth1을 추가했다...

    3) sleep 120: 이 값은 사용자가 적당히 지정할 것.(초 단위) 위의 경우는 120초에 한번씩
        ppp 연결 여부를 체크하도록 하고 있다. 너무 자주 하면 시스템에 부하가 많이 걸린다.

    * 처음의 sleep 5는 adsl 연결 명령(3adsl) 이 실행되고 바로 체크가 이루어지면 adsl 연결
      과정이 진행 중인데도 adsl 연결이 끊긴 것으로 오해해 다시 연결 명령을 주는 것을 방지하기
      위함이다.

    * 위의 스크립트는 ifconfig 명령을 사용해 ppp0가 나타나는지를 검사하는 방법이다.
       즉 ADSL이 연결되어 있다면 아래처럼 나올 것이다.

    linuxlab:~# 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:48:54:82:67:B0
             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:161151 errors:0 dropped:0 overruns:0 frame:0
             TX packets:188079 errors:0 dropped:0 overruns:0 carrier:0
             Collisions:804
             Interrupt:10 Base address:0x6100

    eth1   Link encap:Ethernet HWaddr 00:C0:26:59:4F:CD
             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:237083 errors:0 dropped:0 overruns:0 frame:0
             TX packets:191536 errors:0 dropped:0 overruns:0 carrier:0
             Collisions:2441
             Interrupt:11 Base address:0x6200

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

    ADSL 연결이 끊기면 위의 ppp0 이하가 사라진다. 그러면 keepalive.ppp 는

      $LOG "Starting pppoed"
      pppoed -I eth1

    이 부분을 실행해서 다시 ADSL을 연결하고 120초를 기다릴 것이다.

    그런데 만약 리눅스에 ADSL 외의 다른 PPP 연결이 있다면 (다이얼업 ppp) 이 경우는 ppp0가 ADSL 연결이라는 보장이 없다. 따라서 이 때는 위의 keepalive.ppp 스크립트는 사용할 수가 없다.

    이상과 같이 설정 후 리부팅해서 adsl이 연결되었을 때 ps ax 명령을 주면 아래처럼 나온다.(관계없는 부분은 생략했음.)

      115 ? S 0:30 sh /etc/keepalive.ppp
      125 ? S 0:42 /sbin/syslogd
      22197 ? S 0:00 pppoed -I eth1
      22199 ? S 0:02 pppd /dev/pppox0 38400
      23462 ? S 0:00 sleep 120

 

4. 로그 파일 생성

    이 부분은 필수적인 부분은 아니나 필요한 경우가 있다. 위의 스크립트에서 로그파일을 생성하는 부분이 있다. 즉 "$LOG ... " 부분이다. 로그 파일이 기록되려면 /etc/syslog.conf 파일에 daemon.notice 부분이 지정 되야 하는데 데비안에는 지정이 안되어서 /etc/syslog.conf 에 아래 줄을 추가했다.

      daemon.notice /var/log/adsl.log

    이렇게 지정하면 아래처럼 로그 파일이 기록되므로 adsl.log 파일을 보면 keepalive.ppp 스크립트가 정상으로 작동하는지를 확인할 수 있다.(물론 ps ax 명령도 가능하다.)

    로그파일 내용 (var/log/adsl.log)

    -------------------
    Oct 31 17:16:10 linuxlab keepalive.ppp[115]: PPP connection ok
    Oct 31 17:17:50 linuxlab pppd[17600]: Connection terminated.
    Oct 31 17:18:10 linuxlab keepalive.ppp[115]: Starting pppoed
    Oct 31 17:18:10 linuxlab pppd[17709]: pppd 2.3.11 started by root, uid 0
    Oct 31 17:18:10 linuxlab pppd[17709]: Connect: ppp0 <--> /dev/pppox0
    Oct 31 17:18:11 linuxlab pppd[17709]: local IP address 211.104.24.127
    Oct 31 17:18:11 linuxlab pppd[17709]: remote IP address 211.196.60.9
    Oct 31 17:20:10 linuxlab keepalive.ppp[115]: PPP connection ok
    -------------------

 

5. 로그 파일 지움/다시 만들기

    위의 로그 파일이 너무 커지는 것을 막기 위해 시스템이 리부팅 되면 로그 파일을 지우도록 한다.

    /etc/rc.boot 디렉토리에 4del-log 파일을 넣고 아래처럼 지정한다.

    (혹시, 한 1년 정도 피시를 전혀 리부팅 않으면 로그 파일이 너무 커져 하드를 다 차지할지도 모르니 월 1회 정도는 리부팅해 줄 것. 아니면 cron으로 한 달에 한 번 이 로그 파일을 지우게 만드는 방법을 쓸 것.)

      #!/bin/bash
      /bin/rm /var/log/adsl.log
      touch /var/log/adsl.log




▲ top

home으로...