Friday, December 27, 2013

การรับมือกับปัญหาเรื่อง IPv4 ขาดแคลน

    สืบเนื่องจากปัจจุบัน  IPv4 เริ่มจะขาดแคลน ในบางภูมิภาค จะไม่สามารถขอ IPv4 จากผู้ให้บริการ IP ในแต่ละภูมิภาคได้แล้ว เนื่องจากได้ทำการแจกจ่ายไปหมดแล้ว
    ปัญหาใหญ่จึงตกอยู่กับผู้ที่ต้องการใช้งาน IP ในปริมาณมาก ๆ เช่น ผู้ให้บริการด้าน Internet หรือที่เรียกว่า ISP (Internet service provider) ทั้งแบบมีสาย และแบบไร้สาย รวมถึงหน่วยงานหรือบริษัทใหญ่ ๆ ที่มีการขอ IP เองโดยไม่ผ่าน ISP ด้วย ว่าจะมีวิธีการรับมือกับปัญหานี้อย่างไร
    โดยส่วนใหญ่ ISP ต่าง ๆ จะมีการวางแผนรองรับสำหรับเรื่องนี้เอาไว้อยู่แล้ว (รึเปล่า) โดยจะแบ่งออกเป็นวิธีการต่าง ๆ ดังนี้
    1. ไม่ต้องทำอะไรเลย
    เป็นวิธีการที่ดีที่สุด ใช้ค่าใช้จ่ายน้อยที่สุด และมีผลกระทบในปัจจุบันน้อยที่สุด แต่ ระบบเนทเวิร์คจะขยายต่อไปได้อีกเล็กน้อย จึงเหมาะกับบริษัทใหญ่ ๆ ที่มีการวางระบบไว้ดีแล้ว และไม่ต้องการขยายระบบออกไปอีกมากนัก
    วิธีการนี้ มีข้อเสียอยู่บ้าง นั่นคือ เมื่อระบบส่วนใหญ่บนโลกนี้ เข้าสู่ IPv6 เต็มตัวแล้ว ระบบ  IPv4 ที่เป็นอยู่ปัจจุบันจะไม่สามารถติดต่อกับระบบ IPv6 ได้
    แต่ก็มีวิธีแก้ไขอยู่บ้าง หากว่าจะมีการ Implement IPv6 คู่ขนานไปกับการใช้งาน IPv4 โดยที่ไม่กระทบกับการทำงานปกติ อาจจะมีค่าใช้จ่ายบ้างสำหรับการเริ่มระบบใหม่ และเรื่องของการ Migration ในกรณืที่ต้องการย้ายระบบจากระบบเก่ามาสู่ระบบใหม่ แต่ในช่วงที่พัฒนา ระบบ IPv4 จะสามารถใช้งานได้อย่างเต็มประสิทธิภาพ
    2. พยายามใช้ IPv4 ต่อไป
     สำหรับบางบริษัท ที่มีการขยายตัวอย่างต่อเนื่อง มีความจำเป็นที่จะต้องขยายระบบเนทเวิร์ค เพื่อรองรับการขยายตัวของบริษัท  แต่ก็ไม่อยากที่จะเปลี่ยนระบบที่มีอยู่เดิม จึงต้องหาทางที่จะทำอย่างไรก็ได้ เพื่อที่จะให้สามารถใช้งาน IPv4 ได้ต่อไป ก็จะมีวิธีการที่จะทำให้สามารถใช้ IPv4 ต่อไปได้อีก ดังนี้
    2.1 IP Trading
    ปัจจุบัน ผู้ให้บริการ IP (NIC - Network information center) เริ่มจะมีข้อเสนอใหม่ ๆ  คือการเป็นคนกลางในการแลกปลี่ยนซื้อขาย IPv4 จากผู้ให้บริการรายหนึ่ง ไปยังผู้ให้บริการอีกราย ซึ่งหลังจากผู้ให้บริการ ตกลงราคาเรียบร้อยแล้ว  NIC จะทำหน้าที่เปลี่ยนผู้ถือครอง IPv4 ชุดนั้น
    2.2 CGN (Carrier grade NAT) ,SP-NATหรือ NAT44
    วิธีการนี้ โดยมากจะใช้กับผู้ให้บริการ Internet ตัวอย่างเช่น เดิมที ในการให้บริการลูกค้า ที่เป็นลักษณะ  Individual หรือลูกค้า ADSL แพคเกจ ปกติ ที่ไม่ได้ขอ Fix IP ทาง ISP ก็จะแจกเป็น Public IP ไปถึง ADSL Router ของลูกค้า และ ตัว Router ของลูกค้าจะแจก Private IP ให้กับเครื่องลูกค้าที่ต่ออยู่หลัง Router เหล่านั้น เวลาที่จะใช้งาน Internet เครื่องลูกค้าที่เป็น Private IP  ก็จะทำ NAT ผ่าน Router ของลูกค้าและเชื่อมต่อไปยังปลายทางได้ ซึ่ง Public IP ที่ทาง ISP แจกให้นั้น จะเปลี่ยนไปเรื่อยๆ ทุกครั้งที่ลูกค้ามีการปิด Router ของลูกค้า (เรียกว่า Dynamic IP)
    แต่เนื่องจากปริมาณการใช้งานของลูกค้ามากขึ้น จนกระทั่ง Pool Public IP ของ ISP หมดลง ทำให้ ไม่สามารถที่จะเพิ่มลูกค้าได้อีกด้วยวิธีนี้  CGN จึงเป็นทางออกอีกทางหนึ่ง วิธีการทำงานคือ ISP จะแจก PrivateIP ให้กับลูกค้า แทนที่จะเป็น Public IP เมื่อลูกค้าต้องการใช้งาน Internet ลูกค้าจะ NAT ออกมาที่ Router ของลูกค้าเอง และเมื่อถึงทีฝั่ง ISP จะต้องมีการทำ NAT อีกชั้นหนึ่ง หรือที่เราเรียกว่า NAT ซ้อน NAT ซึ่งทาง ISP จะต้องลงทุนอุปกรณ์ CGN เพิ่มเติมเพื่อรองรับการทำงานนี้
    3. เปลี่ยนมาใช้ IPv6
    เนื่องจาก IPv6 มีขนาดใหญ่มาก จนสามารถรองรับการใช้งานในปัจจุบันได้ทั้งหมด ถ้าเรามีการเปลี่ยนมาใช้ IPv6 จะแก้ปัญหาเรื่อง IP ขาดแคลนได้

