Monday 3 March 2014

2 default routes

1. Đặt vấn đề:
Giả sử ta có 2 NIC kết nối mạng, ta muốn đến host A bằng eth0, còn lại đi bằng eth1. Vậy ta phải làm sao?
Trường hợp khác, ta cũng có 2 NIC kết nối mạng, từ một host A, ta ping đến interface eth0, ta muốn kết quả trả về phải đi bằng interface eth1. Dĩ nhiên packet này sẽ bị router trung gian drop. Nhưng trong vài trường hợp thì ta cần mô phỏng tương tự như vậy.

Vậy ta phải làm sao?

2. Config 2 default route
Với advanced routing, bạn có thể có nhiều routing table. Trong ví dụ sau, chúng ta thêm đường DSL line từ ISP gọi là "cheapskate".
Đầu tiên, chúng ta cần phải đặt tên cho routing table mới này.
root@host# echo 2 cheapskate > /etc/iproute2/rt_tables

Như đã đề cập ở trên, câu lệnh ip route thực ra chỉ là viết gọn lại của ip route show table main.
Vì thế để show ra routing table mới, ta phải sử dụng câu lệnh sau:
root@host# ip route show table cheapskate

Vì table mới được tạo nên sẽ không show ra thông tin gì cho ta hết (:

Việc cần thiết bây giờ là là add thêm default route vào bảng cheapskate -- table main cũ sẽ tiếp xử lí phần còn lại. Đây là thông tin bảng routing main.
root@host# ip route show table main
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.10
192.168.2.0/24 dev eth1  proto kernel  scope link  src 192.168.2.10 
default via 192.168.1.1 dev eth0 

Ta sẽ add default route mới cho table cheapskate như sau:
root@host# ip route add default via 192.168.2.1 dev eth1 table cheapskate
root@host# ip route show table cheapskate
default via 192.168.2.1 dev eth1

Table cheapskate chỉ chứa một dòng,nhưng nó chưa được sử dụng, vì nó chưa được kích hoạt lên, để hiển thị các rule được kích hoạt ta dùng lệnh sau:
root@host# ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

Routing table chỉ định đích đến của gói tin, nhưng bây giờ ta cần kernel sử dụng những routing table khác dựa trên source address của nó. Lúc này ta cần phải add thêm rule mới như sau:
root@host# ip rule add from 192.168.2.10 lookup cheapskate prio 1000

Lệnh này thêm một rule khi có một gói tin đến với pattern là 192.168.2.10, trong trường hợp này routing cheapskate được sử dụng với priority là 1000. Trong ví dụ này pattern chỉ match với một địa chỉ address, nhưng ta có thể thiết lập nhiều pattern trong Linux router để match nhiều tập địa chỉ khác nhau.
Check lại, ta thấy kết quả:
root@host# ip rule
0:      from all lookup local
1000:   from 192.168.2.10 lookup cheapskate
32766:  from all lookup main
32767:  from all lookup default

Kernel tìm tất cả các tập rule với priority thấp nhất, xử lí từng routing table cho đến khi gói tin được chuyển một cách thành công.

Trong tập rule mặc định luôn có table local với pattern match all. Table local (priority 0) xử lí tất cả các gói tin được xem như trên localhost cũng như broadcast.

** Warnings **
Khi làm nhiều hơn 1 routing table, không bao giờ được quên add thêm phần table trong câu lệnh. Nếu quên, những rule thay đổi sẽ được apply lên table main có thể dẫn đến ảnh hưởng không kiểm soát được. Khi thực hiện từ xa, những thay đổi sai có thể dẫn đến mất kết nối, tốt nhất nên thực hiện trên console.

Một trong những điều quan trong cần chú ý là route được cached lại. Nói cách khác khi ta update routing table và thấy không có gì thay đổi. Giải pháp đơn giản chỉ là flush cache đó đi:
root@host# ip route flush table cache