I. Filter Table
เป็นตารางที่ใช้งานมากที่สุด เป็นจุดที่ใช้ในการตรวจสอบและควบคุมการผ่านเข้าออกของ packet
ถ้าหากจะพิจารณาการไหลเวียนของ packet เฉพาะในส่วนของ filter table โดยไม่สนใจ table อื่นๆ นั้น
ก็พอจะแสดงให้เห็นได้ดังภาพที่ 1 โดยเมื่อ packet เข้ามาในระบบ มันจะเข้าไปยัง routing decision
เพื่อตัดสินใจว่า packet จะถูกส่งไปที่ใด
* ในกรณีที่ packet ถูกส่งผ่านไปยังเครื่องอื่น packet นั้นจะต้องถูกตรวจสอบโดย rule ใน FORWARD
chain
* ถ้า packet นั้น มีเป้าหมายเป็นเครื่องปัจจุบัน (เครื่องที่รัน iptables อยู่นี้ เรียกอีกอย่างว่า
linux box) ตัว packet จะถูกตรวจสอบโดย rule ใน INPUT chain
* และในกรณีที่ packet ถูกสร้างจากเครื่องปัจจุบัน (linux box) ตัว packet จะถูกตรวจสอบจาก rule ใน
OUTPUT chain ก่อนที่จะถูกส่งออกไป
รูปที่ 1 แสดงให้เห็นว่า packet มีเส้นทางการเดินทางอย่างไรเมื่อเข้ามาในระบบ (filter table)
ดังภาพ iptables ประกอบไปด้วย built-in chain จำนวน 3 chain ซึ่งไม่สามารถลบได้คือ INPUT, OUTPUT,
FORWARD เมื่อเครื่องคอมพิวเตอร์เริ่มทำงานในครั้งแรก ทั้งสาม chain จะมี default policy เป็น ACCEPT
ซึ่งหมายความว่าอนุญาตให้ทุกอย่างผ่านเข้าออกได้หมด และสำหรับ FORWARD chain นั้น ถึงแม้จะได้กำหนดให้
policy เป็น ACCEPT แล้ว packet ก็จะยังไม่สามารถถูก forward ไปยังจุดหมายที่ต้องการได้
ตราบใดที่ยังไม่ได้เซ็ตให้ enable IP forwarding ทั้งนี้โดย default แล้ว forward=0 สามารถกำหนดให้
enable IP forwarding (forward=1) ได้ โดย
ใช้คำสั่ง echo "1" > /proc/sys/net/ip_forward เพื่อกำหนดให้ IP forwarding เป็น
enable เพื่อให้ Linux box สามารถ forward ip packet ได้
ในบางครั้งนั้นการใช้คำสั่งดังกล่าวทุกครั้งอาจจะไม่สะดวก สามารถแก้ไขไฟล์ configuration ที่
/etc/sysctl.conf แล้ว set ให้ net.ipv4.ip_forward=1 เพื่อเป็นการแก้ไขแบบถาวร
ในกรณีที่ต้องการให้สนับสนุนการทำงานกับ dynamic IP ด้วย เช่น PPP, SLIP, DHCP
ก็สามารถทำได้โดยใช้คำสั่ง echo "1" > /proc/sys/net/ipv4/ip_dynaddr ได้เช่นเดียวกัน
II. Mangle Table
เป็นตารางที่ใช้สำหรับแก้ไขข้อมูล TOS, TTL, MARK ของ packet ซึ่งโดยปกติแล้วแทบจะไม่ได้ใช้งาน
และไม่ควรทำ packet filtering หรือกรอง packet ที่ตารางนี้ รวมทั้งไม่ควรทำ DNAT, SNAT หรือ
Masquerading ที่ตารางนี้อย่างเด็ดขาดด้วย
III. Nat Table
เป็นตารางที่ใช้สำหรับทำ network address translation เช่น เปลี่ยนค่า source ip address, destination
ip address จุดสำคัญอีกอย่างหนึ่งที่ต้องรู้ก็คือ มีเพียง packet แรกเท่านั้นที่เข้ามาที่ chain นี้
ส่วน packet ถัดไปนั้นจะถูกกระทำเหมือนที่ packet แรกได้รับ ดังนั้นจึงไม่ควรทำ packet filtering ที่
chain เหล่านี้
การใช้งาน Nat table นั้นก็เพียงแต่ใช้ออปชัน -t nat เท่านั้น และ target ที่สามารถใช้งานได้คือ SNAT,
DNAT, Masquerade, Redirect ซึ่งมีรายละเอียดดังนี้
* SNAT
การทำ source NAT จะทำที่ POSTROUTING chain โดย หลักๆ คือทำการเปลี่ยน source address
ก่อนที่จะส่ง packet นั้นออกไป ซึ่งสามารถใช้ออปชัน -o (outgoing interface) ร่วมด้วยได้
นอกจากนี้ยังใช้ -j SNAT และ --to--source หรือ --to เพื่อเปลี่ยนไอพีแอดเดรสหรือ port ไปตามต้องการได้
เช่น
##เปลี่ยน source ip address เป็น 1.2.3.4
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
##เปลี่ยน source address เป็น 1.2.3.4, 1.2.3.5 หรือ 1.2.3.6
# iptables -t nat -A POSTROUING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6
##เปลี่ยน source address เป็น 1.2.3.4 port 1-1023
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023
Masquerading
การทำ masquerade นั้นเป็นหนึ่งในรูปแบบของการทำ source NAT แบบพิเศษ ซึ่งใช้สำหรับ
กรณีที่ได้รับไอพีแบบไม่ซ้ำ(dynamically-assigned IP address) เช่น ผู้ที่ใช้โมเด็มล็อกอินเข้าไปยัง isp
(สำหรับผู้ที่ใช้ static IP address ให้ใช้ SNAT ดังตัวอย่างด้านบน) ซึ่งข้อดีของการทำ masquerading
คือไม่จำเป็นต้องระบุค่าของไอพีแอดเดรสที่จะใช้ในการเปลี่ยน เช่น
##ทำ masquerade สำหรับทุก packet ที่วิ่งผ่าน ppp0
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
* DNAT
การทำ Destination NAT จะทำภายใต้ PREROUTING chain หลักๆ คือการเปลี่ยนค่า destination address
หรือ port ก่อนที่จะส่ง packet ไปยัง routing decision
โดยปกติการใช้งานจะระบุ -j DNAT และใช้ --to-destination หรือ --to และยังสามารถใช้ -i (incoming
interface) ร่วมด้วยได้ เช่น
##เปลี่ยน destination address เป็น 192.168.1.20
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.1.20
##เปลี่ยน destination address เป็น 192.168.1.20, 192.168.1.21 หรือ 192.168.1.22
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.1.20-192.168.1.22
##เปลี่ยน destination address ของ web traffic เป็น 192.168.1.50 port 8080
# iptables -t nat -A PREROUING -p tcp --dport 80 -ieth0 -j DNAT --to 192.168.1.50:80
Redirection
การทำ redirect นั้นเป็นหนึ่งในรูปแบบของการทำ Destination NAT แบบพิเศษ เช่น
##เปลี่ยน web traffic ธรรมดาให้ผ่านไปยัง squid proxy (transparent)
# ip tables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j REDIRECT --to-port 3128
##หมายเหตุ จำเป็นต้องมีการ set ที่ squid เพิ่มเติมด้วย
นอกจากนี้ยังสามารถสร้าง rule ที่ใช้ค่า address ร่วมกันได้ เช่น เปลี่ยน source address ของเครื่อง
192.168.1.1 และ 192.168.1.2 ไปเป็น 1.2.3.4 ร่วมกันได้ เพราะ NAT
ฉลาดเพียงพอที่จะแยกแยะและป้องกันการชนกัน และมีตัวอย่างการใช้งานแบบอื่นอีกเช่น
# iptables -t nat -A POSTROUTING -s 192.168.0/24 -o eth1 -j SNAT --to 1.2.3.0/24
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to 1.2.3.0-1.2.3.4 --to
1.2.3.6-1.2.3.254
และสำหรับการทำ source NAT ต้องมั่นใจว่า เมื่อ packet เดินทางไปถึงเป้าหมายแล้ว packet นั้นๆ
สามารถเดินทางกลับมาหาเครื่องที่เป็นเจ้าของ packet นั้นได้จริงๆ เช่น หากทำ SNAT จาก private IP เป็น
1.2.3.4 เมื่อ packet ถูกส่งไปถึงปลายทาง และปลายทางต้องการส่งกลับมา packet นั้นจะต้องเดินทางมาถึง
linux box ที่รัน iptables นี้เท่านั้น การสื่อสารจึงจะสมบูรณ์ ซึ่งสามารถทำได้ด้วยวิธีต่างๆ ดังนี้คือ
1. กรณีที่ทำ SNAT โดยใช้ไอพีแอดเดรสของเครื่อง linux box นั้นเอง และเป็นเครื่องที่ทำ routing
เรียบร้อยแล้ว และทุกอย่างสามารถสื่อสารกันได้ ก็ไม่ต้องทำอะไร
2. ถ้าทำ SNAT โดยใช้ไอพีแอดเดรสที่ไม่ใช่ไอพีของ linux box นั้นๆ แต่เป็นไอพีแอดเดรสที่อยู่ใน
network เดียวกันและไม่มีเครื่องใดใช้ เครื่อง linux box นั้นจะต้องสามารถทำ ARP reply ตอบกลับ ARP
request ที่ถูกส่งออกมาเพื่อค้นหา MAC address สำหรับไอพีแอดเดรสที่ทำ SNAT นั้นได้
ซึ่งสามารถแก้ไขได้โดยการสร้าง IP alia ดังคำสั่งด้านล่าง
#ip address add 1.2.3.99 dev eth0
หรืออาจจะเพิ่ม arp record ที่เครื่องที่ทำหน้าที่เป็น gateway ของ linux box
3. หรือถ้าทำ SNAT โดยใช้ไอพีแอดเดรสที่แตกต่างกันออกไปจาก Linux box โดยสิ้นเชิง (เช่น
ไอพีแอดเดรสคนละ network) ก็จำเป็นต้องมีการแก้ไข routing table ที่เครื่องที่ทำหน้าที่เป็น gateway ของ
Linux box ที่รัน iptables อยู่
มีเอกสารอธิบายเกี่ยวกับความปลอดภัยในการใช้ NAT ที่http://thaicert.nectec.or.th/paper/firewall/nat.phpซึ่งหลังจากอ่านแล้วจะช่วยให้มองเห็นภาพได้ชัดเจนว่า ต้องทำ NAT หรือไม่อย่างไร
ตัวอย่างที่ 1 การใช้งาน iptables แบบง่าย
ในการใช้งาน iptables ในระบบที่ใช้งานจริงนั้น โดยส่วนใหญ่จะเขียนเป็น script ขึ้นมา
ซึ่งมีความซับซ้อนพอสมควร ซึ่งก่อนจะไปถึงขั้นนั้นมีวิธีทดลองใช้คำสั่งง่ายๆ
เพื่อทำความเข้าใจหลักการทำงานเบื้องต้นของ iptables
เช่น ต้องการ drop packet ที่เป็น ICMP ทั้งหมด ที่ออกจากเครื่องนี้ ซึ่งในกรณีนี้ไม่จำเป็นต้องระบุ
source ip address เพราะทุก packet ที่ออกจากเครื่องนี้จะต้องผ่านการตรวจสอบจาก OUTPUT chain
เริ่มการทดสอบโดยทดลอง ping ไปยัง
www.nectec.or.th ซึ่งจะได้ผลลัพธ์คล้ายด้านล่างนี้
# ping -c 1
www.nectec.or.thPING
www.nectec.or.th (202.44.204.33) from 203.154.207.22 : 56(84) bytes of data.
64 bytes from
www.nectec.or.th (202.44.204.33): icmp_seq=0 ttl=61 time=3.710 msec
---
www.nectec.or.th ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/mdev = 3.710/3.710/3.710/0.000 ms
ซึ่ง option -c 1 ระบุให้ส่ง packet ออกไปแค่ packet เดียว จากนั้นให้ใช้คำสั่งดังด้านล่างนี้ เพื่อ
block ICMP packet ที่จะออกจากเครื่องนี้
# iptables -A OUTPUT -p icmp -j DROP
จากนั้นทดลอง ping อีกครั้ง เพื่อตรวจสอบผลลัพธ์ที่ได้
# ping -c 1
www.nectec.or.thPING
www.nectec.or.th (202.44.204.33) from 203.154.207.22 : 56(84) bytes of data.
ping: sendto: Operation not permitted
---
www.nectec.or.th ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
ซึ่งผลลัพธ์แสดงให้เห็นว่า ICMP echo-request packet ดังกล่าวไม่ได้รับอนุญาตให้ผ่าน OUTPUT chain ไปได้
และถ้าหากต้องการลบ rule ดังกล่าวก็สามารถทำได้หลายวิธีคือ
# iptables -F OUTPUT (ซึ่งจะลบทุก rule ใน chain OUTPUT นี้)
# iptables -D OUTPUT 1 (เนื่องจากรู้ว่ามี rule เดียวจึงสามารถสั่งลบ rule ลำดับที่ 1 ได้เลย)
หรือ
# iptables -D OUTPUT -p icmp -j DROP (ลบ rule โดยการระบุออปชันของ rule ที่ต้องการได้โดยตรง)
ตัวอย่างที่ 2 การทำ Masquerading
ตัวอย่างการใช้งาน masquerading ที่เห็นได้ชัดเจนในประเทศไทยก็คือ ร้านอินเทอร์เน็ตคาเฟ่(แบบประหยัด)
ซึ่งนิยมใช้โมเด็ม 1 ตัว connect ไปยัง ISP แล้วใช้ NAT เพื่อให้เครื่องลูกที่มีอยู่หลายๆ เครื่องนั้น
สามารถใช้งานอินเทอร์เน็ตผ่านโมเด็มตัวนั้นได้ โดยเครื่องลูกจะต้องใช้ private ip ซึ่งมีให้เลือกหลาย
class เช่น 10.x.x.x 192.168.x.x เป็นต้น จากนั้นก็ตั้ง gateway ให้ชี้ไปยัง linux box
ที่ทำหน้าที่หมุนโมเด็มและรัน iptables ซึ่งสามารถใช้คำสั่งง่ายๆ
ดังด้านล่างก็ทำให้เครื่องลูกสามารถใช้งานอินเทอร์เน็ตได้แล้ว คือ
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
# echo "1" > /proc/sys/net/ip_forward
ตัวอย่างที่ 3 การเขียน rule จากเครือข่ายตัวอย่าง rc.firewall (ตัวอย่างเครือข่ายและ script
นี้คัดลอกมาจากเว็บไซต์
www.boingworld.com)