Hadyai Internet R&D LAB
ผลงานของ Hadyai Internet R&D LAB => คุยกับทีมวิจัย => ข้อความที่เริ่มโดย: admin ที่ 02 มีนาคม 2017, 17:58:39
-
สำหรับหัวข้อนี้ จะเป็นขั้นสูงมากขึ้น เป็นการทำ การ mark connection และก็ทำ mark route
เพื่อแบ่งกลุ่มของข้อมูล และกำหนดเส้นทางให้กับการวิ่งของข้อมูลให้ถูกต้อง ตามที่เราต้องการ
ทำความเข้าใจการวิ่งของข้อมูลก่อน ดังนี้
ในการเชื่อมต่อรับส่งข้อมูล 1 session หรือ 1 connection จะประกอบด้วย
src ip : src port <==> dst ip : dst port
ข้อมูล INPUT
คือ ข้อมูลที่ dst เป็น Router และ src อาจจะมาจาก Internet ผ่านทาง WAN หรือ มาจาก Client ผ่านทาง LAN
ข้อมูล OUTPUT
คือ ข้อมูลที่ src เป็น Router dst อาจจะเป็น Internet โดยส่งไปทาง WAN หรือ dst เป็น Client โดยส่งไปทาง LAN
ข้อมูล FORWARD
คือ ข้อมูลที่ src เป็น Client วิ่งผ่าน Router ไปยัง dst Internet แล้ว Internet ก็ทำการตอบกลับมาผ่าน Router กลับไปสู่ Client
ข้อมูล INPUT/OUTPUT
เราจะเน้นจัดการข้อมูลที่วิ่งมาทาง WAN เข้ามายัง Router (Router ในทีนี้ก็คือ ตัว Network Server นั่นเอง)
โดยสิ่งที่เราต้องทำก็คือว่า
- ข้อมูลที่วิ่งเข้ามาทาง WAN1 จะต้องถูกส่งออกไปทาง WAN1
- ข้อมูลที่วิ่งเข้ามาทาง WAN2 จะต้องถูกส่งออกไปทาง WAN2
- ข้อมูลที่วิ่งเข้ามาทาง WAN3 จะต้องถูกส่งออกไปทาง WAN3
ก็คือเข้ามาทาง WAN ไหน ก็ต้องออกทาง WAN นั้น
เพราะถ้าออกไม่ตรง จะเกิดการเชื่อมต่อที่ผิดพลาด หรือไม่สามารถเชื่อมต่อกันได้
สิ่งที่ต้องทำ (กรณี 3wan)
1. สร้าง ip route ชื่อ wan1 ขึ้นมา โดยให้ gateway เป็น interface ของ wan1
2. สร้าง ip route ชื่อ wan2 ขึ้นมา โดยให้ gateway เป็น interface ของ wan2
3. สร้าง ip route ชื่อ wan3 ขึ้นมา โดยให้ gateway เป็น interface ของ wan3
4. สร้าง firewall mangle ขึ้นมา chain input
mark conn ข้อมูลที่วิ่งเข้ามาทาง wan1 โดยปลายทางเป็น local ให้ mark เป็น wan1
5. สร้าง firewall mangle ขึ้นมา chain input
mark conn ข้อมูลที่วิ่งเข้ามาทาง wan2 โดยปลายทางเป็น local ให้ mark เป็น wan2
6. สร้าง firewall mangle ขึ้นมา chain input
mark conn ข้อมูลที่วิ่งเข้ามาทาง wan3 โดยปลายทางเป็น local ให้ mark เป็น wan3
7. สร้าง firewall mangle ขึ้นมา chain output
กำหนดให้ข้อมูลที่ mark conn ชื่อ wan1 ให้ route ไปที่ ip route wan1
8. สร้าง firewall mangle ขึ้นมา chain output
กำหนดให้ข้อมูลที่ mark conn ชื่อ wan2 ให้ route ไปที่ ip route wan2
9. สร้าง firewall mangle ขึ้นมา chain output
กำหนดให้ข้อมูลที่ mark conn ชื่อ wan3 ให้ route ไปที่ ip route wan3
มาดูขั้นตอนการ config กัน
สร้าง ip route ให้เข้าไปเมนู IP -> Routes
(http://www.hadyaiinternet.com/images/mt/41.png)
กด + เพิ่ม Route กำหนด Gateway เป็น wan1 interface , Check Gateway ping , Distance 1
และ Routing Mark ชื่อว่า wan1
(http://www.hadyaiinternet.com/images/mt/42.png)
เสร็จแล้วกดปุ่ม Ok ก็จะได้ Route เพิ่มมาในชื่อ wan1
(http://www.hadyaiinternet.com/images/mt/43.png)
ทำเช่นเดียวกัน สำหรับ wan2 และ wan3 ก็จะได้มาเป็น
(http://www.hadyaiinternet.com/images/mt/44.png)
เป็นอันเรียบร้อย สำหรับการสร้าง route
ต่อไป ทำการสร้าง firewall mangle ขึ้นมา โดยเข้าไปที่เมนู IP -> Firewall เลือก แถบ Mangle
(http://www.hadyaiinternet.com/images/mt/45.png)
กดปุ่ม + แถบ General กำหนดค่า Chain input , In. Interface เป็น interface ของ wan1
(http://www.hadyaiinternet.com/images/mt/46.png)
แถบ extra เลือก Dst. Address Type เป็นแบบ local
(http://www.hadyaiinternet.com/images/mt/47.png)
แถบ Action เลือก Action mark connection , mark wan1 และ ติ๊ก Passthrough
(http://www.hadyaiinternet.com/images/mt/48.png)
เสร็จแล้วกดปุ่ม Ok ก็จะได้ mark connection input มา 1 บรรทัด
(http://www.hadyaiinternet.com/images/mt/49.png)
ทำแบบเดียวกันกับ wan2 และ wan3 โดยเปลี่ยน mark ให้ตรงตาม wan ก็จะได้ครบทั้ง 3 บรรทัด
(http://www.hadyaiinternet.com/images/mt/50.png)
ต่อไปทำการกำหนด route ให้กับข้อมูลที่ถูก mark connection แล้วให้ออกตาม wan ที่กำหนด
กด + เลือก Chain เป็น output เลือก Connection Mark เป็น wan1
(http://www.hadyaiinternet.com/images/mt/51.png)
แถบ Action เลือกเป็น mark routing เลือก route เป็น wan1 และก็ติ๊ก Passthrough ออก
(http://www.hadyaiinternet.com/images/mt/52.png)
กดปุ่ม Ok ก็จะได้ mark routing output ของ wan1 มา
(http://www.hadyaiinternet.com/images/mt/53.png)
ก็เช่นเดียวกันครับ ทำ mark routing ของ wan2 และ wan3 ในแบบเดียวกัน
(http://www.hadyaiinternet.com/images/mt/54.png)
ก็จะได้ mark routing output ของทั้ง 3 wan ครบ
เมื่อทำครบเรียบร้อยแล้ว ก็จะสามารถ remote winbox มาจากข้างนอกได้ โดยผ่านทาง ip จริง ของ wan ไหนก็ได้
หรือผ่านทาง noip ที่ได้ทำไว้ก็ได้ เช่นกัน
*** ทำการเพิ่ม comment โดยใช้ action แบบ passthrough เข้าไป เพื่อจัดกลุ่มบรรทัดให้สวยงาม ***
(http://www.hadyaiinternet.com/images/mt/55.png)
*** อันนี้ลองหาวิธีทำดูเองนะครับ อิอิ ไม่ยาก ***
-
ต่อไปทำการ Mark ข้อมูลกลุ่ม FORWARD กัน ก่อนจะทำตรงนี้ ต้องวางแผนกันก่อน ว่าจะแบ่งเป็นกี่กลุ่ม
และแต่ละกลุ่มจะให้วิ่งออกเส้นไหนบ้าง สำหรับในบทความนี้ ขอแบ่งออกเป็น 3 กลุ่มละกันครับ ง่ายๆ ก่อน
กลุ่มแรก คือ กลุ่มของ GamesOnline
กลุ่มสอง คือ กลุ่มของ Internet
กลุ่มสาม คือ กลุ่มอื่น ๆ ทั่วไป
โดยกำหนดว่า
กลุ่มแรก ให้ออกเส้น wan1
กลุ่มสอง ให้ออกเส้น wan2+wan3 โหลดบาลานซ์กัน (บาลานซ์แบบ dst ip address)
กลุ่มสาม ให้ออกเส้น wan2+wan3 โหลดบาลานซ์กัน (บาลานซ์แบบ both ip+port)
สำหรับการ mark FORWARD ตามสไตล์ของ hadyaiinternet นั้น จะมีโครงสร้างดังนี้
ใน chain prerouting ข้อมูลที่ผ่านมาทาง LAN และปลายทางไม่ใช่ local
ถ้า connection mark เป็น no-mark ก็ให้ทำการ jump ไปยัง chain mark_rules เพื่อทำการ mark ก่อน
แต่ถ้า connection mark ไม่ใช่ no-mark (แสดงว่าถูก mark มาแล้ว) ก็ให้ทำการ jump ไปยัง chain mark_route เลย
**การทำเช่นนี้ เพื่อเป็นการลดการทำงานของ mark_rules ไม่จำเป็นต้องมาเช็คทุกรอบ เปลือง cpu และเสียเวลาเปล่าๆ**
ใน chain mark_rules ก็จะทำการ mark connection ตามกลุ่มต่าง ๆ ที่กำหนด แล้วแต่เงื่อนไข จนครบทุกบรรทัด
อาจจะมี chain ย่อยต่าง ๆ สำหรับการแยกแบบพิเศษๆ เช่น loadbalace แบบต่าง ๆ ก็ทำใน chain mark_rules ทั้งหมด
เสร็จแล้วก็จะทำการ jump ไปยัง mark_route เพื่อกำหนดเส้นทางต่อไป
ใน chain mark_route ก็จะทำการ mark route ต่างๆ ตาม mark_connection ที่กำหนดมาแล้วใน chain mark_rules ก็เป็นอันเรียบร้อย เสร็จสิ้นกระบวนการ
มาดูวิธีการ config กัน
เริ่มต้นด้วยการสร้าง comment ด้วย action passthrouth กันก่อน (อันนี้ทำไว้เพื่อความสวยงามเฉยๆ)
กด + ทำการเพิ่ม mangle rules แถบ General เลือก Chain prerouting , In. Interface เป็น LAN
(http://www.hadyaiinternet.com/images/mt/56.png)
แถบ extra เลือกเป็น Dst. Address Type เป็น invert local
(http://www.hadyaiinternet.com/images/mt/57.png)
แถบ Action เลือก Action เป็น passthrough
(http://www.hadyaiinternet.com/images/mt/58.png)
กดปุ่ม Comment ใส่ Comment ไปว่า MARK FORWARD
(http://www.hadyaiinternet.com/images/mt/59.png)
ก็จะได้ บรรทัด comment มา ไว้สำหรับจัดแบ่งบรรทัดให้ดูสวยงามเฉยๆ จะได้ดูง่ายและเป็นระเบียบ
(http://www.hadyaiinternet.com/images/mt/60.png)
ต่อไปก็สร้าง chain ขึ้นมา 2 chain ก็คือ mark_rules และ mark_route
โดยทำ comment แบบ passthrough ขึ้นมาก่อน วิธีการก็คือ กด + ใส่ชื่อ Chain เป็น mark_rules
แล้วเลือก action เป็น passthrough กดปุ่ม comment ใส่ MARK_RULES เข้าไป ก็จะได้ออกมาเป็น
(http://www.hadyaiinternet.com/images/mt/61.png)
สำหรับ chain mark_route ก็ทำเช่นเดียวกัน
(http://www.hadyaiinternet.com/images/mt/62.png)
ต่อไปเพิ่มกฎของ MARK FORWARD เข้าไป ซึ่งจะมี 2 บรรทัด
1. chain prerouting ข้อมูลที่ผ่านมาทาง LAN และปลายทางไม่ใช่ local
ถ้า connection mark เป็น no-mark ก็ให้ทำการ jump ไปยัง chain mark_rules เพื่อทำการ mark ก่อน
2. chain prerouting ข้อมูลที่ผ่านมาทาง LAN และปลายทางไม่ใช่ local
ถ้า connection mark ไม่ใช่ no-mark (แสดงว่าถูก mark มาแล้ว) ก็ให้ทำการ jump ไปยัง chain mark_route เลย
บรรทัดแรก
- แถบ General chain prerouting , In. Interface LAN , Connection Mark เลือกเป็น no-mark
(http://www.hadyaiinternet.com/images/mt/63.png)
- แถบ Extra Dst. Address Type เลือก เป็น invert local
(http://www.hadyaiinternet.com/images/mt/64.png)
- แถบ Action เลือก Action เป็น jump ไปยัง chain mark_rules
(http://www.hadyaiinternet.com/images/mt/65.png)
กดปุ่ม Ok ก็จะได้บรรทัด jump prerouing มา
(http://www.hadyaiinternet.com/images/mt/66.png)
จับยกไปไว้ในกลุ่มของ MARK FORWARD ให้เรียบร้อย
(http://www.hadyaiinternet.com/images/mt/67.png)
ต่อไปบรรทัดที่สอง
ก็ทำแบบเดียวกัน
- แถบ General chain prerouting , In. Interface LAN , Connection Mark เลือกเป็น ! no-mark
(http://www.hadyaiinternet.com/images/mt/68.png)
- แถบ Extra Dst. Address Type เลือก เป็น invert local
(http://www.hadyaiinternet.com/images/mt/69.png)
- แถบ Action เลือก Action เป็น jump ไปยัง chain mark_route
(http://www.hadyaiinternet.com/images/mt/70.png)
กดปุ่ม Ok ก็จะได้บรรทัด jump prerouing มา
(http://www.hadyaiinternet.com/images/mt/71.png)
จับยกไปไว้ในกลุ่มของ MARK FORWARD ให้เรียบร้อย
(http://www.hadyaiinternet.com/images/mt/72.png)
ก็เป็นอันเรียบร้อย สำหรับ MARK FORWARD
ต่อไปก็จะเป็นของ MARK RULES และ MARK ROUTE
-
สำหรับ chain mark_rules เราจะเริ่มกันแบบง่าย ๆ ก่อน เพื่อความเข้าใจ โดยจะมีทั้งหมด 4 บรรทัด
1. ip ปลายทางที่อยู่ใน List ชื่อ GamesOnline จะ mark conn ชื่อว่า game
2. port ปลายทางที่เป็น 443,80 จะ jump ไปที่ chain ชื่อ dst_balance
3. ข้อมูลที่ยัง no-mark ก็ให้ทำการ jump ไปที่ chain ชื่อ both_balance
4. บรรทัดสุดท้าย jump ไปยัง chain mark_route
จะเห็นว่ามี chain ย่อย ชื่อ dst_balance กับ both_balance เพิ่มมา
dst_balance จะเป็นการทำ load balance แบบกระจายปลายทาง แยกเป็น dst1 , dst2
both_balance จะเป็นการทำ load balance แบบกระจายทั้ง src ip/port + dst ip/port แยกเป็น both1 , both2
มาเริ่มต้น config กัน
ก่อนอื่น สร้าง chain ย่อยขึ้นมาก่อน dst_balance,both_balance ใช้ action แบบ passthrough
และ comment เป็นชื่อ chain ไว้
ก็จะได้เป็น
(http://www.hadyaiinternet.com/images/mt/73.png)
ต่อไปเพิ่ม mark_rules บรรทัดแรก
1. ip ปลายทางที่อยู่ใน List ชื่อ GamesOnline จะ mark conn ชื่อว่า game
กด + แถบ General เลือก chain เป็น mark_rules
(http://www.hadyaiinternet.com/images/mt/74.png)
แถบ Advance ใส่ชื่อ Dst. Address list เป็น GamesOnline
(http://www.hadyaiinternet.com/images/mt/75.png)
แถบ Action เลือก Action เป็น mark connection ชื่อ mark เป็น game ติ๊กถูก passthrough ด้วย
(http://www.hadyaiinternet.com/images/mt/76.png)
กดปุ่ม Ok ก็จะได้ mark_rules บรรทัดแรกออกมา
(http://www.hadyaiinternet.com/images/mt/77.png)
เลื่อนบรรทัดไปอยู่ในกลุ่มของ MARK_RULES ให้เรียบร้อย
(http://www.hadyaiinternet.com/images/mt/78.png)
ต่อไป mark_rules บรรทัดที่สอง
2. port ปลายทางที่เป็น 443,80 จะ jump ไปที่ chain ชื่อ dst_balance
กด + แถบ General เลือก chain เป็น mark_rules , protocol 6 (tcp) , Dst. Port 80,443
(http://www.hadyaiinternet.com/images/mt/79.png)
แถบ Action เลือก Action jump ไปยัง dst_balance
(http://www.hadyaiinternet.com/images/mt/80.png)
กดปุ่ม ok ก็จะได้บรรทัด jump mark_rules มา เลื่อนไว้ไปอยู่ในกลุ่ม MARK_RULES
(http://www.hadyaiinternet.com/images/mt/81.png)
3. ข้อมูลที่ยัง no-mark ก็ให้ทำการ jump ไปที่ chain ชื่อ both_balance
กด + แถบ General เลือก chain เป็น mark_rules , Connection Mark เป็น no-mark
(http://www.hadyaiinternet.com/images/mt/82.png)
แถบ Action เลือก Action jump ไปยัง both_balance
(http://www.hadyaiinternet.com/images/mt/83.png)
กดปุ่ม ok ก็จะได้บรรทัด jump mark_rules มา เลื่อนไว้ไปอยู่ในกลุ่ม MARK_RULES
(http://www.hadyaiinternet.com/images/mt/84.png)
4. บรรทัดสุดท้าย jump ไปยัง chain mark_route
กด + แถบ General เลือก chain เป็น mark_rules
(http://www.hadyaiinternet.com/images/mt/85.png)
แถบ Action เลือก Action jump ไปยัง mark_route
(http://www.hadyaiinternet.com/images/mt/86.png)
กดปุ่ม ok ก็จะได้บรรทัด jump mark_rules มา เลื่อนไว้ไปอยู่ในกลุ่ม MARK_RULES
(http://www.hadyaiinternet.com/images/mt/87.png)
เป็นอันครบ
-
ต่อไปเป็น chain dst_balance ในการทำ load balance จะทำได้หลายแบบ สำหรับ mikrotik นิยมใช้เป็น
PCC : Per Connection Classifier ซึ่งในแต่ละแบบจะมีข้อดี ข้อเสีย ไว้อธิบายในโอกาสถัดไป
หลักการของ PCC ก็คือ แบ่ง connection ออกเป็นกลุ่มๆ โดยแต่ละกลุ่ม จะแทนด้วยเลข เศษของกล่ม
เช่น แบ่งเป็น 5 กลุ่ม ก็จะได้เป็น ลำดับที่หารด้วย 5 แล้วเหลือ 1 , 2 , 3 , 4 และ 0 แต่เวลาใช้งานจริงก็จะเอา 0 ขึ้นก่อน
ยกตัวอย่างเช่น แบ่งเป็น 7 กลุ่ม ก็จะได้กลุ่มที่เหลือเศษ 0 , 1 , 2 , 3 , 4 , 5 , 6 เป็นต้น
ในตัวอย่างเราจะแบ่งออกเป็น 2 กลุ่ม นั่นก็แปลว่า จะมีกลุ่มเศษ 0 และ 1
โดยกลุ่ม 0 จะให้ mark ชื่อ dst1
และกลุ่ม 1 จะให้ mark ชื่อ dst2
มาเริ่มกันเลย
กดปุ่ม + แถบ General เลือกเป็น dst_balance
(http://www.hadyaiinternet.com/images/mt/88.png)
แถบ Advance เลือก PCC เป็น dst address 2 / 0
(http://www.hadyaiinternet.com/images/mt/89.png)
แถบ Action เลือก mark connection เป็นชื่อ dst1 ติ๊กถูก passthrough ด้วยนะครับ
(http://www.hadyaiinternet.com/images/mt/90.png)
กดปุ่ม Ok ก็จะได้ mark connection dst_balance มา 1 บรรทัด เลื่อนไปไว้ในกลุ่ม DST_BALANCE
(http://www.hadyaiinternet.com/images/mt/91.png)
ต่อไปกลุ่มที่สอง ก็ทำคล้าย ๆ กัน
กดปุ่ม + แถบ General เลือกเป็น dst_balance
(http://www.hadyaiinternet.com/images/mt/92.png)
แถบ Advance เลือก PCC เป็น dst address 2 / 1
(http://www.hadyaiinternet.com/images/mt/93.png)
แถบ Action เลือก mark connection เป็นชื่อ dst2 ติ๊กถูก passthrough ด้วยนะครับ
(http://www.hadyaiinternet.com/images/mt/94.png)
กดปุ่ม Ok ก็จะได้ mark connection dst_balance มา 1 บรรทัด เลื่อนไปไว้ในกลุ่ม DST_BALANCE
(http://www.hadyaiinternet.com/images/mt/95.png)
ต่อไปบรรทัดสุดท้าย ก็คือ return (หมายถึงย้อนกลับไปทำบรรทัด mark_rules อื่นๆ ต่อไป)
กดปุ่ม +
แถบ General เลือก dst_balance
แถบ action เลือก return
(http://www.hadyaiinternet.com/images/mt/96.png)
ก็ครบเรียบร้อย
สำหรับ load balance แบบ both ก็ทำเช่นเดียวกัน (ลองศึกษาจาก dst_balance ได้เลย)
ก็จะได้ออกมาเป็น both_balance
(http://www.hadyaiinternet.com/images/mt/97.png)
ก็เป็นอันครบ สำหรับ mark_rules
ต่อไปก็เหลือ mark_route
-
ก่อนจะทำ mark_route ก็ต้องเช็คก่อนว่า mark_rules ของเราได้ทำการ mark connection ชื่ออะไรไว้บ้าง
1. game
2. dst1
3. dst2
4. both1
5. both2
เราก็จะมากำหนดใน mark_route ว่า กลุ่มไหน จะวิ่งเส้นไหน กันบ้าง
game => wan1
dst1 => wan2
dst2 => wan3
both1 => wan2
both2 => wan3
มาเริ่ม config กัน
กด + แถบ General ก็เลือก chain mark_route Connection Mark เลือก game
(http://www.hadyaiinternet.com/images/mt/98.png)
แถบ Action ก็เลือก Action เป็น mark routing เลือกเป็น wan1 และก็ติ๊ก Passthrough ออกด้วย
(http://www.hadyaiinternet.com/images/mt/99.png)
กดปุ่ม Ok ก็เป็นอันเรียบร้อย สำหรับการกำหนด routing ง่ายๆ ไม่มีอะไรยุ่งยาก
(http://www.hadyaiinternet.com/images/mt/100.png)
ต่อไปก็ทำให้ครบทุกกลุ่ม ทั้ง 5 กลุ่มที่กล่าวไว้ในตอนแรก
(http://www.hadyaiinternet.com/images/mt/101.png)
ก็เป็นอันเสร็จ เรียบร้อยครับ ลองทดสอบกันดู
บทต่อไปจะเป็นการทำ fail-over