TCP Принудительная маршрутизация через назначенный Интерфейс Ethernet не работает в ubuntu 18.04

Я бы хотел установить исходящий путь TCP через любой назначенный интерфейс Ethernet, даже если указанный интерфейс Ethernet не настроен как шлюз по умолчанию.

У моего устройства два интерфейса Ethernet ( eth0, eth1).

Я хотел бы принудительно установить TCP-соединение для eth0 (192.168.73.x), даже если шлюз по умолчанию установлен на eth1 (192.168.83.1) вместо eth0, как показано ниже в таблице маршрутизации.


Destination     Gateway               Genmask             Flags   Metric   Ref    Use   Iface
0.0.0.0         192.168.83.1          0.0.0.0             UG      0        0      0     eth1
192.168.73.0    0.0.0.0               255.255.255.0       U       0        0      0     eth0
192.168.83.0    0.0.0.0               255.255.255.0       U       0        0      0     eth1

Для этого я создал один сокет и прикрепил свой исходный IP-адрес (= eth0) с помощью bind api.

(Я также пробовал использовать SO_BINDTODEVICE, но это не сработало)

А затем я вызывается API-интерфейс подключения с IP-адресом назначения для подключения к общедоступному адресу внешнего назначения

Фрагмент кода, как показано ниже.

1>


sock = socket(AF_INET, SOCK_STREAM, 0);

2>


struct sockaddr_in  my_addr;

memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(0);
my_addr.sin_addr.s_addr = htonl(myIP); // eth0's IP address (192.168.73.238)

bind(sock, (struct ::sockaddr *)&my_addr, sizeof(my_addr) )

3>


struct sockaddr_in  dest_addr;
memset(&dest_addr, 0, sizeof(dest_addr));

dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr(destIp);        // Destination IP 
dest_addr.sin_port = htons(destinationPort);             // Destination Port

connect(sock, (struct sockaddr *)(&dest_addr),sizeof(struct sockaddr_in))

Код ошибки, возвращаемый соединением: «Нет route to host »

Но это не удается на моем последнем устройстве с ubuntu linux 18.04 (ядро 4.15.18), тогда как та же логика работает на моем старом устройстве со старым ядром версия похожа на версию 3.10.

Как только я изменю шлюз по умолчанию с eth1 на eth0 и таблица маршрутизации станет такой, как показано ниже, я могу отправлять исходящие пакеты через eth0.


Destination    Gateway         Genmask          Flags  Metric Ref    Use  Iface
0.0.0.0        192.168.83.1    0.0.0.0          UG     0      0      0    eth1
192.168.73.0   0.0.0.0         255.255.255.0    U      0      0      0    eth0
192.168.83.0   0.0.0.0         255.255.255.0    U      0      0      0    eth1

На самом деле я хочу сделать возможным установить исходящий путь независимо от моего конфигурация шлюза по умолчанию.

Но это не удается в последней версии ubuntu 18.04 (ядро 4.15.18).

Есть ли какой-нибудь параметр sysctl, который я могу попробовать, чтобы заставить его работать?

Или есть что-нибудь, что я могу попробовать при сборке ядра вариант?

Мы будем благодарны за любые советы.

1
задан 18 November 2020 в 05:21

0 ответов

Другие вопросы по тегам:

Похожие вопросы: