This is G o o g l e's cache of http://debianclub.com/node/85 as retrieved on 8 Feb 2007 00:23:51 GMT.
G o o g l e's cache is the snapshot that we took of the page as we crawled the web.
The page may have changed since that time. Click here for the current page without highlighting.
This cached page may reference images which are no longer available. Click here for the cached text only.
To link to or bookmark this page, use the following url: http://www.google.com/search?hl=en&q=cache%3Ahttp%3A%2F%2Fdebianclub.com%2Fnode%2F85&btnG=Search


Google is neither affiliated with the authors of this page nor responsible for its content.

User login

Links

debianclub.com
debian.org
ubuntuclub.com
blognone.com

Syndicate

Syndicate content

สร้างสคริปต์ DDNS สำหรับเราเตอร์ ให้ zoneedit

กรณี เราเตอร์จะต่างจากกรณีโมเด็ม คือเราไม่สามารถทราบได้ว่าสายจะหลุดเมื่อใด ดังนั้นเราจึงต้องอาศัยการเช็คไอพีเป็นระยะ โดยอาศัยการทำงานของ crontab
การทำงานในขั้นตอนนี้ของแพกเกจสำเร็จรูปทั่วไป จะใช้การตรวจสอบไอพีไปที่ zoneedit เป็นระยะ เช่นทุก ๆ 5 นาที เป็นต้น แต่เนื่องจากเราเขียนสคริปต์เอาเอง เราจึงสามารถประหยัดแบนด์วิธ (แม้เพียงน้อยนิด) ได้ โดยแทนที่จะไปตรวจไอพีเอาจาก zoneedit เราก็ตรวจเอาจากเราเตอร์ของเราแทน

 Internet  ->  Router  ->  Server:eth1
            192.168.5.1    192.168.5.3
                                |
                                v
                           Server:eth0  -> Internal Network
                           192.168.1.1      192.168.1.0/24

สมมุติว่า

  • ไอพีเราเตอร์ เป็น 192.168.5.1
  • ชื่อผู้ใช้เราเตอร์ชื่อ ADMIN รหัสผ่านเป็น ADMIN-PASSWORD
  • ไอพีของการ์ดแลน eth1 บนเซิร์ฟเวอร์ เป็น 192.168.5.3
  • ไอพีของการ์ดแลน eth0 บนเซิร์ฟเวอร์ เป็น 192.168.1.1

เราสามารถดูไอพีของเราเตอร์ที่เป็นสายนอกได้จากคำสั่ง wget
ตัวอย่างของผมใช้คำสั่ง
# wget -o /dev/null -O - --http-user="ADMIN" --http-passwd="ADMIN-PASSWORD" "http://192.168.5.1/wancfg.cmd?action=view"
จะได้ผลลัพธ์ออกมาเต็มไปหมด แต่ในนั้นจะมีหมายเลขไอพีเราอยู่ด้วย

ต่อไปเราจะกรองข้อมูลที่เราไม่ต้องการทิ้ง ให้เหลือแต่เลขไอพี
ตอนนี้เราใฃ้เทคนิกคือ แม้ว่าไอพีเราจะเปลี่ยนทุกครั้งที่ต่อสายใหม่ แต่ตัวที่ไม่เปลี่ยนคือตัวเลขสองหลักหน้า ดังนั้นเราจะเอาตัวเลขสองหลักหน้ามาเป็นตัวกรอง
เช่นของผมเป็น 58.9.XXX.XXX เราจะเพิ่มการกรองด้วยคำสั่ง grep 58.9
# wget -o /dev/null -O - --http-user="ADMIN" --http-passwd="ADMIN-PASSWORD" "http://192.168.5.1/wancfg.cmd?action=view" | grep 58.9
ได้ผลลัพธ์เป็น

      <td>58.9.XXX.XXX</td>

เพิ่มการกรองอีกชั้นนึงให้ตัดแท็ก html:td ทิ้ง คำสั่งกลายเป็น
# wget -o /dev/null -O - --http-user="ADMIN" --http-passwd="ADMIN-PASSWORD" "http://192.168.5.1/wancfg.cmd?action=view" | grep 58.9 | cut -d ">" -f 2 | cut -d "<" -f 1
ได้แล้ว

