ทำ Host ใช้เอง

เห็นมีการคุยกันที่ codenone เรื่องโฮสต์ไพธอนหายากมาก จึงขออนุญาตบันทึกการทำโฮสต์ไว้ใช้เองไว้ที่นี่แทน เพราะว่าเราใช้เดเบียน ;D เพื่อจะได้สามารถใช้งาน Python Ruby หรือแพกเกจที่ไม่ใช่แพกเกจท้องตลาดได้อย่างอิสระเสรี

ขั้นตอนคร่าว ๆ คือ

  1. คิดชื่อโดเมน และตรวจสอบว่าชื่อที่เราตั้งยังว่างอยู่หรือไม่
  2. จดทะเบียน dynamic domain name server
  3. จดทะเบียนชื่อโดเมน
  4. สร้างสคริปต์สำหรับเปลี่ยนไอพี เมื่อสายหลุด

เริ่มด้วย

  1. คิดชื่อโดเมน และตรวจสอบว่าชื่อที่เราตั้งยังว่างอยู่หรือไม่
    สามารถตรวจดูได้จากเว็บโฮสติ้งทั่วไป
  2. จดทะเบียน dynamic domain name server
    ที่ผมใช้อยู่คือ

    นอกจากสองที่นี้แล้ว ยังมีอีกมาก สามารถลองค้นจากกูเกิลได้ ด้วยคำว่า "free dynamic dns" ครับ

    เมื่อลงทะเบียนและใส่ชื่อโดเมนเราแล้ว เขาจะให้ชื่อ DNS เรามาสองชื่อ เช่นของ zoneedit จะเป็น ns1.zoneedit.com และ ns2.zoneedit.com (ชื่อ DNS จริงอาจแปลกไปจากตัวอย่าง) ซึ่งเราจะเอาชื่อทั้งสองชื่อนี้ ไปจดทะเบียนชื่อโดเมนต่อไป

  3. จดทะเบียนชื่อโดเมน
    ขั้นตอนนี้ก็สามารถจดได้ทั่วไปครับ โดยในขั้นตอนการจดทะเบียน เขาจะมีช่องให้ใส่ชื่อ DNS เราก็เอาชื่อที่ได้มาจากขั้นตอนก่อน ทั้งสองชื่อใส่ลงไปก็เรียบร้อย
  4. สร้างสคริปต์สำหรับเปลี่ยนไอพี เมื่อสายหลุด
    ขั้นตอนนี้ จริง ๆ แล้วมีสคริปต์ที่เขาทำกันเอาไว้อยู่แล้ว เช่น ddclient แต่ผมใช้ไม่เป็นครับ และเห็นว่าส่วนใหญ่เขาจะใช้วิธี ping ไปที่ DNS เป็นระยะ ซึ่งวิธีนี้ทำให้สิ้นเปลืองแบนด์วิธโดยไม่จำเป็น สู้เขียนสคริปต์เอาเองดีกว่า

ขั้นตอนนี้ สำหรับโมเด็ม adsl ในตัว ให้ดูในหัวข้อถัดไปครับ ส่วนกรณีที่ใช้เราเตอร์ ขอติดไว้เป็นครั้งหน้า

เกร็ด

  • ddns แต่ละที่ จะมีความเร็วในการอัปเดตต่างกัน
    • zoneedit.com ใช้เวลาประมาณ 1 นาที
    • everydns.net ประมาณ 2-5 นาที

    รวมทั้งขั้นตอนการอัปเดตก็ต่างกัน

    • zoneedit.com ใช้ wget อย่างเดียว
    • ส่วน everydns.net ใช้สคริปต์ Perl
  • ข้อเสียของวิธีนี้คือ
    • ต้องเปิดเครื่องทิ้งไว้ตลอดเวลา
    • ต้องพึ่งพาการใช้ DDNS จากเมืองนอก เพราะเมืองไทยยังไม่มีบริการแบบนี้ เวลาที่มีปัญหาช่องสัญญาณเมืองนอกขัดข้อง การอัปเดตจะขัดข้องตามไปด้วย
    • ถ้าการใช้งานอินเทอร์เน็ตของเราเป็นแบบ ADSL (Asynchronous Digital Subscriber Line) ความเร็วในการอัปโหลดจะต่ำกว่าความเร็วในการดาวน์โหลดพอสมควร จึงควรซื้อแพกเกจของการเชื่อมต่อให้มีความเร็วให้สูงเข้าไว้ จะให้ผลดีกว่า
  • ส่วนข้อดีก็คือ เราสามารถใช้งานและปรับแต่งเซิร์ฟเวอร์ได้อย่างที่เราต้องการ ไม่มีข้อจำกัดของโฮสติ้งมาเกี่ยว
  • ในข้อเขียนนี้ ไม่ได้อธิบายการป้องกันเซิร์ฟเวอร์ไว้ด้วย ดังนั้นเพื่อความปลอดภัย ควรป้องกันเซิร์ฟเวอร์เราไว้ก่อนหนึ่งชั้นด้วยแพกเกจ portsentry
    # aptitude install portsentry
    

    โดยเราจะใช้ค่าปริยายทั้งหมด โดยไม่ต้องปรับแต่งอะไรเลย

    ส่วนการป้องกันเซิร์ฟเวอร์ให้ดียิ่งขึ้น ควรศึกษาเพิ่มเติมด้วยครับ

