PDA

View Full Version : Simulare connessione di rete tra due interfacce


marco.r
13-12-2007, 01:06
Devo simulare il collegamento di rete tra due programmi che comunicano tramite TCP/IP, nel senso che devo prendere i dati che produce l'uno, gestirne in qualche modo la spedizione e quindi darlo in pasto all'altro. Il modo piu' semplice che mi era venuto in mente era quello di far partire ognuno dei due programmi su di una interfaccia tun, e quindi con un programma maneggiare direttamente i pacchetti tcp, copiandoli in qualche modo da una interfaccia all'altra. Ovviamente se i due processi, e quindi le due tun, stanno sulla stessa macchina, si vedono gia' e quindi quando uno cerca di comunicare con l'altro lo fanno direttamente. C'e' un modo per far si' che passino per il tunnel ?

Cerco di chiarire con un esempio.
Ho un programma X che mi crea tun0 e tun1, e poi semplicemente copia i pacchetti dall'uno all'altro.
Una volta lanciato, configuro le due interfacce con degli indirizzi di rete

ifconfig tun0 192.168.1.1/24
ifconfig tun1 192.168.1.2/24

Faccio poi partire due programmi, server e client, vincolando server a girare solo sul primo dei due indirizzi. Vorrei a questo punto far si che client possa collegarsi a server, ma passando per l'interfaccia tun1, in modo che i pacchetti passino per il mio programma. Ovviamente in condizioni normali non e' cosi', e il mio dubbio e': e' fattibile ? Non mi sembra ce la si possa cavare con dei giochi sulla tabella di routing, e l'unica alternativa che mi viene e' quella di usare qualche software di virtualizzazione in modo da separare i due processi in modo piu' netto, ma vorrei se possibile evitare questa soluzione. Qualche idea (o anche notizie di software analogo gia' esistente) ?

Marco

marco.r
14-12-2007, 12:16
Alla fine ho risolto cosi' (magari puo' tornare utile a qualcun altro):
- uso un unico tun al posto di due (i pacchetti vengono reimmessi nella stessa interfaccia)
- assegno un indirizzo con una sottomask non banale all' interfaccia

ifconfig tun0 192.168.10.1/24

Per ovviare al problema del routing, con iptables cambio origine e destinazione dei pacchetti per 192.168.10.2 in 192.168.10.2. Similmente quando mi rientrano dall'interfaccia cambio di nuovo la destinazione cosi' che arrivano correttamente a destinazione

iptables -t nat -A PREROUTING -d 192.168.10.2 -j DNAT --to 192.168.10.1
iptables -t nat -A POSTROUTING -s 192.168.10.1 -j SNAT --to 192.168.10.2
iptables -t nat -A OUTPUT -d 192.168.10.1 -j DNAT --to 192.168.10.2

Per inciso non so perche' cosi' funzioni, visto che secondo me manca una regola :D, ma non son pratico di iptables (troppo complicato per i miei gusti) e per il momento va bene cosi'.