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 ตาราง การทำมีดังนี้

หลักการคร่าวๆ

  1. สร้าง route table 1 และ route table 2 โดยให้มี default route กันคนละแบบ
  2. add ip rules โดยแยกว่า from internet ip ให้ไปอ่าน route table ที่ควรจะเป็น แบบว่า มาทางไหน ไปทางนั้น
  3. มาทดลองกันเลยดีกว่า

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 อีกแหละ

  1. flush ให้มันว่างก่อน ด้วยคำว่า ip route flush table 1
  2. copy route table main ยกเว้น default route (ดูได้ด้วยคำสั่ง ip route show table main)
  3. add default route สำหรับ table 1
  4. ทำแบบนี้กับ 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 เมื่อมีการตัดสายอะไรพวกนี้ ยังไม่ได้ทำจ้ะ

Leave a comment

Your comment

*
To prove you're a person (not a spam script), type the security word shown in the picture.
Anti-spam image

Spam Protection by WP-SpamFree