ตั้งค่า iproute2 ให้ ubuntu server ที่มี 2 interfaces

ผมมี server สำหรับห้องบริการคอมพิวเตอร์ ที่ทำหน้าที่จ่าย dhcp IP และ cloning Windows และใช้ pGina for Windows ในการ Login ก่อนเข้าใช้เครื่อง

เริ่มแรก server ก็มีการ์ดแลนเพียง 1 ใบ สำหรับห้องบริการคอมพิวเตอร์ห้องที่ 1 (eth0) ต่อมามีความต้องการให้ห้องบริการคอมพิวเตอร์ห้องที่ 2 ซึ่งจะเป็นอีก network ใช้ server ตัวเดียวกันนี้ด้วย จึงเพิ่มการ์ดแลนอีก 1 ใบ (eth1) ทำให้ตอนนี้มี eth0 และ eth1

ipmultihomed

ปัญหาคือ เมื่อ Windows ในห้องคอมฯ ห้องที่ 2 ตั้งค่า pGina RADIUS plugin ชี้ไปยัง IP ของ eth0 (192.168.99.20) ก็ทำงานไม่ได้ แต่ถ้าตั้งค่าชี้ไปยัง IP ของ eth1 (192.168.99.251) อย่างนี้ใช้งานได้ หรือใช้คำสั่ง ping 192.168.99.20 อย่างนี้ก็ไม่ได้ เช่นกัน

จึงค้นหาคำตอบ google search อยู่หลายวัน มีบทความที่ให้คำตอบใกล้เคียงที่สุด แต่ผมก็ต้องมาแต่ง config ใหม่ จนสำเร็จ โดยหลักใหญ่ ๆ คือ เครื่อง server ที่มีการ์ดแลน 2 การ์ดนี้จะเรียกว่า multi-homed server จำเป็นจะต้องตั้งค่าเพิ่มโดยใช้ iproute2 ซึ่งมีให้แล้วบน ubuntu server ที่ผมทดสอบนี้คือ ubuntu server 16.04 ครับ คือ ปรกติแล้วเครื่อง 1 เครื่อง จะมี default gateway เพียง 1 เท่านั้น เราจะใช้ iproute2 เพื่อแยกให้มี gateway สำหรับ IP ของ eth0 และ eth1 เพิ่มขึ้น

เรามาดูตัวอย่างกันครับ

เครื่องที่ทดสอบ มี 2 subnets (อันนี้ที่ต้องใช้ /25 เพราะผมไม่มี net class C ถึง 2 net จึงไปขอความช่วยเหลือทีมเครือข่ายให้ช่วยแบ่งครึ่ง net class C ให้ครับ)
1. net 192.168.99.0/25
IP 192.168.99.1 – 192.168.99.126 broadcast 192.168.99.127 gateway 192.168.99.1
2. net 192.168.99.128/25
IP 192.168.99.129 – 192.168.99.254 broadcast 192.168.99.255 gateway 192.168.99.129

 

1. ตรวจสอบ network interfaces ได้ผลลัพธ์ดังนี้

root@ubuntu:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:4d:60:1e:fb:ab
 inet addr:192.168.99.20 Bcast:192.168.99.127 Mask:255.255.255.128

eth1 Link encap:Ethernet HWaddr 00:04:a5:fd:a4:9c
 inet addr:192.168.99.251 Bcast:192.168.99.255 Mask:255.255.255.128

lo Link encap:Local Loopback
 inet addr:127.0.0.1 Mask:255.0.0.0

 

2. เพิ่ม 2 บรรทัดนี้ต่อท้ายในไฟล์ /etc/iproute2/rt_tables (ผมตั้งชื่อ routing table 1 ว่า rt1 และ routing table 2 ว่า rt2)

1 rt1
2 rt2

ผลลัพธ์ได้ดังนี้

root@ubuntu:~# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 rt1
2 rt2

 

3. เพิ่ม 4 บรรทัดนี้สำหรับ eth0

post-up ip route add 192.168.99.0/25 dev eth0 src 192.168.99.20 table rt1
post-up ip route add default via 192.168.99.1 dev eth0 table rt1
post-up ip rule add from 192.168.99.20/32 table rt1
post-up ip rule add to 192.168.99.20/32 table rt1

 

4. และเพิ่ม 4 บรรทัดนี้สำหรับ eth1
post-up ip route add 192.168.99.128/25 dev eth1 src 192.168.99.251 table rt2
post-up ip route add default via 192.168.99.129 dev eth1 table rt2
post-up ip rule add from 192.168.99.251/32 table rt2
post-up ip rule add to 192.168.99.251/32 table rt2

 

จากข้อ 3 และ ข้อ 4 ผลลัพธ์ได้ดังนี้

root@ubuntu:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.99.20
netmask 255.255.255.128
gateway 192.168.99.1
dns-nameservers 192.100.77.10 192.100.77.11
post-up ip route add 192.168.99.0/25 dev eth0 src 192.168.99.20 table rt1
post-up ip route add default via 192.168.99.1 dev eth0 table rt1
post-up ip rule add from 192.168.99.20/32 table rt1
post-up ip rule add to 192.168.99.20/32 table rt1

auto eth1
iface eth1 inet static
address 192.168.99.251
netmask 255.255.255.128
post-up ip route add 192.168.99.128/25 dev eth1 src 192.168.99.251 table rt2
post-up ip route add default via 192.168.99.129 dev eth1 table rt2
post-up ip rule add from 192.168.99.251/32 table rt2
post-up ip rule add to 192.168.99.251/32 table rt2

 

5. ทำการ restart server
แค่นี้ครับ

 

References:

1. Two Default Gateways on One System

(URL https://www.thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System)
2. Linux iproute2 multiple default gateways

(URL https://www.iodigitalsec.com/2014/10/05/linux-iproute2-multiple-default-gateways/)

3. Number of IP Addresses and Multihoming

(URL http://www.tcpipguide.com/free/t_NumberofIPAddressesandMultihoming.htm)