การใช้ iptables สำหรับ share internet connection และใช้เป็น filewall

By | 21/05/2011

เหมาะสำหรับผู้ที่มีเครื่องคอมพิวเตอร์จำนวนมากในความดูแล และ/หรือมีการเชื่อมต่อกับอินเทอร์เน็ต มีเครื่องเซิร์ฟเวอร์เปิดให้บริการกับสาธารณชน เช่น web service, ftp service, mail service เป็นต้น และต้องการเพิ่มความปลอดภัยให้กับระบบ เนื่องจากไฟร์วอลล์ทำหน้าที่ควบคุมการเข้าออกของข้อมูลใน port ที่ได้รับอนุญาตเท่านั้น ดังนั้นผู้ที่จะเขียน rule ของไฟร์วอลล์ได้ต้องมีความรู้เกี่ยวกับ TCP/IP พอสมควร และขอย้ำตรงนี้อีกว่า ไฟร์วอลล์ไม่ใช่อุปกรณ์ป้องกันการบุกรุกระบบที่สมบูรณ์ 100% เพราะการโจมตีที่เกิดขึ้นในปัจจุบันนั้นมักจะโจมตีผ่าน port ที่เป็นที่รู้จัก เช่น 21, 22, 25, 53, 80 ซึ่งไฟร์วอลล์มักจะอนุญาตให้ข้อมูลเข้าออกผ่านทาง port เหล่านี้เสมอ ดังนั้นควรใช้เครื่องมืออื่นๆ ช่วย
การใช้ iptables จะต้องสร้าง chain ให้ระบบ โดยเขียน Parameter ต่อท้ายซึ่งมี Parameter หลักที่จำเป็นดังนี้

-A หมายถึง การเพิ่ม Chain ให้ระบบ
-F หมายถึง สั่งลบ Chain เดิมที่เคยสร้างไว้ทั้งหมด
-N หมายถึง ตั้งชื่อ Chain ใหม่
-P หมายถึง การกำหนด Policy
-X หมายถึง ลบชื่อ Chain
-I หมายถึง เพิ่ม rule ใหม่ ใน chain
-s หมายถึง ( Source ) IP Address ต้นทาง
-d หมายถึง ( Destination ) IP Address ปลายทาง
-p หมายถึง Protocal เช่น tcp, udp, icmp
– -dport หมายถึง ( Destination Port ) หมายเลขหรือชื่อ Port ปลายทาง
– -sport หมายถึง ( Source Port ) หมายเลขหรือชื่อ Port ต้นทาง
-j หมายถึง การกำหนดให้เชื่อมต่อกันระหว่างต้นทาง ( Source ) กับปลายทาง ( Destination )
ที่นิยมใช้คือ ACCEPT, REJECT, DENY, MASQUERADE และ REDIRECT
-o หมายถึง packet ที่จะ match กับ rule นี้กำลังจะเดินผ่าน interface ที่ระบุไว้ เช่น -o eth0
-i หมายถึง packet ที่จะ match กับ rule นี้ต้องเข้ามาจาก interface ที่กำหนด เช่น -i eth0
-m หมายถึง เป็น option ที่ใช้กรอง packet ที่ถูกส่งเข้ามา – ออกไป ของ eth0 หรือ ppp0
Input คือ ส่วนที่ใช้รับค่าต่างๆ จากภายนอกเข้า Server
Output คือ ส่วนที่ส่งค่าต่างๆ ออกจาก Server ไปยังภายนอก
Forward คือ ส่วนที่ต้องการให้ลูกข่าย ติดต่อออกไปภายนอก Server
The State Match
รูปแบบการใช้งาน : -m state หรือ – -match state
เป็นโมดูลที่ใช้ประโยชน์ได้เป็นอย่างดี มีออปชันให้ใช้งานดังนี้
NEW รูปแบบการใช้งาน: -m state –state new หรือ –match state –state new
หมายถึง packet ที่เป็นตัวสร้าง connection ใหม่
ESTABLISHED รูปแบบการใช้งาน: -m state –state established หรือ –match state –state establishedหมายถึง packet ที่เกี่ยวข้องกันกับ connection ที่สร้างไว้แล้ว เช่น echo-reply packet หรือ packet ที่ส่งข้อมูลออกไปจาก web server เมื่อมี request web service เข้ามา
RELATED รูปแบบการใช้งาน: -m state –state related หรือ –match state –state related
เป็น packet ที่เกี่ยวข้องกับ connection ที่สร้างไว้แล้ว แต่ไม่ใช่ส่วนหนึ่งส่วนใดของ connection นั้น เช่น FTP data packet (port 20) ที่เกิดขึ้นจากการใช้คำสั่งใน FTP command (port 21)
INVALID รูปแบบการใช้งาน: -m state –state invalid หรือ –match state –state invalid
เป็น packet ที่ไม่เกี่ยวข้องกับส่วนอื่นเลย เช่น icmp echo-reply ที่เกิดขึ้น โดยที่ไม่มีเครื่องได้ในระบบส่ง echo-request ออกไปเลย (กรณีเช่นนี้เกิดขึ้นได้เนื่องจากอาจจะโดนโจมตีแบบ Smurf attack)

