ก็ผมบอกแล้วไงว่ามันทำได้ หลายสูตร ขนาดสูตรของผมกับ X (
www.truefaster.com )ยังคนหละสูตรเลย เหอๆ
แล้วเอามา remix รวมกันอีกที
iproute2 นั่นก็อีกสูตร หลักการพื้นฐานก็คล้ายๆกัน รู้ๆกันอยู่ว่าคือการ MARK ก็ได้ก็ง่ายดี
อันนั้นยังไม่ได้ลองเต็มที่ เพราะแค่นี้ ก็มึน กับ สูตร ที่ใช้อยู่ พออยู่แล้ว ..ได้ออกมาแล้ว 2 สูตร
อยากได้ก็จาดดดปายยยยยยย
http://lartc.org/howto/"หลักการ iproute2 "ภาคไทย.. OS BY Slackware
Policy Routing with Linux
TCP/IP routing algorithms ปกติทั่ว ๆ ไป ที่ใช้กันอยู่ทุกวันนี้ จะเลือกเส้นทางโดยดูจาก address ปลายทาง ของ IP packet แต่ปัจจุบันนี้ ระบบเน็ตเวอร์กมีความซับซ้อนมากขึ้น ท่านอาจจะพบว่า บางทีต้องการที่จะ ส่ง IP packets ไม่เพียงแต่ดูด้านปลายทางเท่านั้น อาจจะต้องพิจารณา address ต้นทาง, IP protocal, ports ของ protocal ที่ใช้, หรือแม้กระทั่ง ต้องพิจารณาถึง data ที่อยู่ใน packet ที่จะส่งไปด้วย วิธีการนี้เรียกว่า Policy Routing สมมุติว่า เน็ตเวอร์กของท่าน มีเน็ตเวอร์กเข้ามาต่อสองทาง ทางหนึ่งต่อไปยัง Internet ส่วนอีกทางหนึ่ง ต่อไปยัง Network A ดังรูปด่านล่าง และท่านต้องการให้ เน็ตเวอร์กภายใน (Internal) ของท่าน สามารถติดต่อได้ทั้ง Internet และ Network A ดังนั้นท่านต้อง สร้างเงื่อนไข ว่าจะติดต่อกับเน็ตเวอร์กไหน ให้ผ่านทาง gateway ไหน
เรามาดูที่ Network A กันก่อน 172.16.1.0/24 (หรือ netmask = 255.255.255.0) หมายถึงเซิฟเวอร์ต่าง ๆ ใน Network A จะมี IP ตั้งแต่ 172.16.1.0 -172.16.1.255 gateway ที่จะติดต่อกับ Network A คือ 192.168.44.18/28 (192.168.44.18 netmask 255.255.255.240) ซึ่งค่าต่าง ๆ เหล่านี้ ทางเน็ตเวอร์ก A จะกำหนดมาให้ เช่น
Network ในตัวอย่างนี้เป็น 192.168.44.16/28 (28 คือ netmaks 255.255.255.240) ซึ่งจะมี IP ใช้ได้ตั้งแต่ 192.168.44.16 - 192.168.44.31 แต่ท่านจะมี IP ที่ใช้ทำเซิฟเวอร์ไม่ได้ 3 IPs คือ
192.168.44.16 เพราะจะเป็น network address
IP ที่เป็น gateway แล้วแต่กำหนด ซึ่งส่วนมากจะเป็น IP ของ router
IP ที่เป็น boardcast แล้วแต่กำหนด ปกติจะเป็น IP ท้ายสุด
เรื่องเหล่านี้ ผมไม่รู้เรื่องมากนัก ดังนั้น ถ้าใครสงสัยเรื่องนี้ คงต้องหาหนังสืออ่านเองครับ
Netmask : 255.255.255.240
Gateway : 192.168.44.18
DNS : 172.168.1.150
Internet คงไม่ต้องบอกว่ามี IP อะไรบ้าง ก็เป็น IP ทั้งหลายแหล่ ที่อยู่บน Internet แต่เน็ตเวอร์กในตัวอย่างนี้ จะมี gateway ที่ 202.6.100.113/29 (202.6.100.113 netmask 255.255.255.248) ซึ่งค่าเหล่านี้ ทาง Internet Admin จะกำหนดมาให้ เช่น (IP เหล่านี้ สมมุติขึ้นมา ไม่ใช่ที่ใช้งานจริง)
Network 202.6.100.112/29 (29 คือ netmask = 255.255.255.248) ดังนั้นเน็ตเวอร์กนี้ จะมี IP ใช้งานตั้งแต่ 202.6.100.112 - 202.6.100.119
202.6.100.112 เป็น network address
202.6.100.113 เป็น gateway
202.6.100.119 เป็น boardcast IP
ดังนั้นจะเหลือ IP สำหรับใช้งานได้จริงเพียง 202.6.100.114 - 202.6.100.118
Internal เป็นเน็ตเวอร์ภายใน ซึ่งในที่นี้คือ 10.200.200.0/24 (10.200.200.0 - 10.200.200.255 netmask 255.255.255.0) ซึ่งส่วนนี้เราสามารถ กำหนดเองได้ ว่าจะใช้ IP เท่าไร ถึงเท่าไร IP ใน Class ไหน ขอให้เป็น Private IP เท่านั้น และความต้องการก็คือ
Internal สามารถติดต่อ Internet และ Network A ได้ โดยไม่ต้องเปลี่ยน gateway IP ไปมา เซ็ตไว้เบอร์เดียว สามารถติดต่อได้ทั้งสองทางตลอด
ขอพักเรื่องนี้ไว้ก่อน จะนำไปประกอบตัวอย่างการเซ็ตในตอนท้ายอีกครั้งหนึ่ง
ต้องใช้อะไรบ้าง
Linux 2.2.x kernel ต้องคอมไพล์เคอร์เนลให้สนับสนุน "advanced router" และ "policy routing"
- IP: advanced router
- IP: policy routing
IPROUTE2 Utility package เขียนโดย Alexey สมมุติว่าท่านมี package ล่าสุด ซึ่งปกติจะเรียกว่า iproute2-current.tar.gz ซึ่งจะเป็น symbolic link ไปยัง เวอร์ชั่นล่าสุดซึ่งจะมีวันที่กำกับอยู่ primary FTP site จะอยู่ใน Russia ที่
ftp://ftp.inr.ac.ru/ip-routing ข้อดีของ iproute อันหนึ่งที่เห็นคือ ท่านสามารถเซ็ต ip ได้หลาย ip กับ network card เดียว โดยไม่ต้องใช้ ip aliasing
ติดตั้ง IPROUTE2
หลังจากที่ compile kernel ให้สนับสนุน advanced router และ policy routing เมื่อได้มาแล้วท่านจะ unpack ที่ใดก็ได้แล้วแต่ท่าน ซึ่งอาจจะเก็บไว้ที่ /usr/src
cp iproute2-current.tar.gz /usr/src
cd /usr/src
tar xvfz iproute2-current.tar.gz
cd iproute2
make
ตรวจสอบว่าในเครื่องมี /etc/iproute2 หรือไม่โดย
ls -l /etc/iproute2
ถ้าไม่มีสร้างโดยสั่ง mkdir /etc/iproute2
ถ้ามีแล้ว ก็ให้ลองดูว่าข้างในมีอะไร ใช้งานอยู่หรือไม่ ในที่นี้สมมุติว่าไม่มี เนื่องจากกำลังจะทำเป็นครั้งแรก
cp etc/iproute2/* /etc/iproute2
เช็คดูไฟล์ที่ copy ไปยัง /etc/iproute2
GlobalLinuxServer:/usr/src/iproute2# ls -l /etc/iproute2
total 20
-rw-r--r-- 1 root root 286 Aug 25 15:58 rt_dsfield
-rw-r--r-- 1 root root 276 Aug 25 15:58 rt_protos
-rw-r--r-- 1 root root 106 Aug 25 15:58 rt_realms
-rw-r--r-- 1 root root 92 Aug 25 15:58 rt_scopes
-rw-r--r-- 1 root root 86 Aug 25 15:58 rt_tables
แต่จากที่ลอง ก็ยังไม่ได้ใช้ไฟล์อื่น ๆ นอกจาก rt_tables เท่านั้น
cd ip
cp ifcfg ip routef routel rtacct rtmon rtpr /sbin
cd ../tc
cp tc /sbin
ที่ทำมาด้านบนนี่ จะเป็นการคอมไพล์ iproute2 utility และการ copy configuration และ executables files ไปยัง directory ที่เหมาะสม ดังนั้นท่านจะสามารถใช้งาน ip utility จาก directory ใค ๆ ก็ได้ โดยพิมพ์ ip เพื่อทดสอบว่ามันสามารถใช้งานได้แล้ว ลองพิมพ์ ip address เครื่องจะแจ้งรายละเอียดของ interfaces และ addresses ของระบบในเครื่องท่านให้ทราบ แต่จากที่ลองใช้มา ยังไม่ได้ใช้คำสั่งอื่น ๆ นอกเหนือกจากคำสั่ง ip เลย
ถ้าพร้อมแล้ว เริ่มกันเลย
เนื่องจาก iproute2 เวอร์ชั่นปัจจุบัน (February 2000) ยังไม่มี man pages และ document ก็มีแต่ในรูปแบบของ Latex เท่านั้น ดังนั้นอันดับแรก เราจะมาลองกันก่อนดีกว่า ว่าคำสั่ง ip มันทำอะไรได้บ้าง
เนื่องจากผมไม่รู้อะไรเกี่ยวกับเรื่องนี้เลย ก็เลยติดตั้ง slackware ใหม่ที่เซิฟเวอร์ตัวหนึ่ง เห็นมี slackware 7.1 ออกมาแล้ว ก็เลยลองเสียเลย เพราะไหน ๆ ก็จะติดตั้งใหม่แล้ว ดาวน์โหลดไม่ครบ ก็เลือกเท่าที่ใช้งานก่อน เพราะกว่าจะครบคงนาน ก็ดาวน์โหลด package a, ap, d, k, n
ตอนทำ netconfig ผมเลือก ใส่ชื่อโฮสต์ โดเมน จากนั้นเลือก loop back เนื่องจากต้องการ ทดลองใช้คำสั่ง ip กำหนด IP และอื่น ๆ เอง (จะได้รู้ว่า มันทำอะไรกันบ้าง)
หลังจาก compile kernel และติดตั้ง iproute2 แล้ว บูทเครื่องขึ้นมา สมมุติว่า เครื่องท่านสามารถ ตรวจสอบเน็ตเวอร์กการ์ดพบแล้ว ติดตั้งโมดูลของเน็ตเวอร์การ์ดเรียบร้อย พร้อมใช้งาน เครื่องที่ใช้ลอง มีเน็ตเวอร์กการ์ด สองตัว กำหนดให้เรียกโมดูลจากไฟล์ /etc/rc.d/rc.netdevice
/sbin/modprobe 3c59x
/sbin/modprobe ne io=0x320
เมื่อบูทเสร็จ เครื่องจะมี ip lo 127.0.0.1 เพียง ip เดียว เนื่องจากต้องการให้บทความ ไม่ยากมาก ดังนั้นจะไม่เขียนตัวอย่าง ที่เกิดจากคำสั่งให้ดู คำสั่งที่แนะนำให้ท่านลองใช้ดูคือ
ip help
ip address help
ip route help
ip addrsee list (ip addr ls) หรือ ip address show
ip route list
ip rule list
ว่าจะไม่ยกตัวอย่างให้ดู มาเจอข้อนี้ พอดีเป็นเรื่องใหม่ ดูตัวอย่างสักหน่อยแล้วกัน
root@GlobalLinuxServer:/home/esc# ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
นี่เป็นตัวอย่าง Default policy rules ซึ่งมีความสำคัญมาก ท่านต้องนึกถึงเสมอ เวลาที่จะพิจารณา หรือสร้าง policy rule ของระบบที่มีความสลับซับซ้อน ไม่เช่นนั้น อาจจะทำไม่สำเร็จ ลองอ่านคำอธิบาย เป็นภาษาอังกฤษกันสักหน่อยแล้วกันครับ กลัวแปลผิดครับ :laugh:
First, is the highest priority rule, Rule Priority 0.
Rule 0: Priority 0 Selector = match every packet
Action = lookup routing table local (ID 255).
Table local is the reserved routing table containing high priority control routes for local and broadcast addresses. Rule 0 is special and cannot be deleted or changed.
Rule 32766: Priority 32766 Selector = match every packet
Action = lookup routing table main (ID 254)
The table main is the default standard routing table containing all non-policy routes. Table main is where routes created with the old route command are placed. Additionally, any routes created by ip route that do not specify an explicit table are placed into this table. This rule may be deleted or overridden by other rules. ###ตรงนี้พอจะจับความได้ว่า ถ้าท่านเพิ่ม (add) route โดยไม่กำหนดว่า จะใช้กับ table ใด มันจะมา add ที่ table main นี้ แต่เราสามารถลบ หรือว่าอาจจะเปลี่ยนแปลง โดย rules อื่น ๆ ได้
Rule 32767: Priority 32767 Selector = match every packet
Action = lookup routing table default (ID 253).
Table default is empty and reserved for post-processing if previous default rules did not select the packet. This rule also may be deleted.
อย่าสับสนระหว่าง routing tables และ rules
Rules จะเป็นตัวบ่งชี้ว่าจะใช้ routing tables ใด
ท่านสามารถใช้หลาย ๆ rules ชี้ไปยัง routing table เดียวได้
บาง routing table อาจจะไม่มี rules ใด ๆ อ้างอิงถึง ถ้าท่านลบ rules ทั้งหมด ที่ชี้มายังมันหมดแล้ว routing table นั้นจะไม่ได้ใช้ แต่ยังคงอยู่
routing table จะหายไป ก็ต่อเมื่อ ท่านลบ routes ที่อยู่ใน tables นั้น ๆ หมดแล้ว
เมื่อท่านทำ step ต่อ ๆ ไป เช่น เพิ่ม address หรือว่า add route ก็ควรใช้คำสั่ง ip address list, ip route lis, ip rule list เช็คตามไปด้วย ว่ามันมีอะไรเปลี่ยนแปลงบ้าง เพื่อความเข้าใจ
เซ็ตให้เน็ตเวอร์กการ์ด เตรียมพร้อมที่จะใช้งาน ด้วยคำสั่ง
ip link set dev eth0 up
ip link set dev eth1 up
ลองตอนแรก ๆ ผมเซ็ต ip ให้กับเน็ตเวอร์กการ์ดเลย ใช้คำสั่ง ip addr ls ก็เห็น ip กำหนดแล้ว แต่ไม่สามารถใช้งานได้ กว่าจะรู้ว่าต้องใช้คำสั่ง ip link set <device> up เสียก่อน จึงจะใช้งานได้ ก็หลายวันอยู่ครับ ท่านสามารถเซ็ต ip ก่อนให้เรียบร้อย แล้วจึงใช้คำสั่งนี้ ก็ได้เหมือนกันครับ คำสั่งคู่กันก็
ip link set <device> down
เริ่มเซ็ต IP ให้กับเน็ตเวอร์การ์ด ที่จะใช้เป็น multiple gateway ตามตัวอย่างรูปด้านบน
ip address add 192.168.44.20/28 brd + dev eth0
brd + คือสั่งให้ สร้าง broadcast address 192.168.44.31 ด้วย (อัตโนมัติ) คำสั่งด้านบน เหมือนกับคำสั่ง ifconfig eth0 192.168.44.20 netmask 255.255.255.240 up คำสั่งนี้ ใช้กำหนด address ที่จะติดต่อกับ Network A
ip address add 202.6.100.117/29 brd + dev eth1
กำหนด address ที่จะใช้ติดต่อกับ Internet IP 202.6.100.117 netmask 255.255.255.248
NOTE : /28 หรือ /29 หรืออื่น ๆ หาได้จากไหน ผมก็ไม่รู้เหมือนกัน ว่าวิธีคำนวณ ทำอย่างไร ผมหาได้โดยสั่ง ifconfig eth1 202.16.117 netmask 255.255.255.248 up แล้วก็ใช้คำสั่ง ip address list dev eth1 มันก็จะบอกเองว่าเป็น /เท่าไร เสร็จแล้วก็สั่ง ifconfig eth1 202................ down แล้วเอาค่านั้น มาสั่งโดยคำสั่ง ip
ip address add 10.200.200.1/24 brd + dev eth1
กำหนด ip ที่จะใช้ติดต่อกับ เน็ตเวอร์กภายใน (Internal) รวมทั้งจะใช้เป็น gateway ของ ip ภายในด้วย
ตอนนี้ถ้าท่านลอง ping IP ภายในต่าง ๆ ที่มีเซิฟเวอร์ หรือ client อยู่ จะสามารถ ping ได้แล้ว รวมทั้งสามารถ ping Internet gateway 202.6.100.113 และ Network A gateway 192.168.44.18 ได้แล้ว แต่ยังไม่สามารถออกไปยัง Internet หรือว่า Network A ได้ เพราะท่านยังไม่ได้กำหนดเส้นทาง หรือ gateway ให้
เริ่ม add route, ก่อนอื่น เพื่อจะให้การเรียกชื่อ table ต่าง ๆ ง่ายขึ้น คือสามารถเรียกเป็นชื่อ หรือว่าเป็นตัวเลขก็ได้ ทำได้โดยแก้ไขไฟล์ /etc/iproute2/rt_tables ซึ่งในกรณีแบบในตัวอย่าง ถือว่าระบบไม่มีความซับซ้อน สามารถใช้ table เดียวก็จัดการได้แล้ว โดยกำหนดชื่อ table 1 เป็น esc ย่อมาจาก Engineering Service Circuit เมื่อกำหนดแล้วท่านจะเรียกว่า table 1 หรือว่า table esc ก็ได้
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
1 esc
ip route add 172.16.1.0/24 via 192.168.44.18 table esc proto static
ip route add default via 202.6.100.113/29 table esc proto static
จากนั้น สามารถดู route tables ที่เรากำหนดให้ ตาราง esc ได้โดย
root@GlobalLinuxServer:/home/esc# ip route list table esc
172.16.1.0/24 via 192.168.44.18 dev eth0 proto static
default via 202.6.100.113 dev eth1 proto static
พิจารณา route table ที่เกิดขึ้น บรรทัดแรก เป็นการบอกว่า ถ้าจะติดต่อกับ Ntework A (172.16.1.0/24) ให้ผ่านไปทาง gateway 192.168.44.18 แต่ถ้าเป็นการติดต่อโดยทั่ว ๆ ไป (บรรทัดสอง) ให้ผ่านทาง default gateway 202.6.100.113 (Internet) ดูรูปประกอบ จบเรื่อง add route เพียงเท่านี้เอง
ADD rule เมื่อเรา add route คือบอกทางไปให้แล้ว ต่อไปเราต้องสร้าง rule ให้มันใช้ โดย
i p rule add from 10.200.200.0/24 lookup esc
จบแล้วครับ ๛emoticon295: เรื่องที่เขียนมายืดยาว ทำจริง ๆ นิดเดียว ทีนี้เรามาดูว่า rule นี้มันหมายความว่าอย่างไร
คือมันจะบอกว่า ถ้ามี packets ใด ๆ ที่มาจาก ip 10.200.200.x ให้ไปดูตาราง esc ว่าจะให้ไปทางไหน นี่คือการกำหนดให้ดู address ต้นทาง ซึ่ง TCP/IP แบบเดิมทำไม่ได้
เมื่อ packets มาถึงตาราง esc ต่อไปมันก็จะดูว่า ปลายทางเป็น IP เท่าใด ถ้าเป็น 172.16.1.x ให้ผ่านไปทาง 192.168.44.18 แต่ถ้าปลายทางเป็น IP นอกเหนือจากนั้น ให้ผ่านไปทาง 202.6.100.113 นี่คือการพิจารณา IP ปลายทางของ Policy IP
ทำให้มี IP และ Tables เหล่านี้ ทุกครั้งที่เปิดเครื่อง
เนื่องจากผมไม่ได้ร่ำเรียนมาทางนี้ รู้ว่าเขาไม่ได้ทำกันแบบผม แต่ผมลองทำแบบนี้ แล้วมันใช้ได้ พูดง่ายๆว่ามั่ว ??? ผมจึงเลือกวิธีนี้ โดยเอาคำสั่ง ต่าง ๆ เหล่านี้ ไปใส่ไว้ในไฟล์ /etc/rc.d/rc.local
ip link set dev eth0 up
ip link set dev eth1 up
ip addr add 192.168.44.20/28 brd + dev eth0
ip addr add 202.6.100.117/29 brd + dev eth1
ip addr add 10.200.200.1/24 brd + dev eth1
ip ro add 172.16.1.0/24 via 192.168.44.18
ip ro add default via 202.6.100.113
# สีแดงนี่ เป็นการ add route ให้กับเครื่องลินุกซ์ที่เป็น gateway สามารถใช้งาน สองทางด้วย ซึ่งเงื่อนไข ก็เหมือนกับ ตาราง esc แต่ route พวกนี้ จะอยู่ในตาราง main ดังนั้นจึงไม่ต้องใส่ชื่อ ตารางก็ได้ ถ้าท่านไม่ add route ใด ๆ ให้กับ ตาราง main ที่เครื่องลินุกซ์ จะไม่สามารถใช้งาน Internet หรือว่า Network A ได้ แต่ยังสามารถเป็น gateway ได้ ถ้าท่านสั่งคำสั่งต่าง ๆ ครบถ้วน
ipchains -P forward DENY
ipchains -A forward -s 10.200.200.0/24 -j MASQ
#ต้องใช้ ipchains หรือว่า ipfwadm และ masquerade ในการผ่าน packets ต่าง ๆ ด้วย เหมือนในเรื่อง gateway ต้องแก้ไขบางส่วนในไฟล์ /etc/rc.d/rc.modules ด้วย
ip ro add 172.16.1.0/24 via 192.168.44.18 table esc proto static
ip ro add default via 202.6.100.113 table esc proto static
ip ru add from 10.200.200.0/24 table esc
เป็นอันว่าจบเรื่อง Policy Routing With Linux เพียงเท่านี้ ก่อยวุ้ยมึน
ขอขอบคุณ พี่ siracha แห่ง cattelecom ที่เอื้อเฟื้อข้อมูล ด้วยนะครับ ::)ขอหาสูตรที่ สมบูรณ์แบบที่สุด แบบ ทีเดียวจบไปเลย คือ ถ้าไม่เวป Siamcafe.net กับ Truefaster จบ...ปิดเวปอายม้วนกลับบ้านไปเลย
ก็ คนที่มาเรียน จบ สมบูรณ์ครบถ้วนทุกสูตร แค่นี้หละครับ.. ยังไม่รวมมะม่วง mangle หรือ สูตร ไม้ถูพื้น Flood
คือมั่วจนไม่รู้จะมั่วยังไงแล้วเอางี้เลยดีกว่า เลยออกมาเป็น 2 สูตรแล้ว
Squid ใช้เวอร์ชั่นใหนก็ได้ 2.3 - 2.4 - 2.5 - 2.6 - 3.0
ชอบเลขใหนเลือกใช้ได้ตามสบายเลย
Mine.conf ไม่ต้องใช่มันอีกแล้วด้วย ไม่งันปวดหัวตาย ???
และไม่ต้องกลัวว่าจะปวดหัวหรอกนะครับเพราะแน่นอนผมคงไม่หาเรื่องใส่ตัว มานั่งอธิบายยาวเหยียดดดดดดดดดดด..เพราะบอกแต่แรกแล้วว่า " นอกตำรา "
เพราะฉนั้น แค่ copy ไป แปะ ก็พอครับ คำสั่งก็คงมีแต่พื้นฐานๆ ไม่มีอะไรซักซ้อนครับ แต่ใช้งานได้จริงแน่นอน !!
ก็ผมบอกแล้วไงแต่แรกอยากรู้อะไร ไม่ GooGle ก็ Goo เอง นี่หละครับ ดีที่สุด :P
คืออยากจะทำออกมาทีเดียวหลายๆสูตร..คือเอาแบบให้จุกกันไปเลย แบบนี้ชอบมั้ยหละครับ ๛info:
จริงๆจะสอนให้ 2 สูตรเลยด้วยครับไม่ใช่ สูตรเดียว อยากจะแยกร่างแปลงร่างเป็นอะไร ก็บอกมา 8)