Thursday, December 19, 2013

IPv6 ความเป็นมา ความหมาย และคุณสมบัติ




ถ้าจะกล่าวถึงเรื่องของIP หลายๆ คนที่ทำงานด้าน IT อาจจะทราบว่า นั่นย่อมาจาก Internet Protocol และถูกนำไปใช้งานในการติดต่อสื่อสารกันในระบบเนทเวิร์ค โดยเฉพาะอย่างยิ่ง บน Internet
แต่นับว่าเป็นเรื่องใหม่สำหรับหลาย ๆ คน ถ้าจะพูดถึงเรื่องของ IPv6 เนื่องจากเป็นอะไรที่ยังค่อนข้างใหม่มาก สำหรับผู้ใช้งานทั่วไป ซึ่ง IPv6 ได้ถือกำเนิดขึ้นมานานแล้ว ตั้งแต่ปี 1994 แต่เพิ่งมาเป็นที่กล่าวถึงไม่นานนี้
แล้วเหตุใด ทำไมถึงต้องมีการนำIPv6 มาใช้? แล้ว IPv6 คืออะไร? แตกต่างจากIP ที่เราใช้งานกันในปัจุบันอย่างไร? เราจะมาหาคำตอบกัน



ความเป็นมา
เมื่อเราย้อนเวลากลับไปยังสมัยแรกๆประมาณ ปลายทศวรรษที่ 80 (1988-1989) ที่เราเริ่มจะมีการติดต่อสื่อสารกันบน Internet ในการที่เราจะติดต่อสื่อสารให้เข้าใจนั้น เราจำเป็นจะต้องคุยด้วยภาษาเดียวกัน การคุยด้วยภาษาเดียวกันนี้ เรียกว่าProtocol ซึ่ง Protocol ที่เป็นที่นิยมใช้สำหรับการติดต่อสื่อสารกันบน Internet เรียกว่า Internet Protocol หรือเรียกสั่้นๆว่า IP ซึ่งในสมัยแรกๆ เวอร์ชั่นของIPที่ใช้ จะเป็นเวอร์ชั่น 4 เราจึงเรียก Protocol นั้นว่า IPv4



