การทำเกตเวย์และไฟร์วอลล์ด้วย Linux (ipchains)

สมมุติว่ามีปัญหาอยู่อย่างนี้ครับ
 ถ้าท่านเป็นผู้ให้บริการอินเตอร์เน็ตเช่นประเภท
Internet Corporate Access โดยจำนวน IP ที่ท่านให้กับลูกค้าแต่ละรายอาจจะมีจำนวนเป็น 16,32,64 หรือ 128 IP ก็แล้วแต่ว่าผู้ให้บริการแต่ละรายจะมีนโยบายให้กันเท่าไหร่นะครับ  ท่านคงจะได้เจอปัญหานี้มาแล้วบ้างที่ว่า เมื่อจำนวนของเครื่องคอมพิวเตอร์หรือ Server ของลูกค้ามีมากกว่าจำนวน IP ที่ท่านให้แล้วท่านจะให้คำปรึกษากับลูกค้าอย่างไร หรือถ้าเป็นในส่วนของลูกค้า จะต้องทำอย่างไร

ปัญหาที่กล่าวมานี้สามารถแก้ปัญหาได้ด้วยการใช้
Linux Server ซึ่งเป็น OS แบบ Open Source และสามารถใช้ได้ฟรีโดยไม่ต้องซื้อ Software ราคาแพงมาใช้  แต่อาจจะไม่สะดวกเท่ากับ Software ที่มีราคาแพง ๆ นะครับ แต่ก็นั่นแหละครับ มันสามารถประหยัดต้นทุนลงไปได้มากทีเดียว

สมมุติฐาน
สมมุติว่าหน่วยงานที่มีปัญหาได้เช่า Internet Corporate Access (Internet เป็นแบบ Leased Line) จาก ISP มา และได้ IP Address จาก ISP สำหรับวง LAN เป็น 16 ip คือ 202.129.48.160/28 (ใช้งานจริงได้ 14 ip) แต่มีจำนวนของเครื่องคอมพิวเตอร์หรือเซิร์ฟเวอร์ภายในสำนักงานมากกว่า 14 ip โดย ip ที่ได้จาก ISP เป็นดังนี้ครับ :

LAN IP  : 202.129.48.160/28 นั่นคือจะมี IP ภายในวงแลนของผู้ใช้บริการเป็น 16 IP คือ 202.129.48.160-175 แต่ใช้ได้จริงแค่ 14 ip เพราะไอพี 202.129.48.160 เป็น Network IP และไอพี 202.129.48.175 เป็น Broadcast IP

WAN IP : 202.129.19.244/30  นั่นคือจะมี wan ip ฝั่ง ISP เป็น 202.129.19.245 และ wan ip ฝั่งผู้ใช้บริการเป็น 202.129.19.246

วิธีการแก้ปัญหา
เนื่องจาก
IP ที่ได้จาก ISP นั้นไม่เพียงพอต่อการใช้งาน ดังนั้น วิธีแก้ก็คือการใช้ Private IP ร่วมกับการทำเกตเวย์ โดยเครื่องที่จะเอามาทำเกตเวย์นั้นก็สามารถเอาเครื่อง PC ที่มีสเปคพอใช้ได้หน่อยมาทำ หรือจะใช้ Server จริง ๆ เลยก็ได้  ส่วน OS ที่ลงบนเครื่องเกตเวย์ให้ลง Linux นะครับ  สำหรับ Private IP มาตรฐานนั้นมี 3 ชุดด้วยกันคือ

10.0.0.0
- 10.255.255.255            สำหรับ Class A
172.16.0.0 - 172.31.255.255       สำหรับ Class B
192.168.0.0 - 192.168.255.255   สำหรับ Class C

ในที่นี้ผมขอเลือกใช้ Class C นะครับ โดยวิธีการที่จะทำนั้นก็คือการเอาเกตเวย์มาคั่นระหว่างเราเตอร์กับเครือข่าย LAN ภายใน ดังรูปที่ 1 โดยเครือข่าย LAN ภายในนั้นให้ใช้ IP Address เป็น Private IP  ซึ่งสามารถกำหนดได้โดยไม่จำกัด ซึ่งในที่นี้กำหนด IP เริ่มต้นที่ 192.168.1.11 เป็นต้นไป 

ส่วนของตัวเกตเวย์ควรจะมีการ์แลน 2 การ์ดนะครับ โดยกำหนดให้การ์หนึ่งมี IP อยู่ในกลุ่มของ IP ที่ได้จาก ISP โดยในที่นี้เลือกเป็น 202.129.48.162 และอีกการ์ดให้กำหนด IP เป็น Private IP โดยในที่นี้กำหนดเป็น 192.168.1.1

