Tôi có môi trường sau đây: 2 host, mỗi với 2 giao diện Ethernet kết nối với eachother (như trên sơ đồ dưới đây):thế nào để tránh định tuyến thông qua đống địa phương trong Linux
+---------+ +---------+
| (1)+---------------+(2) |
| host1 | | host2 |
| | | |
| (3)+---------------+(4) |
+---------+ +---------+
Tôi muốn viết client/công cụ socket máy chủ sẽ mở cả ổ cắm máy khách và máy chủ trên host1. Tôi muốn khách hàng gửi gói TCP thông qua giao diện (1) và máy chủ để nghe trên giao diện (3), gói đó sẽ đi qua host2.
Thông thường, ngăn xếp Linux sẽ định tuyến các gói này thông qua ngăn xếp TCP/IP cục bộ mà không gửi chúng đến host2.
Tôi đã cố gắng sử dụng SO_BINDTODEVICE tùy chọn cho cả máy chủ và máy khách và có vẻ như máy chủ thực sự được liên kết với giao diện (3) và không nghe lưu lượng cục bộ. Tôi đã kiểm tra client đó từ host1 không thể chấp nhận được trong khi client từ host2 thực hiện.
Thật không may là các gói tin của khách hàng không được gửi đi (thậm chí tcpdump trên giao diện (1) không thấy các gói) thông qua giao diện (1) đến giao diện (2). Định tuyến của khóa học là chính xác (tôi có thể ping (2) từ (1), (4) từ (1), (4) từ (3) vv).
Câu hỏi của tôi là liệu điều này có thể được triển khai mà không sử dụng ngăn xếp TCP/IP tùy chỉnh không?
Có lẽ tôi nên cố gắng thay đổi địa chỉ IP đích (từ máy khách) thành mạng bên ngoài (và sau đó sẽ được gửi bằng cổng mặc định từ giao diện (1) - giao diện (2)) và sau đó đăng lại thay đổi lại bản gốc? Giải pháp đó có thể hoạt động không?
Tôi đang viết đơn đăng ký của mình bằng C dưới Debian.
Thêm một số chi tiết và làm rõ:
- tất nhiên cả cặp (1) - (2) và (3) - (4) là mạng con khác nhau
- những gì tôi muốn đạt được là (1) -> (2) -> (4) -> (3)
- host2 là hộp đen vì vậy tôi không thể cài đặt ở đó bất kỳ gói chuyển tiếp nào (sẽ mở ổ cắm nghe trên giao diện (2) và chuyển tiếp đến (3) đến (4)) - đây chính là điều tôi muốn tránh
T vấn đề chính của ông dường như là giao hàng địa phương. Khi tôi mở socket trên host1 và muốn kết nối với socket, đó là lắng nghe trên địa chỉ khác của cùng một máy chủ hạt nhân chỉ sử dụng stack địa phương để cung cấp các gói tin. Xem sơ đồ netfilter dưới đây:
--->[1]--->[ROUTE]--->[3]--->[4]--->
| ^
| |
| [ROUTE]
v |
[2] [5]
| ^
| |
v |
gói đang trải qua [5] NF_IP_LOCAL_OUT và [2] NF_IP_LOCAL_IN trong khi tôi muốn buộc họ phải đi qua [4].
Chỉ cần để hiểu bạn muốn con đường thông điệp của bạn là (1) -> (2) -> (4) -> (3)? –
Bạn chắc chắn không cần một ngăn xếp TCP tùy chỉnh cho việc này. Bạn không chắc chắn nếu đó là cách tốt nhất, nhưng bạn có thể thực hiện một số dịch địa chỉ mạng trên host2 sẽ ánh xạ một số địa chỉ IP duy nhất tới địa chỉ giao diện (3) và đảm bảo các gói tin (3) từ host2 được định tuyến thông qua (4)). Host1 sau đó sẽ kết nối với địa chỉ IP duy nhất đó. – NPE
Nếu một ổ cắm kết nối từ (1) đến (2) trên một máy khác và ổ cắm khác kết nối (4) đến (3) trên máy đầu tiên, tại sao ngăn xếp TCP Linux bỏ qua việc gửi gói tin qua mạng? Làm thế nào có thể ngăn xếp TCP _possibly_ biết về cấu trúc liên kết bất thường này và làm thế nào nó có thể _possibly_ biết ý định của bạn? – Damon