กำเนิด IPv6
เมื่อปี 1990 เป็นช่วงที่Internet เติบโตอย่างก้าวกระโดด มีการใช้งานInternetอย่างแพร่หลายในวงกว้าง ซึ่งทำให้ปริมาณการใช้งาน IPAddress มีมากขึ้นเป็นเงาตามตัว จนกระทั่ง RIR หรือ Regional Internet Registry ได้ออกมาประกาศว่า จากการที่มีคนมาร้องขอ IP address และมีการแจกจ่ายไปเป็นจำนวนมากแล้วนั้น ขณะนี้ IP address Class B เริ่มจะไม่พอแจกแล้ว
เมื่อเป็นเช่นนั้น องค์กรที่ดูแลด้านInternet ที่ชื่อ IETF หรือ Internet Engineering Task Force ได้ประกาศคณะทำงานเพื่อแก้ไขปัญหาที่เกิดขึ้นนี้ เพราะเขาได้คิดแล้วว่า หากปล่อยให้มีการร้องขอการใช้งานแบบนี้เรื่อย ๆ IP Address ที่มีอยู่ ก็อาจหมดไปในระยะเวลาอันสั้นแน่นอน
ผ่านไปสี่ปี หลังจากที่ได้ทำงานอย่างหนัก คณะทำงานก็ได้ข้อสรุปของ IPAddress แบบใหม่ ซึ่งจะเปลี่ยนรูปแบบการใช้งาน IP แบบเดิมๆไปอย่างมากมาย ซึ่งมีชื่อเรียก IP แบบใหม่นี้ว่า Ipng หรือ IP Next Generation นั่นเอง
พอถึงปี 1995 ข้อกำหนดของ Ipng ก็เรียบร้อย พร้อมจะประกาศใช้และตั้งชื่อให้เป็นIP Versionถัดไป แต่ทว่า... IP version 5 ได้ถูกนำไปใช้เรียบร้อยแล้ว โดย Protocol ที่ชื่อว่า Internet streaming protocol ทาง IETF จึงไม่มีทางเลือก ต้องกำหนดชื่อให้เป็น IPv6 แทน ซึ่งเราสามารถดูข้อกำหนดและ Spec ของ IPv6 ได้จาก RFC1883



แรงผลักดันที่ทำให้มีการคิดค้น IPv6
ปกติ การที่เราจะเริ่มต้นใช้งานเทคโนโลยีใหม่ๆ ขณะที่เรายังสามารถใช้งานของเก่าได้ เป็นเรื่องค่อนข้างยาก การที่จะเปลี่ยนไปสู่สิ่งใหม่ๆ จำเป็นจะต้องมีแรงจูงใจให้เราเข้าไปศึกษาและทดสอบ เรื่องของ IPv6 ก็เช่นเดียวกัน ซึ่งแรงจูงใจที่จะทำให้เราเปลี่ยนไปใช้งาน IPv6 มีดังนี้