วิธีการ setiptables สำหรับ share internet และการทำ filewall
ให้ลบ rule ทั้งหมดที่มีทุก chain ใน file /etc/sysconfig/iptables

iptables –flush
iptables -t nat -F
( ลบ chain nat table ที่ใช้สำหรับการแปลงแอดเดรส )
iptables -t mangle -F
( ลบ chain mangle table ที่ใช้สำหรับการเปลี่ยนแปลงหรือแก้ไข packet )
iptables -t filter -F
( ลบ chain filter table ที่ใช้สำหรับกรอง packet )
iptables -X
( ลบ chain ที่ไม่มี rule ซึ่งสามารถลบ user-define chain ที่ไม่มี rule ได้ )

โหลด module ที่จำเป็นต้องใช้ในการ share internet connection โดยใช้คำสั่ง insmod ในการ load module
insmod ip_tables
insmod ip_conntrack
insmod ip_conntrack_ftp
insmod iptable_nat
insmod ip_nat_ftp

เปิดการทำงานของ Masquerading และการ forward packet ( การทำ MASQUERADE เป็นการทำให้ Server สามารถ Share Internet ให้เครื่องลูกข่ายเข้าใช้งาน Internet ได้ )
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE (ทำMASQUERADEสำหรับทุกpacket ที่วิ่งผ่าน ppp0 )
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
( ทำMASQUERADEสำหรับทุกpacket ที่วิ่งผ่าน eth0 )
iptables -A FORWARD -i eth0 -j ACCEPT
( packet ถูกส่งเข้ามายังFORWARD chain โดยวิ่งผ่าน eth0 )
echo 1 > /proc/sys/net/ipv4/ip_forward
( เพื่อกำหนดให้ IP forwarding เป็น Enable เพื่อให้ Linux box สามารถ forward ip packet ได้ )


ยอมให้ connections ที่ผ่าน rule แล้วไม่ต้องถูกตรวจสอบจาก firewall อีก
iptables -A FORWARD -i ppp0 -o eth0 -m state –state ESTABLISHED,RELATED -j ACCEPT (เป็นคำสั่งที่ทำให้ iptables นี้ตรวจสอบ packet ว่ามีเป็นส่วนหนึ่งของ connection ที่สร้างไว้แล้วหรือไม่(ESTABLISHED) ถ้าใช่ก็จะปล่อยให้ผ่านไป (ACCEPT) โดยการส่งข้อมูลเข้าผ่านทาง ppp0(Modem) และให้ส่งข้อมูลออกทาง eth0 (Lan Card)โดยมีความสัมพันธ์(related)กันระหว่าง ppp0 กับ eth0)
iptables -A FORWARD -i eth0 -o ppp0 -m state –state ESTABLISHED,RELATED -j ACCEPT

