This web page is included as a technical article, journal, technical, news, games and CV of Pankpond. Pankpond have 5 years experience of Information Technology and Software development worked for the multi-national company (Thai,French,Australia)
วันจันทร์ที่ 12 มกราคม พ.ศ. 2552
Brute Force port SSH (เดาสุ่มพาสเวิร์ด)
ตอนนั้นยังโ่ง่อยู่ไม่รู้ว่าโดนอะไร ตอนนี้ฉลาดแล้วแหล่ะ มันคือการ Brute Force port SSH เกิดจากที่เวลาเราเปิด port ssh เพื่อที่จะเข้ามาที่ server ผ่านทาง internet เราอาจเจอคนอื่นที่สแกนพอร์ดของเครื่อง server ของเราและพยายามสุ่ม password ของ root เข้ามา
วิธีแก้ไขด้วย iptables
iptables -I INPUT -i ppp+ -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -i ppp+ -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --seconds 60 --hitcount 4 -j DROP
จากตัวอย่างเป็นการตั้งค่า หากมีการเชื่อมต่อ Port 22 มาเกิน 3 ครั้งใน 1 นาที ก็จะทำการ Block IP นั้น เป็นต้น
บทเรียนเรื่องการสร้าง Firewall ด้วย IPTABLES
จุดประสงค์ คือ เรียนรู้และทำความเข้าใจการทำงานของ iptables และสามารถนำไปประยุกต์ใช้กับ Firewall ได้
เริ่มต้นการเรียนด้วย คำสั่งแรก
iptables -L (List the rules in all chain)
จะได้ผลลัพธ์เป็น
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ประกอบด้วย Chain จำนวน 3 Chain
INPUT คือ Packet ที่วิ่งเข้ามายังเครื่อง Server ทั้งทางขา LAN และขา WAN
FORWARD คือ Packet ที่วิ่งผ่าน Server จากทาง LAN --> WAN และ จาก WAN --> LAN
OUTPUT คือ Packet ที่วิ่งออกจากเครื่อง Server ทั้งทางขา LAN และขา WAN
และ policy จะเป็น ACCEPT
INPUT คือ อนุญาติให้ทุก Packet วิ่งเข้ามายัง Server
FORWARD คือ อนุญาติให้ทุก Packet วิ่งผ่าน Server
OUTPUT คือ อนุญาติให้ทุก Packet วิ่งออกจาก Server
ในการใช้งานนั้น Chain INPUT/OUTPUT จะใช้ในกรณีที่เครื่องเราทำหน้าที่เป็น Server
และ Chain FORWARD นั้น จะใช้ในกรณีที่เครื่องเราทำหน้าที่เป็น Gateway
ปูพื้นฐานเรื่องความรู้เรื่อง port , ip และ Protocol กันก่อน
IP
หมายเลข IP จะประกอบด้วย 32 bit 4 กลุ่ม คั่นด้วย . นั่นก็คือ 8bit . 8bit . 8bit . 8bit
192.168.0.100 = 11000000.10101000.00000000.01100100
172.16.20.5 = 10101100.00010000.00010100.00000101
10.0.100.1 = 00001010.00000000.01100100.00000001
NetMask จะประกอบด้วย จำนวนเลข 1 ทางซ้ายมือ และจำนวนเลข 0 ทางขวามือ
11111111.11111111.11111111.11111111 = 255.255.255.255 หรือ /32 (บิตที่เป็น 0 ไม่มี)
11111111.11111111.11111111.00000000 = 255.255.255.0 หรือ /24 (บิตที่เป็น 1 มีจำนวน 24 บิต)
11111111.11111111.00000000.00000000 = 255.255.0.0 หรือ /16 (บิตที่เป็น 1 มีจำนวน 16 บิต)
11111111.00000000.00000000.00000000 = 255.0.0.0 หรือ /8 (บิตที่เป็น 1 มีจำนวน 8 บิต)
00000000.00000000.00000000.00000000 = 0.0.0.0 หรือ /0 (บิตที่เป็น 1 ไม่มี)
Network และ Subnet
ในการอ้างอิง Network นั้นจะต้องระบุ ชื่อ Network และ Netmask เพื่อระบุขนาด เช่น
192.168.200.0/255.255.255.0 โดยที่ /255.255.255.0 สามารถแทนได้ด้วย /24
จะได้เป็น 192.168.200.0/24 จะมีความหมายเหมือนกัน
Private IP และ Public IP
Private IP ที่ใช้กันคือ
10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
IP ที่นอกเหนือจากนี้จะถือเป็น Public IP
Port
System Port คือ Port ตั้งแต่ 1 ถึง 1024
Application Port คือ Port ตั้งแต่ 1025 ถึง 65535
Protocol
TCP
UDP
ICMP
การเดินทางของ Packet ผ่าน Server จะแบ่งได้เป็น 3 กรณี คือ
1. ข้อมูลวิ่งมายังเครื่อง Server
กรณีนี้คือ เครื่อง Server เป็นผู้ให้บริการ เช่น ftp, web, mail, dns หรือ proxy เป็นต้น
แล้วเครื่องลูกข่าย หรือเครื่องจากภายนอก วิ่งเข้ามายังเครื่อง Server
การเดินทางของ Packet จะเป็นดังนี้ คือ
จาก Interface ของ Server เช่น eth0, ppp0 หรืออื่น ๆ ที่ข้อมูลวิ่งเข้ามา จะวิ่งเข้ามายัง
Chain PREROUTING --> Conntrack , mangle , nat ตามลำดับ จากนั้นก็จะวิ่งไปยัง
Routing Process
Chain INPUT --> Filter , Conntrack , mangle ตามลำดับ จากนั้นก็จะวิ่งไปยัง
Local Process
สรุปง่าย ๆ คือ Interface -> PREROUTING --> Routing Process --> INPUT --> Local Process
2. ข้อมูลวิ่งออกจากเครื่อง Server
กรณีนี้คือ เมื่อเครื่อง Server ได้รับการติดต่อมาจากภายนอก แล้วทำการตอบกลับ ก็จะมีการส่งข้อมูลออก
เช่น การปิงมายัง Server , การส่งข้อมูลไปยังเครื่องลูกข่าย
การเดินทางของ Packet จะเป็นดังนี้
Local Process
Chain OUTPUT --> Conntrack , mangle , nat , filter ตามลำดับ จากนั้นจะวิ่งไปยัง
Routing Process
Chain POSTROUTING --> mangle , nat , Conntrack ตามลำดับ จากนั้นก็จะวิ่งไปยัง
สู่ Interface ของ Server เช่น ppp0, eth0 เพื่อส่งข้อมูลออกไป
สรุป ง่าย ๆ คือ Local Process --> OUTPUT --> Routing Process --> POSTROUTING --> Interface
3. ข้อมูลวิ่งผ่านเครื่อง Server
ในกรณีที่เครื่องของเราทำหน้าที่เป็น Gateway ก็จะมีข้อมูลวิ่งจาก Interface นึงไปยังอีก Interface นึง
ไม่ว่าจะเป็นจาก WAN --> LAN หรือ จาก LAN --> WAN ก็จะมีลักษณะเหมือนกัน
ซึ่งจะแทนด้วย Interface A ไปยัง Interface B การเดินทางของ Packet จะเป็นดังนี้
เริ่มต้นจากเข้ามาสู่ Interface A
Chain PREROUTING --> Conntrack , mangle , nat ตามลำดับ จากนั้นจะวิ่งไปยัง
Routing Process
Chain FORWARD --> mangle , filter ตามลำดับ จากนั้นจะวิ่งไปยัง
Chain POSTROUTING --> mangle , nat , Conntrack ตามลำดับ จากนั้นจะวิ่งไปยัง
วิ่งออกทาง Interface B
สรุป ง่าย ๆ คือ Interface A --> PREROUTING --> Routing Process --> FORWARD --> POSTROUTING --> Interface B
การทำ Firewall นั้น ก็คือการสร้างกฎเพื่อกำหนดการเข้าและออกของข้อมูล
กรณีที่มี 1 Interface หรือเป็นแค่เพียง Server ให้บริการธรรมดา ก็จะต้องกำหนดกฎ 2 รูปแบบ
1. กำหนดข้อมูลที่วิ่งเข้ามายัง Server
2. กำหนดข้อมูลที่วิ่งออกจาก Server
กรณีที่มี 2 Interface และทำหน้าที่เป็น Gateway และให้บริการด้วย จะต้องกำหนดกฎ 4 รูปแบบ
1. กำหนดข้อมูลที่วิ่งเข้ามายัง Server ทางขา WAN และ ขา LAN
2. กำหนดข้อมูลที่วิ่งออกจาก Server ทางขา WAN และ ขา LAN
3. ข้อมูลที่วิ่งจาก Localnet ออกไปยัง InterNet
4. ข้อมูลที่วิ่งจาก InterNet เข้ามายัง LocalNet
กรณีที่มี 3 Interface ทำหน้าที่เป็น Gateway และมี Interface DMZ เพิ่มขึ้นมา เพื่อรักษาความปลอดภัยให้ Server ภายใน
1. กำหนดข้อมูลที่วิ่งเข้ามายัง Server ทางขา WAN ,ขา LAN และขา DMZ
2. กำหนดข้อมูลที่วิ่งออกจาก Server ทางขา WAN ,ขา LAN และขา DMZ
3. ข้อมูลที่วิ่งจาก Localnet ออกไปยัง InterNet
4. ข้อมูลที่วิ่งจาก Localnet ออกไปยัง DMZ
5. ข้อมูลที่วิ่งจาก DMZ ออกไปยัง Internet
6. ข้อมูลที่วิ่งจาก DMZ ออกไปยัง LocalNet
7. ข้อมูลที่วิ่งจาก Internet เข้ามายัง LocalNet
8. ข้อมูลที่วิ่งจาก Internet เข้ามายัง DMZ
ในการทำ Firewall นั้น เราจะต้องทราบข้อมูลเข้าและข้อมูลออกทั้งหมดของ Server โดยจะต้องระบุ IP ต้นทาง, IP ปลายทาง, Port และ Protocol เป็นอย่างน้อย
ยกตัวอย่างกรณีแรก เครื่อง Server ทำหน้าที่เป็น Web Server และ Proxy Server
มี 1 Interface คือ eth0 โดยมี IP เป็น 172.16.6.11
ดังนั้น กฎที่เราต้องสร้างขึ้นจะมี 2 รูปแบบ ก็กำหนดได้โดย
1. กำหนดข้อมูลที่วิ่งเข้ามายัง Server
- สามารถเชื่อมต่อมายัง Server ต้นทาง IP 172.16.6.0/24 ด้วย Protocol TCP Port 80 (Web Server)
- สามารถเชื่อมต่อมายัง Server ต้นทาง IP 172.16.6.0/24 ด้วย Protocol TCP Port 8080 (Proxy Server)
- สามารถเชื่อมต่อมายัง Server ได้เฉพาะกลุ่ม IP 172.16.6.200-254 ด้วย Protocol TCP Port 22 (SSH Server)
- สามารถเชื่อมต่อมายัง Server ได้เฉพาะกลุ่ม IP 172.16.6.200-254 ด้วย Protocol TCP Port 10000 (Webmin)
- สามารถปิงเข้ามายัง Server ได้ ต้นทาง IP 172.16.6.0/24
- นอกเหนือจากกฎเหล่านี้ให้ DROP
2. กำหนดข้อมูลที่วิ่งออกจาก Server
- สามารถออกได้หมดทุก ip/port/protocol
เริ่มต้นในการ set firewall นั้น จะเริ่มทำการปิด หรือ DROP policy ของทุก Chain ก่อน
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#1. กำหนดข้อมูลที่วิ่งเข้ามายัง Server
#สามารถเชื่อมต่อมายัง Server ต้นทาง IP 172.16.6.0/24 ด้วย Protocol TCP Port 80 (Web Server)
iptables -A INPUT -i eth0 -s 172.16.6.0/24 -d 172.16.6.11 -p tcp --dport 80 -j ACCEPT
#สามารถเชื่อมต่อมายัง Server ต้นทาง IP 172.16.6.0/24 ด้วย Protocol TCP Port 8080 (Proxy Server)
iptables -A INPUT -i eth0 -s 172.16.6.0/24 -d 172.16.6.11 -p tcp --dport 8080 -j ACCEPT
#สามารถเชื่อมต่อมายัง Server ได้เฉพาะกลุ่ม IP 172.16.6.200-254 ด้วย Protocol TCP Port 22 (SSH Server)
iptables -A INPUT -i eth0 -m iprange --src-range 172.16.6.200-172.16.6.254 -d 172.16.6.11 -p tcp --dport 22 -j ACCEPT
#สามารถเชื่อมต่อมายัง Server ได้เฉพาะกลุ่ม IP 172.16.6.200-254 ด้วย Protocol TCP Port 10000 (Webmin)
iptables -A INPUT -i eth0 -m iprange --src-range 172.16.6.200-172.16.6.254 -d 172.16.6.11 -p tcp --dport 10000 -j ACCEPT
#สามารถปิงเข้ามายัง Server ได้ ต้นทาง IP 172.16.6.0/24
iptables -A INPUT -i eth0 -s 172.16.6.0/24 -d 172.16.6.11 -p icmp -j ACCEPT
#2. กำหนดข้อมูลที่วิ่งออกจาก Server
iptables -A OUTPUT -o eth0 -j ACCEPT
เป็นอันเรียบร้อย สำหรับตัวอย่างแรก
ลองใช้คำสั่ง iptables -nvL เพื่อดู rule ที่เพิ่มเข้าไป
ref : https://www.ee.buu.ac.th/courseweb/mod/forum/discuss.php?d=6676
การใช้งาน iptables (ก๊อปเค้ามา)
ยังไม่ได้ลองใช้เลยแต่กำลังศึกษาเรื่องนี้อยู่พอดี เลยกะว่าเก็บไว้อ่านน่าจะมีประโยชน์
การใช้คำสั่งไอพีเทเบิล (iptables)
รูปแบบการใช้งาน iptables เบื้องต้น จะมีรูปแบบการใช้งานดังนี้คือ
iptables [table]
โดยกฎ (rule)ที่เขียนขึ้นจะเป็นเป็นตัวบอกเคอร์เนลว่าให้กระทำอย่างไรในกรณีที่พบแพ็กเก็ตตรงตามที่ระบุไว้
[table] หมายถึง ตาราง ที่ต้องการระบุ มี 3 ตาราง คือ ฟิลเตอร์เทเบิล (Filter table) แนตเทเบิล (Nat table) และ แมงเกิล (Mangle table) เช่น iptables -t nat หมายถึงให้ทำงานกับแนตเทเบิล ในกรณีที่ไม่ได้ระบุตาราง ไอพีเทเบิล จะถือว่าคำสั่งดังกล่าวระบุถึงฟิลเตอร์เทเบิล โดยอัตโนมัติ
ตัวอย่างคำสั่งไอพีแอดเดรส
-A เพิ่มกฎใหม่ ต่อท้ายเชน (chain) (Append rule) เช่น
iptables -A INPUT -p ALL -i eth0 -j ACCEPT
-D ลบกฎ (Delete rule) เช่น
iptables -D INPUT –dport 80 -j DROP
-I เพิ่มกฎใหม่ ในเชน (Insert rule) เช่น
iptables -I OUTPUT -p ALL -s 127.0.0.1/32 -j ACCEPT
-R แทนที่กฎเดิม ด้วยกฎใหม่ (Replace rule)
-L แสดงกฎทั้งหมดในเชน (ถ้าไม่ระบุเชนจะแสดงกฎ ทั้งหมดในฟิลเตอร์เทเบิลทั้งสาม built-in chain) เช่น \
iptables -L
iptables -L -t nat
iptables -L INPUT
-Z ใช้ reset byte counter สำหรับทุกกฎ ในเชน ที่กำหนด เช่น
iptables -Z INPUT
-N ใช้สร้างเชน ใหม่ เช่น
iptables -N mychain
-X ลบเชน ที่ไม่มีกฎ ซึ่งสามารถลบ user-defined chain ที่ไม่มีกฎ ได้ แต่ไม่สามารถลบ built-in chain ได้ เช่น
iptables -X emptychain
-P เปลี่ยน default policy ของเชน ค่าที่ใช้ได้คือ ACCEPT, DROP ทั้งนี้ค่านี้มีความสำคัญอย่างมากเพราะหากแพ็กเก็ตถูกส่งเข้ามาในเชน แล้ว และไม่ตรงกับกฎ ใดๆ เลย แพ็กเก็ตนั้นก็ต้องถูกตัดสินใจโดย policy ของเชน นั้นๆ เช่น
iptables -P FORWARD DROP
ซึ่งหากแพ็กเก็ตถูกส่งเข้า มายังฟอร์เวิร์ดเชน (FORWARD chain) และไม่ตรงกับกฎใดๆใน ฟอร์เวิร์ดเชน นี้เลย แพ็กเก็ตนั้นถูกทิ้งทันที • -E ใช้เปลี่ยนชื่อ chain ใหม่ เช่น
iptables -E myoldchain mynewchain
การใช้คำสั่ง ด้านบนนั้นสามารถใช้ร่วมกับออปชันบางอย่างได้ คือ • -V, –verbose ใช้ร่วมกับ -L, -A, -I, -D, -R เพื่อให้แสดงจำนวนไบต์ ที่ ตรงกับกฎ ออกมาด้วย (หน่วยเป็นได้ทั้ง K(x1,000),M(x1,000,000),G(x1,000,000,000)) เช่น
iptables -L –v
-x, –exact ใช้ร่วมกับ -L และ -v เพื่อให้แสดงจำนวนแพ็กเก็ต และจำนวนของไบต์ ข้อมูลที่ตรงกับกฎ โดยไม่ให้แสดงผลในหน่วยของ K,M,G เช่น
iptables -L OUTPUT -v –x
-n, –numeric ใช้ร่วมกับ -L เพื่อสั่งให้ไอพีเทเบิล แสดงข้อมูลไอพีแอดเดรสและพอร์ต เป็นตัวเลขเท่านั้น เช่น
iptables -L OUTPUT -n
–line-numbers ใช้ร่วมกับ -L เพื่อแสดงเลขบรรทัดของกฎ ซึ่งตัวเลขที่แสดงนี้จะสามารถใช้ได้กับคำสั่งเพิ่มกฎใหม่ในเชน ( insert rule) ที่ระบุเป็นลำดับที่ของกฎ เช่น
iptables -L –line-numbers
–modprobe=command เพื่อโหลดโมดูล (module) ที่เกี่ยวข้อง
Match
การ ตั้งเงื่อนไขของการ match นั้นจะต้องอาศัยความเข้าใจในเรื่อง IP, TCP, UDP, และ ICMP มาบ้างพอสมควร จึงจะสามารถตั้งเงื่อนไขที่เหมาะสมและตรงตามความต้องการได้ ซึ่งมีรายละเอียดดังนี้
การระบุไอพีแอดเดสของต้นทางและปลายทาง
สามารถ ระบุไอพีแอดเดรสต้นทาง (source ip address) ของแพ็กเก็ต โดยใช้ -s หรือ –source หรือ –src และสำหรับไอพีแอดเดรสปลายทาง (destination ip address) ก็ใช้ -d หรือ –destination หรือ –dst
การทำ Inversion
ใน บางกรณีนั้นหากต้องการระบุเป็นอินเวิร์ส (inverse) เช่น อนุญาตให้ทุกไอพียกเว้นไอพีที่ระบุไว้ ซึ่งการใช้คำสั่งดังกล่าวสามารถทำได้โดยใช้เครื่องหมาย ! นำหน้า argument ที่ต้องการ (เครื่องหมาย ! หมายถึง NOT) เช่น -p ! TCP ซึ่งจะตรง กับโพรโตคอลทุกๆ ตัวที่ไม่ใช่ทีซีพี หรือ -s ! localhost ซึ่งหมายถึงแพ็กเก็ต ที่มีไอพีแอดเดรสต้นทาง อื่นๆ ยกเว้น localhost (127.0.0.1)
การระบุโพรโตคอล
สามารถ ระบุโพรโตคอลที่ต้องการได้ดังนี้คือ ทีซีพี (TCP), ยูดีพี (UDP), ไอซีเอ็มพี (ICMP) หรือสามารถใช้ตัวเลขแทนได้ (สำหรับ *NIX อ้างอิงได้จาก /etc/protocols) และยังสามารถใช้ได้ทั้งตัวอักษรเล็กหรือใหญ่ (ใช้ได้ทั้ง tcp และ TCP) เช่น -p TCP หรือ -p ! tcp
การระบุ interface
-i หรือ –in-interface ตามด้วยชื่ออินเตอร์เฟส ( interface) ใช้เพื่อระบุ incoming interface ซึ่งหมายถึงว่า แพ็กเก็ต ที่จะตรงกับกฎ นี้ต้องเข้ามาจากอินเตอร์เฟส ที่กำหนด เช่น -i eth0 หมายความว่า ทุกแพ็กเก็ต ที่เข้ามาทาง eth0 จะ ตรงกับกฎ นี้ ทั้งนี้ชื่ออินเตอร์เฟส ที่สามารถใช้ได้นั้น สามารถตรวจสอบได้โดยใช้คำสั่ง ifconfig และ -o หรือ –out-interface ตามด้วยชื่อของอินเตอร์เฟส ใช้เพื่อระบุ outgoing interface ซึ่งหมายถึงว่า แพ็กเก็ต ที่จะ ตรงกับกฎ นี้ กำลังจะเดินทางผ่านอินเตอร์เฟส ที่ระบุไว้ เช่น -o eth1 หรือ -o ! eth1
ragment packet
ใน การส่งข้อมูลใน ip network นั้นเป็นเรื่องปกติที่จะเกิดการแฟรกเมนต์ (fragment)ของแพ็กเก็ตเนื่องจากขนาดของแพ็กเก็ต มีขนาดใหญ่เกินไปที่จะส่งไปในครั้งเดียว จำเป็นต้องมีการแบ่งแพ็กเก็ต ออกเป็นหลายๆ ชิ้นทยอยส่งไป ซึ่งเรียกกันว่าการทำแฟรกเมนต(fragment)โดยเครื่องปลายทางจะทำหน้าที่ประกอบ แฟรกเมนต์แพ็กเก็ต(fragment packet)รวมกันเป็นแพ็กเก็ต ที่สมบูรณ์ดังเดิม ข้อมูลที่เป็นแฟรกเมนต์แพ็กเก็ต นั้นจะมีเฮดเดอร์ (header)ที่สมบูรณ์แค่แพ็กเก็ต แรกเท่านั้น ส่วนแพ็กเก็ต ที่ตามมาจะมีแค่เฮดเดอร์ บางส่วนคือ ไอพีแอดเดรสเท่านั้น ไม่มีข้อมูลของโพรโตคอลแนบมาด้วย ดังนั้นการตรวจสอบข้อมูลเฮดเดอร์ ของ ทีซีพี ยูดีพี ไอซีเอ็มพี จึงไม่สามารถทำได้ในแพ็กเก็ต ที่สองเป็นต้นมา หากใช้แนต (NAT)แพ็กเก็ตประเภทแฟรกเมนต์แพ็กเก็ต จะถูกประกอบเข้าด้วยกันจนสมบูรณ์ก่อนที่ แพ็กเก็ต จะเข้าไปถึง แพ็กเก็ตฟิลเตอร์ริ่ง (packet filtering) ดังนั้นจึงไม่มีความจำเป็นที่จะต้องกังวลเกี่ยวกับ แฟรก-เมนต์แพ็กเก็ต ในกรณีที่ไม่ได้ใช้แนต (NAT) แพ็กเก็ตประเภทแฟรกเมนต์แพ็กเก็ตก็จะไม่ถูกประกอบเข้าด้วยกัน ไอพีเทเบิล จะมีกระบวนการในการทำงานกับ แฟรกเมนต์แพ็กเก็ตดังนี้ หลังจากที่แฟรกเมนต์แพ็กเก็ตแรกผ่านเข้ามาแล้วไอพีเทเบิล สามารถตรวจสอบได้ว่าจะอนุญาตให้ผ่านหรือไม่ ในขณะที่แฟรกเมนต์แพ็กเก็ต ที่สองและหลังจากนั้นที่ตามมานั้น จะไม่สามารถนำไปตรวจสอบกับกฎ ใดๆ เลย เช่น -p TCP –sport www หรือแม้แต่ -p TCP –sport ! www แต่ยังสามารถเขียนกฎ ให้ตรวจสอบทั้งแฟรกเมนต์แพ็กเก็ต ตัวที่สองและหลังจากนั้นที่ตามมาได้ด้วยการใช้ -f หรือ –fragment ทั้งนี้อาจจะเขียนในทางตรงข้ามคือไม่ต้องตรวจสอบแฟรกเมนต์แพ็กเก็ต ที่สองและหลังจากนั้นโดยใช้ ! -f ก็ได้ โดยปกติแล้วมักจะปล่อยให้แฟรกเมนต์แพ็กเก็ต ผ่านไป เนื่องจากถ้าสามารถทิ้งแฟรกเมนต์แพ็กเก็ตแรกได้แล้ว แพ็กเก็ตทั้งหมดก็จะไม่สามารถถูกประกอบที่เครื่องปลายทางได้ แต่ทั้งนี้แฟรกเมนต์แพ็กเก็ต ที่ถูกปล่อยไปดังกล่าวอาจจะทำให้เครื่องที่ได้รับนั้นเกิดการชะงัก หรือเกิดความเสียหายได้ หรืออาจจะเกิดการโจมตีแบบดีไนอัลออฟเซอร์วิส (Denial of Service) โดยใช้แฟรกเมนต์แพ็กเก็ตได้
การระบุ target
user-defined chain
เนื่อง จากไอพีเทเบิล อนุญาตให้ผู้ใช้สามารถสร้างเชน (chain) ขึ้นมาได้ใหม่นอกเหนือจากเชนที่มีมาอยู่แล้ว (built-in chain) ทั้งสามตัว (INPUT, OUTPUT, FORWARD) ทั้งนี้จะต้องใช้ตัวอักษรตัวเล็กทั้งหมดสำหรับเชน ที่ผู้ใช้สร้างขึ้นเอง เมื่อแพ็กเก็ตตรงกับกฎ ที่เป็นเชนที่ผู้ใช้กำหนดขึ้น (user-defined chain) แพ็กเก็ตนั้นจะถูกนำไปตรวจสอบใหม่โดยเชนที่ผู้ใช้กำหนด นั้นๆ และถ้าในเชนนั้นๆ ไม่มีการตัดสินใจใดๆ แพ็กเก็ตนั้นก็สามารถย้อนกลับมายังกฎ ถัดไปในเชนที่เริ่มต้นเดินทางได้
new target
เป็น target ที่สร้างเพิ่มเติมขึ้นมาคือ
LOG เป็นโมดูลที่มีความสามารถในการเก็บข้อมูลลงล็อก (มี syslog facility เป็น kernel) สำหรับแพ็กเก็ตที่ตรงกับกฎที่ระบุปลายทาง เป็น LOG มีออปชันให้เลือกใช้งานดังนี้คือ–log-level เป็นการระบุ priority level ของ log ซึ่งกำหนดได้ตั้งแต่ debug, info ,notice, warning, crit, alert, emerg–log-prefix ตามด้วยชุดของตัวอักษรยาวไม่เกิน 29 ตัว ซึ่งชุดของตัวอักษรดังกล่าวจะปรากฏอยู่บนล็อกไฟล์
ความสำคัญของ 3 ตารางหลัก ในคำสั่งไอพีเทเบิล
1.Filter Table เป็นตารางที่ใช้งานมากที่สุด เป็นจุดที่ใช้ในการตรวจสอบและควบคุมการผ่านเข้าออกของแพ็กเก็ต ถ้าหากจะพิจารณาการไหลเวียนของแพ็กเก็ต เฉพาะในส่วนของฟิลเตอร์เทเบิล (filter table) โดยไม่สนใจเทเบิล อื่นๆ นั้น ก็พอจะแสดงให้เห็นได้ดังรูปที่ 2.20 โดยเมื่อแพ็กเก็ต เข้ามาในระบบ มันจะเข้าไปยัง routing decision เพื่อตัดสินใจว่า แพ็กเก็ต จะถูกส่งไปที่ใด
2.Mangle Table เป็นตารางที่ใช้สำหรับแก้ไขข้อมูล TOS, TTL, MARK ของแพ็กเก็ต ซึ่งโดยปกติแล้วแทบจะไม่ได้ใช้งาน และไม่ควรทำ packet filtering หรือกรองแพ็กเก็ต ที่ตารางนี้ รวมทั้งไม่ควรทำ DNAT, SNAT หรือ Masquerading ที่ตารางนี้อย่างเด็ดขาดด้วย
3.Nat Table เป็นตารางที่ใช้สำหรับทำการแปลงแอดเดรส (network address translation) เช่น เปลี่ยนค่าไอพีแอดเดรสต้นทางและปลายทาง (source ip address, destination ip address) จุดสำคัญอีกอย่างหนึ่งที่ต้องรู้ก็คือ มีเพียงแพ็กเก็ต แรกเท่านั้นที่เข้ามาที่เชน นี้ ส่วนแพ็กเก็ต ถัดไปนั้นจะถูกกระทำเหมือนที่แพ็กเก็ต แรกได้รับ ดังนั้นจึงไม่ควรทำ packet filtering ที่เชน เหล่านี้
การใช้งาน Nat table นั้นก็เพียงแต่ใช้ออปชัน -t nat เท่านั้น และ target ที่สามารถใช้งานได้คือ SNAT, DNAT, Masquerade, Redirect ซึ่งมีรายละเอียดดังนี้
SNAT
การ ทำ source NAT จะทำที่ POSTROUTING chain โดย หลักๆ คือทำการเปลี่ยนแอดเดรสต้นทาง (source address) ก่อนที่จะส่งแพ็กเก็ตนั้นออกไป ซึ่งสามารถใช้ออปชัน -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
ตัวอย่าง การทำ Masquerading
ตัวอย่าง การใช้งาน masquerading ที่เห็นได้ชัดเจนในประเทศไทยก็คือ ร้านอินเทอร์เน็ตคาเฟ่(แบบประหยัด) ซึ่งนิยมใช้โมเด็ม 1 ตัว ติดต่อ(connect)ไปยัง ไอเอสพี (Internet Service Provider) แล้วใช้ NAT เพื่อให้เครื่องลูกที่มีอยู่หลายๆ เครื่องนั้น สามารถใช้งานอินเทอร์เน็ตผ่านโมเด็มตัวนั้นได้ โดยเครื่องลูกจะต้องใช้ private ip ซึ่งมีให้เลือกหลายคลาส (class) เช่น 10.x.x.x 192.168.x.x เป็นต้น จากนั้นก็ตั้งเกตเวย์ให้ชี้ไปยัง linux box ที่ทำหน้าที่หมุนโมเด็มและรันไอพีเทเบิล ซึ่งสามารถใช้คำสั่งง่ายๆ ดังด้านล่างก็ทำให้เครื่องลูกสามารถใช้งานอินเทอร์เน็ตได้แล้ว คือ
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
echo “1″ > /proc/sys/net/ip_forward
ref :: การใช้คำสั่งไอพีเทเบิล (iptables)
รูปแบบการใช้งาน iptables เบื้องต้น จะมีรูปแบบการใช้งานดังนี้คือ
iptables [table]
โดยกฎ (rule)ที่เขียนขึ้นจะเป็นเป็นตัวบอกเคอร์เนลว่าให้กระทำอย่างไรในกรณีที่พบแพ็กเก็ตตรงตามที่ระบุไว้
[table] หมายถึง ตาราง ที่ต้องการระบุ มี 3 ตาราง คือ ฟิลเตอร์เทเบิล (Filter table) แนตเทเบิล (Nat table) และ แมงเกิล (Mangle table) เช่น iptables -t nat หมายถึงให้ทำงานกับแนตเทเบิล ในกรณีที่ไม่ได้ระบุตาราง ไอพีเทเบิล จะถือว่าคำสั่งดังกล่าวระบุถึงฟิลเตอร์เทเบิล โดยอัตโนมัติ
ตัวอย่างคำสั่งไอพีแอดเดรส-A เพิ่มกฎใหม่ ต่อท้ายเชน (chain) (Append rule) เช่น
iptables -A INPUT -p ALL -i eth0 -j ACCEPT
-D ลบกฎ (Delete rule) เช่น
iptables -D INPUT –dport 80 -j DROP
-I เพิ่มกฎใหม่ ในเชน (Insert rule) เช่น
iptables -I OUTPUT -p ALL -s 127.0.0.1/32 -j ACCEPT
-R แทนที่กฎเดิม ด้วยกฎใหม่ (Replace rule)
-L แสดงกฎทั้งหมดในเชน (ถ้าไม่ระบุเชนจะแสดงกฎ ทั้งหมดในฟิลเตอร์เทเบิลทั้งสาม built-in chain) เช่น \
iptables -L
iptables -L -t nat
iptables -L INPUT
-Z ใช้ reset byte counter สำหรับทุกกฎ ในเชน ที่กำหนด เช่น
iptables -Z INPUT
-N ใช้สร้างเชน ใหม่ เช่น
iptables -N mychain
-X ลบเชน ที่ไม่มีกฎ ซึ่งสามารถลบ user-defined chain ที่ไม่มีกฎ ได้ แต่ไม่สามารถลบ built-in chain ได้ เช่น
iptables -X emptychain
-P เปลี่ยน default policy ของเชน ค่าที่ใช้ได้คือ ACCEPT, DROP ทั้งนี้ค่านี้มีความสำคัญอย่างมากเพราะหากแพ็กเก็ตถูกส่งเข้ามาในเชน แล้ว และไม่ตรงกับกฎ ใดๆ เลย แพ็กเก็ตนั้นก็ต้องถูกตัดสินใจโดย policy ของเชน นั้นๆ เช่น
iptables -P FORWARD DROP
ซึ่งหากแพ็กเก็ตถูกส่งเข้า มายังฟอร์เวิร์ดเชน (FORWARD chain) และไม่ตรงกับกฎใดๆใน ฟอร์เวิร์ดเชน นี้เลย แพ็กเก็ตนั้นถูกทิ้งทันที • -E ใช้เปลี่ยนชื่อ chain ใหม่ เช่น
iptables -E myoldchain mynewchain
การใช้คำสั่ง ด้านบนนั้นสามารถใช้ร่วมกับออปชันบางอย่างได้ คือ • -V, –verbose ใช้ร่วมกับ -L, -A, -I, -D, -R เพื่อให้แสดงจำนวนไบต์ ที่ ตรงกับกฎ ออกมาด้วย (หน่วยเป็นได้ทั้ง K(x1,000),M(x1,000,000),G(x1,000,000,000)) เช่น
iptables -L –v
-x, –exact ใช้ร่วมกับ -L และ -v เพื่อให้แสดงจำนวนแพ็กเก็ต และจำนวนของไบต์ ข้อมูลที่ตรงกับกฎ โดยไม่ให้แสดงผลในหน่วยของ K,M,G เช่น
iptables -L OUTPUT -v –x
-n, –numeric ใช้ร่วมกับ -L เพื่อสั่งให้ไอพีเทเบิล แสดงข้อมูลไอพีแอดเดรสและพอร์ต เป็นตัวเลขเท่านั้น เช่น
iptables -L OUTPUT -n
–line-numbers ใช้ร่วมกับ -L เพื่อแสดงเลขบรรทัดของกฎ ซึ่งตัวเลขที่แสดงนี้จะสามารถใช้ได้กับคำสั่งเพิ่มกฎใหม่ในเชน ( insert rule) ที่ระบุเป็นลำดับที่ของกฎ เช่น
iptables -L –line-numbers
–modprobe=command เพื่อโหลดโมดูล (module) ที่เกี่ยวข้อง
Match
การ ตั้งเงื่อนไขของการ match นั้นจะต้องอาศัยความเข้าใจในเรื่อง IP, TCP, UDP, และ ICMP มาบ้างพอสมควร จึงจะสามารถตั้งเงื่อนไขที่เหมาะสมและตรงตามความต้องการได้ ซึ่งมีรายละเอียดดังนี้
การระบุไอพีแอดเดสของต้นทางและปลายทาง
สามารถ ระบุไอพีแอดเดรสต้นทาง (source ip address) ของแพ็กเก็ต โดยใช้ -s หรือ –source หรือ –src และสำหรับไอพีแอดเดรสปลายทาง (destination ip address) ก็ใช้ -d หรือ –destination หรือ –dst
การทำ Inversion
ใน บางกรณีนั้นหากต้องการระบุเป็นอินเวิร์ส (inverse) เช่น อนุญาตให้ทุกไอพียกเว้นไอพีที่ระบุไว้ ซึ่งการใช้คำสั่งดังกล่าวสามารถทำได้โดยใช้เครื่องหมาย ! นำหน้า argument ที่ต้องการ (เครื่องหมาย ! หมายถึง NOT) เช่น -p ! TCP ซึ่งจะตรง กับโพรโตคอลทุกๆ ตัวที่ไม่ใช่ทีซีพี หรือ -s ! localhost ซึ่งหมายถึงแพ็กเก็ต ที่มีไอพีแอดเดรสต้นทาง อื่นๆ ยกเว้น localhost (127.0.0.1)
การระบุโพรโตคอล
สามารถ ระบุโพรโตคอลที่ต้องการได้ดังนี้คือ ทีซีพี (TCP), ยูดีพี (UDP), ไอซีเอ็มพี (ICMP) หรือสามารถใช้ตัวเลขแทนได้ (สำหรับ *NIX อ้างอิงได้จาก /etc/protocols) และยังสามารถใช้ได้ทั้งตัวอักษรเล็กหรือใหญ่ (ใช้ได้ทั้ง tcp และ TCP) เช่น -p TCP หรือ -p ! tcp
การระบุ interface
-i หรือ –in-interface ตามด้วยชื่ออินเตอร์เฟส ( interface) ใช้เพื่อระบุ incoming interface ซึ่งหมายถึงว่า แพ็กเก็ต ที่จะตรงกับกฎ นี้ต้องเข้ามาจากอินเตอร์เฟส ที่กำหนด เช่น -i eth0 หมายความว่า ทุกแพ็กเก็ต ที่เข้ามาทาง eth0 จะ ตรงกับกฎ นี้ ทั้งนี้ชื่ออินเตอร์เฟส ที่สามารถใช้ได้นั้น สามารถตรวจสอบได้โดยใช้คำสั่ง ifconfig และ -o หรือ –out-interface ตามด้วยชื่อของอินเตอร์เฟส ใช้เพื่อระบุ outgoing interface ซึ่งหมายถึงว่า แพ็กเก็ต ที่จะ ตรงกับกฎ นี้ กำลังจะเดินทางผ่านอินเตอร์เฟส ที่ระบุไว้ เช่น -o eth1 หรือ -o ! eth1
ragment packet
ใน การส่งข้อมูลใน ip network นั้นเป็นเรื่องปกติที่จะเกิดการแฟรกเมนต์ (fragment)ของแพ็กเก็ตเนื่องจากขนาดของแพ็กเก็ต มีขนาดใหญ่เกินไปที่จะส่งไปในครั้งเดียว จำเป็นต้องมีการแบ่งแพ็กเก็ต ออกเป็นหลายๆ ชิ้นทยอยส่งไป ซึ่งเรียกกันว่าการทำแฟรกเมนต(fragment)โดยเครื่องปลายทางจะทำหน้าที่ประกอบ แฟรกเมนต์แพ็กเก็ต(fragment packet)รวมกันเป็นแพ็กเก็ต ที่สมบูรณ์ดังเดิม ข้อมูลที่เป็นแฟรกเมนต์แพ็กเก็ต นั้นจะมีเฮดเดอร์ (header)ที่สมบูรณ์แค่แพ็กเก็ต แรกเท่านั้น ส่วนแพ็กเก็ต ที่ตามมาจะมีแค่เฮดเดอร์ บางส่วนคือ ไอพีแอดเดรสเท่านั้น ไม่มีข้อมูลของโพรโตคอลแนบมาด้วย ดังนั้นการตรวจสอบข้อมูลเฮดเดอร์ ของ ทีซีพี ยูดีพี ไอซีเอ็มพี จึงไม่สามารถทำได้ในแพ็กเก็ต ที่สองเป็นต้นมา หากใช้แนต (NAT)แพ็กเก็ตประเภทแฟรกเมนต์แพ็กเก็ต จะถูกประกอบเข้าด้วยกันจนสมบูรณ์ก่อนที่ แพ็กเก็ต จะเข้าไปถึง แพ็กเก็ตฟิลเตอร์ริ่ง (packet filtering) ดังนั้นจึงไม่มีความจำเป็นที่จะต้องกังวลเกี่ยวกับ แฟรก-เมนต์แพ็กเก็ต ในกรณีที่ไม่ได้ใช้แนต (NAT) แพ็กเก็ตประเภทแฟรกเมนต์แพ็กเก็ตก็จะไม่ถูกประกอบเข้าด้วยกัน ไอพีเทเบิล จะมีกระบวนการในการทำงานกับ แฟรกเมนต์แพ็กเก็ตดังนี้ หลังจากที่แฟรกเมนต์แพ็กเก็ตแรกผ่านเข้ามาแล้วไอพีเทเบิล สามารถตรวจสอบได้ว่าจะอนุญาตให้ผ่านหรือไม่ ในขณะที่แฟรกเมนต์แพ็กเก็ต ที่สองและหลังจากนั้นที่ตามมานั้น จะไม่สามารถนำไปตรวจสอบกับกฎ ใดๆ เลย เช่น -p TCP –sport www หรือแม้แต่ -p TCP –sport ! www แต่ยังสามารถเขียนกฎ ให้ตรวจสอบทั้งแฟรกเมนต์แพ็กเก็ต ตัวที่สองและหลังจากนั้นที่ตามมาได้ด้วยการใช้ -f หรือ –fragment ทั้งนี้อาจจะเขียนในทางตรงข้ามคือไม่ต้องตรวจสอบแฟรกเมนต์แพ็กเก็ต ที่สองและหลังจากนั้นโดยใช้ ! -f ก็ได้ โดยปกติแล้วมักจะปล่อยให้แฟรกเมนต์แพ็กเก็ต ผ่านไป เนื่องจากถ้าสามารถทิ้งแฟรกเมนต์แพ็กเก็ตแรกได้แล้ว แพ็กเก็ตทั้งหมดก็จะไม่สามารถถูกประกอบที่เครื่องปลายทางได้ แต่ทั้งนี้แฟรกเมนต์แพ็กเก็ต ที่ถูกปล่อยไปดังกล่าวอาจจะทำให้เครื่องที่ได้รับนั้นเกิดการชะงัก หรือเกิดความเสียหายได้ หรืออาจจะเกิดการโจมตีแบบดีไนอัลออฟเซอร์วิส (Denial of Service) โดยใช้แฟรกเมนต์แพ็กเก็ตได้
การระบุ target
user-defined chain
เนื่อง จากไอพีเทเบิล อนุญาตให้ผู้ใช้สามารถสร้างเชน (chain) ขึ้นมาได้ใหม่นอกเหนือจากเชนที่มีมาอยู่แล้ว (built-in chain) ทั้งสามตัว (INPUT, OUTPUT, FORWARD) ทั้งนี้จะต้องใช้ตัวอักษรตัวเล็กทั้งหมดสำหรับเชน ที่ผู้ใช้สร้างขึ้นเอง เมื่อแพ็กเก็ตตรงกับกฎ ที่เป็นเชนที่ผู้ใช้กำหนดขึ้น (user-defined chain) แพ็กเก็ตนั้นจะถูกนำไปตรวจสอบใหม่โดยเชนที่ผู้ใช้กำหนด นั้นๆ และถ้าในเชนนั้นๆ ไม่มีการตัดสินใจใดๆ แพ็กเก็ตนั้นก็สามารถย้อนกลับมายังกฎ ถัดไปในเชนที่เริ่มต้นเดินทางได้
new target
เป็น target ที่สร้างเพิ่มเติมขึ้นมาคือ
LOG เป็นโมดูลที่มีความสามารถในการเก็บข้อมูลลงล็อก (มี syslog facility เป็น kernel) สำหรับแพ็กเก็ตที่ตรงกับกฎที่ระบุปลายทาง เป็น LOG มีออปชันให้เลือกใช้งานดังนี้คือ–log-level เป็นการระบุ priority level ของ log ซึ่งกำหนดได้ตั้งแต่ debug, info ,notice, warning, crit, alert, emerg–log-prefix ตามด้วยชุดของตัวอักษรยาวไม่เกิน 29 ตัว ซึ่งชุดของตัวอักษรดังกล่าวจะปรากฏอยู่บนล็อกไฟล์
ความสำคัญของ 3 ตารางหลัก ในคำสั่งไอพีเทเบิล
1.Filter Table เป็นตารางที่ใช้งานมากที่สุด เป็นจุดที่ใช้ในการตรวจสอบและควบคุมการผ่านเข้าออกของแพ็กเก็ต ถ้าหากจะพิจารณาการไหลเวียนของแพ็กเก็ต เฉพาะในส่วนของฟิลเตอร์เทเบิล (filter table) โดยไม่สนใจเทเบิล อื่นๆ นั้น ก็พอจะแสดงให้เห็นได้ดังรูปที่ 2.20 โดยเมื่อแพ็กเก็ต เข้ามาในระบบ มันจะเข้าไปยัง routing decision เพื่อตัดสินใจว่า แพ็กเก็ต จะถูกส่งไปที่ใด
2.Mangle Table เป็นตารางที่ใช้สำหรับแก้ไขข้อมูล TOS, TTL, MARK ของแพ็กเก็ต ซึ่งโดยปกติแล้วแทบจะไม่ได้ใช้งาน และไม่ควรทำ packet filtering หรือกรองแพ็กเก็ต ที่ตารางนี้ รวมทั้งไม่ควรทำ DNAT, SNAT หรือ Masquerading ที่ตารางนี้อย่างเด็ดขาดด้วย
3.Nat Table เป็นตารางที่ใช้สำหรับทำการแปลงแอดเดรส (network address translation) เช่น เปลี่ยนค่าไอพีแอดเดรสต้นทางและปลายทาง (source ip address, destination ip address) จุดสำคัญอีกอย่างหนึ่งที่ต้องรู้ก็คือ มีเพียงแพ็กเก็ต แรกเท่านั้นที่เข้ามาที่เชน นี้ ส่วนแพ็กเก็ต ถัดไปนั้นจะถูกกระทำเหมือนที่แพ็กเก็ต แรกได้รับ ดังนั้นจึงไม่ควรทำ packet filtering ที่เชน เหล่านี้
การใช้งาน Nat table นั้นก็เพียงแต่ใช้ออปชัน -t nat เท่านั้น และ target ที่สามารถใช้งานได้คือ SNAT, DNAT, Masquerade, Redirect ซึ่งมีรายละเอียดดังนี้
SNAT
การ ทำ source NAT จะทำที่ POSTROUTING chain โดย หลักๆ คือทำการเปลี่ยนแอดเดรสต้นทาง (source address) ก่อนที่จะส่งแพ็กเก็ตนั้นออกไป ซึ่งสามารถใช้ออปชัน -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
ตัวอย่าง การทำ Masquerading
ตัวอย่าง การใช้งาน masquerading ที่เห็นได้ชัดเจนในประเทศไทยก็คือ ร้านอินเทอร์เน็ตคาเฟ่(แบบประหยัด) ซึ่งนิยมใช้โมเด็ม 1 ตัว ติดต่อ(connect)ไปยัง ไอเอสพี (Internet Service Provider) แล้วใช้ NAT เพื่อให้เครื่องลูกที่มีอยู่หลายๆ เครื่องนั้น สามารถใช้งานอินเทอร์เน็ตผ่านโมเด็มตัวนั้นได้ โดยเครื่องลูกจะต้องใช้ private ip ซึ่งมีให้เลือกหลายคลาส (class) เช่น 10.x.x.x 192.168.x.x เป็นต้น จากนั้นก็ตั้งเกตเวย์ให้ชี้ไปยัง linux box ที่ทำหน้าที่หมุนโมเด็มและรันไอพีเทเบิล ซึ่งสามารถใช้คำสั่งง่ายๆ ดังด้านล่างก็ทำให้เครื่องลูกสามารถใช้งานอินเทอร์เน็ตได้แล้ว คือ
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
echo “1″ > /proc/sys/net/ip_forward
ref::http://research.crma.ac.th/2549/index.php
คลังบทความของบล็อก
เกี่ยวกับฉัน
- pound pound
- Linux user number 528023.