กรณีใช้โมเด็ม ADSL

สมมุติว่า

  • เซิร์ฟเวอร์เราชื่อ www.example.com
  • เราลงทะเบียน dynamic dns ไว้ในชื่อ MYUSERNAME รหัสผ่าน MYPASSWORD
  • อินเทอร์เฟสที่เกิดจากโมเด็มคือ ppp0

สำหรับการต่อเน็ต ADSL แบบใช้โมเด็มในตัวเครื่อง จะเปรียบเสมือนกับว่าเราเป็นเราเตอร์เอง จึงไม่ต้องการการ ping เพื่อตรวจสอบไอพีเป็นระยะเหมือนกับการเชื่อมต่อผ่านเราเตอร์ เมื่อสายหลุด โมเด็มจะทำการเชื่อมต่อใหม่โดยอัตโนมัติ โดยขั้นตอนในการเชื่อมต่อจะเป็นดังนี้

  1. ตอนสายหลุด ระบบจะเรียกสคริปต์ /etc/ppp/ip-down.local
  2. ตอนที่เชื่อมต่อใหม่สำเร็จแล้ว ระบบจะเรียกใช้สคริปต์ /etc/ppp/ip-up.local

เราใช้แค่สคริปต์ /etc/ppp/ip-up.local ก็พอ โดยจะดักการเชื่อมต่อตรงจุดนี้ โดยเราจะสร้างสคริปต์ย่อยในการอัปเดตขึ้นมาอีกสคริปต์นึง เนื่องจากในการอัปเดต จำเป็นต้องมีชื่อผู้จดทะเบียนและรหัสผ่านอยู่ในสคริปต์ด้วย เราจึงต้องนำสคริปต์ไปไว้ในที่ปลอดภัย (ผมเอาไปใส่ใน /usr/sbin)

สำหรับ zoneedit.com

แก้ไขไฟล์ ip-up.local ดังนี้

# vi /etc/ppp/ip-up.local
...
if [ $PPP_IFACE == "ppp0" ]; then
    # REFRESH DNS
    # REFRESH IPTABLES
    # REFRESH SQUID
    # RECONNECT DDNS
    /usr/sbin/d.update-zoneedit
fi
...

สร้างสคริปต์อัปเดตชื่อ /usr/sbin/d.update-zoneedit ดังนี้

# vi /usr/sbin/d.update-zoneedit
#!/bin/bash
# SCRIPT FOR PPP TO UPDATE DNS RECORD AT zoneedit.com

# UPDATE FUNCTION
#usage: updatezoneedit $USER $PASSWORD $IP_ADDR $DOMAIN $HOST 
#     : updatezoneedit MYUSERNAME MYPASSWORD $PPP_IP example.com www.example.com

updatezoneedit() {
    USER=$1
    PASSWORD=$2
    IP_ADDR=$3
    DOMAIN=$4
    HOST=$5
    wget -O - --http-user=$USER --http-passwd=$PASSWD \
      "http://www.zoneedit.com/auth/dynamic.html?host=$DOMAIN&type=A&dnsto=$IP_ADDR"
}

# BEGIN MAIN PROGRAM
I_FACE=ppp0
USER="MYUSERNAME"
PASSWD="MYPASSWORD"
DOMAIN1="example.com"
HOST1="www.example.com"

IP_ADDR=`ifconfig $I_FACE | fgrep -i inet | cut -d : -f 2 | cut -d \  -f 1`