ดังนั้นจากรูปจะเห็นว่า  ถ้าจะให้เครื่องภายในวงแลนสามารถออกสู่อินเตอร์เน็ตได้ ก็ต้องกำหนดให้เครื่องคอมพิวเตอร์ภายในชี้ default gateway ไปที่ 192.168.1.1 และที่เกตเวย์จะต้องมีการเซ็ตว่าจะอนุญาตให้แพ็คเก็ตข้อมูลที่ส่งมาจากเครือข่ายภายในประเภทไหนบ้างผ่านไปยังเครือข่ายอินเตอร์เน็ตได้ และในทางกลับกันก็จะตัองทำการเซ็ตว่าจะอนุญาตให้แพ็คเก็ตข้อมูลไดบ้างจากภายนอกหรืออินเตอร์เน็ตสามารถผ่านเข้าไปสู่เครือข่ายภายในได้ด้วย
 


รูปที่ 1 การทำเกตเวย์โดยใช้การ์ดแลน 2 การ์ด

การเซ็ตเพื่อจะกำหนดว่าจะให้เครือข่ายภายในสามารถติดต่อกับเครือข่ายภายนอกได้หรือไม่ นั้นจะต้องใช้คำสั่ง ipchains บนเครื่อง gateway ครับ  โดยคำสั่ง ipchains เป็นคำสั่งในการทำไฟร์วอลลบน Linux ครับ ซึ่งจะมีรูปแบบและพารามิเตอร์ที่หลายหลายมาก โดยในที่นี้ผมจะยกตัวอย่างเท่าที่จำเป็นเท่านั้นนะครับสมมุติว่าจะให้ผู้ใช้ภายในเครือข่ายสามารถที่จะใช้บริการทุกอย่างได้โดยผ่าน gateway ก็ให้ใช้คำสั่ง ipchains ดังนี้ครับ

#echo 1 > /proc/sys/net/ipv4/ip_forward
#/sbin/ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ

จากคำสั่งดังกล่าว คำสั่งแรกเป็นการ enable ip_forward ส่วนคำสั่งที่ 2 เป็นการทำ IP Masquerading ซึ่งจะหมายถึง  การทำแพ็คเก็ตข้อมูลที่ส่งมาจากเครือข่ายภายในให้เปลี่ยนแปลงเป็นแพ็คเก็ตข้อมูลเสมือนว่ามีแอสเดรสต้นทางของแพ็คเก็ตมากจากเครื่อง Linux เอง แต่จะมีการกำหนดพอร์ตเพิ่มเติมเพื่อที่จะให้ทราบได้ว่าส่งมาจากโฮสต์ใดของเครือข่ายภายใน  โดยขั้นตอนในการกำหนด Masquerade Gatewate มีขั้นตอนดังนี้

  • แจ้งให้โฮสต์บนโลคัลเน็ตเวิร์ค (เครือข่ายภายใน) ทราบว่าช่องทางที่จะเชื่อมต่อกับอินเตอร์เน็ตเป็นช่องทางใดบน Linux Server อาจจะเป็น eth1 (การ์ดแลนฝั่งที่ติดต่อกับเครือข่ายภายนอก จากรูปที่ 1 คือการ์ดด้านขวามือ) หรือในการณีที่เชื่อมต่ออินเตอร์เน็ตผ่าน dialup อาจะเป็น ppp0 หรือ ppp1 นะครับ

  • เมื่อมีแพ็คเกตจากโลคัลเน็ตเวิร์คเดินทางมาถึง Masqueraded Gateway ตัว Masqueraded Gateway ก็จะเปลี่ยนข้อมูลที่เป็นแอสเดรสต้นทางในแพ็คเก็ต  พร้อมกับการกำหนดพอร์ตบนโปรโตคอล TCP/IP ใหม่เพื่อที่จะให้สามารถจำแนกโฮสต์บนโลคัลเน็ตเวิร์คได้

  • เมื่อมีแพ็คเกตจากอินเตอร์เน็ตเดินทางมาถึง Masqueraded Gateway ตัว Masqueraded Gateway ก็จะค้นหาข้อมูลบนพอร์ตของโปรโตคอล TCP/IP เพื่อจะให้ทราบว่าเป็นข้อมูลของโฮสต์ใดบนโลคัลเน็ตเวิร์ค  จากนั้นก็จะกำหนดแอดเดรสปลายทางของแพ็คเกตใหม่  เพื่อส่งไปยังโฮสต์บนโลคัลเน็ตเวิร์ค

  • การทำงานดังกล่าวเป็น Transparent ต่อโฮสต์ต้นทางหรือปลายทางที่รับ/ส่งข้อมูล