(เป็นคำสั่งที่ทำให้ iptables นี้ตรวจสอบ packet ว่ามีเป็นส่วนหนึ่งของ connection ที่สร้างไว้แล้วหรือไม่(ESTABLISHED) ถ้าใช่ก็จะปล่อยให้ผ่านไป (ACCEPT) โดยการส่งข้อมูลเข้าผ่านทาง eth0(LanCard) และให้ส่งข้อมูลออกทาง ppp0 (Modem)โดยมีความสัมพันธ์(related)กันระหว่าง ppp0 กับ eth0)

ยอมให้มีการเชื่อมโยงกันทุกประเภทภายในเครือข่าย (internal network)
iptables -A INPUT -s 192.168.0.0/16 -d 192.168.0.0/16 -j ACCEPT (เป็นการรับข้อมูลเข้าโดยมี source IP(ต้นทาง) ที่ 192.168.0.0/16 และ destination IP (ปลายทาง) ที่ 192.168.0.0/16 )
iptables -A OUTPUT -s 192.168.0.0/16 -d 192.168.0.0/16 -j ACCEPT

(เป็นการส่งข้อมูลออกโดยมี source IP(ต้นทาง) ที่ 192.168.0.0/16 และ destination IP (ปลายทาง) ที่ 192.168.0.0/16 ) ##(หมายเลขIP/netmask)

ยอมให้มีการ forward packet จากเครื่องลูกข่าย (clients) ไปยังภายนอก network ที่อยู่
iptables -A FORWARD -m state –state NEW -i eth0 -j ACCEPT ( packet ที่เป็นตัวสร้าง connection ใหม่ โดยให้ส่งข้อมูลเข้าทาง eth0 (Lan Card))
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
( เป็นคำสั่งที่ทำให้ iptables สามารถทำงานได้ในรูปแบบของ stateful inspection ที่แท้จริง โดย rule นี้จะตรวจสอบ packet ว่ามีเป็นส่วนหนึ่งของ connection ที่สร้างไว้แล้วหรือไม่(ESTABLISHED) ถ้าใช่ก็จะปล่อยให้ผ่านไป (ACCEPT) และในกรณีที่เครื่องภายในเครือข่ายเรียกใช้ ftp ไปยังเครื่องอื่นในอินเทอร์เน็ตนั้น คำสั่งที่ส่งไปจะใช้ destination port เป็น 21 แต่ data port ที่ใช้สำหรับรับส่งข้อมูลใน ftp นั้นเป็น port 20 ซึ่ง port ที่เกิดขึ้นนี้ถือว่ามีความสัมพันธ์(related)กับ port 21 ดังนั้นจึงสามารถรับส่งไฟล์ผ่าน port 20 ได้โดยไม่จำเป็นต้องสร้าง rule เพิ่มเติมแต่อย่างใด )
iptables -I FORWARD -i ppp0 -d 0.0.0.0 -j ACCEPT
( เพิ่ม chain ให้ส่ง packet เข้ามาทาง ppp0 และ destination IP ปลายทางที่ 0.0.0.0 )
iptables -I FORWARD -s 192.168.0.0/16 -d 0.0.0.0 -j ACCEPT
( เพิ่ม chain ให้ส่ง packet เข้ามาทาง Source IP ที่ 192.168.0.0/16 และ destination ปลายทางที่ 0.0.0.0 )

ให้ยอมรับ Stateful Traffic คือ การส่ง packet ผ่านชั้น Network ตาม OSI Model 7 Layer ต้องศึกษาเรื่อง OSI Model 7 Layer ผู้เขียนได้เก็บข้อมูลไว้ที่ไฟล์อ้างอิง
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

