# การเชื่อมต่อแบบ PPP

### การเซ็ตอัพให้ลีนุกซ์เชื่อมต่อเครือข่ายอินเทอร์เนตแบบ PPP

ในการเชื่อมต่อคอมพิวเตอร์เข้ากับเครือข่ายของอินเทอร์เนตนั้น ทาง ISP จะทำการกำหนด IP Numbers หรือหมายเลขประจำตัวของ IP ให้กับเครื่องที่ขอทำการเชื่อมต่อนั้น ในกรณี ที่เป็นการขอเชื่อมต่อแบบ real PPP ซึ่งจะแตกต่างจาก slirp ที่เป็นลักษณะของการ จำลอง slip เท่านั้น นั่นหมายความว่าหากทำการเชื่อมต่อเข้ากับอินเทอร์เนตแล้ว ผู้ใช้จากที่อื่นๆในอินเทอร์เนตจะสามารถเข้าใช้บริการเครื่องของคุณได้ ตัวอย่างเช่น ผู้ใช้คนอื่นๆในอินเทอร์เนตอาจจะทำการบราวซ์ดูเอกสาร HTML ของคุณได้ในกรณี ที่เครื่องของคุณสามารถให้บริการแบบ HTML server ได้

การกำหนดหมายเลข IP ให้กับคอมพิวเตอร์นั้นจะแบ่งออกเป็นสองแบบคือ static ip กับ dynamic ip สำหรับ static ip นั้นหมายถึงเลข IP ที่ได้จาก ISP จะเป็นเลข IP เลขเดิมตลอด ในขณะที่ dynamic ip จะมีการเปลี่ยนค่าเลข IP ที่กำหนดให้กับเครื่องที่ ติดต่อเข้าไปหาทุกครั้ง นั่นคือในการเชื่อมต่อแบบ dynamic ip นั้นจะได้ตัวเลขที่ไม่ เหมือนกันทุกครั้ง โดยทั่วไปแล้ว ISP ส่วนใหญ่จะกำหนดการเชื่อมต่อแบบ dynamic ip ให้กับลูกค้าทั่วๆไป (เท่าที่ทดลองติดต่อ real ppp กับ อินเทอร์เนตไทยแลนด์และ สามารถไซเบอร์เนตจะเป็นลักษณะของ dynamic)

โดยปกติแล้วเราสามารถใช้โปรแกรม dip เพื่อเข้าขอทำการเชื่อมต่อกับทาง ISP ใน แบบ slip แต่สำหรับการเชื่อมต่อกับ ISP โดยวิธีแบบ ppp แล้ว มักจะนิยมใช้โปรแกรม ที่เกี่ยวข้องกับ ppp บนลีนุกซ์ซึ่งก็คือ chat และ pppd

สำหรับการเชื่อมต่อแบบ ppp นั้นเราสามารถกำหนดให้เครื่องลีนุกซ์รับการติดต่อเข้ามา เป็นแบบ ppp ซึ่งจะเรียกว่า ppp server หรือทำการติดต่อไปหายัง ISP เพื่อขอรับ บริการ ppp ซึ่งจะเรียกว่า ppp client ก็ได้ หรือแม้แต่จะทำการกำหนดให้เครื่อง ลีนุกซ์ทำงานพร้อมกันทั้งสองแบบก็ย่อมได้ สำหรับเอกสารฉบับนี้จะอธิบายเฉพาะวิธีการ กำหนดให้ลีนุกซ์ทำหน้าที่แบบ ppp client

ในการจะใช้งาน ppp คุณจะต้องทำการคอมไพล์เคอร์เนลของคุณให้สามารถใช้งาน ppp ได้เสียก่อน ให้คุณเลือก option ที่เกี่ยวข้องกับ protocol ppp ที่เกี่ยวข้อง กับการ config kernel แล้วทำการคอมไพล์ใหม่ อย่างไรก็ดีเคอร์เนลที่คุณได้รับ มาจากดิสตริบิวเตอร์ส่วนใหญ่ก็ติดตั้งเคอร์เนลที่ใช้งาน ppp ได้ มาให้อยู่แล้ว

สิ่งที่คุณจะต้องทราบก่อนการปรับแต่งให้เครื่องลีนุกซ์ของคุณใช้ ppp

