Я бы хотел установить исходящий путь 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, который я могу попробовать, чтобы заставить его работать?
Или есть что-нибудь, что я могу попробовать при сборке ядра вариант?
Мы будем благодарны за любые советы.