Linuxhost auf dem Openvpnclient läuft soll nicht über vpn Tunnel gehen

BonyTony

Junior Member
Hi,

bin jetzt routingtechnisch (noch) nicht so bewandert.
Was stelle ich auf nem Linux Host ein, damit dieser selbst nicht durch den VPNTunnel sondern über normales Gateway ins Internet geht?

* LinuxHost ist eine Qnap Nas mit openvpnclient.
* Tunnel wird aufgebaut, geht
* bei anderen Hosts, die den Qnap als Gateway haben, geht deren traffic durch den Tunnel (so solls auch sein)
* qnap nas soll aber selbst den Tunnel nicht verwenden.

Ich denke ich müsste die vom vpn server gepuschten routen übergehen. Das route-nopull zeigt nur keine Wirkung.

Testweise eingetragen sind nach dem offenen Tunnel trotzdem alle routen gesetzt...

Hat jemand ne Idee?
 
Du benötigst route-noexec dafür. Damit werden auf dem Linux Host keine Routen durch openvpn mehr gesetzt. Somit geht Linux über die default Route ins Internet und nicht mehr über den VPN Server. Du musst dann allerdings die Routen ins VPN Netz selbst setzen, damit Linux weiß wie es den VPN Server erreichen kann.
 
Also bei mir passiert das automatisch, wenn ich die PP-config so lasse. Es werden die zwei neuen default routes (/1 Netze) eingerichtet und eine host-route zum VPN server. Zusätzlich kann man ja auch noch ein script in der .conf aufrufen, welches weitere routes setzt. Alles was dieser host dann zum routen bekommt, geht durch den Tunnel (ausgenommen ein client will direkt zum vpn-server - der kriegt dann auch die host route und geht am Tunnel vorbei).

Edit:
Beim nochmaligen Lesen scheint mir, daß Du das so nicht willst - das könntest Du mit advanced routing umsetzen:
ip rule add from 192.168.0.0/24 lookup table_xyz
ip rule add to 192.168.0.0/24 lookup table_xyz
sowie
ip route add default via <tun0 gw-ip> dev tun0 table table_xyz

die table muß noch in /etc/iproute2/rt_tables eingetragen werden.
Außerdem müssen noch ein paar weitere Einträge in die routing-table table_xyz, z.B. für localhost etc.
Ist im Netz nachzulesen.
 
Last edited:
Erstmal noch Danke für die Tipps.
Ich habe es zum laufen bekommen.
Was habe ich gemacht habe:
In der vpn Konfiguration up und down Scripte definiert, route-noexec gesetzt

up:
Code:
#!/bin/sh
ip route add table 3 default via "$route_net_gateway" dev eth0
ip route add table 3 0.0.0.0/1 via "$route_vpn_gateway" dev "$dev"
ip route add table 3 "$trusted_ip" via "$route_net_gateway" dev eth0
ip route add table 3 128.0.0.0/1 via "$route_vpn_gateway" dev "$dev"
ip rule add from 192.168.5.5 table 3
/sbin/iptables -t nat -A POSTROUTING -o tun0 -s 192.168.5.5 -j MASQUERADE
/sbin/iptables -A FORWARD -i eth0 -o tun0 -s 192.168.5.5 -j ACCEPT
/sbin/iptables -I INPUT -i tun0 -j DROP

down:
Code:
#!/bin/sh
ip rule delete from 192.168.5.5 table 3
ip route flush table 3
ip route delete "$trusted_ip"
/sbin/iptables -F
/sbin/iptables -t nat -F


Mittels Traceroute sehe ich, dass die Anfragen die richtigen Wege gehen.

Mit iptables -L -v sehe ich, dass entsprechende Pakete über Postrouting gehen.

Wie kann ich das aber sonst noch testen?

Kann ich noch was in den Scripten verbessern oder sicherer machen?
 
Ich gehe mal davon aus, dass die Kiste mit IP 192.168.5.5 der Client ist, der über den Linux Host als Router ins Internet gelangt. Das ganze dann über VPN.

