ข้อมูลที่ควรทราบ
==========
1. ร้านผม มีเน็ตทั้งหมด 3 เส้น, เกมส์ 2 เส้น(ppp0,ppp1), เน็ต 1 เส้น(ppp2)
2. ใช้ ClarkConnect Enterprise Edition 4.2
3. ใช้ frox ของ คุณบ้านคอมเกษตร
4. ใช้ Squid ที่ผ่านการโมจากคุณ Mr.X แห่ง
http://www.truefaster.com5. ร้านผมมี 80 เครื่อง
6. ใช้ server P4, MB Intel, RAM 4 GB, HDD 60 GB, LAN card 4 ตัว
7. ใช้ iptables ในการแยกเน็ต+เกมส์ (ค่อนข้างเด็ดขาด 95%)
8. ร้านผมลงเกมส์เกือบทุกๆเกม ของค่าย Asiasoft และบางเกมส์ของค่ายอื่น
- Audition, Cabal, Freestyle, GE, GhostOnline, MapleStory, RO, TSOnline, Yulgang
- CSO, PirateKings, ProjectOne, RYL, SuperDance, SecretOnline,
- HipStreet, Hy, Lineage2, LunaOnline, Pangya, Pucca, RAN, Rebirth, Flyff, SealOnline, SF, TalesRunner
- 3ก๊ก online, 16 pounds, Crazy Kart, Crazy Mon, Laghaim, LastChaos
อืม หมดยังน่ะ ก็ประมาณนี้แล่ะครับ
========================================
คือ จากการทดสอบ และเก็บสถิติ ที่ร้านผม โดยดูจาก iptraf
activity ของ ppp2 วิ่งอยู่ระหว่าง 2,500 kbps - 4,900 kbps
ในขณะที่ ppp0, ppp1 มี activity วิ่งอยู่ระหว่าง 300k bps - 800 kbps
เวลาผมโหลดไฟล์ด้วย FlashGet วิ่งที่ความเร็ว 300-500 kbps จะทำให้ activiy ของ ppp2 พุ่งขึ้นไปเป็น 4000 kbps กว่า ๆ ทุกครั้ง ไม่ว่าจะเป็น http, หรือ ftp
ส่วนกลางคืน คนน้อยๆหน่อย เหลือ 10-20 คน
activity ของ ppp2 วิ่งอยู่ระหว่าง 2,500 kbps - 4,900 kbps เหมือน (คนเล่น Camfrog เยอะมาก ที่ร้านผม)
ส่วน ppp0, ppp1 มี activity วิ่งอยู่ระหว่าง 80k bps - 100 kbps แล้วแต่ว่าคนเล่นเกมส์ค่ายไหนเยอะกว่ากัน
( ด้วยเหตุแห่งข้อมูลข้างต้นนี้ จึงทำให้ผมเชื่อว่า ผมน่าจะแยกได้แล้วประมาณ 95%)
========================================
ลูกค้าที่ร้านผม เค้าชอบทำอะไรหลายๆอย่างในเวลาเดียวกัน
บางคนเล่น RO เปิดบอทกันที 20 หน้าต่าง แล้วก็ฟังเพลง online เล่น Hi5 (ฮิห้า) ไปด้วย
บางคนก็เล่น HY ที 3 หน้าต่าง พร้อมๆกับเล่น DarkStory กับ MSN ไปด้วย
(แหม่~~~ทำไปได้นะคนเรา เล่นมันทุกอย่างในเวลาเดียวกัน)
เท่านั้นยังไม่พอ บางคนเปิด youtube ดู การ์ตูน นารูโตะ, Bleach ไปด้วย แล้วก็ย่อหน้าต่างเกม Cabal เล่นไปพร้อมๆกัน (ไม่รู้ว่าเค้าแยกสมองได้ไง งงกะเด็กสมัยนี้จริงๆ)
(ขออภัยครับ บ่นมากไปหน่อย แหะๆ สงสารเครื่องในร้านตัวเอง กลัวมันจะพังในเร็ววันจริงๆ)
========================================
ที่ผมจะโพสท์ต่อไปนี้คือ คำสั่ง iptables ที่ผมใช้งานจริงอยู่ในร้านของผม
แล้วได้ผลลัพธ์ตามที่บอกเลยครับ อาจจะเป็นประโยชน์กับท่านใดบ้าง ไม่มากก็น้อย
เชิญทัศนาครับ
# วงแลนของเรา แก้ไขเป็นวงแลนของท่านได้เลย
$My_Local_Net = "192.168.1.0/24"
# -------------------------------------------------------------
# เคลียร์กฎเก่าๆใน mangle ทิ้งไปให้หมด
# -------------------------------------------------------------
iptables -t mangle -F
modprobe ip_nat_ftp
modprobe ip_tables
modprobe iptable_nat
modprobe ipt_conntrack
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe ip_nat_irc
modprobe ip_nat_snmp_basic
# -------------------------------------------------------------
# เปลี่ยน default policies ในทุกๆ chains ของ filter, nat, mangle เป็น ACCEPT
# ผลคือ : ถ้าข้อมูลนั้นไม่ match กับกฎใดๆเลย ก็จะใช้ default policies
# กรณีนี้คือ ACCEPT ข้อมูลสามารถผ่านไปได้
# แต่ถ้าคำนึงถึงความปลอดภัย ก็เปลี่ยนเป็น DROP
#
# <หมายเหตุ ที่ 2> : แต่จริงๆ ทำไปก็คงไม่มีผลอะไรเท่าไหร่ เพราะผมใช้ nat ที่ Clark เริ่มต้นมาให้ แต่ก็ทำไว้ให้รู้คำสั่งครับ
# -------------------------------------------------------------
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
# -------------------------------------------------------------
# ทำ IP MASQUERADE
# เรียกง่ายๆว่า แชร์ IP คือ เอา IP เดียวแชร์ให้เครื่องลูกได้หลายๆเครื่อง
# -------------------------------------------------------------
iptables -t nat -A POSTROUTING -s $My_Local_Net -o ppp+ -j MASQUERADE
# -------------------------------------------------------------
# ทำการ redirect ข้อมูลเว็บ port 80 ไป port 3128 ของ Squid เพื่อการทำ web caching
# -------------------------------------------------------------
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
# -------------------------------------------------------------
# ทำการ redirect ข้อมูล FTP port 21 ไป port 2121 ของ Frox เพื่อเก็บ patch
# -------------------------------------------------------------
iptables -t nat -A PREROUTING -p tcp -m multiport --dport 21 -j REDIRECT --to-port 2121
# ################################################################
# START - multi wan 3 Line #
# ################################################################
# ----------------------------Start of NOTE---------------------------------
# ผมมีเน็ต 3 เส้น ppp0,ppp1,ppp2 เส้น เกมส์ = ppp0,ppp1 / เส้นเน็ต = ppp2
#
# การเซ็ต mark ผมใช้ของที่ ClarkConnect ให้มา คือ 0x8000 = ออก ppp0 / 0x8001 = ออก ppp1/ 0x8002 = ออก ppp2
#
# จากการสังเกตุพบว่า ถ้าเพิ่มกฎใน "-t mangle POSTROUTING",
# ข้อมูลนั้นจะวิ่งออกไปยัง ppp เส้นที่เรา mark ค่าเอาไว้ โดยไม่ผ่าน SQUID เลย คือไม่ cache นั่นเอง
#
# <หมายเหตุ ที่ 3> : อันนี้ผมลองทดสอบดูแล้ว โดยดูจาก cache ของ squid ไม่มีการเก็บ cache เลย
#
# ----------------------------End of NOTE---------------------------------
# ---------- ทำการสร้าง chain ของเราเอง สำหรับตรวจสอบข้อมูลว่าเป็นของเกมส์ หรือเป็นของเน็ต ----------
# สร้าง chain ชื่อ CHECK_SERVICE_PORTS
# สำหรับตรวจสอบ port บริการทั่วไปที่เราอยากให้ออกเส้นเน็ต เช่น port 20,21,80 ถ้าใช่ ก็ให้ set mark เป็น 0x8002 คือ mark ให้ออกเส้นเน็ต
iptables -t mangle -F CHECK_SERVICE_PORTS
iptables -t mangle -N CHECK_SERVICE_PORTS
iptables -t mangle -A CHECK_SERVICE_PORTS -p tcp -m multiport -- dports 20,21,80,3128 -j MARK --set-mark 0x8002
# สร้าง chain ชื่อ CHECK_GAMES
# สำหรับตรวจสอบ ข้อมูลว่าเป็นเกมส์ค่ายไหน แล้วจะให้ mark ไปออกเน็ตเส้นไหน
iptables -t mangle -F CHECK_GAMES
iptables -t mangle -N CHECK_GAMES
# Asiasoft
iptables -t mangle -A CHECK_GAMES -d 203.144.0.0/16 -j MARK --set-mark 0x8000
# SF,LN2, Asiasoft International
iptables -t mangle -A CHECK_GAMES -d 61.90.0.0/16 -j MARK --set-mark 0x8000
# ProjectOne, DOMO
iptables -t mangle -A CHECK_GAMES -d 61.19.0.0/16 -j MARK --set-mark 0x8001
# Seal, HY, 3Kingdoms, 16pounds
iptables -t mangle -A CHECK_GAMES -d 61.47.0.0/16 -j MARK --set-mark 0x8001
# PFW, Eco
iptables -t mangle -A CHECK_GAMES -d 61.91.0.0/16 -j MARK --set-mark 0x8001
# HipStreet
iptables -t mangle -A CHECK_GAMES -d 58.97.0.0/16 -j MARK --set-mark 0x8001
# Pangya, Rebirth, Pucca, Flyff
iptables -t mangle -A CHECK_GAMES -d 58.64.0.0/16 -j MARK --set-mark 0x8001
# DotA, Getamped
iptables -t mangle -A CHECK_GAMES -d 210.86.0.0/16 -j MARK --set-mark 0x8001
# LunaOnline, pko, water, SDO, Secret, RYL, cso
iptables -t mangle -A CHECK_GAMES -d 202.43.0.0/16 -j MARK --set-mark 0x8001
# RAN
iptables -t mangle -A CHECK_GAMES -d 203.142.0.0/16 -j MARK --set-mark 0x8001
# TalesRunner
iptables -t mangle -A CHECK_GAMES -d 203.113.0.0/16 -j MARK --set-mark 0x8001
#
# ---------- เมื่อเตรียมทุกอย่างเสร็จเรียบร้อยแล้ว ก็มาเริ่ม Add Rule กันได้เลยครับ ----------
# ขั้นแรกสุด, ให้ set mark ทุกๆข้อมูลที่ผ่านเข้ามา ออกเส้นเน็ตก่อน คือ ppp2
# เผื่อว่า ถ้าข้อมูลนี้ไม่ตรงกับกฎข้อไหนเลย จะได้วิ่งออกเส้นเน็ตไป ไม่ต้องไปกวนใจเน็ตเส้นอื่น
iptables -t mangle -A PREROUTING -d ! 192.168.0.1/24 -j MARK --set-mark 0x8002
# ตรวจดูว่าข้อมูลนี้เป็นของเน็ตหรือไม่ โดยใช้ chain ที่เราสร้างขึ้น ชื่อ CHECK_SERVICE_PORTS
iptables -t mangle -A PREROUTING -s $My_Local_Net -d ! $My_Local_Net -j CHECK_SERVICE_PORTS
iptables -t mangle -A INPUT -s $My_Local_Net -d ! $My_Local_Net -j CHECK_SERVICE_PORTS
iptables -t mangle -A OUTPUT -s $My_Local_Net -d ! $My_Local_Net -j CHECK_SERVICE_PORTS
iptables -t mangle -A FORWARD -s $My_Local_Net -d ! $My_Local_Net -j CHECK_SERVICE_PORTS
# ตรวจดูว่าข้อมูลนี้เป็นของ GAME หรือไม่ โดยใช้ chain ที่เราสร้างขึ้น ชื่อ CHECK_GAMES
iptables -t mangle -A PREROUTING -s $My_Local_Net -j CHECK_GAMES
iptables -t mangle -A INPUT -s $My_Local_Net -j CHECK_GAMES
iptables -t mangle -A OUTPUT -s $My_Local_Net -j CHECK_GAMES
iptables -t mangle -A FORWARD -s $My_Local_Net -j CHECK_GAMES
# ตรวจสอบ port ของเกม DotA
# จากผลการทดสอบภายในร้านของผม ไม่มีกระตุก ไร้อาการแล่ก (ยกเว้น ว่ามีคนเล่นเกมในเส้น DotA เยอะๆ ก็มีกระตุกบ้าง ซึ่งอยู่ในขั้นที่ยอมรับได้
# กรณีเราเป็นคน Create ชั้น 1 ผมใช้ port 7101ถึง7156 / ส่วนชั้น 2 ผมใช้ port 7051 ถึง 7073
iptables -t mangle -A PREROUTING -s $Local_Net -d ! $Local_Net -p tcp -m multiport --sports 7051:7073,7101:7156 -j MARK --set-mark 0x8001
iptables -t mangle -A INPUT -s $Local_Net -d ! $Local_Net -p tcp -m multiport --sports 7051:7073,7101:7156 -j MARK --set-mark 0x8001
iptables -t mangle -A OUTPUT -s $Local_Net -d ! $Local_Net -p tcp -m multiport --sports 7051:7073,7101:7156 -j MARK --set-mark 0x8001
iptables -t mangle -A FORWARD -s $Local_Net -d ! $Local_Net -p tcp -m multiport --sports 7051:7073,7101:7156 -j MARK --set-mark 0x8001
# กรณีที่เราไป Join กับคนอื่น
iptables -t mangle -A PREROUTING -s $Local_Net -d ! $Local_Net -p tcp -m multiport --dports 6000:7500 -j MARK --set-mark 0x8001
iptables -t mangle -A INPUT -s $Local_Net -d ! $Local_Net -p tcp -m multiport --dports 6000:7500 -j MARK --set-mark 0x8001
iptables -t mangle -A OUTPUT -s $Local_Net -d ! $Local_Net -p tcp -m multiport --dports 6000:7500 -j MARK --set-mark 0x8001
iptables -t mangle -A FORWARD -s $Local_Net -d ! $Local_Net -p tcp -m multiport --dports 6000:7500 -j MARK --set-mark 0x8001
# ################################################################
# END - multi wan 3 Line #
# ################################################################
=================
ข้อควรรู้เพิ่มเติม (ผมคิดว่าน่าจะเป็นแบบนี้นะ)
=================
ปกติหลักการณ์ทำงานของกฎ จะเป็นการทำงานแบบ Top-Down คือจากบนลงล่าง
เมื่อข้อมูลวิ่งเข้าไปใน chain ใดๆ ข้อมูลจะถูกตรวจสอบว่า match หรือ ตรงกับกฎข้อไหนหรือไม่
ถ้าตรง ข้อมูลนั้นก็จะถูกกระทำตามกฎข้อนั้น แล้ววิ่งไปยัง chain ถัดไป โดยไม่สนใจกฎข้อที่เหลือ
แต่ว่า บางกรณี เช่น -j LOG คือการเก็บ LOG เฉยๆ พอเก็บ LOG เสร็จ ข้อมูลยังคงวิ่งไปยังกฎข้อต่อไปของ chain ที่ข้อมูลกำลังถูกตรวจสอบอยู่
การ set mark ก็เช่นเดียวกัน กับ LOG
ฉะนั้น การเรียงกฎของ chain ที่มีแต่การ set mark จึงควรระมัดระวัง และจินตนาการให้ดีๆ เพราะมัน set mark เสร็จแล้ว ไม่ได้วิ่งไป chain ต่อไปเลย
มันยังคงวิ่งไปดูกฎข้อต่อไป
# -------------------------------------------------------------
ถ้าคุณจินตนาการได้ถูกต้อง คุณจะรู้ว่าท้ายที่สุด
ข้อมูลที่ destination IP 203.144.244.1 port 80 หรือ 20,21 จะวิ่งออกเส้น เน็ต ppp2
ในขณะที่ destination IP 203.144.244.1 port อื่นๆ ที่ไม่ใช่ 80 และ 20,21 จะวิ่งออกเส้น เกมส์ ppp0
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
ขออธิบายเป็นคำพูด ตามความเข้าใจในแบบของผมนะครับ
==================================
คือ ต้องเข้าใจก่อนว่า หลักการวิ่งของข้อมูลใน firewall มีอยู่ 3 กรณี ดังนี้ (คิดว่าเป็นถนนนะครับ)
- กรณี firewall เป็นผู้รับข้อมูล (source : IP ใดๆ destination : IP firewall) จะใช้ถนนเส้นนี้
[ต้นทาง >> mangle PRE >> nat PRE >> mangle IN >> local process]
- กรณี firewall เป็นทางผ่านส่งต่อข้อมูล หรือ forward (source : IP ใดๆ destination : IP ใดๆ) จะใช้ถนนเส้นนี้
[ต้นทาง >> mangle pre >> nat pre >> mangle for >> filter for >> mangle post >> nat post >> ปลายทาง]
- กรณี firewall เป็นผู้สร้างข้อมูล (source : IP firewall destination : IP ใดๆ) จะใช้ถนนเส้นนี้
[local process >> mangle out >> mangle post >> nat post >> ปลายทาง]
เมื่อเราเข้าใจแล้วว่า ในแต่ละกรณี ข้อมูลจะมีทางวิ่งผ่าน chain ที่แตกต่าง
เราก็ลองวาดภาพ แล้วใส่ Rule ที่เรา Add เข้าไป เรียงตามลำดับ
จากนั้น ลองสมมติ ข้อมูลมาในทุกๆกรณี แล้วลองไล่เรียงดู เราก็จะรู้คร่าวๆ เกือบ 99.99% ว่า ที่เราออกแบบมาถูกต้องหรือไม่ ได้อย่างที่ต้องการหรือเปล่า
สุดท้ายตอนข้อมูลวิ่งออกไป ปลายทาง มันควรจะไปที่ไหน
พื้นฐานสำคัญนะครับ เหมือนรากฐานตึก
=====================
ข้อมูลเพิ่มเติม
=====================
ชื่อ table ก็บอกอยู่ในตัวแล้วนะครับว่า mangle, nat, filter
mangle
ใช้ทำพวก Advance routing หรือเปลี่ยนแปลงค่า TOS (Type Of Service)
nat
ใช้ทำ Network Address Translation
filter
ใช้ในการ filter หรือ คัดกรองข้อมูลว่า จะให้ผ่าน หรือไม่ผ่าน
งงไหมครับ (ไม่น่าจะงง แต่ถ้างง ก็อ่านซ้ำๆเข้าไปครับ แล้วจะเข้าใจ เหมือนที่ผมอ่านแล้วอ่านอีก พยายามทำความเข้าใจ ธรรมชาติของ chain ต่างๆ ใน iptables)
ใช้กระดาษ กับดินสอ บ่อยๆ ครับ วาดมันออกมา
ไอน์สไตน์บอกเอาไว้ว่า "จินตนาการ สำคัญกว่าความรู้"
สู้ๆนะครับผม
สุดท้ายนี้
==========
- ขอบคุณ คุณ
Mr.X แห่งเว็บ http://www.truefaster.com ที่สอนให้ผมทำระบบ server บน Linux เป็น- ผมขอขอบคุณ webboard
http://www.internetcafe.in.th ที่เป็นศูนย์กลางการแบ่งปันความรู้เชิงสร้างสรรค์
- ขอบคุณ คุณบ้านคอมเกษตร สำหรับ frox และ imspector ช่วยผ่อนแรงผมไปได้เยอะ
- ขอบคุณ เว็บ
http://www.thaiadmin.org ที่มีความรู้มากมายให้ได้ศึกษา
- แล้วก็ขอบคุณ
http://www.google.co.th ที่ทำให้ผมได้เจอกับทุกๆอย่างที่กล่าวมาเบื้องต้น
ที่มา :
http://www.truefaster.com/bbs/index.php/topic,3837.0.html