ซึ่งก็คล้ายกันการทำ NAT แบบมี IP จริงแค่ IP เดียวนะครับ

ส่วนรูปที่ 2 ก็เป็นหลักการเดียวกันกับรูปที่ 1 นะครับ เพียงแต่ว่าบนตัว
Gateway มีการ์ดแลนแค่การ์ดเดียว  การแก้ปัญหาก็ทำได้ด้วยการกำหนดค่า IP Address บนการ์ดนั้นให้มี IP เป็น 2 ค่า (Linux สามารถทำได้) คือ ip จริงค่าหนึ่งและอีกค่าเป็น Private IP และให้เครือข่ายภายในกำหนด IP ของทุกเครื่องเป็น Private IP หมด โดยให้ชี้ default dateway มาที่ Private IP ของ Gateway แต่วิธีนี้ไม่ขอแนะนำให้ใช้นะครับเพราะแพ็กเกตข้อมูลที่เป็นของอินเตอร์เน็ตปนเปอยู่กับแพ็คเกตข้อมูลภายใน  และยูสเซอร์ก็สามารเปลี่ยน IP ของเครื่องเป็น IP จริงได้



รูปที่ 2 การทำเกตเวย์โดยใช้การ์ดแลน 1 การ์ด


การใช้ ipchains ที่ผ่านมานั้นเป็นการเปิดบริการให้ยูสเซอร์ที่อยู่ในวงเครือข่ายภายในสามารถใช้บริการบนอินเตอร์เน็ตได้ทุกอย่าง นั่นคือไม่มีการห้ามใช้บริการประเภทใด  ในบางสถานะการณ์นั้น เราสามารถห้ามไม่ให้ยูสเซอร์ใช้บริการบางอย่างได้  เช่นห้ามเล่น ICQ ห้ามใช้ POP3 เป็นต้น  และบางครั้งตัวเกตเวย์ของเราเองอาจจะถูกโจมตีจากบุคคลที่ไม่หวังดีได้  ดังนั้นถ้าเรามีการป้องกันการโจมตีไว้ด้วยก็จะเป็นสิ่งที่ดี  ซึ่ง ipchains สามารถจะป้องกันตรงนี้ได้

การทำไฟร์วอลล์ด้วย
ipchains
ตัวอย่างต่อไปนี้เป็นตัวอย่างหนึ่งของการทำไฟร์วอลล์ที่ผมใช้งานอยู่จริง โดยมีรูปแบบการเชื่อมต่อของเครือข่ายเป็นดังรูปที่ 1 ซึ่งในตัวไฟร์วอลล์เองมีบริการอื่นที่รันอยู่ด้วยคือ Web Server (ทำเป็น Webmail ติดต่อกับ mail server คือเครื่องตัวเองผ่าน smtp และ imap), DNS Server, Proxy Server, Mail Server (เปิดให้ client คอนเน็กผ่านทั้ง pop3 และ imap), Ftp Server และอนุญาตให้เครือข่ายภายในสามารถออกไปใช้บริการอินเตอร์เน็ตที่ประกอบด้วย ftp,telnet,smtp,pop3,imap,webcache,http,https,icq,ping,dns และมีการห้ามพอร์ตบางพอร์ตของ tcp และ udp ซึ่งสามารถสรุปเป็นตารางดังต่อไปนี้

ลำดับ Source Destination Service Port No. Action
1 Internal any ftp 21 tcp accept
2 Internal any telnet 23 tcp accept
3 any any smtp 25 tcp accept
4 any any http 80 tcp accept
5 Internal any pop3 110 tcp accept
6 Internal any imap 143 tcp accept
7 localhost localhost imap 143 tcp accept
8 Internal any https 443 tcp accept
9 any any dns 53 udp accept
10 Intenal any icq 4000 udp accept
11 ไม่ใช่ Internal any webcache (proxy) 8080 tcp reject
12 Internal any เป็นการทำ NAT (MASQ) forward
13 any any tcp port 0-1023 0-1023 tcp reject
14 any any tcp Network File System (NFS) 2049 tcp reject
15 any any udp port 0-1023 0-1023 udp reject
16 any any udp Network File System (NFS) 2049 udp reject
17 any any x windows system 6000-6009 tcp reject
18 any any X Font Service 7100 tcp reject