58.9.XXX.XXX

ถึงตอนนี้เพื่อให้ใช้งานสะดวก และเป็นการปกปิดชื่อและรหัสผ่าน เราจะทำเป็นสคริปต์ เก็บไว้ที่ /usr/sbin ผมตั้งชื่อว่า d.router-getip
# vi /usr/sbin/d.router-getip

#!#!/bin/bash
CMD="http://192.168.5.1/wancfg.cmd?action=view"
USER="ADMIN"
PASSWORD="ADMIN-PASSWORD"
FIRSTTWODIGIT="58.9"
IP_ADDR=`wget -o /dev/null -O - --http-user=$USER --http-passwd=$PASSWORD $CMD | grep $FIRSTTWODIGIT | cut -d ">" -f 2 | cut -d "<" -f 1` >> /dev/null
echo $IP_ADDR

# chmod 0700 /usr/sbin/d.router-getip
เวลาเรียกใช้ก็สั่ง d.router-getip ก็จะได้ไอพีของ WAN ออกมา

ต่อไปเราจะสร้างสคริปต์ให้มีการตรวจสอบว่าไอพีตรงกับค่าปัจจุบันหรือไม่
ถ้าตรงก็ไม่ทำอะไร แต่ถ้าไม่ตรงก็จะให้ไปเรียกสคริปต์ให้ไปอัปเดต DDNS และเก็บค่าไอพีใหม่ ผมตั้งชื่อไฟล์ว่า d.router-cron-checkip ซึ่งผมเก็บไว้ที่ /usr/local/bin
# vi /usr/local/bin/d.router-cron-checkip

#!/bin/bash
OLD_IP=`cat /root/router-ip`
CUR_IP=`/usr/sbin/d.router-getip`
if [ $OLD_IP != $CUR_IP ]; then
    echo $CUR_IP > /root/router-ip
    /usr/sbin/d.update-zoneedit
fi

# chmod 755 /usr/local/bin/d.router-cron-checkip

งานต่อไปคือการตั้งให้ crontab ตรวจสอบค่าไอพีทุก 5 นาที
# crontab -e

...
#CHECK ROUTER IP ADDRESS EVERY 5 MIN
0/5 0-23    * * *   /usr/local/bin/d.router-cron-checkip
...

เสร็จแล้วครับ

เกร็ด
จากตัวอย่าง ผมละเลยที่จะกล่าวถึงการทำตาราง nat เพราะความรู้ไม่พอที่จะอธิบาย จึงขอลงวิธีการไว้ตอนท้ายเพื่อให้สามารถศึกษาต่อได้เองดังนี้ครับ

  • การฟอร์เวิร์ดไอพี
    # vi /etc/sysctl.conf

    ...
    net.ipv4.ip_forward = 1
    ...

    # echo 1 > /proc/sys/net/ipv4/ip_forward

  • การเพิ่มเกตเวย์ไปที่เราเตอร์
    # route add default gw 192.168.5.1
  • การทำตาราง nat ด้วย iptables
    # WAN_INT=eth1
    # iptables -t nat -D POSTROUTING -o $WAN_INT -j MASQUERADE > /dev/null
    # iptables -t nat -A POSTROUTING -o $WAN_INT -j MASQUERADE
  • อย่าลืมตั้งค่า NAT ให้เราเตอร์ชี้ DMZ host มาที่ eth1 ของเซิร์ฟเวอร์ด้วย ซึ่งในที่นี้คือ 192.168.5.3
  • คำสั่งในการดูเลขไอพี ตามตัวอย่างเป็น http://192.168.5.1/wancfg.cmd?action=view แต่เวลาใช้งานจริงต้องดูว่าเราเตอร์เราใช้คำสั่งเดียวกันนี้หรือไม่ ส่วนใหญ่ดูจาก Status Bar ด้านล่างของบราวเซอร์ เวลาที่เราเอาเมาส์ไปชี้ตรงลิงก์