Hadyai Internet R&D LAB
แหล่งความรู้ => Server => Linux Server System => ข้อความที่เริ่มโดย: admin ที่ 30 พฤษภาคม 2008, 05:30:55
-
จุดประสงค์ คือ เรียนรู้และทำความเข้าใจการทำงานของ 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 ที่เพิ่มเข้าไป