Có thể có nhiều cổng mặc định cho các kết nối ra không?


15

Tôi muốn có nhiều NIC (eth0 và wlan0) trong cùng một mạng con và để phục vụ như một bản sao lưu cho các ứng dụng trên máy chủ nếu một trong các NIC bị lỗi. Vì lý do này, tôi đã tạo ra một bảng định tuyến bổ sung. Đây là cách /etc/network/interfacesnhìn:

iface eth0 inet static
address 192.168.178.2
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.2
    post-up ip route add default via 192.168.178.1 dev eth0
    post-up ip rule add from 192.168.178.2/32
    post-up ip rule add to 192.168.178.2/32

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
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.3 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.3/32 table rt2
    post-up ip rule add to 192.168.178.3/32 table rt2

Điều đó hoạt động để kết nối với máy chủ: Tôi vẫn có thể SSH vào nó nếu một trong các giao diện không thành công. Tuy nhiên, các ứng dụng trên máy chủ không thể khởi tạo kết nối với thế giới bên ngoài nếu không hoạt eth0động. Đó là vấn đề của tôi.

Tôi đã nghiên cứu chủ đề đó và tìm thấy thông tin thú vị sau:

Khi một chương trình khởi tạo kết nối ra, việc sử dụng địa chỉ nguồn ký tự đại diện (0.0.0.0) là bình thường, cho biết không có ưu tiên nào về giao diện được sử dụng miễn là có thể truy cập địa chỉ đích có liên quan. Điều này không được thay thế bởi một địa chỉ nguồn cụ thể cho đến khi quyết định định tuyến được đưa ra. Do đó, lưu lượng được liên kết với các kết nối như vậy sẽ không khớp với một trong các quy tắc chính sách ở trên và sẽ không được chuyển đến một trong các bảng định tuyến mới được thêm vào. Giả sử một cấu hình bình thường khác, thay vào đó nó sẽ rơi vào bảng định tuyến chính. http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_mult Môn_default_gateways.html

Những gì tôi muốn là cho bảng tuyến chính có nhiều hơn một cổng mặc định (một eth0và một trên wlan0) và đi đến cổng mặc định thông qua eth0theo mặc định và thông qua wlan0nếu eth0bị tắt.

Điều đó có thể không? Tôi cần làm gì để đạt được chức năng như vậy?


Rất ngắn gọn: Một số tuyến mặc định sẽ chọn một giao diện ngẫu nhiên, điều này dẫn đến sự cố vì IP được gán khác nhau. Những gì bạn muốn là đa dạng hoặc , rất khó để thực hiện, xem ví dụ ở đây
dirkt

1
Bạn có thể sử dụng chuyển đổi dự phòng động với liên kết . Không cần phải fiddle với các tuyến mặc định.
Ingo

Câu trả lời:


17

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 showbạ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/interfacesrấ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 mainbả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 mainbả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ì eth0có số liệu thấp nhất, đây là tuyến mặc định sẽ được sử dụng miễn eth0là 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.8vào một thiết bị đầu cuối và ifdown eth0trong một thiết bị đầu cuối khác. pingvẫn hoạt động vì ifdown eth0sẽ 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ừ eth0tuyến đường mặc định eth0vẫ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 eth0nế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/ifdownnế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 wlan1và 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.


Hãy thử tạo một kết nối mất nhiều thời gian hơn (ví dụ: scp một tệp lớn), xem giao diện mạng nào nó sử dụng, vô hiệu hóa giao diện đó và xem điều gì sẽ xảy ra.
dirkt

Các scpphiên sẽ phá vỡ vì địa chỉ IP thay đổi. Bạn có thể thử sử dụng withsctpđể giữ cho kết nối tồn tại trong trường hợp như vậy hoặc sử dụng rsyncthay vì scpđể ngăn chặn việc chuyển từ điểm dừng.
rosix

Vấn đề là: Nếu nó bị hỏng, ưu điểm của thiết lập phức tạp của bạn là gì khi chỉ có một tuyến mặc định duy nhất, nói trên giao diện mạng nhanh nhất hiện tại? withsctpcũng sẽ làm việc cho chỉ một tuyến mặc định.
dirkt

1
"lợi thế của thiết lập phức tạp của bạn là gì khi chỉ có một tuyến mặc định duy nhất, nói trên giao diện mạng nhanh nhất hiện tại?" >> Đó chính xác là những gì thiết lập của tôi đang làm. Chỉ có tuyến mặc định nhanh nhất (eth0) được sử dụng theo mặc định. Không có gì.
rosix

10

Linux cung cấp một giải pháp tốt hơn so với cách giải quyết theo kịch bản của bạn: liên kết dự phòng hoạt động.

Bằng cách này, máy của bạn sẽ chỉ có một địa chỉ IP (và một địa chỉ mac) và tự động và chuyển đổi giao diện trong suốt nếu một giao diện không khả dụng. Không làm gián đoạn bất kỳ kết nối TCP nào (không lan truyền nội bộ cũng như internet).

Tôi đang sử dụng thiết lập này để tự động chuyển đổi dự phòng từ eth0 sang wlan0 trên máy tính xách tay debian của tôi khi tôi ngắt kết nối máy tính xách tay của mình khỏi trạm nối.

Giao diện / etc / mạng / của tôi:

# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
        bond-master bond0
        bond-primary eth0

# The secondary network interface
allow-hotplug wlan0
iface wlan0 inet manual
        pre-up sleep 5
        wpa-conf /etc/wpa_supplicant.conf
        bond-master bond0
        bond-primary eth0

# The bonding interface
allow-hotplug bond0
iface bond0 inet dhcp
        bond-slaves eth0 wlan0
        bond-primary eth0
        bond-mode active-backup
        bond-miimon 10
        bond_downdelay 10
        bond_updelay 4000

Bạn có thể dễ dàng mở rộng thiết lập này để bao gồm nhiều thiết bị wlan. Đặt primary_reselecttùy chọn thành better(tự động chọn liên kết nhanh nhất) sẽ giúp ích ở đây.

Để biết thêm thông tin, hãy xem https://wiki.linuxfoundation.org/networking/boinatinghttps://wiki.debian.org/Bonding

Và (tất nhiên) tài liệu kernel linux tại https://www.kernel.org/doc/Documentation/networking/boinating.txt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.