1
: #ipchains -A input -s 192.168.1.0/24 -d 0/0 21 -p tcp -y -j ACCEPT                       
2: #ipchains -A input -s 192.168.1.0/24 -d 0/0 23 -p tcp -y -j ACCEPT
3: #ipchains -A input -s 0/0 -d 0/0 25 -p tcp -y -j ACCEPT
4: #ipchains -A input -s 0/0 -d 0/0 80 -p tcp -y -j ACCEPT
5: #ipchains -A input -s 192.168.1.0/24 -d 0/0 110 -p tcp -y -j ACCEPT
6: #ipchains -A input -s 192.168.1.0/24 -d 0/0 143 -p tcp -y -j ACCEPT
7: #ipchains -A input -s 127.0.0.1 -d 127.0.0.1 143 -p tcp -y -j ACCEPT
8: #ipchains -A input -s 192.168.1.0/24 -d 0/0 443 -p tcp -y -j ACCEPT
9: #ipchains -A input -s 0/0 -d 0/0 53 -p udp -j ACCETP
10: #ipchains -A input -s 192.168.1.0/24 -d 0/0 4000 -p udp -j ACCEPT
11: #ipchains -A input -s ! 192.168.1.0/24 -d 0/0 8080 -p tcp -y -j REJECT
12:#ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ
13:#ipchains -A input -s 0/0 -d 0/0 0:1023 -p tcp -y -j REJECT
14:#ipchains -A input -s 0/0 -d 0/0 2049 -p tcp -y -j REJECT
15:#ipchains -A input -s 0/0 -d 0/0 0:1023 -p udp -j REJECT
16:#ipchains -A input -s 0/0 -d 0/0 2049 -p udp -j REJECT
17:#ipchains -A input -s 0/0 -d 0/0 6000:6009 -p tcp -y -j REJECT
18:#ipchains -A input -s 0/0 -d 0/0 7100 -p tcp -y -j REJECT

