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 ) và iproute2 ( ip
lệnh) (Ubuntu: iproute , 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 ppp0
và 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 iptables
và ip 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 eth0
và 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 localhost
giao 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 eth0
và 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 proxy
thô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ền và liê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-routes
chạ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 0
nó 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 …
.