Kết nối mạng kép


9

Tôi có modem di động usb và kết nối LAN gia đình trên hộp Ubuntu 10.10.

Cả hai làm việc độc lập.

Tôi muốn biết làm thế nào để cả hai kết nối cùng một lúc và có thể chỉ định ứng dụng nào sử dụng thiết bị nào để kết nối với internet.

Có ai biết cách để làm điều này không?

Câu trả lời:


11

Có một số khả năng, tùy thuộc vào cách bạn muốn quyết định gói tin đi đâu. Hầu hết trong số họ sẽ yêu cầu một số hiểu biết về cách mạng TCP / IP hoạt động trong Linux. Các công cụ chính bạn sẽ phải biết để thực hiện những việc phức tạp là iptables(Ubuntu: iptables Cài đặt iptables ) và iproute2 ( iplệnh) (Ubuntu: iproute Cài đặt iproute , iproute-doc Cài đặt iproute-doc ).

Nếu bạn có thể phân biệt hoàn toàn theo địa chỉ IP mục tiêu, thật đơn giản: định tuyến các địa chỉ IP theo mong muốn của bạn. Ví dụ, các lệnh sau sẽ gây ra tất cả các gói cho 1.2.3. x và 1.2.4.2 để đi qua ppp0và các gói khác đi qua eth0.

route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0

Đối với các yêu cầu phức tạp hơn, bạn cần bắt đầu sử dụng iptablesip route. Ví dụ, các lệnh sau thiết lập các bảng định tuyến đặc biệt để tất cả các gói được đánh dấu 1 đi qua eth0và tất cả các gói được đánh dấu 2 đi ra ngoài ppp0(ngoại trừ các gói dành cho localhostgiao diện loopback).

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0

Bây giờ bạn có thể sử dụng iptablesđể gói dữ liệu gửi đi của Mangle, thêm một dấu hiệu sẽ quyết định tuyến đường nào họ đi. Ví dụ: đây là cách gửi tất cả lưu lượng truy cập SMTP đi (cổng 25) qua eth0và tất cả lưu lượng truy cập có nguồn gốc từ một ứng dụng chạy khi người dùng proxythông qua ppp0.

iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2

Xem thêm 2 giao diện mạng được kết nối với internet. Chọn một để sử dụng theo tên miềnliên kết phần mềm với các giao diện mạng khác nhau .


Bạn sẽ cần sắp xếp để các lệnh này chạy khi cả hai giao diện được kết nối. Tôi khuyên bạn nên viết một tập lệnh gọi là /etc/network/if-up.d/0justin-routeschạy các lệnh bạn muốn. Kịch bản này sẽ được thực thi bất cứ khi nào một giao diện mạng được đưa lên; vì tên của nó bắt đầu bằng một 0nó sẽ chạy sớm trong quy trình đó, trước khi thiết lập dành riêng cho ứng dụng có thể mong đợi các tuyến đường được đặt đúng chỗ. Có một đối xứng /etc/network/if-down.d/trong trường hợp bạn cũng muốn làm mọi thứ khi một trong các giao diện đi xuống. (Tất cả các tuyến liên quan sẽ tự động bị xóa, có thể khiến một số gói bị mắc kẹt khi bạn muốn chúng quay lại giao diện khác.)

Các kịch bản ifup được ghi lại trong interfaces(5) man page. Điều chính cần biết là tên của giao diện được đưa lên hoặc xuống là trong biến môi trường IFACE. Bạn có thể tìm hiểu xem giao diện khác đã sẵn sàng chưa if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then ….


@Justin: Đây không phải là thứ tôi có nhiều kinh nghiệm, vì vậy vui lòng gửi phản hồi về những gì đã hoạt động, những gì không hoạt động, những gì bạn không hiểu, v.v.
Gilles 'SO- ngừng trở nên xấu xa'

1
Tôi đã có hai bổ sung để thực hiện: Thứ nhất, điều này sẽ gửi lưu lượng trên ppp0 với địa chỉ nguồn từ eth0. Bạn có thể thay đổi điều này bằng cách sử dụng : iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ip, ppp_ipđịa chỉ IP của bộ điều hợp đó ở đâu. Thứ hai, bạn sẽ cần phải tắt nghiêm ngặt rp_filtertại /proc/sys/net/ipv4/config/ppp0/rp_filter. Nó hoạt động khi được đặt ở chế độ thư giãn, đó là 2.
Karalga
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.