(ดูรายละเอียดของ tcp ports และ udp ports ได้ที่ http://www.southcat.net/technology/computer/tcp_ports.html และ http://www.southcat.net/technology/computer/udp_ports.html )
ความหมายแต่ละบรรทัด:
1.อนุญาตให้เครือข่ายภายใน ftp ไปยังปลายทางที่ไหนก็ได้
2.อนญาติให้เครือข่ายภายใน telnet ไปยังปลายทางที่ไหนก็ได้
3.อนุญาตให้รับส่งเมล์ผ่าน smtp ได้ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
4.อนุญาตให้ใช้เรียกใช้งานเว็บได้ไม่ว่าจะเรียกจากที่ไหน และเรียกไปที่ไหนก็ได้
5.อนุญาตให้ mail client ของเครือข่ายภายในรับส่งเมล์กับ mail server ที่ไหนก็ได้ผ่าน POP3
6.อนุญาตให้ mail client ของเครือข่ายภายในรับส่งเมล์กับ mail server ที่ไหนก็ได้ผ่าน IMAP
7.อนุญาตให้ localhost สามารถใช้ imap ติดต่อกับ localhost ได้ เพื่อทำ webmail
8.อนุญาตให้เครือข่ายภายในใช้ https ได้
9.อนุญาตให้ใช้งาน DNS ได้ ไม่ว่าต้นทางและปลายทางอยู่ที่ไหน
10.อนุญาตให้เครือข่ายภายในใช้ ICQ ได้
11.ไม่อนุญาตให้เครือข่ายที่นอกเหนือจากเครือข่ายภายในสามารถใช้งาน Proxy Server ได้
12.ทำ NAT ให้เครือข่ายภายในติดต่อกับเครือข่ายภายนอกที่ไหนก็ได้
13.ไม่อนุญาตให้ใช้งาน tcp พอร์ต 0-1023 ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
14.ไม่อนุญาตให้ใช้งาน tcp พอร์ต 2049 (NFS) ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
15.ไม่อนุญาตให้ใช้งาน udp พอร์ต 0-1023 ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
16.ไม่อนุญาตให้ใช้งาน udp พอร์ต 2049 (NFS) ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
17.ไม่อนุญาตให้ใช้งาน tcp พอร์ต 6000-6009 (เป็น x11 สำหรับ X-windows) ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
18.ไม่อนุญาตให้ใช้งาน tcp พอร์ต 7100 (X Font Service) ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน

จากคำสั่งข้างบน เนื่องจาก
webmail จะต้องมีการติดต่อกับ Mail Server ผ่าน imap  ดังนั้นในบรรทัดที่ 7 เราจึงต้องอนุญาตให้ localhost สามารถเชื่อมต่อ IMAP กับ localhost ได้  ซึ่งอาจจะใช้คำสั่งเป็นอีกแบบ ดังนี้ได้ครับ :
#ipchains -A input -s 0/0 -d 0/0 -i lo -j ACCEPT

จากตัวอย่างที่ผ่านมา อาจจะมีบางคนสงสัยว่าทำไมในส่วนท้ายของชุดคำสั่งไฟร์วอลล์ที่ผ่านมา (บรรทัดที่ 13-18) จึงไม่ Reject ทั้ง TCP และ UDP ให้หมดเลยด้วยการใช้คำสั่งแค่ 2 บรรทัด ต่อไปนี้ (แทนที่บรรทัด 13-18 ของคำสั่งข้างบนเป็นคำสั่งใหม่บรรทัดที่ 13-14)

1
: #ipchains -A input -s 192.168.1.0/24 -d 0/0 21 -p tcp -y -j ACCEPT                       
2: #ipchains -A input -s 192.168.1.0/24 -d 0/0 23 -p tcp -y -j ACCEPT
3: #ipchains -A input -s 0/0 -d 0/0 25 -p tcp -y -j ACCEPT
4: #ipchains -A input -s 0/0 -d 0/0 80 -p tcp -y -j ACCEPT
5: #ipchains -A input -s 192.168.1.0/24 -d 0/0 110 -p tcp -y -j ACCEPT
6: #ipchains -A input -s 192.168.1.0/24 -d 0/0 143 -p tcp -y -j ACCEPT
7: #ipchains -A input -s 127.0.0.1 -d 127.0.0.1 143 -p tcp -y -j ACCEPT
8: #ipchains -A input -s 192.168.1.0/24 -d 0/0 443 -p tcp -y -j ACCEPT
9: #ipchains -A input -s 0/0 -d 0/0 53 -p udp -j ACCETP
10: #ipchains -A input -s192.168.1.0/24 -d 0/0 4000 -p udp -j ACCEPT
11: #ipchains -A input -s ! 192.168.1.0/24 -d 0/0 8080 -p tcp -y -j REJECT
12:#ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ

13:#ipchains -A input -s 0/0 -d 0/0 -p udp -j REJECT
14:#ipchains -A input -s 0/0 -d 0/0 -p tcp -y -j REJECT

ถ้าทำแบบนี้จะมีปัญหาคือ
เครือข่ายภายในไม่สามารถเล่น ICQ ได้ เพราะ ICQ นอกจากจะทำงานที่ UDP port 4000 แล้ว มันยังทำงานที่ TCP port ที่ค่าพอร์ตมากกว่า 1023 อีกด้วย และปัญหาอีกอย่างที่ผมเจอคือเครือข่ายภายในไม่สามารถใช้บริการ DNS ไปยังภายนอกได้ ซึ่งผมคิดว่าน่าจะมีสาเหตุจากการทำ Masquerade ที่ไม่มีความสามารถเท่ากับการทำ NAT จริง ๆ

ออปชันที่เป็น
-y ซึ่งมีเฉพาะที่ใช้กับโปรโตคอล tcp เท่านั้น กล่าวคือ TCP เป็นโปรโตคอลแบบ "connection oriented" คือต้องสถาปนาการเชื่อมต่อระหว่างสถานีต้นทางและปลายทางก่อนการส่งข้อมูล ซึ่งจะต่าง กับ UDP ที่เป็นแบบ "connectionless" คือไม่มีการสถาปนาการเชื่อมต่อระหว่างต้นทางและปลายทาง  การใช้ -y ก็เพื่อที่จะอนุญาต/ไม่อนุญาต ให้มีการสถาปนาการเชื่อมต่อ (initiate communication) สำหรับโปรโตคอล TCP นั่นเอง

ในเรื่องของ
ipchains นั้นมีรายละเอียดเกี่ยวกับการใช้งานมาก  ซึ่งไม่ขออธิบายรายละเอียดในที่นี้  การทำไฟร์วอลล์หรือเกตเวย์  ถ้าต้องการความปลอดภัยมาก ๆ ก็อาจจะต้องใช้คำสั่งของ ipchains ที่ยุ่งยากมากกว่านี้ แต่ยิ่งมีจำนวน chains มากขึ้นเท่าไหร่ก็จะมีผลทำให้ Server ต้องทำงานหนักขึ้น ซึ่งส่งผลให้ Server ทำงานช้าลงได้  ในการใช้งานจริง ๆ ท่านสามารถพลิกแพรง  ได้ตามความเหมาะสมนะครับ ไม่ต้องเอาตามของผม ของผมอาจจะจะไม่ปลอดภัยมากนักนะครับ มันขึ้นอยู่กับระดับความปลอดภัยที่ต้องการนะครับว่าจะให้มากน้อยขนาดไหน

Demilitarized Zone (DMZ)
ต่อไปผมจะขอยกตัวอย่างในกรณีที่ผู้ใช้บริการมี
Server ต่าง ๆ อยู่ด้วย ในที่นี่สมมุติว่ามี Web Server, FTP Server, DNS Server , Proxy Server, Mail Server และ MySql  Serer แล้วเราจะทำอย่างไรล่ะ

วิธีการที่นิยมกันคือการเพิ่มโซนของเครือข่ายมาอีกโซนหนึ่งนั่นคือ
Demilitarized Zone (DMZ) ซึ่งถ้าแปลตรง ๆ ก็คือ "เขตปลอดทหาร" เช่น ที่กำหนดขึ้นที่เขตแดนระหว่างประเทศเกาหลีเหนือและประเทศเกาหลีใต้ในระหว่างการสงบศึกชั่วคราวของสงครามเกาหลี

สำหรับในเรื่อง
Network Security แล้ว DMZ เป็นคำจำกัดความของโซนอีกประเภทหนึ่งที่ไม่ใช่ทั้ง Internal (เครือข่ายภายใน) และ External (เครือข่ายภายนอกหรือเครือข่ายอินเตอร์เน็ต) แต่หมายถึงเครือข่ายที่ต้องมีการสื่อสารกับทั้งเครือข่ายภายในและเครือข่ายภายนอกนั่นเอง  และดังนั้นผมจึงได้จัดให้ Server ทั้ง 5 ซึ่งต้องติตต่อกับทั้งเครือข่ายภายในและเครือข่ายภายนอกให้อยู่ใน DMZ ดังรูปที่ 3

อาจจะสงสัยบ้างว่าถ้ามี
DHCP Server ด้วยจะเอาไว้ตรงไหน  เนื่องจาก DHCP Server ไม่ต้องมีการติดต่อสื่อสารกับเครือข่ายภายนอก จึงสามารถวางไว้ที่เครือข่ายภายในได้เลยครับ หรือถ้า Gateway มี Spec สูงหน่อย ก็สามารถวางไว้บน gateway เลยก็ได้ครับ

รูปที่ 3 การทำไฟร์วอลล์แบบที่มี DMZ ที่จัดแบ่งไอพีไม่ถูกต้อง

จากรูปข้างบนนี้ผมลองทำดูแล้วมีปัญหาครับ คือ Linux ไม่ยอมรับลักษณะที่มีการ์ดแลนด์ 2 การ์ดแต่มีค่า IP อยู่ในวงเดียวกันนั่นคือการ์ด 202.129.48.162 กับการ์ด 202.29.48.163 ซึ่งเป็น IP ที่อยู่ในวงเดียวกันคืออยู่ในวง 202.129.48.160/28

เมื่อเป็นแบบนี้วิธีการแก้ปัญหาก็สามารถทำได้ด้วยการแบ่ง
subnet ออกเป็น 2 subnet คือแบ่งไอพีวงแลนที่ได้จาก ISP เป็น 2 วงแลนนั่นเอง โดยวงแลนวงที่หนึ่งจะให้เป็นของ External และวงที่สองเป็นของ DMZ ซึ่งสามารถแบ่งได้เป็นดังนี้ :

วงที่ 1
: 202.129.48.160/29 ซึ่งจะมีไอพีเป็น 8 ไอพีที่อยู่ในช่วง 202.129.48.160 ถึง 202.129.48.167 แต่จะใช้งานได้จริงเป็น 6 ip คือ 202.129.48.161 ถึง 202.129.48.166
วงที่ 2
: 202.129.48.168/29 ซึ่งจะมีไอพีเป็น 8 ไอพีที่อยู่ในช่วง 202.129.48.168 ถึง 202.129.48.175 แต่จะใช้งานได้จริงเป็น 6 ip คือ 202.129.48.169 ถึง 202.129.48.174

และแล้วก็จะได้รูปแบบของการจัดวางเครือข่ายทั้งหมดใหม่เป็นดังรูปที่ 4


รูปที่ 4 การทำไฟร์วอลล์แบบที่มี
DMZ ที่ถูกต้อง

เพื่อความสะดวกในการทำ ipchains เราควรจัดทำตารางแอคเซสรูลขึ้นมาก่อน  เพื่อแสดงความต้องการในการใช้งานว่าเราต้องการจะยอมรับหรือปฏิเสธแอปปลิเคชันอันไหนบ้าง  โดยความต้องการในที่นี้ขออ้างถึงรูปที่ 4 และได้ดังตารางต่อไปนี้ :
 

ลำดับ Source Destination Service Port No. Action
1 internal any เป็นการทำ NAT (MASQ) forward
2 internal any ftp 21 tcp accept
3 internal any dns 53 udp accept
4 dmz any dns 53 udp accept
5 any dmz dns 53 udp accept
6 any any http 80 tcp accept
7 Internal any telnet 23 tcp accept
8 any (external) internal telnet 23 tcp reject
9 any any smtp 25 tcp accept
10 internal any pop3 110 tcp accept
11 Intenal any imap 143 tcp accept
12 Internal any https 443 tcp accept
13 Internal any ping icmp accept
14 ไม่ใช่ Internal any webcache (proxy) 8080 tcp reject
15 any (external) dmz ping icmp reject
16 any any tcp port 0-1023 0-1023 tcp reject
17 any any tcp Network File System (NFS) 2049 tcp reject
18 any any udp port 0-1023 0-1023 udp reject
19 any any udp Network File System (NFS) 2049 udp reject
20 internal any ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven 2773 tcp reject
21 internal any ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven 6771 tcp reject
22 internal any ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven 6713 tcp reject
23 internal any ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven 7215 tcp reject
24 internal any ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven 27374 tcp reject
25 internal any ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven 27573 tcp reject
26 internal any ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven 54283 tcp reject
27 any dmz x windows system 6000-6009 tcp reject
28 any dmz X Font Service 7100 tcp reject
29 intenal any ดักจับโฮสต์ภายในที่ติดโปรแกรม Back Orifice 2000 8787 tcp reject
30 internal any ดักจับโฮสต์ภายในที่ติดโปรแกรม Back Orifice 2000 54320-54321 reject


1:#ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ
2:#ipchains -A input -s 192.168.1.0/24 -d 0/0 21 -p tcp -y -j ACCEPT
3.:#ipchains -A input -s 192.168.1.0/24 -d 0/0 53 -p udp -j ACCEPT
4:#ipchains -A input -s 202.129.48.168/29 -d 0/0 53 -p udp -j ACCEPT
5:#ipchains -A input -s 0/0 -d 202.129.48.168/29 53 -p udp -j ACCEPT
6:#ipchains -A input -s 0/0 -d 0/0 80 -p tcp -y -j ACCEPT
7:#ipchains -A input -s 192.168.1.0/24 -d 0/0 23 -p tcp -y -j ACCEPT
8:#ipchains -A input -s 0/0 -d 202.129.48.168/29 23 -p tcp -y  -j REJECT
9:#ipchains -A input -s 0/0 -d 0/0 25 -p tcp -y -j ACCEPT
10:#ipchains -A input -s 192.168.1.0/24 -d 0/0 110 -p tcp -y -j ACCEPT
11:#ipchains -A input -s 192.168.1.0/24 -d 0/0 143 -p tcp -y -j ACCEPT
12:#ipchains -A input -s 192.168.1.0/24 -d 0/0 443 -p tcp -y -j ACCEPT
13:#ipchains -A input -s 192.168.1.0/24 -d 0/0 -p icmp --icmp-type ping -j ACCEPT
14: #ipchains -A input -s ! 192.168.1.0/24 -d 0/0 8080 -p tcp -y -j REJECT
15:#ipchains -A input -s 0/0 -d 202.129.48.168/29 -p icmp --icmp-type ping -j REJECT
16:#ipchains -A input -s 0/0 -d 0/0 0:1023 -p tcp -y -j REJECT
17:#ipchains -A input -s 0/0 -d 0/0 2049 -p tcp -y -j REJECT
18:#ipchains -A input -s 0/0 -d 0/0 0:1023 -p udp -j REJECT
19:#ipchains -A input -s 0/0 -d 0/0 2049 -p udp -j REJECT

20:#ipchains -A input -s 192.168.1.0/24 -d 0/0 2773 -p tcp -y -j REJECT
21:#ipchains -A input -s 192.168.1.0/24 -d 0/0 6771 -p tcp -y -j REJECT
22:#ipchains -A input -s 192.168.1.0/24 -d 0/0 6713 -p tcp -y -j REJECT
23#ipchains -A input -s 192.168.1.0/24 -d 0/0 7215 -p tcp -y -j REJECT
24:#ipchains -A input -s 192.168.1.0/24 -d 0/0 27374 -p tcp -y -j REJECT
25:#ipchains -A input -s 192.168.1.0/24 -d 0/0 27573 -p tcp -y -j REJECT
26:#ipchains -A input -s 192.168.1.0/24 -d 0/0 54283 -p tcp -y -j REJECT

27:#ipchains -A input -s 0/0 -d 202.129.48.168/29 6000:6009 -p tcp -y -j REJECT
28:#ipchains -A input -s 0/0 -d 202.129.48.168/29 7100 -p tcp -y -j REJECT

29:#ipchains -A input -s 192.168.0.1/24 -d 0/0 8787 -p tcp -y -j REJECT
30:#ipchains -A input -s 192.168.0.1/24 -d 0/0 54320:54321 -p udp -j REJECT
:
ความหมายแต่ละบรรทัด:
1.ทำ NAT ให้เครือข่ายภายในเพื่อจะให้สามารถออกสู่เครือข่ายภายนอกได้
2.อนุญาตให้เครือข่ายภายใน ftp ไปที่ไหนก็ได้
3.อนุญาตให้เครือข่ายภายในใช้ DNS ของที่ไหนก็ได้
4.อนุญาตให้ DMZ ไปใช้ DNS ของที่ไหนก็ได้  ซึ่งตรงนี้เป็นการอนุญาตให้ทั้งเครือข่าย  จริง ๆ แล้วอาจจะอนุญาตให้เฉพาะ Proxy Server กับ DNS Sever ก็พอแล้ว โดยให้ระบุ IP address ของ Server ไปได้เลย นั่นคือต้องใช้คำสั่งนี้สองบรรทัดนะ
5.อนุญาตให้ต้นทางที่ไหนก็ได้มาใช้ DNS ใน DMZ ได้  ซึ่งไอพีของปลายทางสามารถจะระบุเฉพาะ IP ของ DNS Server ไปเลยก็ได้
6.อนุญาตให้ใช้ http ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
7.อนุญาตให้เครือข่ายภายในสามารถจะ telnet ไปที่ไหนก็ได้
8.ไม่อนุญาตให้ต้นทางที่ไหนก็ได้ telnet เข้ามา DMZ ได้ แต่เมื่อย้อนไปดูข้อ 7 ก็สรุปว่าอนุญาตให้เฉพาะเครือข่ายภายในเท่านั้นที่ telnet เข้า DMZ ได้
9.อนุญาตให้ต้นทางที่ไหนสามารถใช้ smtp ที่ปลายทางที่ไหนก็ได้
10.อนุญาตให้เครือข่ายภายในไปใช้ pop3 ที่ปลายทางที่ไหนก็ได้
11.อนุญาตให้เครือข่ายภายในไปใช้ imap ณ ปลายทางที่ไหนก็ได้
12.อนุญาตให้เครือข่ายภายในไปใช้ https ณ ปลายทางที่ไหนก็ได้
13.อนุญาตให้เครือข่ายภายใน ping ไปที่ไหนก็ได้
14.ไม่อนุญาตให้เครือข่ายที่นอกเหนือจากเครือข่ายภายในสามารถใช้งาน Proxy Server ได้
15.ไม่อนุญาตให้ทุกที่ ping เข้ามาใน DMZ แต่เมื่อย้อนไปดูข้อ 13 แล้ว สรุปเป็นว่าอนุญาตให้เฉพาะเครือข่ายภายในเท่านั้นที่ ping เข้า dmz ได้
16.ห้ามการใช้งานที่พอร์ต 0-1023 tcp ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน แต่จะอนุญาตให้เฉพาะกฎข้อก่อนหน้านี้เท่านั้น
17.ห้ามการใช้งาน tcp Network File System (NFS) ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
18.ห้ามการใช้งานที่พอร์ต 0-1023 udp ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน แต่จะอนุญาตให้เฉพาะกฎข้อก่อนหน้านี้เท่านั้น
19.ห้ามการใช้งาน udp Network File System (NFS) ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
20-26 ดักจับโฮสต์ภายในที่ติดโปรแกรม SubSeven
27.ห้ามต้นทางที่ไหนก็แล้วแต่  ติดต่อเข้าไปยัง x windows system ของ DMZ
28.ไม่อนุญาตให้ใช้งาน tcp พอร์ต 7100 (X Font Service) ไม่ว่าจะเป็นต้นทางและปลายทางที่ไหน
29-30 ดักจับโฮสต์ภายในที่ติดโปรแกรม Back Orifice 2000