วันอังคารที่ 12 สิงหาคม พ.ศ. 2551

Ubuntu : iptables rule

เป็นความรู้ที่ได้รับจากพี่ต๊อกถ่ายทอดมาให้อีกที เป็นเรื่องเกี่ยวกับการตั้งกฏของโปรแกรม iptables ใน Ubuntu

ซึ่งโดยปรกตินั้นเจ้า Ubuntu มันก็จะมีโปรแกรม iptables ติดตั้งมาให้เลยตอนที่ลงโปรแกรม แต่ว่ามันไม่ได้สร้างกฏเกณฑ์อะไรมาให้ทั้งนั้น ซึ่งก็คือมันไม่สามารถป้องกันอะไรได้เลย (แล้วมันจะติดมาให้ทำไมหว่า)

เมื่อก่อนเคยใช้ linux ตระกูลพวก Red hat ซึ่งถ้าหากต้องการเขียนกฏเกณฑ์อะไรของ Firewall ก็เข้าไป edit กฏเอาตรงเลยที่ /etc/sysconfig แล้วเปิดไฟล์ iptables edit กฏกันตรงๆ เลย

แต่พอมาใช้ Ubuntu มันกลับไม่มีเจ้าไฟล์นี้มาให้ คราวนี้ก็ไปไม่ถูกเลยสิครับท่าน เลยไม่ได้ทำอะไรกับ firewall ทั้งนั้น

แล้วความซวยก็มาถึง เหมือนนิยายนำ้เน่าเลย

เหมือนโดนล้วงคอ

คุมเครื่่อง Server อยู่มาเป็นปีเป็นชาติ

สุดท้ายโดนจนได้ เจอมือดีมันเข้ามาล้วงข้อมูลในเครื่อง Server เลยแถมมันยังลบข้อมูลเราด้วย

สุดท้ายจับไม่ได้ไล่ไม่ทัน ก็ต้องยอมมันไป ต้องเสียเวลามากู้ระบบอีก เอาข้อมูลกลับมาอีก เหนื่อยเลย

แล้วสุดท้ายก็ถึงบางอ้อว่า นี่เองความสำคัญอย่างหนึ่งของ Firewall ก็เลยต้องหันมาให้ความสำคัญกับมันแบบจริงๆ จังๆ อย่างมากๆ เลย สุดท้ายก็ได้พี่ต๊อกมาสอนเรื่องการสร้างกฏเพื่อป้องกันขึ้นพื้นฐานเอาไว้ให้ พออุ่นใจได้บ้างก็ดีว่าไม่มีเลย

สำหรับ Ubuntu มันไม่มีไฟล์ /etc/sysconfig/iptables ก็ไม่เป็นไร ก็สร้างไฟล์ขึ้นมาเองเลย สร้างไว้ที่ไหนก็ได้ยกตัวอย่างเช่น สร้างไว้ที่ home ของ user ก็ได้ ตั้งชื่อว่า iptables.firewall ก็แล้วกัน โดยการสร้างไฟล์นี้ทำได้โดย

# sudo iptables-save >  iptables.firewall

เราก็จะได้ไฟล์ iptables.firewall ซึ่งจะบรรจุ pattern ของกฏเปล่าๆ ขึ้นมา จากนั้นก็ทำการแก้ไฟล์โดยใสกฏป้องกันเบื้องต้นดังนี้

# pico /home/phisan/iptables.firewall

จากนั้นทำการ edit file นี้โดยใส่ pattern ต่างๆ ดังนี้เช่น


# Generated by iptables-save v1.3.5 on Mon Feb 19 21:47:01 2007
*filter
:INPUT ACCEPT [1665:126682]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [911:121420]
# Completed on Mon Feb 19 21:47:01 2007

#@Allow httpd service ------------------------------------------------
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT

#@Allow admin computer to remote login -----------------------------
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -s xx.xx.xx.xx -j ACCEPT

#@Allow ftp service from any where -----------------------------------
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -s 0/0 -j ACCEPT

-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j DROP
-A INPUT -i eth0 -p icmp -j DROP
-A INPUT -i eth0 -j DROP
COMMIT

อธิบายกฏอย่างคร่าว คือ

-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT

คือบริการให้เครื่องต่างๆ สามารถเรียกใช้บริการ ผ่าน port 80 ได้ซึ่งก็คือ port ของ web

-A INPUT -i eth0 -p tcp -m tcp --dport 22 -s xx.xx.xx.xx -j ACCEPT

คือเปิดบริการให้เฉพาะเครื่องที่มีหมายเลย ip xx.xx.xx.xx สามารถทำการ ssh เข้ามาได้เท่านั้น

-A INPUT -i eth0 -p tcp -m tcp --dport 21 -s 0/0 -j ACCEPT

คือเปิดบริการ ftp ได้จากทุกที่ และทุกเครื่อง สามารถเรียกใช้บริการนี้ได้

-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j DROP

คือการปิดให้บริการ ssh ในกรณีที่มี request ที่นอกเหนือจากการอนุญาติโดยกฏข้างบน

-A INPUT -i eth0 -p icmp -j DROP

คือการปิดการให้บริการ ping ไม่ว่าเครื่องใดๆ ที่ทำการ ping เข้ามาจะไม่มีการตอบรับจากเครื่องนี้

-A INPUT -i eth0 -j DROP

คือส่วนที่ใช้สำหรับเก็บตกจากฏต่างๆ ข้างบน คือถ้านอกเหนือจากกฏข้างบนแล้วจะทำการ Drop package ที่วิ่งเข้ามาทั้งหมดทิ้งไป

ความจริงยังมีกฏอีก แต่เอาแค่นี้ก่อนแล้วกัน เดี๋ยวชาวบ้านรู้ไต๋หมดไม่ได้

แต่แค่นี้ยังไม่จบ ต้องทำให้เจ้าตัว iptables รับรู้กฏที่เราสร้างขึ้นโดยการใช้คำสั่ง

# sudo iptables-restore <>

หรือว่าจะคำสั่งนี้ไปใส่ใน rc.local ก็ได้จะได้ทำการ load rule นี้ให้กับ iptables แบบอัตโนมัติ ทุกครั้งที่ boot เครื่องเลย

คลังบทความของบล็อก