VPN mit tun/tap selbst programmieren, Routing Problem

17/12/2008 - 16:53 von Florian Weingarten | Report spam
Hallo zusammen,

ich möchte gerne eine Art VPN bauen, und zwar mit tun/tap.

Ich habe zwei Hosts, A und B. Nun soll alles was von A nach B gesendet wird zuerst
an meiner Software vorbei. Dafür benutze ich ein tun Interface und einen entsprechenden
Eintrag in der Routing Tabelle. Die Pakete, die meine Software dann bekommt, werden
von meiner Software verarbeitet (was genau damit passiert ist nicht wichtig).
Das Paket wird dann als Payload in ein UDP Paket verpackt und nun zu Host B verschickt.

Das Problem ist, dass ich aber natürlich keine Pakete an Host B senden kann, da diese
wiederrum wegen dem Eintrag in der Routing Tabelle durch das tun Interface gehen, und
erneut verarbeitet werden, usw..

Ich möchte ungerne "private IP Adresse" einführen, wie das bei VPNs oft gemacht wird.

Daher meine Frage:

Ist es möglich in einem C Programm ein Paket über ein bestimmtes Interface zu senden
bzw. über einen bestimmten Gateway, selbst wenn die Routing Tabelle etwas anderes
sagt? D.h. ich möchte in meinem Programm sagen "Sende dieses Paket über eth0, auch
wenn die Routing Tabelle sagt, dass es über tun0 gesendet werden soll!".

Vielen Dank für alle Antworten!

Flo
 

Lesen sie die antworten

#1 Ignatios Souvatzis
10/02/2009 - 15:29 | Warnen spam
Florian Weingarten wrote:
...
ich möchte gerne eine Art VPN bauen, und zwar mit tun/tap.
[...]
Das Problem ist, dass ich aber natürlich keine Pakete an Host B senden
kann, da diese wiederrum wegen dem Eintrag in der Routing Tabelle durch
das tun Interface gehen, und erneut verarbeitet werden, usw..

Ich möchte ungerne "private IP[-]Adresse" einführen, wie das bei VPNs
oft gemacht wird.



Dann nimm' (getrennte, aber) echte IP-Adressen. Wenn du das auch nicht
willst, dann ...

Ist es möglich[,] in einem C Programm ein Paket über ein bestimmtes
Interface zu senden


ja, im LAN,

bzw. über einen bestimmten Gateway,


nein, das nicht.

Angenommen, das Tunnelende ist im LAN, und der getunnelte Adressbereich
ist "kleiner", dann funktioniert folgendes:

#include <sys/types.h>
#include <sys/socket.h>
int s,rc,one;

s = socket(...);
if (s < 0) {
err(1, "can't connect");
}
one=1;
rc = setsocktopt(s, SOL_SOCKET, SO_DONTROUTE,
(const void *)&one, sizeof(one));
if (rc) {
err(2, "can't setsockopt");
}
rc = sendto(s, ...);
...

Bedingung: das Ziel des sendto() muss im LAN sein, denn die
Routingtabelle (mithin: die Gatewaybestimmung) wird komplett
umgangen; nur noch ARP (bei Ethernet,ARCnet, FDDI, Tokenring etc.)
findet statt. Aber für das Experimentieren im Labor duerfte das
reichen.

Wenn du mehr willst, solltest du dem Tunnel tatsàchlich eigenstàndige
IP-Adressen verpassen - ob sie nun echt sind oder aus RFC1918.

-is

Ähnliche fragen