อนุญาต traffic จาก loopback interface
iptables -A INPUT -i lo -j ACCEPT ( เป็นการรับข้อมูลเข้า Server ทาง Loopback ของ Lancard )
iptables -A OUTPUT -o lo -j ACCEPT ( เป็นการส่งข้อมูลออกจาก Server ทาง Loopback ของ Lancard )

การทำ redirect นั้นเป็นหนึ่งในรูปแบบของการทำ Destination NAT แบบพิเศษ เช่น
เปลี่ยน web traffic ธรรมดาให้ผ่านไปยัง squid proxy (transparent)
redirect พอร์ต 80 ไปยังพอร์ต 8080 เพื่อให้การใช้ WWW ผ่าน squid proxy

iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j REDIRECT –to-port 8080
## จำเป็นต้องมีการ set ที่ squid เพิ่มเติมด้วย

เซ็ต default policy ของ INPUT traffic ให้เป็น drop ยกเว้นจะมีการกำหนด rule เป็นอย่างอื่น
iptables -P INPUT DROP ( packet ถูกส่งเข้ามาและไม่ match กับ rule ใดๆมันก็จะถูก DROP ทันที )

ไม่อนุญาตให้มี INPUT connection จากภายนอก (ยกเว้น 192.168.0.0/16)
iptables -A INPUT -s ! 192.168.0.0/16 -p all -j DROP ( packet ที่ถูกส่งเข้ามายัง server อนุญาติให้ส่งได้เฉพาะเครื่องที่มี IP อยู่ในช่วง 192.168.0.0/16 เท่านั้น IP อื่นไม่อนุญาติ )

เซ็ต policy ของ OUTPUT traffic เป็น ACCEPT ยกเว้นจะมีการกำหนด rule เป็นอย่างอื่น
iptables -P OUTPUT ACCEPT ( packet ถูกส่งออกไปไม่match กับ rule ใดๆมันก็จะถูก DROP ทันที )

ห้าม connection ไปยังภายนอกจากพอร์ต 31337, 31335, 27444, 27665,
# 20034, 9704, 1433, 2049, 2432, 5999, 6068, 6900 ซึ่งส่วนใหญ่
# พอร์ตเหล่านี้จะเป็นพอร์ตที่ backdoor ใช้

iptables -A OUTPUT -o eth0 -p tcp –dport 31337 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 31335 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 27444 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 27665 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 20034 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 9704 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 1433 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 2049 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 2432 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 5999 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 6068 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 6900 -j DROP

save rule ที่สร้างขึ้นมาใหม่ และ restart iptables
service iptables save
service iptables restart

หลังจากใช้ rules ใหม่ของ iptables แล้วแต่ถ้ายังใช้ www ไม่ได้อาจอาจจะต้อง restart squid ใหม่
โดยใช้คำสั่ง

service squid stop
service squid start

หรืออาจจะต้องรีบูตเครื่องใหม่ด้วย

แก้ไฟล์ /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1 ( เซ็ตให้เป็น enable IP forwarding เป็นการกำหนดให้ policy เป็น ACCEPT ทำให้ packet สามารถถูก forward ไปยังจุดหมายที่ต้องการได้ )

โดยใช้คำสั่ง pico /etc/sysctl.conf

สำหรับการใช้งาน iptables ในการใช้งาน Internet คุณสามารถที่จะกำหนดขอบเขตในการ ทำงานเพิ่มเติมได้ ซึ่งจะช่วยในการป้องกันการบุกรุกจากผู้ที่ไม่หวังดีได้ ตามความพอใจของ Admin ที่ดูแล ระบบและการใช้งาน Internet ภายในองค์กรของท่านได้ และผู้เขียนได้แทรกไฟล์ wordไว้ที่ไฟล์ setiptables และได้แนบไฟล์เอกสารอ้างอิงไว้ด้วย Iptables.zip

โดย linuxstep team,linuxstep@eve.co.th,linux@eve.co.th วันที่ 17/03/2547