Anmerkung zum Routing:
Du verwendest ja die Routing Table 3 für Zugriffe des Clients, was über die Policy

Code:
ip rule add from 192.168.5.5 table 3

definiert ist. Der Client soll rein über VPN ins Internet gelangen, von daher ist die default Route über deinen DSL Router in der Table 3 unnötig. Damit benötigst du auch keine Spezifizierung des Routings, welche den Traffic über VPN anstatt der default Route zwingen, da es keine default Route über den DSL Router direkt ins Internet gibt. Das heißt, du kannst die Anweisungen:

Code:
ip route add table 3 default via "$route_net_gateway" dev eth0
ip route add table 3 0.0.0.0/1 via "$route_vpn_gateway" dev "$dev"
ip route add table 3 128.0.0.0/1 via "$route_vpn_gateway" dev "$dev"

ersetzen durch eine einzige Route:

Code:
ip route add table 3 default via "$route_vpn_gateway" dev "$dev"

Damit gibt es nur noch eine einzige Route über VPN ins Netz, was du ja auch möchtest.
Die Anweisung (ich geh mal davon aus, dass das die Route zur externen IP des VPN Servers ist)

Code:
ip route add table 3 "$trusted_ip" via "$route_net_gateway" dev eth0

würde ich in die default Routing Table eintragen, also das ganze ohne table 3. Damit steht in der table 3 lediglich die Route über VPN ins Internet für den Client 192.168.5.5, was ja auch langt.

Anmerkung zu den iptables:
Was hast du denn für eine Policy auf der FORWARD chain? ACCEPT oder DROP?
Solltest du hier ACCEPT haben, so benötigst du diese Anweisung:

Code:
/sbin/iptables -A FORWARD -i eth0 -o tun0 -s 192.168.5.5 -j ACCEPT

nicht wirklich, da ohnehin alles durchgelassen wird. Ist die Policy DROP, dann sieht die Sache anders aus, hier ist die Anweisung nötig, dass Traffic rausgehend und Antworttraffic reingehend zugelassen wird.

Wozu ist die DROP Anweisung auf der INPUT Chain? Die INPUT Chain brauchst du nicht wirklich, da der Client rein über die FORWARD Chain mit dem Linux Host kommuniziert. Die INPUT Chain wäre für Pakete, die direkt an den Linux Host adressiert sind, in diesem Fall an sein VPN Interface tun0.

Edit:
Noch was zum Routing, wenn du von 192.168.5.5 noch Rechner deines LAN erreichen möchtest, so musst du eine Route in dein LAN in table 3 noch hinzufügen. Die Route in table 3 leitet alle Anfragen an den VPN Server, der aber keine Anfragen direkt in dein LAN bedienen kann.
 
Last edited:
Nochmal Danke, ich habe es entsprechend angepasst.
Bin ja froh, dass ich das überhaupt geschafft habe. Gab einige Hürden beim Qnap Nas.

Mit /sbin/iptables -I INPUT -i tun0 -j DROP will ich erreichen, das kein internes Gerät von außen irgendwie erreichbar ist.
Oder mache ich das anders?
 
Mit /sbin/iptables -I INPUT -i tun0 -j DROP will ich erreichen, das kein internes Gerät von außen irgendwie erreichbar ist.
Oder mache ich das anders?

Die INPUT Chain regelt lediglich eingehenden Traffic zu deinem Linux Host, nicht darüber hinaus, dafür wäre die FORWARD Chain zuständig. Der Linux Host ist ebenfalls nicht von aussen erreichbar, es sei denn du schaltest nen Port Forward auf dem PP Server, der ja als NAT für deinen Linux Host fungiert, solange dieser mit PP verbunden ist. Da der Linux Host nicht über VPN von aussen erreichbar ist, sind auch deine internen Geräte nicht über VPN von aussen erreichbar. Somit benötigst du diese Anweisung nicht für deine Zwecke.
 
Back
Top