- หมายเลขโทรศัพท์ของ ISP
- ISP ให้การเชื่อมต่อแบบ static ip หรือ dynamic ip
- ใช้ PAP/CHAP หรือไม่ สำหรับ PAP/CHAP จะเป็นการตรวจสอบการมีสิทธิ์เข้า ใช้งาน HOST ของ ISP แต่จะมีการตรวจสอบว่าชื่อเครื่อง (machine name) ที่มี สิทธิ์ได้ใช้งานแทนที่จะเป็น ชื่อของผู้ใช้งาน (user name) แต่โดยทั่วไปแล้ว ISP จะเปิดให้ใช้การติดต่อแบบปกติคือตรวจสอบชื่อผู้ใช้งาน (ไม่ได้ใช้ PAP/CHAP)
- DNS ของ ISP คุณคืออะไร

ไฟล์ที่เกี่ยวข้องกับการเชื่อมต่อ ppp มีดังต่อไปนี้ หากคุณไม่พบสคริปต์ทั้งสองข้างล่างนี้ คุณจำเป็นจะต้องเขียนขึ้นมาใหม่ ซึ่งก็จะมีตัวอย่างไว้ให้แล้ว และอย่าลืมเปลี่ยน mode ของไฟล์ให้เป็น execute mode ด้วยคำสั่ง chmod +x [ชื่อสคริปต์]
เนื่องจากการใช้งานหลายๆอย่างต้องอาศัย root priveledge ดังนั้นก่อนการ แก้ไขหรือใช้งาน pppd ขอให้คุณเข้าทำการล็อกอินเป็น super user (root) เสียก่อน

- /usr/sbin/pppd ซอฟท์แวร์สำหรับการเชื่อมต่อแบบ ppp
- /usr/sbin/ppp-on สคริปต์สำหรับเริ่มการเชื่อมต่อ (จะไปเรียก pppd)
- /usr/sbin/ppp-off สคริปต์สำหรับตัดการเชื่อมต่อ
- /etc/ppp/options เป็นไฟล์ option ที่ pppd จะทำการอ่านเมื่อเริ่มต้นทำงาน

ตัวอย่างของ /etc/ppp/options

    # /etc/ppp/options (NO PAP/CHAP)
    #
    # Prevent pppd from forking into the background
    -detach
    # If you are using a STATIC IP number, edit the 0.0.0.0 part of the
    # following line to your static IP number.
    0.0.0.0:
    #
    # use the modem control lines
    modem
    # use uucp style locks to ensure exclusive access to the serial device
    lock
    # use hardware flow control
    crtscts
    # create a default route for this connection in the routing table
    defaultroute
    # do NOT set up any "escaped" control sequences
    asyncmap 0
    # use a maximum transmission packet size of 552 bytes
    mtu 552
    # use a maximum receive packet size of 552 bytes
    mru 552
    #
    #-------END OF SAMPLE /etc/ppp/options (no PAP/CHAP)

### การเรียกใช้ ppp โดยการลงมือทำเอง (manual)

ให้ทำการหมุนโทรศัพท์เข้าไปที่ ISP หรือ Host ที่อนุญาต ให้เชื่อมต่อไปยัง อินเทอร์เนต ด้วยการใช้ minicom ก่อนโดยทำการเรียก minicom ที่คอมมานด์ไลน์ วิธีการใช้ minicom จะคล้ายกับการใช้ telix ให้กด Ctrl-A-Z เพื่อแสดงคำสั่ง ของ minicom ทั้งหมดขึ้นมา

เมื่อเชื่อมต่อได้แล้วให้กด Ctrl-A-Q เพื่อออกจาก minicom ซึ่ง minicom ก็จะถามว่าต้องการออกแบบไม่ reset modem ใช่หรือไม่ ให้ตอบ "OK" ไป เพื่อยืนยันว่าไม่ต้องการ reset modem เนื่องจากเราจะให้ ppp ใช้การเชื่อมต่อนี้

จากนั้นจึงสั่ง /usr/sbin/pppd -d -detach /dev/ttyS0 (ttyS0 สำหรับ com1 แต่ถ้าเป็น com2 จะเป็น /dev/ttyS1) pppd จะทำการเชื่อมต่อแบบ ppp ให้