เหมาะสำหรับผู้ที่มีเครื่องคอมพิวเตอร์จำนวนมากในความดูแล และ/หรือมีการเชื่อมต่อกับอินเทอร์เน็ต มีเครื่องเซิร์ฟเวอร์เปิดให้บริการกับสาธารณชน เช่น web service, ftp service, mail service เป็นต้น และต้องการเพิ่มความปลอดภัยให้กับระบบ เนื่องจากไฟร์วอลล์ทำหน้าที่ควบคุมการเข้าออกของข้อมูลใน port ที่ได้รับอนุญาตเท่านั้น ดังนั้นผู้ที่จะเขียน rule ของไฟร์วอลล์ได้ต้องมีความรู้เกี่ยวกับ TCP/IP พอสมควร และขอย้ำตรงนี้อีกว่า ไฟร์วอลล์ไม่ใช่อุปกรณ์ป้องกันการบุกรุกระบบที่สมบูรณ์ 100% เพราะการโจมตีที่เกิดขึ้นในปัจจุบันนั้นมักจะโจมตีผ่าน port ที่เป็นที่รู้จัก เช่น 21, 22, 25, 53, 80 ซึ่งไฟร์วอลล์มักจะอนุญาตให้ข้อมูลเข้าออกผ่านทาง port เหล่านี้เสมอ ดังนั้นควรใช้เครื่องมืออื่นๆ ช่วย 

การใช้ iptables จะต้องสร้าง chain ให้ระบบ โดยเขียน Parameter ต่อท้ายซึ่งมี Parameter หลักที่จำเป็นดังนี้

-A หมายถึง การเพิ่ม Chain ให้ระบบ
-F หมายถึง สั่งลบ Chain เดิมที่เคยสร้างไว้ทั้งหมด
-N หมายถึง ตั้งชื่อ Chain ใหม่
-P หมายถึง การกำหนด Policy
-X หมายถึง ลบชื่อ Chain
-I หมายถึง เพิ่ม rule ใหม่ ใน chain
-s หมายถึง ( Source ) IP Address ต้นทาง
-d หมายถึง ( Destination ) IP Address ปลายทาง
-p หมายถึง Protocal เช่น tcp, udp, icmp
– -dport หมายถึง ( Destination Port ) หมายเลขหรือชื่อ Port ปลายทาง
– -sport หมายถึง ( Source Port ) หมายเลขหรือชื่อ Port ต้นทาง
-j หมายถึง การกำหนดให้เชื่อมต่อกันระหว่างต้นทาง ( Source ) กับปลายทาง ( Destination )
ที่นิยมใช้คือ ACCEPT, REJECT, DENY, MASQUERADE และ REDIRECT
-o หมายถึง packet ที่จะ match กับ rule นี้กำลังจะเดินผ่าน interface ที่ระบุไว้ เช่น -o eth0
-i หมายถึง packet ที่จะ match กับ rule นี้ต้องเข้ามาจาก interface ที่กำหนด เช่น -i eth0
-m หมายถึง เป็น option ที่ใช้กรอง packet ที่ถูกส่งเข้ามา – ออกไป ของ eth0 หรือ ppp0
Input คือ ส่วนที่ใช้รับค่าต่างๆ จากภายนอกเข้า Server
Output คือ ส่วนที่ส่งค่าต่างๆ ออกจาก Server ไปยังภายนอก
Forward คือ ส่วนที่ต้องการให้ลูกข่าย ติดต่อออกไปภายนอก Server
The State Match
รูปแบบการใช้งาน : -m state หรือ – -match state
เป็นโมดูลที่ใช้ประโยชน์ได้เป็นอย่างดี มีออปชันให้ใช้งานดังนี้
NEW รูปแบบการใช้งาน: -m state –state new หรือ –match state –state new
หมายถึง packet ที่เป็นตัวสร้าง connection ใหม่
ESTABLISHED รูปแบบการใช้งาน: -m state –state established หรือ –match state –state establishedหมายถึง packet ที่เกี่ยวข้องกันกับ connection ที่สร้างไว้แล้ว เช่น echo-reply packet หรือ packet ที่ส่งข้อมูลออกไปจาก web server เมื่อมี request web service เข้ามา
RELATED รูปแบบการใช้งาน: -m state –state related หรือ –match state –state related
เป็น packet ที่เกี่ยวข้องกับ connection ที่สร้างไว้แล้ว แต่ไม่ใช่ส่วนหนึ่งส่วนใดของ connection นั้น เช่น FTP data packet (port 20) ที่เกิดขึ้นจากการใช้คำสั่งใน FTP command (port 21)
INVALID รูปแบบการใช้งาน: -m state –state invalid หรือ –match state –state invalid
เป็น packet ที่ไม่เกี่ยวข้องกับส่วนอื่นเลย เช่น icmp echo-reply ที่เกิดขึ้น โดยที่ไม่มีเครื่องได้ในระบบส่ง echo-request ออกไปเลย (กรณีเช่นนี้เกิดขึ้นได้เนื่องจากอาจจะโดนโจมตีแบบ Smurf attack)

