ก่อนที่ท่านจะศึกษาเรื่อง ACL (Access Control List) นั้นท่านควรมีความรู้เรื่อง TCP/IP ในระดับ TCP/UDP port สักหน่อย โดยท่านสามารถเข้าไปศึกษาได้ตาม link นี้ครับ
//www.bloggang.com/viewblog.php?id=likecisco&date=10-02-2015&group=3&gblog=29
=============================================
ตัวอย่าง ACL Command:
access-list 100 permit tcp host 10.1.1.1 host 20.1.1.1 eq 80
access-list 100 permit tcp host 10.1.1.2 30.1.1.0 0.0.0.255 eq 23
ACL สามารถใส่มุมมองของ programming ได้ในลักษณะนี้ครับ
สิ่งแรกที่ท่านต้องจำไว้คือ ACL ทำงานจากบรรทัดบน ลงบรรทัดล่างเสมอ
if < condition > then < action permit/deny > (ACLStatement ที่ 1)
else if < condition > then < action permit/deny > (ACL Statement ที่ 2)
else if < condition > then < action permit/deny > (ACL Statement ที่ 3)
- if < condition > หมายถึง
เมื่อ < condition > ประกอบไปด้วย conditionย่อยๆ คือ
- Protocol อะไรที่สนใจ (TCP, UDP, ICMP หรืออืนๆ)
- Source IP address ที่สนใจเป็น IP address อะไร หรือมี rangeของ source IP address เป็นเบอร์อะไร (การใช้งานปกติทั่วๆไป ที่ไม่ได้ประยุกต์แล้ว ปกติ source IP address จะเป็น IP address ของ client ที่จะไปขอใช้บริการ server)
- Source Port (กรณีสนใจ protocol TCP/UDP) เป็น port อะไรหากสนใจ แต่ปกติจะไม่กำหนด เพราะเมื่อ client ไปติดต่อกับ server แล้ว มันจะ random source port และเมื่อไม่กำหนด source port แล้ว จะหมายถึง source port = any
- Destination IP address ที่สนใจ เป็น IP address อะไร หรือมี range ของ destination IP address เป็นเบอร์อะไร (การใช้งานปกติทั่วๆไป ที่ไม่ได้ประยุกต์แล้ว ปกติ destination IP address จะเป็น IP address ของ server ที่จะถูกใช้บริการจาก client)
- Destination Port (กรณีสนใจ protocol TCP/UDP) เป็น port อะไร โดยปกติทั่วๆ ไปแล้ว (ในกรณีที่ไม่ได้ประยุกต์) destination port จะเป็น port ที่ client จะระบุเพื่อบอกกับ server ว่าต้องการใช้บริการ application อะไร เพราะ server 1 ตัว สามารถให้บริการ service ได้มากกว่า 1 service หรือกล่าวอีกนัยหนึ่ง คือ server หนึ่งตัวอาจจะเปิด TCP/UDP port ไว้มากกว่าหนึ่ง port (TCP/UDP port จะเป็นมาตรฐานที่ถูกผูกไว้กับ Application) โดยท่านสามารถเข้าไปดูได้ตาม link นี้ครับ
//en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
-------------------------------------------------
โดย ACL Statement นั้นๆ จะถือว่า match หรือเป็นจริง ทั้ง statement ก็ต่อเมื่อ condition ย่อยทั้งหมดจะต้องเป็นจริง เพราะ condition ย่อยต่างๆ ใน ACL statement นั้นๆ จะเชื่อมกันด้วย AND Logic
< condition > = < Protocol AND source IP AND source port AND destination IP AND destination port>
------------------------------------------------
ตัวอย่างที่ 1 ของ < condition >
access-list 100 permit tcp host 10.1.1.1 host 20.1.1.1 eq 80
< condition > คือ
- Protocol: TCP
- Source IP address: host 10.1.1.1
- Source TCP Port: Any port (เพราะไม่ได้ระบุว่าให้ใช้ port อะไร หรือไม่มี command eq ตามหลัง source IP address)
- Destination IP address: host 20.1.1.1
- Destination TCP Port: eq 80 (หรือ TCP port 80 หรือ Web Application)
ความหมายคือ: เรากำลังสนใจ traffic จาก client เครื่องใดเครื่องหนึ่งที่มี IP address 10.1.1.1 ไปยัง server เครื่องใดเครื่องหนึ่งที่มี IP address 20.1.1.1 โดยไม่สนใจว่า client จะใช้ source TCP port เป็นหมายเลขอะไร (any port) แต่สนใจ traffic ที่ไปหา server 20.1.1.1 เพื่อไปติดต่อ server ขอใช้บริการ Web Application (www หรือ TCP port 80)
สิ่งที่ขอให้ท่านจำไว้ให้ขึ้นใจ คือ
หลักการเขียน ACL จะเขียนเน้นในลักษณะทิศทางจาก Client-to-Server เป็นหลัก เพราะ service ต่างๆ จะเริ่มต้นการสื่อสารจาก Client เป็นคนร้องขอ หรือ request เสมอ (ไม่นิยมเขียนกลับจาก Server-to-Client แต่หากต้องการ ก็สามารถเขียนได้ แต่จะต้องเข้าใจเรื่อง flow ของ traffic ให้ดีก่อน)
และจากที่ Client เป็นผู้เริ่มต้นของการสื่อสาร (ส่ง request หรือ sync) ดังนั้น Client จะใช้ source port ที่เป็น random ดังข้อมูลข้างล่าง
- สำหรับ Windows XP และ version ที่ต่ำกว่า จะใช้ source port ที่เป็น Dynamic portrange สำหรับ TCP/IP ตั้งแต่ 1,025 ไปจนถึง 5,000
- สำหรับ Windows Vista และ Windows Server 2008 เป็นต้นไป จะใช้ sourceport ที่เป็น Dynamic port range สำหรับ TCP/IP ตั้งแต่ 49,152 ไปจนถึง 65,535
นั่นก็คือ ในการเขียน ACL โดยเน้นทิศทางจาก Client-to-Server แล้ว เราจะไม่สามารถบอกได้อย่างชัดเจนว่า Client กำลังใช้ Source Port เลขอะไร ดังนั้น เราจะสังเกตเห็นได้จาก ACL โดยทั่วๆ ไปว่า จะไม่การกำหนด Source Port ใน ACL เลย (ไม่มี command "eq" ตามหลัง Source IP address)
Note: หากมีการเขียน ACL ในทิศทาง return traffic จาก Server-to-Client แล้ว เราจะเห็นการเขียนที่มีความแตกต่างออกไปจากปกติทั้่วๆ ไป แต่ผมขออนุญาติไม่อธิบายในรายละเอียดนะครับ เพื่อไม่ให้ท่านเกิดความสับสน เพราะมันเป็นส่วนน้อยที่ท่านแทบจะไม่เจอเลย
หากท่านใดต้องการอ่านข้อมุลเพิ่มเติมเกี่ยวกับ "Default dynamic port range สำหรับ TCP/IP" แล้ว ท่านสามารถไปตามอ่านได้ตาม link นี้ครับ
//www.bloggang.com/viewblog.php?id=likecisco&date=10-02-2015&group=3&gblog=29
-------------------------------------------------
ตัวอย่างที่ 2 ของ < condition >
access-list 100 permit tcp host 10.1.1.2 30.1.1.0 0.0.0.255 eq 23
< condition > คือ
- Protocol: TCP
- Source IP address: host 10.1.1.2
- Source TCP Port: Any port (เพราะไม่ได้ระบุว่าให้ใช้ port อะไร หรือไม่มี command eq ตามหลัง source IP address)
- Destination IP address: host ตั้งแต่ IP address 30.1.1.0 ไปจนถึง IP address 30.1.1.255 (แต่ในความเป็นจริงแล้ว IP address ที่ใสามารถช้ได้จริงคือ IP address 30.1.1.1 จนถึง IP address 30.1.1.254 เท่านั้น)
- Destination TCP Port: eq 23 (หรือ TCP port 23 หรือ Telnet Application)
ความหมายคือ: เรากำลังสนใจ traffic จาก client เครื่องใดเครื่องหนึ่งที่มี IP address 10.1.1.2 ไปยัง server IP address ใด address หนึ่งจาก 30.1.1.1 ถึง 30.1.1.254 โดยไม่สนใจว่า client จะใช้ source TCP port เป็นหมายเลขอะไร (any port) แต่สนใจ traffic ที่ไปหา server 30.1.1.1 ถึง 30.1.1.254 เพื่อไปติดต่อ server ขอใช้บริการ Telnet Application (หรือ TCP port 23)
-------------------------------------------------
หาก ACL Statement นั้นๆ match หรือเป็นจริงทั้ง statement แล้ว
then < action permit/deny >
จากนั้นมันจะไปดู Action ที่ได้กำหนดเอาไว้ว่า เป็น permit หรือ deny
โดย permit และ deny จะมีความหมายอยู่ 2 แบบคือ:
- ถ้า ACL ใช้เป็น Filtering หรือ Firewall แล้ว:
- Permit = ปล่อยผ่าน
- Deny = Drop ทิ้งไป
- ถ้า ACL ใช้เป็น Classification เช่น ใช้กับ QoS, IPsec VPN, NAT และอื่นๆ แล้ว:
- Permit = สนใจ เอาไปใช้กับเรื่องที่ ACL นี้ผูกอยู่
- Deny = ไม่สนใจ เอาไปใช้กับเรื่องที่ ACL นี้ผูกอยู่
หาก ACL statement นั้นๆ เป็นจริงทั้ง statement
หาก ACL statement นั้นๆ เป็นจริงทั้ง statement และได้กระทำ action permit หรือ deny ไปแล้ว จะถือว่าเป็นการจบการไล่ ACL
แต่ถ้าไม่ match condition แรกแล้ว
else if < condition > then < action permit/deny >
else if ก็คือ ให้ไปดู < condition > บรรทัดถัดไป แล้วไล่ลงไปเรื่อยๆ เหมือนที่อธิบายไว้ในตอนแรก
ถ้าไม่ match ซัก condition ในบรรทัดใดๆ เลย
ก็จะมี implicit deny all statement ดักที่ท้ายสุด เพราะว่าเราไม่สามารถกำหนด condition ได้ทุกรณี หรือทุกเงื่อนไขครับ
สำหรับการกำหนดทิศทางของ ACL บน Interface นั้น ท่านสามารถเข้าไปดูแนวทางได้ตาม link นี้ครับ