การทำไฟร์วอลล์ด้วย Linux
จาก Research 2549, สารานุกรมฟรี
ชื่อผู้จัดทำ นนร.วสุรัตน์ ตันติวิศาลเกษตร เลขที่ 14สารบัญ |
บทคัดย่อ
- ปัจจุบัน อินเตอร์เน็ท ได้เข้ามาเป็นส่วนสำคัญในการติดต่อสื่อสาร ในทุกๆด้าน เช่น ธุรกิจบนInternet การติดต่อสื่อสาร การศึกษา ความบันเทิง ความรู้ ข่าวสาร เป็นต้น การติดต่อสื่อสารระหว่างกันนั้นสามารถเชื่อมต่อกันได้โดยตรง(โลกไร้พรมแดน) โดยปัญหาที่เกิดขึ้นสำหรับผู้ที่ใช้ อินเตอร์เน็ท ก็คือ การบุกรุกเข้ามาของคนที่ไม่ได้รับอนุญาต ทำให้เกิดการขโมยข้อมูล การเข้ามาทำความเสียหายให้แก่เครื่องของเราหรือระบบของเรา เป็นต้น จากปัญหาดังกล่าว ทำให้เกิดความไม่ปลอดภัยในการใช้อินเตอร์เน็ท ดังนั้นจึงมีวิธีการที่จะรักษาความปลอดภัยในการติดต่อสื่อสาร ซึ่งจะช่วยลดความเสี่ยงในการเข้ามาของผู้บุกรุกได้ คือ ไฟร์วอลล์ ไฟร์วอลล์นั้นจะช่วยป้องกันอันตรายต่างๆ จากภายนอกที่จะเข้ามายังภายใน เครื่องของเรา หรือ เน็ทเวิร์กของเรา
บทนำ
- ไฟร์วอลล์ หมายถึง ระบบที่เอาไว้ป้องกันอันตรายจากอินเตอร์เน็ตหรือเน็ตเวิร์กภายนอก เพื่อป้องกันการเข้าถึงข้อมูลจากเน็ทเวิร์กภายนอกได้โดยตรง
- ไฟร์วอลล์ ทำหน้าที่ในการควบคุมการเข้าถึงระหว่างเน็ตเวิร์กภายนอกหรือเน็ตเวิร์กที่เราคิดว่าไม่ปลอดภัย กับเน็ตเวิร์กภายในหรือเน็ตเวิร์กที่เราต้องการจะป้องกัน ส่วนการใช้ส่วนใดในการทำเป็น ไฟร์วอลล์นั้นแล้วแต่ว่าเราจะนำส่วนไหนมาใช้ เช่น เราเตอร์ คอมพิวเตอร์ หรือเน็ตเวิร์ก หรืออาจจะนำแต่ละส่วนมาประกอบกันก็ได้
- ชนิดของไฟร์วอลล์ แบ่งเป็น 3 ประเภท
- Packet Filtering
- Proxy Service
- Stateful Inspection
ประวัติความเป็นมา/ทฤษฎีพื้นฐานที่เกี่ยวข้อง
ประวัติความเป็นมา
- ระบบปฏิบัติการ Linux สามารถที่จะใช้งานเป็นไฟร์วอลล์ได้ตั้งแต่เวอร์ชันเคอร์เนล 1.1 ซึ่งเป็นเวอร์ชันแรก โดย Alan Cox ใช้ชื่อ Linux Firewall ว่า ipfw (จาก BSD)เมื่อมีการพัฒนาต่อมาจนกลายเป็น Linux 2.0 Linux Firewall ได้ถูกพัฒนาและปรับปรุงได้เครื่องมือที่มีชื่อว่า ipfwadm โดยเพิ่มเครื่องมือชิ้นนี้อนุญาตให้ผู้ใช้สามารถควบคุม filtering rule ได้ และต่อมา Linux 2.2 Linux Firewall ก็ได้สร้างเครื่องมือตัวใหม่ชื่อ ipchains ซึ่งเผยแพร่ในปี 1998 โดย Rusty Russel และทีมงาน ทั้งนี้ ipchains นี้ถือได้ว่าเป็นพัฒนาการขั้นที่สามของ Linux Firewall จวบจนกระทั่งในปัจจุบัน ก็มี netfilter และ iptables ซึ่งถือว่าเป็นพัฒนาการขั้นที่สี่ของ Linux Firewall
- Netfilter นั้นเป็นชื่อใหม่ของโค้ดที่ทำหน้าที่เป็น packet handler(stateful inspection) ใน Linux kernel 2.4 (จริงคือเวอร์ชัน 2.3.15 และเวอร์ชันต่อๆ มา) ซึ่งได้ถูกออกแบบและปรับปรุงใหม่จากเวอร์ชันก่อนหน้านี้ คือ netfilter นั้นสามารถทำงานย้อนหลังร่วมกับ ipchains และ ipfwadm ได้ และคำสั่งในการเรียกใช้งานคือ iptables
- ความแตกต่างระหว่าง iptables และ ipchains
- ชื่อของ built-in chain (ประกอบไปด้วย INPUT, OUTPUT, FORWARD) เปลี่ยนจากตัวอักษรเล็ก (lowercase) เป็นตัวอักษรใหญ่ (uppercase)
- การใช้งานที่ต้องระบุ port ทั้ง TCP และ UDP นั้น ต้องใช้คำว่า --source-port หรือ --sport (--destination-port หรือ --dport) และต้องใช้ตามหลังจาก -p tcp หรือ -p udp
- TCP -y flag เปลี่ยนเป็น --syn และต้องใช้ร่วมกับ -p tcp
- target จาก DENY เปลี่ยนเป็น DROP
- chain ที่ไม่มี rule ใดๆ เลยก็สามารถทำงานได้
- การทำ zeroing built-in chain จะทำให้ byte counter ถูกล้างค่าไปด้วย
- ชื่อของ chain ยาวสูงสุดได้ 31 ตัวอักษร
- MASQ เปลี่ยนเป็น MASQUERADE และมีรูปแบบการใช้งานเปลี่ยนไป รวมทั้ง REDIRECT ก็มีการเปลี่ยนแปลงรูปแบบใหม่
ทฤษฎีพื้นฐานที่เกี่ยวข้อง
- รูปแบบการใช้งาน iptables
iptables [table] <command> <match> <target/jump>
- [table] หมายถึง ตารางหรือ table ที่ต้องการระบุ เช่น iptables -t nat หมายถึงให้ทำงานกับ nat table ในกรณีที่ไม่ได้ระบุตาราง iptables จะถือว่าคำสั่งดังกล่าวระบุถึง filter table โดยอัตโนมัติ iptables สามารถทำงานได้กับตาราง(table) 3 ตารางหลัก 1.Filter table 2.Nat table 3.Mangle table
- <command> จะเป็นตัวสั่งให้ iptables ทำในสิ่งที่ต้องการ เช่น iptables -A INPUT ซึ่งหมายถึงให้สร้าง rule ต่อท้าย INPUT chain ใน filter table ตัวอย่างคำสั่ง
# iptables -A INPUT -p ALL -i eth0 -j ACCEPT # iptables -D INPUT --dport 80 -j DROP # iptables -I OUTPUT -p ALL -s 127.0.0.1/32 -j ACCEPT
- <match> เป็นส่วนที่ใช้ตรวจสอบว่า packet มีข้อมูลตรง (match) กับที่ระบุไว้หรือไม่ เช่น มี source ip address เป็น 19.203.30.4 การระบุไอพีแอดเดรสนั้นสามารถทำได้ 4 แบบด้วยกันคือ
ใช้ชื่อเต็มแทน เช่น localhost หรือ www.crma.ac.th ระบุไอพีแอดเดรสโดยตรง เช่น 127.0.0.1 หรือ 203.185.130.41 ระบุเป็น group ของไอพีแอดเดรส เช่น 203.44.201.0/24 ซึ่งหมายถึงไอพีแอดเดรสตั้งแต่ 203.44.201.0 - 203.44.201.255 หรืออาจจะใช้ 203.44.201.0/255.255.255.0 แทน 203.44.201.0/24 ได้
- <target/jump> เป็นตัวระบุว่าเมื่อเจอ packet ที่ match ก็จะกระทำ (action) ตามที่ระบุไว้ เช่น ถ้า packet ใดมี source ip address เป็น 19.203.30.4 ให้ DROP packet นั้นทิ้งไป โดยปกติจะใช้กัน 2 target คือ DROP และ ACCEPT
เนื้อเรื่อง (วิธีการ/รูปแบบการใช้งาน)
- การ drop packet
# iptables -A OUTPUT -p icmp -j DROP
จาก คำสั่ง หมายถึง การ drop packet ที่เป็น ICPM ที่จะออกจากเครื่องนี้ โดยไม่ต้องระบุ ip address เพราะทุก packet ที่จะออกจากเครื่องนี้จะต้องผ่านการตรวจสอบจาก OUTPUT chain
หากต้องการที่จะ ยกเลิก rule ที่เรากำหนดไว้ข้างต้นให้ใช้คำสั่งดังต่อไปนี้
# iptables -F OUTPUT (จะทำการยกเลิกทุก rule ที่กำหนดไว้) # iptables -D OUTPUT -p icmp -j DROP (ลบ rule โดยกำหนด option ของ rule ที่เรากำหนดไว้ได้โดยตรง)
- การทำ Masquerading
เป็นกระบวนการเปลี่ยนแปลง IP Address ของเครื่องคอมพิวเตอร์ที่อยู่เครือข่ายภายในแต่ต้องการออกนอกเครือข่าย ได้รับการจัดตั้ง IP Address ของการ์ด LAN ที่เชื่อมต่อตรงกับเครือข่ายที่อยู่ด้านนอก ตัวอย่างที่เห็นได้ชัดเจน คือ ร้าน Internet cafe ต่างๆที่ใช้ modem 1 ตัว โดย modem ทำหน้าที่ เป็น router ด้วย แล้วทำการแจก IP address ให้แก่เครื่องที่อยู่ภายในร้าน การทำ Masquerading มีคำสั่งดังนี้
#iptables -t nat -A POSTROUTING -o eth0 - s 192.168.1.1 \ -j MASQUERADING
- การทำ เครื่องนอกเครือข่าย ให้สามารถเข้ามาใช้งานภายในเครือข่ายได้
เราต้องทำการ Configure DNAT และ SNAT เพื่อไม่ให้เกิดความสับสนขึ้นในภายในเครือข่ายของเรา เพราะถ้ามีการเข้ามาภายในเครือข่ายของเราจากภายนอกนั้น อาจเกิดปัญหาขึ้นของการกำหนด IP Address ที่อยู่ภายในเครือข่าย การ Configure DNAT และ SNAT มีคำสั่งดังนี้
สมมติว่าเครื่องที่มาจากภายนอกต้องการติดต่อเข้ามาที่เซิร์ฟเวอร์ ใช้ IP 192.168.1.72 โดยเครื่องภายนอกใช้ IP Address คือ 192.0.34.72 #iptables -t nat -A PREROUTING - i eth0 -o eth1 - d 192.0.34.72 \ -j DNAT --to-destination 192.168.1.72 #iptables -t nat -A POSTROUTING - s 192.168.1.0/24 -d 192.168.1.72 \ -j SNAT --to-source 192.168.1.1
- การทำ firewall ด้วย iptables
ในที่นี้จะขอยกตัวอย่างการอนุญาตและไม่อนุญาต ให้ใช้งานของ port ต่างๆ ที่ทำการเชื่อมต่อกับเครือข่ายภายนอก
#iptables -A INPUT -s 192.168.1.0/24 -d 0/0 -p tcp --dport 23 --syn -j ACCEPT การอนญาติให้เครือข่ายภายในสามารถ telnet ไปยังปลายทางที่ไหนก็ได้
#iptables -A INPUT -s 0/0 -d 0/0 -p tcp --dport 80 --syn -j ACCEPT การอนุญาตให้ใช้เรียกใช้งานเว็บได้ไม่ว่าจะเรียกจากที่ไหน และเรียกไปที่ไหนก็ได้
#iptables -A INPUT -s 192.168.1.0/24 -d 0/0 -p udp --dport 4000 -j ACCEPT การอนุญาตให้เครือข่ายภายสามารถใช้งาน ICQ ได้
#iptables -A INPUT -s 0/0 -d 0/0 -p tcp --dport 0:1023 --syn -j REJECT ไม่อนุญาตให้ใช้งาน tcp พอร์ต 0-1023 ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
#iptables -A INPUT -s 0/0 -d 0/0 -p udp --dport 0:1023 -j REJECT ไม่อนุญาตให้ใช้งาน udp พอร์ต 0-1023 ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
สรุป
- การทำไฟร์วอลล์ด้วย Linux ผมได้ยกตัวอย่างการทำโดยการใช้ iptables ในการจัดทำระบบขึ้น การนำ iptables ไปใช้งานจริงนั้น จะต้องสร้าง rule ขึ้นมาให้สอดคล้องกับเครือข่ายที่มีอยู่ และระดับความปลอดภัยที่ต้องการ เพื่อที่จะให้การทำงานขององค์กรต่างๆสามารถดำเนินงานไปได้ด้วยความเรียบร้อย ปลอดภัยจาก ภัยคุกคามต่างๆ และสามารถกำหนด สิทธิ และหน้าที่ ได้ด้วย ในข้อมูลที่ผมได้นำมาเสนอนั้น เป็นแค่ตัวอย่างบางส่วนในการทำไฟร์วอลล์ด้วย Linux อาจจะเป็นประโยชน์แก่บางคน ถ้ามีความผิดพลาดประการใด ผมขอ อภัยมา ณ โอกาสนี้
เอกสารอ้างอิงและเว็บลิงค์
- http://www.thaicert.nectec.or.th/paper/firewall/iptables/rc_firewall.txt
- http://www.linux-mag.com/2000-01/bestdefense_01.html
- http://www.boingworld.com/workshops/linux/iptables-tutorial/iptables-tutorial/iptables-tutorial.html
- http://www6.software.ibm.com/developerworks/education/l-fw/
- http://www.thaicert.nectec.or.th/paper/firewall/fwbasics.php
- http://www.thaicert.nectec.or.th/paper/basic/home_networks.php
- http://www.itwizard.info/technology/linux/gateway_firewall_iptables.html