วิธีการ setiptables สำหรับ share internet และการทำ filewall
ให้ลบ rule ทั้งหมดที่มีทุก chain ใน file /etc/sysconfig/iptables

iptables –flush
iptables -t nat -F
( ลบ chain nat table ที่ใช้สำหรับการแปลงแอดเดรส )
iptables -t mangle -F
( ลบ chain mangle table ที่ใช้สำหรับการเปลี่ยนแปลงหรือแก้ไข packet )
iptables -t filter -F
( ลบ chain filter table ที่ใช้สำหรับกรอง packet )
iptables -X
( ลบ chain ที่ไม่มี rule ซึ่งสามารถลบ user-define chain ที่ไม่มี rule ได้ )

โหลด module ที่จำเป็นต้องใช้ในการ share internet connection โดยใช้คำสั่ง insmod ในการ load module
insmod ip_tables
insmod ip_conntrack
insmod ip_conntrack_ftp
insmod iptable_nat
insmod ip_nat_ftp

เปิดการทำงานของ Masquerading และการ forward packet ( การทำ MASQUERADE เป็นการทำให้ Server สามารถ Share Internet ให้เครื่องลูกข่ายเข้าใช้งาน Internet ได้ )
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE (ทำMASQUERADEสำหรับทุกpacket ที่วิ่งผ่าน ppp0 )
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
( ทำMASQUERADEสำหรับทุกpacket ที่วิ่งผ่าน eth0 )
iptables -A FORWARD -i eth0 -j ACCEPT
( packet ถูกส่งเข้ามายังFORWARD chain โดยวิ่งผ่าน eth0 )
echo 1 > /proc/sys/net/ipv4/ip_forward
( เพื่อกำหนดให้ IP forwarding เป็น Enable เพื่อให้ Linux box สามารถ forward ip packet ได้ )


ยอมให้ connections ที่ผ่าน rule แล้วไม่ต้องถูกตรวจสอบจาก firewall อีก
iptables -A FORWARD -i ppp0 -o eth0 -m state –state ESTABLISHED,RELATED -j ACCEPT (เป็นคำสั่งที่ทำให้ iptables นี้ตรวจสอบ packet ว่ามีเป็นส่วนหนึ่งของ connection ที่สร้างไว้แล้วหรือไม่(ESTABLISHED) ถ้าใช่ก็จะปล่อยให้ผ่านไป (ACCEPT) โดยการส่งข้อมูลเข้าผ่านทาง ppp0(Modem) และให้ส่งข้อมูลออกทาง eth0 (Lan Card)โดยมีความสัมพันธ์(related)กันระหว่าง ppp0 กับ eth0)
iptables -A FORWARD -i eth0 -o ppp0 -m state –state ESTABLISHED,RELATED -j ACCEPT