ให้ใช้ ifconfig ตรวจดู การเชื่อมต่อแบบ ppp --> ppp0 หากสามารถทำการติดต่อ ได้สำเร็จจะเห็นผลลัพธ์ดังต่อไปนี้

      ppp0     Link encap:Point-Point Protocol
               inet addr:10.144.153.104  P-t-P:10.144.153.51 Mask:255.255.255.0
               UP POINTOPOINT RUNNING  MTU:552  Metric:1
               RX packets:0 errors:0 dropped:0 overruns:0
               TX packets:0 errors:0 dropped:0 overruns:0

ลองใช้งานโปรแกรมที่เกี่ยวข้องกับอินเทอร์เนตดู เช่น บราวเซอร์, ftp, telnet, ping เป็นต้น หากต้องการจะตัดการติดต่อให้ใช้คำสั่ง ps เพื่อแสดง PID (Process id) แล้ว kill PID ของโปรแกรม pppd ทิ้ง

    # ps -ax | grep pppd
     1228  p0 S    0:00 grep pppd
     1139  p1 S    0:00 pppd
    # kill -9 1139

จะเห็นว่าหมายเลข PID ของโปรแกรม pppd ก็คือ 1139 (ไม่ใช่ 1228 เพราะเกิดจากคำสั่ง grep) ให้ทำการ kill โปรแกรม pppd ตามตัวอย่าง

### การเชื่อมต่อแบบอัตโนมัติ (Automatic)

จะต้องทำการแก้ไขสคริปต์ /etc/ppp/ppp-on ดังต่อไปนี้

    #!/bin/sh
    #
    # Script to initiate a PPP connection. This is the first part of the
    # pair of scripts. This is not a secure pair of scripts as the codes
    # are visible with the 'ps' command.  However, it is simple.
    #
    # These are the parameters. Change as needed.
    TELEPHONE=0,,1601       # The telephone number for the connection
    ACCOUNT=username        # The account name for logon (as in 'username')
    PASSWORD=passwd         # The password for this account (and 'passwd')
    LOCAL_IP=0.0.0.0        # Local IP address if known. Dynamic = 0.0.0.0
    REMOTE_IP=0.0.0.0       # Remote IP address if desired. Normally 0.0.0.0
    NETMASK=255.255.255.0   # The proper netmask if needed
    #
    # Export them so that they will be available to 'ppp-on-dialer'
    export TELEPHONE ACCOUNT PASSWORD
    #
    # This is the location of the script which dials the phone and logs
    # in.  Please use the absolute file name as the $PATH variable is not
    # used on the connect option.  (To do so on a 'root' account would be
    # a security hole so don't ask.)
    #
    DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
    #
    # Initiate the connection
    #
    #

    /bin/setserial /dev/cua1 spd_vhi

    exec /usr/sbin/pppd debug /dev/ttyS1 115200  \
            $LOCAL_IP:$REMOTE_IP \
            connect $DIALER_SCRIPT &

    echo $! > /var/run/ppp-on.pid

ในการใช้งานสคริปต์ข้างต้นคุณจะต้องทำการแก้ไขข้อมูลต่อไปนี้เสียก่อน

- จะต้องแก้หมายเลขโทรศัพท์
- จะต้องแก้ชื่อผู้ใช้ที่จะขอล็อกอินเข้าไปใช้งานที่ ISP HOST
- จะต้องแก้รหัสผ่านที่จะใช้ล็อกอิน
- ถ้าเป็น static ให้ใส่หมายเลข IP ที่ได้รับมาจาก ISP ที่ LOCAL IP ADDRESS แต่ถ้าเป็น dynamic ให้ใส่ 0.0.0.0:ที่ LOCAL IP ADDRESS

สำหรับสคริปต์ที่ทำการติดต่อกับ ISP HOST เพื่อส่งชื่อผู้ใช้และรหัสผ่านนั้นจะอยู่ ใน /etc/ppp/ppp-on-dialer

    #!/bin/sh
    #
    # This is part 2 of the ppp-on script. It will perform the connection
    # protocol for the desired connection.
    #
    /usr/sbin/chat -v                               \
    'ABORT' 'BUSY' 					\
    'ABORT' 'ERROR' 				\
    'ABORT' 'NO CARRIER' 			        \
    'ABORT' 'NO DIALTONE' 			        \
    'ABORT' 'Invalid Login' 			\
    'ABORT' 'Login incorrect' 			\
    '' 'ATZ' 					\
    'OK' ATDT$TELEPHONE 				\
    'CONNECT' '' 					\
    'ogin:--ogin:' $ACCOUNT  			\
    'ord:' $PASSWORD 				\
    '>' 'ppp'