# FOR example.com
echo "Updating $DOMAIN1 ..."
updatezoneedit $USER $PASSWD $IP_ADDR $DOMAIN1 $HOST1
echo "Finished."

ทำให้รันได้

# chmod 0700 /usr/sbin/d.update-zoneedit

ครั้งแรกเราเรียกใช้ครั้งเดียว ที่เหลือระบบจะทำอัตโนมัติทุกครั้งที่สายหลุด หรือเปิดเครื่อง

# /usr/sbin/d.update-zoneedit

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

สำหรับ everydns

แก้ไขไฟล์ ip-up.local ดังนี้

# vi /etc/ppp/ip-up.local
...
if [ $PPP_IFACE == "ppp0" ]; then
    # REFRESH DNS
    # REFRESH IPTABLES
    # REFRESH SQUID
    # RECONNECT DDNS
    /usr/sbin/d.update-everydns
fi
...

สร้างสคริปต์อัปเดตชื่อ /usr/sbin/d.update-everydns ดังนี้

# vi /usr/sbin/d.update-everydns
#!/bin/bash
# SCRIPT FOR PPP TO UPDATE DNS RECORD AT everydns.net

# PREREQUIST:
# 0.REGISTER USERNAME & PASSWORD AT www.everydns.net
#   - ADD DYNAMIC DNS example.com
#   - ADD DYNAMIC DNS www.example.com
# 1.DOWNLOAD FILE http://www.everydns.net/eDNS.pl 
#   PUT IN /usr/local/bin
# 2.INSTALL ncftp
#   # aptitude install ncftp
# 3.INSTALL PERL MIME::Base64
#   # perl -MCPAN -e 'install MIME::Base64'

# UPDATE FUNCTION
#usage: updateeverydns $USER $PASSWORD $IP_ADDR $DOMAIN $HOST 
#     : updateeverydns MYUSERNAME MYPASSWORD $PPP_IP example.com www.example.com

updateeverydns() {
    USER=$1
    PASSWORD=$2
    IP_ADDR=$3
    DOMAIN=$4
    HOST=$5
    eDNS.pl -u $USER -p $PASSWORD -ip $IP_ADDR -d $DOMAIN
    eDNS.pl -u $USER -p $PASSWORD -ip $IP_ADDR -d $HOST
}

# BEGIN MAIN PROGRAM
I_FACE=ppp0
USER="MYUSERNAME"
PASSWD="MYPASSWORD"
DOMAIN1="example.com"
HOST1="www.example.com"

IP_ADDR=`ifconfig $I_FACE | fgrep -i inet | cut -d : -f 2 | cut -d \  -f 1`

# FOR example.com
echo "Updating $DOMAIN1 ..."
updateeverydns $USER $PASSWD $IP_ADDR $DOMAIN1 $HOST1
echo "Finished."

ทำให้รันได้

# chmod 0700 /usr/sbin/d.update-everydns

ตามคำแนะนำของ everydns คือจะต้องใช้สคริปต์ของเขา ซึ่งสคริปต์นั้นเขียนด้วย perl มีการเรียกใช้ ncftp จึงต้อง...

ดาวน์โหลดสคริปต์มาก่อน และนำไปเก็บไว้ที่ /usr/local/bin

# wget http://www.everydns.net/eDNS.pl
# chmod 755 eDNS.pl
# mv eDNS.pl /usr/local/bin

ในสคริปต์จะต้องเรียกใช้ ncftp จึงต้องติดตั้ง ncftp ก่อน

# aptitude install ncftp

ติดตั้ง perl MIME::base64 ตามคำแนะนำ

# perl -MCPAN -e 'install MIME::Base64'

ครั้งแรกเราเรียกใช้ครั้งเดียว ที่เหลือระบบจะทำอัตโนมัติทุกครั้งที่สายหลุด หรือเปิดเครื่อง

# /usr/sbin/d.update-everydns

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

(ท่านใดเอาไปใช้งาน ถ้าไม่ผ่านรบกวนแจ้งด้วยนะครับ เพราะตัดทอนจากโปรแกรมที่ใช้งานอยู่ บางทีอาจตรวจทานหลุด และไม่มีฮาร์ดแวร์สำหรับทดสอบแล้ว)

Comments

ทำ server ตั้งไว้บ้าน net 1m/512 k นี่จะรับ user ได้สักประมาณกี่คนครับ

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้