1. ความต้องการไอพีแอดเดรสที่มากขึ้น เพื่อให้สามารถรองรับกับอุปกรณ์สื่อสารสมัยใหม่ เช่น Smart phone และ Tablet เป็นต้น
    ปัจจุบัน พฤติกรรมการใช้งานโทรศัพท์มือถือของคนเราเปลี่ยนไปจากเดิมมาก เพราะว่า โทรศัพท์มือถือในยุคนี้ สามารถ ทำอะไรได้มากกว่า โทรศัพท์มือถือในยุคก่อน ๆ มากนัก หรือที่เราเรียกกันว่า  Smartphone ซึ่ง Smartphone นี้เอง ต้องการใช้งาน IPAddress เพื่อเชื่อมต่อ Internet 
    ไม่เพียงเท่านั้น อุปกรณ์ Tablet ก็ได้มีการพัฒนา ให้มีความเบาและบางขึ้นเป็นอย่างมาก ทำให้เราสามารถพกไปที่ไหน ๆ ได้สะดวก
    ณ ขณะที่เขียนบทความนี้ ประชากรในโลกเรา มีอยู่ประมาณ 7.13 พันล้านคน(ข้อมูลจาก http://www.census.gov/popclock/) ถ้าหากว่า 60% ของประชากรทั้งหมด ใช้งาน Smartphone เพียงคนละเครื่อง ก็จะไม่มี IPAddress เพียงพอกับการใช้งาน
2. การสื่อสารระหว่างกันโดยไม่ต้องพึ่งพา NAT เช่นการทำ Online transaction เป็นต้น
     NAT (Network address translation) คือการทำให้ Private IPAddress หลาย ๆ IP สามารถใช้งานผ่าน  Public IPAddress เพียง IP เดียวได้ ซึ่งแนวคิดนี้เกิดขึ้นเนื่องจาก IPAddress ที่แจกจ่ายไป ไม่เพียงพอกับการใช้งาน 
    การใช้งาน NAT มีข้อเสียอย่างมากในการติดต่อสื่อสารกัน คือ ฝั่งปลายทางจะไม่มีทางทราบได้เลยว่า กำลังติดต่ออยู่กับใคร เนื่องจากว่า Public IPAddress ที่มีการ NAT ออกมานั้น โดยทั่วไป จะไม่สามารถระบุได้ว่า มาจาก Private IPAddress ใด 
3. ความต้องการความปลอดภัย ความน่าเชื่อถือ และความรวดเร็วในการติดต่อสื่อสาร
    เหตุต่อเนื่องจากข้อ 2 หากว่า เราไม่สามารถตรวจสอบว่า  IPAddress ปลายทางที่คุยกับเรานั้นเป็นใคร ความน่าเชื่อถือของการใช้งาน ก็จะลดลงอย่างมาก

    จะเห็นได้ว่าจากแรงผลักดันทั้งหลาย ทำให้เราต้องมุ่งไปสู่การใช้งาน IPv6 ซึ่งจะแก้ปีญหาทั้งหมดที่กล่าวมาข้างต้นได้

โปรดติดตามตอนต่อไป

Monday, December 16, 2013

ขั้นตอนการ Backup ไฟล์ Configuration ของ Juniper Firewall (ISG Series) และ Fortigate Firewall รวมถึงการทำ Compare Configuration. Part2/2




    หลังจากที่เราทำการทดสอบ Script ทั้งสองเรียบร้อยแล้ว ก็ให้เรานำ Script ทั้ง 2 ไปวางไว้ที่ /root
และเขียน Script เพื่อทำการเก็บ Config ของไฟร์วอลล์ทั้งสองนั้นในรูปแบบของไฟล์ที่มีการบีบอัดข้อมูล

compress.sh

/root/fortigate.sh
/root/juniper.sh
gunzip /tftpboot/*.gz
chmod 644 /tftpboot/*
chown root:root /tftpboot/*
BASELOG="/tftp/log"
BASEDIR=${BASELOG}/`date +%d-%b-%y`
[ ! -d ${BASEDIR} ] && mkdir -p ${BASEDIR}
mv /srv/tftp/ru* ${BASEDIR}



หลัง จากนั้น ให้เราเขียน Script เพื่อทำการตรวจสอบว่า  File config ของเมื่อวาน และของปัจจุบันที่เราเพิ่งได้ backup ไปนั้น มีความแตกต่างกันอย่างไร มีการเพิ่มอะไรใหม่ ๆ หรือมีการลบอะไรออกไปบ้าง และให้ทำการส่งเมล์ออกไปยัง Admin   

checkdiff.sh

#!/bin/bash
BASELOG="/tftp/log/"
BASEDIR=${BASELOG}/`date +%d-%b-%y`
[ ! -d ${BASEDIR} ] && mkdir -p ${BASEDIR}
mv /tftpboot/* ${BASEDIR}
TODAY=`date +%d-%b-%y`
YESTERDAY=${BASELOG}/`date --date='1 day ago' +%d-%b-%y`

FILENAME="
juniper
fortigate

echo "Date - " ${TODAY} >> /tftp/report.log
echo "------------------------------------------------------------------------" >> /tftp/report.log
ls -l ${BASEDIR} >> /tftp/report.log
echo "*************************************************" >> /tftp/report.log
for filename in ${FILENAME}
do
    FILENAME=`echo ${filename}
    cut -f 1`
    SUBDIR=${BASEDIR}
    YSUBDIR=${YESTERDAY}
    echo "File" ${filename} " " >> /tftp/report.log
    echo "-----------------------------------------------------------------" >> /tftp/report.log
    echo "Check Differential configuration" >> /tftp/report.log
    diff ${SUBDIR}/${FILENAME} ${YSUBDIR}/${FILENAME} >> /tftp/diff.log
    echo "............... New configuration added ............." >> /tftp/report.log
    echo "-----------------------------------------------------------------" >> /tftp/report.log
    cat /tftp/diff.log
    grep "<" >> /tftp/report.log
    echo "-----------------------------------------------------------------" >> /tftp/report.log
    echo ".............. Old configuration Remove ............." >> /tftp/report.log
    echo "-----------------------------------------------------------------" >> /tftp/report.log
    cat /tftp/diff.log
    grep ">" >> /tftp/report.log
    echo "-----------------------------------------------------------------" >> /tftp/report.log
    echo "End of file" ${filename} " " >> /tftp/report.log
    echo "-----------------------------------------------------------------" >> /tftp/report.log
    echo "******************************************" >> /tftp/report.log
    rm -f /tftp/diff.log
    touch /tftp/diff.log
done

SUBJECT="Firewall differential configuration"
EMAIL= “taveesak@gmail.com"
EMAILMESSAGE="/tftp/report.log"
mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
rm -f /tftp/report.log


สุดท้าย

ตั้ง Crontab ให้รัน script compress.sh และ checkdiff.sh ทุกๆ วัน ในเวลาที่เราต้องการ
เท่านั้น

เหมือนเดิม หากว่าเราจะทดสอบว่า Script ที่เขียนนั้น ใช้งานได้จริงหรือไม่ ก็แค่ รัน Script นั้นขึ้นมา
หากใช้งานได้ เราก็จะเห็นเมล์ส่งเข้ามายัง Inbox ของเราครับ

 --------------------------------------------------------------------------------------------------
PS. Part2 นี้ รีบไปหน่อย หากมีข้อสงสัย ก็ส่งเมล์มาถามนะครับ

ขั้นตอนการ Backup ไฟล์ Configuration ของ Juniper Firewall (ISG Series) และ Fortigate Firewall รวมถึงการทำ Compare Configuration. Part1/2



    ถ้าหากว่า เราเป็น Admin ของ Firewall ซักตัวนึง เราเคยมีคำถามไหมว่า ทำอย่างไร เราถึงจะเก็บ config ของ Firewall เอาไว้ที่ใดซักที่นึง ทุกๆ วัน เผื่อว่า วันใด Firewall ที่เราดูแล เกิดอาการแฮงก์ โดยไม่ทราบสาเหตุ เราก็จะสามารถเอา Config ที่เราเก็บไว้ล่าสุดมา Restore ได้

    หากคุณเป็น Admin ที่มีความขยันและมีวินัยเป็นเลิศ คุณอาจจะบอกว่า ไม่ยากเลยจอร์จ เราก็แค่  Login เข้าไปที่  Firewall สิ จากนั้นก็เข้าไปที่หน้า Maintenance แล้ว Backup config ออกมา
 
    นั่นสินะ แต่ถ้าวันไหน Admin ป่วยล่ะ หรือลาพักร้อนล่ะ ใครจะทำหน้าที่นี้ ? จะให้คนอื่นเข้ามาทำแทนหรือ? จะยุ่งยากไปมั้ย หากไฟร์วอลล์นี้ ใคร ๆ ก็เข้าไป admin ได้

    อย่ากระนั้นเลย เรามาเป็น admin ที่ใช้ Server และ Script ทำงานแทนเราทุก ๆ วันดีกว่า

    เริ่มต้นด้วย เราจะต้องมี Server มาทำหน้าที่เก็บ Config ของอุปกรณ์ ซึ่งก็คงจะหนีไม่พ้น ต้องทำเป็น Linux server (เพราะอะไรหรือ ? ก็เพราะว่า เราไม่อยากจะเสียค่า License ไง)

    สำหรับขั้นตอนการติดตั้ง Linux ให้ลองไปหาดูโพสท์เก่า ๆ นะครับ

   สมมติว่า เรามีไฟร์วอลล์อยู่ 2 ตัว  คือ Fortigate กับ Netscreen (รุ่นเก่าก่อน SRX นะ) ซึ่งมี IP Address ดังต่อไปนี้

Fortigate Firewall IP Address 1.1.1.1
Netscreen Firewall IP Address 2.2.2.2

   สำหรับ Linux server เราก็กำหนด IP Address ดังนี้
Backup config Server IP Address 3.3.3.3

    ขั้นตอนการติดตั้งบริการ TFTP  ให้เลือกติดตั้ง Package ตามนี้นะครับ

    1. atftp
    2. xinetd
    3. postfix เอาไว้ใช้ส่งเมล์หาเราทุกวัน
    4. expect พระเอกของงานเลย ห้ามลืมติดตั้งเด็ดขาด 

สิ่งที่ห้ามลืม
จะต้องมี User ที่สามารถเข้าถึงบริการ SSH ของ Firewall ทั้งสองตัว 
ในที่นี้ ผมใช้ user ชื่อว่า monica และ password ชื่อว่า john@123 ครับ 

จากนั้น ก็เขียน Script ตามด้านล่างเลยครับ

fortigate.sh - เอาไว้เก็บ Config ของ Fortigate


#!/usr/bin/expect -f
#-----------------------------------------------------------------------
spawn ssh -o stricthostkeychecking=no monica@1.1.1.1
expect {
"password:" {send "john@123\r"}
}
expect {
"#" {send "execute backup config tftp fortigate 3.3.3.3\r"}
}
expect {
"#" {send "exit\r"}
}
close
#-----------------------------------------------------------------------


juniper.sh - เอาไว้เก็บ Config ของ Juniper

#!/usr/bin/expect -f
#-----------------------------------------------------------------------
spawn ssh -o stricthostkeychecking=no monica@2.2.2.2
expect {
"password:" {send "john@123\r"}
}
expect {
";" {send "get config all > tftp 3.3.3.3 juniper\r"}
}
expect {
"#" {send "exit\r"}
}
close
#-----------------------------------------------------------------------

เมื่อทำเสร็จแล้ว ลองรัน script ดูนะครับ ว่า ใช้งานได้หรือเปล่า
วิธีดูง่าย ๆ ว่าใช้งานได้หรือไม่ ก็คือ เมื่อรันไปแล้ว ไม่เกิด error
และเมื่อเราไปดูที่ TFTP server ที่พาธ /tftpboot ก็จะเห็นไฟล์  config ของไฟร์วอลล์ ปรากฏอยู่ครับ


สำหรับ Part แรก เอาไว้แค่นี้ก่อนครับ