สคริปต์ ppp-on-dialer จะทำการติดต่อส่งชื่อผู้ใช้ รหัสผ่าน และเรียกโปรแกรม ppp ที่ฝั่งของ ISP Host แบบอัตโนมัติโดยที่เราไม่ต้องทำการพิมพ์เหมือนตอนต่อแบบ manual เลย

ให้แก้สคริปต์ที่สำหรับดักหรือรอรับ ข้อมูลที่ ISP HOST ส่งมาให้ สำหรับในตัวอย่างนี้ เมื่อโมเด็มสามารถติดต่อกับฝั่ง ISP ได้แล้ว ส่วน terminal ของ ISP จะแสดงข้อความ ดังต่อไปนี้

    Login: username			<--- Login section
    Password: passwd		<--- Password section

    ISP> ppp			<--- System prompt

หาก HOST หรือ terminal ของ ISP ของคุณมีรูปแบบที่แตกต่างออกไปก็ให้แก้ไข สคริปต์ที่ดักรอตามลำดับข้างต้น เช่น ส่วนใส่ชื่อทะเบียนผู้ใช้ อาจแสดงเป็น

    Username :

ก็จะต้องแก้ส่วนล็อกอินพร้อมพต์เป็น

    'ername:--ername:' $ACCOUNT  			\

ส่วนที่ต้องพิจารณาที่จะทำการแก้ไขอื่นๆมีดังต่อไปนี้

- ล็อกอินพร้อมพต์( 'ogin:--ogin:') --> ใส่ชื่อทะเบียนผู้ใช้
- พาสเวอร์ดพร้อมพต์ ('ord:') --> ใส่รหัสผ่าน
- พร้อมพต์ของระบบ ('>') --> เรียกโปรแกรม ppp ที่ฝั่งเซอร์ฟเวอร์ทำงาน (ppp)

การตัดการเชื่อมต่อแบบ automatic จะต้องใช้สคริปต์ ppp-off สำหรับตัวอย่างสคริปต์ ppp-off มีดังต่อไปนี้

    #!/bin/sh
    PATH=/sbin:/usr/sbin:/bin:/usr/bin

    if [ -f /var/run/ppp-on.pid ] ; then
      daemonpid=`cat /var/run/ppp-on.pid`
      if [ -n "$daemonpid" ] ; then
        kill $daemonpid > /dev/null 2>&1
      fi
      rm /var/run/ppp-on.pid
    fi

pppd จะทำการบันทึก log file ไว้ที่ /var/log/messages ให้ลองตรวจสอบ ข้อมูลจากที่ไฟล์นี้โดยใช้คำสั่ง

    # tail -f /var/log/messages

จากตัวอย่างให้สังเกตุการดักรอส่วนตรวจสอบชื่อทะเบียนผู้ใช้, รหัสผ่าน และ พร้อมพต์ของระบบ

    Jul 10 16:08:04 daffy chat[1396]: Login: -- got it
    Jul 10 16:08:04 daffy chat[1396]: send (username^M)
    Jul 10 16:08:04 daffy chat[1396]: expect (ord:)
    Jul 10 16:08:04 daffy chat[1396]:  username^M
    Jul 10 16:08:04 daffy chat[1396]: Password: -- got it
    Jul 10 16:08:04 daffy chat[1396]: send (passwd^M)
    Jul 10 16:08:05 daffy chat[1396]: expect (>)
    Jul 10 16:08:05 daffy chat[1396]:  ^M
    Jul 10 16:08:05 daffy chat[1396]: PYT_ITS> -- got it
    Jul 10 16:08:05 daffy chat[1396]: send (ppp^M)
    Jul 10 16:08:05 daffy pppd[1390]: Serial connection established.
    Jul 10 16:08:06 daffy pppd[1390]: Using interface ppp0
    Jul 10 16:08:06 daffy pppd[1390]: Connect: ppp0 <--> /dev/ttyS1
    Jul 10 16:08:07 daffy pppd[1390]: local  IP address 203.151.5.109
    Jul 10 16:08:07 daffy pppd[1390]: remote IP address 203.151.5.2
    Jul 10 16:08:33 daffy kernel: Appletalk 0.17 for Linux NET3.035

HTML developed by Kaiwal Development Team (kaiwal@geocities.com)