(เป็นคำสั่งที่ทำให้ iptables นี้ตรวจสอบ packet ว่ามีเป็นส่วนหนึ่งของ connection ที่สร้างไว้แล้วหรือไม่(ESTABLISHED) ถ้าใช่ก็จะปล่อยให้ผ่านไป (ACCEPT) โดยการส่งข้อมูลเข้าผ่านทาง eth0(LanCard) และให้ส่งข้อมูลออกทาง ppp0 (Modem)โดยมีความสัมพันธ์(related)กันระหว่าง ppp0 กับ eth0)

ยอมให้มีการเชื่อมโยงกันทุกประเภทภายในเครือข่าย (internal network)
iptables -A INPUT -s 192.168.0.0/16 -d 192.168.0.0/16 -j ACCEPT (เป็นการรับข้อมูลเข้าโดยมี source IP(ต้นทาง) ที่ 192.168.0.0/16 และ destination IP (ปลายทาง) ที่ 192.168.0.0/16 )
iptables -A OUTPUT -s 192.168.0.0/16 -d 192.168.0.0/16 -j ACCEPT

(เป็นการส่งข้อมูลออกโดยมี source IP(ต้นทาง) ที่ 192.168.0.0/16 และ destination IP (ปลายทาง) ที่ 192.168.0.0/16 ) ##(หมายเลขIP/netmask)

ยอมให้มีการ forward packet จากเครื่องลูกข่าย (clients) ไปยังภายนอก network ที่อยู่
iptables -A FORWARD -m state –state NEW -i eth0 -j ACCEPT ( packet ที่เป็นตัวสร้าง connection ใหม่ โดยให้ส่งข้อมูลเข้าทาง eth0 (Lan Card))
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
( เป็นคำสั่งที่ทำให้ iptables สามารถทำงานได้ในรูปแบบของ stateful inspection ที่แท้จริง โดย rule นี้จะตรวจสอบ packet ว่ามีเป็นส่วนหนึ่งของ connection ที่สร้างไว้แล้วหรือไม่(ESTABLISHED) ถ้าใช่ก็จะปล่อยให้ผ่านไป (ACCEPT) และในกรณีที่เครื่องภายในเครือข่ายเรียกใช้ ftp ไปยังเครื่องอื่นในอินเทอร์เน็ตนั้น คำสั่งที่ส่งไปจะใช้ destination port เป็น 21 แต่ data port ที่ใช้สำหรับรับส่งข้อมูลใน ftp นั้นเป็น port 20 ซึ่ง port ที่เกิดขึ้นนี้ถือว่ามีความสัมพันธ์(related)กับ port 21 ดังนั้นจึงสามารถรับส่งไฟล์ผ่าน port 20 ได้โดยไม่จำเป็นต้องสร้าง rule เพิ่มเติมแต่อย่างใด )
iptables -I FORWARD -i ppp0 -d 0.0.0.0 -j ACCEPT
( เพิ่ม chain ให้ส่ง packet เข้ามาทาง ppp0 และ destination IP ปลายทางที่ 0.0.0.0 )
iptables -I FORWARD -s 192.168.0.0/16 -d 0.0.0.0 -j ACCEPT
( เพิ่ม chain ให้ส่ง packet เข้ามาทาง Source IP ที่ 192.168.0.0/16 และ destination ปลายทางที่ 0.0.0.0 )

ให้ยอมรับ Stateful Traffic คือ การส่ง packet ผ่านชั้น Network ตาม OSI Model 7 Layer ต้องศึกษาเรื่อง OSI Model 7 Layer ผู้เขียนได้เก็บข้อมูลไว้ที่ไฟล์อ้างอิง
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

อนุญาต traffic จาก loopback interface
iptables -A INPUT -i lo -j ACCEPT ( เป็นการรับข้อมูลเข้า Server ทาง Loopback ของ Lancard )
iptables -A OUTPUT -o lo -j ACCEPT ( เป็นการส่งข้อมูลออกจาก Server ทาง Loopback ของ Lancard )

