Ubuntu with 2 ethernets 2 pppoes
นี้เป็นปัญหาใหญ่สำหรับ linux เมื่อต้องการทำ Advance Routing การจะทำแบบนี้จะเกิดขึ้นเมื่อเรามี gateway มากกว่า 1 ตัว ยกตัวอย่างเช่นเครื่องของผม มีไดอะแกรมดังนี้
เครื่องนี้มี webserver อยู่ด้วย
ppp0 = NTT
ppp1 = Fixed IP
Default Route = ppp0
ปัญหาก็คือว่า Fixed IP รับ packets เข้ามาทาง ppp1 แต่ดันไปส่งออกที่ ppp0 เพราะมันอ่านตาราง Default Route เข้าให้ ดังนั้น ppp1 จึงถือว่าพิการไป เว็บผมจึงล่มโดยปริยาย -*- (ISP จะ block out going packet เพราะถือว่าเป็น fake packet)
ทางแก้คือต้องทำ Advance Routing ให้มี 2 ตาราง การทำมีดังนี้
หลักการคร่าวๆ
- สร้าง route table 1 และ route table 2 โดยให้มี default route กันคนละแบบ
- add ip rules โดยแยกว่า from internet ip ให้ไปอ่าน route table ที่ควรจะเป็น แบบว่า มาทางไหน ไปทางนั้น
- มาทดลองกันเลยดีกว่า
ifconfig ดูก่อน
ppp0 inet addr:218.110.108.209 P-t-P:59.146.160.146 Mask:255.255.255.255 ppp1 inet addr:219.117.216.105 P-t-P:163.139.56.99 Mask:255.255.255.255
ppp0 เป็น NTT ผมต้องการให้คนในออฟฟิชเล่นเน็ต ออกสายนี้
ppp1 เป็น Fixed IP ผมใช้บริการประชาชน และเป็นเน็ตสำรอง
ขอกำหนดตัวแปรก่อนนะ
$IP1, $IP2 คือ ip ใน inet address
$PTP1, $PTP2 คือ ip ที่ใช้คุยกับ ISP
script แยก ip , ptp
IP1=`ifconfig ppp0|grep inet|awk '{print $2}'|sed -e s/addr://`
IP2=`ifconfig ppp1|grep inet|awk '{print $2}'|sed -e s/addr://`
PTP1=`ifconfig ppp0|grep inet|awk '{print $3}'|sed -e s/P-t-P://`
PTP2=`ifconfig ppp1|grep inet|awk '{print $3}'|sed -e s/P-t-P://`
สร้าง route table 1 กับ 2 ก็ใช้ script อีกแหละ
- flush ให้มันว่างก่อน ด้วยคำว่า ip route flush table 1
- copy route table main ยกเว้น default route (ดูได้ด้วยคำสั่ง ip route show table main)
- add default route สำหรับ table 1
- ทำแบบนี้กับ table 2 ด้วย
โค้ดเป็นแบบนี้
ip route flush table 1 ip route show table main | grep -Ev ^default | while read ROUTE ; do ip route add table 1 $ROUTE done
ip route flush table 2 ip route show table main | grep -Ev ^default | while read ROUTE ; do ip route add table 2 $ROUTE done
add default route สำหรับแต่ละ table
ip route add default via $PTP1 table 1 ip route add default via $PTP2 table 2
add ip rule มาจากไหน ไปทางนั้น
ip rule add from $IP1 table 1 ip rule add from $IP2 table 2
ตรงนี้สั่งแค่ครั้งเดียวพอ ถ้าอยากจะดูให้สั่งว่า ip rule show
root@kglinux:~# ip rule show 0: from all lookup local 32764: from 219.117.216.105 lookup 2 32765: from 218.110.108.209 lookup 1 32766: from all lookup main 32767: from all lookup default
ถ้าอยากลบ 32764 ก็ต้องพิมว่า
ip rule del from 219.117.216.105 lookup 2
ส่วนการทำ NAT
iptables -t mangle -A FORWARD -o ppp1 iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE iptables -t mangle -A FORWARD -o ppp0 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
ก็ตามนี้เลยจ้ะ
ถ้าอยากจะเปลี่ยนทางออก
route del default route add default ppp1
กว่าจะทำได้ขนาดนี้ ใช้เวลาค้นหลายวันเหมือนกัน
อ้างอิง http://www.docum.org/docum.org/kptd/
สาเหตุของปัญหา http://linux-ip.net/html/adv-multi-internet.html ข้อ 10.4.2
คำตอบสุดท้าย http://lartc.org/howto/lartc.rpdb.multiple-links.html
แต่เว็บสุดท้าย ยังไม่สมบูรณ์ เพราะผมเข้าเว็บตัวเองไม่ได้ มันไม่มี route table
ผมมาแก้ให้สมบูรณ์ขึ้น เหลือแต่ส่วน automatic เมื่อมีการตัดสายอะไรพวกนี้ ยังไม่ได้ทำจ้ะ
