Ho il seguente ambiente: 2 host, ciascuno con 2 interfacce Ethernet collegati alla vicenda (come su schema sottostante):come evitare il routing attraverso la pila locale in Linux
+---------+ +---------+
| (1)+---------------+(2) |
| host1 | | host2 |
| | | |
| (3)+---------------+(4) |
+---------+ +---------+
vorrei scrivere client/strumento socket del server che aprirà i socket client e server su host1. Vorrei che il client inviasse i pacchetti TCP attraverso l'interfaccia (1) e il server per l'ascolto sull'interfaccia (3), che i pacchetti passino attraverso host2.
Normalmente lo stack di Linux instraderà questi pacchetti attraverso lo stack TCP/IP locale senza inviarli a host2.
Ho provato ad utilizzare SO_BINDTODEVICE opzione sia per il server e client e sembra che in effetti è assistente binded per interfacciare (3) e non è in ascolto del traffico localhost. Ho verificato che il client da host1 non possa essere accettato mentre il client da host2 lo fa.
Purtroppo i pacchetti client non vengono inviati (anche tcpdump sull'interfaccia (1) non vedono i pacchetti) tramite l'interfaccia (1) all'interfaccia (2). Ovviamente il routing è corretto (posso eseguire il ping (2) da (1), (4) da (1), (4) da (3) e così via).
La mia domanda è se è possibile implementarlo senza utilizzare lo stack TCP/IP personalizzato?
forse dovrei provare a cambiare l'indirizzo IP di destinazione (dal client) per essere da rete esterna (e quindi sarà inviata utilizzando gateway predefinito dall'interfaccia (1) - Interfaccia (2)) e poi in POSTROUTING cambiare quelli di nuovo per quelli originali? È possibile che una tale soluzione funzioni?
Sto scrivendo la mia domanda in C sotto Debian.
Aggiunta alcuni dettagli e chiarimenti:
- naturalmente entrambe le coppie (1) - (2) e (3) - (4) sono diverse sottoreti
- quello che si vuole raggiungere è (1) -> (2) -> (4) -> (3)
- host2 è blackbox quindi non posso installare lì alcun forwarder di pacchetti (che aprirà la presa di ascolto sull'interfaccia (2) e li inoltrerà a Da (3) a (4)) - questo è esattamente ciò che voglio evitare
T il problema principale sembra essere la consegna locale. Quando apro il socket su host1 e voglio connettermi al socket, che è in ascolto su un altro indirizzo dello stesso kernel host, usa lo stack locale per consegnare i pacchetti. Vedere schema netfilter di seguito:
--->[1]--->[ROUTE]--->[3]--->[4]--->
| ^
| |
| [ROUTE]
v |
[2] [5]
| ^
| |
v |
pacchetti stanno attraversando [5] NF_IP_LOCAL_OUT e [2] NF_IP_LOCAL_IN mentre io voglio costringerli a passare attraverso [4].
solo per capire che si desidera che il percorso del messaggio di essere (1) -> (2) -> (4) -> (3)? –
Non hai certamente bisogno di uno stack TCP personalizzato per questo. Non è sicuro che sia il modo migliore, ma potresti eseguire una traduzione di indirizzi di rete su host2 che mapperebbe un indirizzo IP univoco all'indirizzo di interfaccia (3) e assicurarti che i pacchetti a (3) da host2 vengano instradati via (4)). Host1 si collegherebbe quindi a quell'indirizzo IP univoco. – NPE
Se un socket si connette da (1) a (2) su una macchina diversa e un altro socket si collega da (4) a (3) sulla prima macchina, perché lo stack TCP di Linux salta l'invio di pacchetti tramite la rete? In che modo lo stack TCP poteva conoscere, in modo impercettibile, questa insolita topologia e in che modo potrebbe _possibilmente_ conoscere le tue intenzioni? – Damon