Esistono due possibili modelli di progettazione per uno stack di rete TCP/IP:un modello host forte e un modello host debole. Ti aspetti un comportamento che corrisponda al modello host forte. Linux è progettato per utilizzare il modello host debole. In generale il modello di host debole è più comune in quanto riduce la complessità del codice di routing e quindi potrebbe offrire prestazioni migliori. Altrimenti i due modelli host sono solo principi di progettazione diversi:nessuno dei due è intrinsecamente migliore dell'altro.
Fondamentalmente, il modello di host debole significa che il traffico in uscita verrà inviato alla prima interfaccia elencata nella tabella di routing che corrisponde all'indirizzo IP della destinazione (o del gateway selezionato, se la destinazione non è raggiungibile direttamente), indipendentemente da l'indirizzo IP di origine .
Questo è fondamentalmente il motivo per cui è generalmente sconsigliabile utilizzare due interfacce fisiche separate se sono necessari due indirizzi IP sullo stesso segmento di rete. Assegna invece due indirizzi IP per un'interfaccia (alias IP:ad esempio eth1 =192.168.8.142 e eth1:0 =192.168.8.140). Se hai bisogno di più larghezza di banda di quella che una singola interfaccia può fornire, collega (o raggruppa, se applicabile) due o più interfacce insieme, quindi esegui entrambi gli IP sul collegamento/team.
Modificando una serie di impostazioni di sysctl e utilizzando la funzionalità di "instradamento avanzato" per impostare tabelle di instradamento indipendenti per ogni NIC, è possibile fare in modo che Linux si comporti come un sistema a modello host forte. Ma questa è una configurazione molto speciale e consiglierei di pensarci due volte prima di implementarla.
Vedi le risposte in Linux Source Routing, Strong End System Model / Strong Host Model? se ne hai davvero bisogno.
Un ulteriore punto da considerare è che l'interfaccia eth1 è configurata con una subnet mask di 255.255.255.255.
Ciò significa che l'interfaccia eth1 è configurata per non aspettarsi altri dispositivi (host) sulla sua interfaccia di rete. Ciò significa che non sarà in grado di comunicare con il tuo client 192.168.8.142.
Dopo molte ricerche, ho scoperto Perché netcat non utilizza l'interfaccia corretta associata all'IP? , e questo è lo stesso problema. Come ha detto @telcoM, il traffico in uscita verrà inviato alla prima interfaccia, e questo è il problema, quindi il modo più semplice per risolverlo è:
ip route add default via 192.168.8.142 dev eth1 table 142
ip rule add from 192.168.8.142 table 142
Questo percorso farà ip route get 192.168.8.135 from 192.168.8.142
restituisce eth1 invece di eth0. Quindi tutto funziona come previsto.