Tự mình giải quyết nó. Dường như có rất ít thông tin về các công cụ kết nối mạng mà bạn có thể làm với Linux, vì vậy tôi đã quyết định ghi lại và giải thích chi tiết giải pháp của mình. Đây là thiết lập cuối cùng của tôi:
- 3 NIC: eth0 (dây), wlan0 (tích hợp wifi, yếu), wlan1 (bộ chuyển đổi wifi usb, tín hiệu mạnh hơn wlan0)
- Tất cả chúng trên một mạng con duy nhất, mỗi mạng có địa chỉ IP riêng.
- Theo mặc định, eth0 nên được sử dụng cho cả lưu lượng đến và đi.
- Nếu eth0 thất bại thì nên sử dụng wlan1.
- Nếu wlan1 thất bại thì nên sử dụng wlan0.
Bước đầu tiên : Tạo bảng lộ trình mới cho mọi giao diện /etc/iproute2/rt_tables
. Hãy gọi chúng là rt1, rt2 và rt3
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 rt1
2 rt2
3 rt3
Bước thứ hai : Cấu hình mạng trong /etc/network/interfaces
. Đây là phần chính và tôi sẽ cố gắng giải thích nhiều nhất có thể:
auto eth0 wlan0
allow-hotplug wlan1
iface lo inet loopback
iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
post-up ip route add default via 192.168.178.1 dev eth0 table rt1
post-up ip rule add from 192.168.178.99/32 table rt1
post-up ip rule add to 192.168.178.99/32 table rt1
post-up ip route add default via 192.168.178.1 metric 100 dev eth0
post-down ip rule del from 0/0 to 0/0 table rt1
post-down ip rule del from 0/0 to 0/0 table rt1
iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
post-up ip rule add from 192.168.178.97/32 table rt2
post-up ip rule add to 192.168.178.97/32 table rt2
post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
post-down ip rule del from 0/0 to 0/0 table rt2
post-down ip rule del from 0/0 to 0/0 table rt2
iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
post-up ip rule add from 192.168.178.98/32 table rt3
post-up ip rule add to 192.168.178.98/32 table rt3
post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
post-down ip rule del from 0/0 to 0/0 table rt3
post-down ip rule del from 0/0 to 0/0 table rt3
Nếu bạn gõ ip rule show
bạn sẽ thấy như sau:
0: from all lookup local
32756: from all to 192.168.178.98 lookup rt3
32757: from 192.168.178.98 lookup rt3
32758: from all to 192.168.178.99 lookup rt1
32759: from 192.168.178.99 lookup rt1
32762: from all to 192.168.178.97 lookup rt2
32763: from 192.168.178.97 lookup rt2
32766: from all lookup main
32767: from all lookup default
Điều này cho chúng tôi biết rằng lưu lượng đến hoặc đi từ địa chỉ IP "192.168.178.99" sẽ sử dụng bảng tuyến đường rt1. Càng xa càng tốt. Nhưng lưu lượng truy cập được tạo cục bộ (ví dụ: bạn muốn ping hoặc ssh từ máy đến nơi khác) cần được xử lý đặc biệt (xem trích dẫn lớn trong câu hỏi).
Bốn dòng đăng bài đầu tiên /etc/network/interfaces
rất đơn giản và có thể tìm thấy lời giải thích trên internet, dòng thứ năm và cuối cùng là dòng làm cho phép thuật xảy ra:
post-up ip r add default via 192.168.178.1 metric 100 dev eth0
Lưu ý cách chúng tôi chưa chỉ định bảng lộ trình cho dòng đăng này. Nếu bạn không chỉ định bảng lộ trình, thông tin sẽ được lưu trong main
bảng tuyến đường mà chúng tôi đã thấy ip rule show
. Dòng đăng tải này đặt một tuyến mặc định trong bảng tuyến "chính" được sử dụng cho lưu lượng được tạo cục bộ không phải là phản hồi cho lưu lượng đến. (Ví dụ: một MTA trên máy chủ của bạn đang cố gắng gửi e-mail.)
Cả ba giao diện đều đặt một tuyến mặc định trong bảng tuyến chính, mặc dù với các số liệu khác nhau. Chúng ta hãy xem main
bảng lộ trình với ip route show
:
default via 192.168.178.1 dev eth0 metric 100
default via 192.168.178.1 dev wlan1 metric 101
default via 192.168.178.1 dev wlan0 metric 102
192.168.178.0/24 dev wlan0 proto kernel scope link src 192.168.178.97
192.168.178.0/24 dev eth0 proto kernel scope link src 192.168.178.99
192.168.178.0/24 dev wlan1 proto kernel scope link src 192.168.178.98
Chúng ta có thể thấy rằng bảng tuyến chính có ba tuyến mặc định, mặc dù với các số liệu khác nhau. Ưu tiên cao nhất là eth0, sau đó là wlan1 và sau đó là wlan0 vì các số liệu thấp hơn cho thấy mức độ ưu tiên cao hơn. Vì eth0
có số liệu thấp nhất, đây là tuyến mặc định sẽ được sử dụng miễn eth0
là lên. Nếu eth0
đi xuống, lưu lượng đi sẽ chuyển sang wlan1
.
Với thiết lập này, chúng ta có thể gõ ping 8.8.8.8
vào một thiết bị đầu cuối và ifdown eth0
trong một thiết bị đầu cuối khác. ping
vẫn hoạt động vì ifdown eth0
sẽ xóa tuyến mặc định liên quan đến eth0
, lưu lượng đi sẽ chuyển sang wlan1
.
Các dòng sau giảm xuống đảm bảo rằng các bảng tuyến đường liên quan sẽ bị xóa khỏi cơ sở dữ liệu chính sách định tuyến ( ip rule show
) khi giao diện bị hỏng, để giữ mọi thứ gọn gàng.
Vấn đề còn lại là khi bạn rút phích cắm từ eth0
tuyến đường mặc định eth0
vẫn còn đó và lưu lượng đi không thành công. Chúng tôi cần một cái gì đó để giám sát các giao diện của chúng tôi và để thực thi ifdown eth0
nếu có vấn đề với giao diện (ví dụ như lỗi NIC hoặc ai đó đang rút phích cắm).
Bước cuối cùng : nhập ifplugd
. Đó là một trình nền xem các giao diện và thực thi ifup/ifdown
nếu bạn rút phích cắm hoặc nếu có vấn đề với kết nối wifi /etc/default/ifplugd
:
INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"
Bây giờ bạn có thể kéo phích cắm eth0
, lưu lượng đi sẽ chuyển sang wlan1
và nếu bạn cắm lại, lưu lượng đi sẽ chuyển trở lại eth0
. Máy chủ của bạn sẽ trực tuyến miễn là bất kỳ giao diện nào trong ba giao diện hoạt động. Để kết nối với máy chủ của bạn, bạn có thể sử dụng địa chỉ IP của eth0 và nếu thất bại, địa chỉ IP của wlan1 hoặc wlan0.