ทำ Host ใช้เอง
เห็นมีการคุยกันที่ codenone เรื่องโฮสต์ไพธอนหายากมาก จึงขออนุญาตบันทึกการทำโฮสต์ไว้ใช้เองไว้ที่นี่แทน เพราะว่าเราใช้เดเบียน ;D เพื่อจะได้สามารถใช้งาน Python Ruby หรือแพกเกจที่ไม่ใช่แพกเกจท้องตลาดได้อย่างอิสระเสรี
ขั้นตอนคร่าว ๆ คือ
- คิดชื่อโดเมน และตรวจสอบว่าชื่อที่เราตั้งยังว่างอยู่หรือไม่
- จดทะเบียน dynamic domain name server
- จดทะเบียนชื่อโดเมน
- สร้างสคริปต์สำหรับเปลี่ยนไอพี เมื่อสายหลุด
เริ่มด้วย
- คิดชื่อโดเมน และตรวจสอบว่าชื่อที่เราตั้งยังว่างอยู่หรือไม่
สามารถตรวจดูได้จากเว็บโฮสติ้งทั่วไป - จดทะเบียน dynamic domain name server
ที่ผมใช้อยู่คือนอกจากสองที่นี้แล้ว ยังมีอีกมาก สามารถลองค้นจากกูเกิลได้ ด้วยคำว่า "free dynamic dns" ครับ
เมื่อลงทะเบียนและใส่ชื่อโดเมนเราแล้ว เขาจะให้ชื่อ DNS เรามาสองชื่อ เช่นของ zoneedit จะเป็น ns1.zoneedit.com และ ns2.zoneedit.com (ชื่อ DNS จริงอาจแปลกไปจากตัวอย่าง) ซึ่งเราจะเอาชื่อทั้งสองชื่อนี้ ไปจดทะเบียนชื่อโดเมนต่อไป
- จดทะเบียนชื่อโดเมน
ขั้นตอนนี้ก็สามารถจดได้ทั่วไปครับ โดยในขั้นตอนการจดทะเบียน เขาจะมีช่องให้ใส่ชื่อ DNS เราก็เอาชื่อที่ได้มาจากขั้นตอนก่อน ทั้งสองชื่อใส่ลงไปก็เรียบร้อย - สร้างสคริปต์สำหรับเปลี่ยนไอพี เมื่อสายหลุด
ขั้นตอนนี้ จริง ๆ แล้วมีสคริปต์ที่เขาทำกันเอาไว้อยู่แล้ว เช่น 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 เพื่อตรวจสอบไอพีเป็นระยะเหมือนกับการเชื่อมต่อผ่านเราเตอร์ เมื่อสายหลุด โมเด็มจะทำการเชื่อมต่อใหม่โดยอัตโนมัติ โดยขั้นตอนในการเชื่อมต่อจะเป็นดังนี้
- ตอนสายหลุด ระบบจะเรียกสคริปต์ /etc/ppp/ip-down.local
- ตอนที่เชื่อมต่อใหม่สำเร็จแล้ว ระบบจะเรียกใช้สคริปต์ /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
เสร็จแล้วครับ
(ท่านใดเอาไปใช้งาน ถ้าไม่ผ่านรบกวนแจ้งด้วยนะครับ เพราะตัดทอนจากโปรแกรมที่ใช้งานอยู่ บางทีอาจตรวจทานหลุด และไม่มีฮาร์ดแวร์สำหรับทดสอบแล้ว)
|
ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้ |















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