การทำ redirect นั้นเป็นหนึ่งในรูปแบบของการทำ Destination NAT แบบพิเศษ เช่น
เปลี่ยน web traffic ธรรมดาให้ผ่านไปยัง squid proxy (transparent)
redirect พอร์ต 80 ไปยังพอร์ต 8080 เพื่อให้การใช้ WWW ผ่าน squid proxy

iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j REDIRECT –to-port 8080
## จำเป็นต้องมีการ set ที่ squid เพิ่มเติมด้วย

เซ็ต default policy ของ INPUT traffic ให้เป็น drop ยกเว้นจะมีการกำหนด rule เป็นอย่างอื่น
iptables -P INPUT DROP ( packet ถูกส่งเข้ามาและไม่ match กับ rule ใดๆมันก็จะถูก DROP ทันที )

ไม่อนุญาตให้มี INPUT connection จากภายนอก (ยกเว้น 192.168.0.0/16)
iptables -A INPUT -s ! 192.168.0.0/16 -p all -j DROP ( packet ที่ถูกส่งเข้ามายัง server อนุญาติให้ส่งได้เฉพาะเครื่องที่มี IP อยู่ในช่วง 192.168.0.0/16 เท่านั้น IP อื่นไม่อนุญาติ )

เซ็ต policy ของ OUTPUT traffic เป็น ACCEPT ยกเว้นจะมีการกำหนด rule เป็นอย่างอื่น
iptables -P OUTPUT ACCEPT ( packet ถูกส่งออกไปไม่match กับ rule ใดๆมันก็จะถูก DROP ทันที )

ห้าม connection ไปยังภายนอกจากพอร์ต 31337, 31335, 27444, 27665,
# 20034, 9704, 1433, 2049, 2432, 5999, 6068, 6900 ซึ่งส่วนใหญ่
# พอร์ตเหล่านี้จะเป็นพอร์ตที่ backdoor ใช้

iptables -A OUTPUT -o eth0 -p tcp –dport 31337 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 31335 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 27444 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 27665 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 20034 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 9704 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 1433 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 2049 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 2432 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 5999 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 6068 -j DROP
iptables -A OUTPUT -o eth0 -p tcp –sport 6900 -j DROP

save rule ที่สร้างขึ้นมาใหม่ และ restart iptables
service iptables save
service iptables restart

หลังจากใช้ rules ใหม่ของ iptables แล้วแต่ถ้ายังใช้ www ไม่ได้อาจอาจจะต้อง restart squid ใหม่
โดยใช้คำสั่ง

service squid stop
service squid start

หรืออาจจะต้องรีบูตเครื่องใหม่ด้วย

แก้ไฟล์ /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1 ( เซ็ตให้เป็น enable IP forwarding เป็นการกำหนดให้ policy เป็น ACCEPT ทำให้ packet สามารถถูก forward ไปยังจุดหมายที่ต้องการได้ )

โดยใช้คำสั่ง pico /etc/sysctl.conf

 

 

ส่งท้าย 

สำหรับการใช้งาน iptables ในการใช้งาน Internet คุณสามารถที่จะกำหนดขอบเขตในการ ทำงานเพิ่มเติมได้ ซึ่งจะช่วยในการป้องกันการบุกรุกจากผู้ที่ไม่หวังดีได้ ตามความพอใจของ Admin ที่ดูแล ระบบและการใช้งาน Internet ภายในองค์กรของท่านได้ และผู้เขียนได้แทรกไฟล์ wordไว้ที่ไฟล์ setiptables และได้แนบไฟล์เอกสารอ้างอิงไว้ด้วย Iptables.zip


โดย linuxstep team,linuxstep@eve.co.th,linux@eve.co.th วันที่ 17/03/2547

ใส่ความเห็น