drizzt
Goto Top

Iptables forwarding für openvpn-Verbindung

Hallo zusammen,

ich muss ein wenig weiter ausholen, um mein Problem zu schildern:
Für meinen alten DSL-Zugang hatte ich eine feste IP-Adresse (T-DSL Business). Das war mir auf Dauer jedoch zu teuer, daher habe ich mir vor kurzem einen neuen DSL-Zugang schalten lassen. Außerdem habe ich ein vTunnel-Abo (openvpn), um wieder eine feste IP-Adresse nutzen zu können.

Dadurch habe ich auf meinem Debian Server nun ein neues Interface hinzubekommen (tun0). Mit meiner alten DSL-Verbindung war es mir möglich, Anfragen auf bestimmten Ports (z. B. 443) auf einen Server in meinem Netz weiterleiten (forwarden) zu lassen. Mit der neuen Leitung / dem zusätzlichen Interface kriege ich das jetzt aber irgendwie nicht mehr hin...

Noch zur Info:
Der Debian Server wählt sich direkt ins Internet ein (ppp0). Anschließend wird dann der Tunnel aufgebaut (tun0).

Meine routing-Tabelle sieht folgendermaßen aus:
min_server:~# route -n
Kernel IP Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
217.0.119.59    *               255.255.255.255 UH    0      0        0 ppp0
80.xxx.xxx.41   *               255.255.255.255 UH    0      0        0 tun0
80.xxx.xxx.248  93.217.101.230  255.255.255.255 UGH   0      0        0 ppp0
192.168.xxx.0     *               255.255.255.224 U     0      0        0 eth0
default         80.xxx.xxx.41   0.0.0.0         UG    0      0        0 tun0

Mein ifconfig zeigt mir Folgendes:
eth0      Protokoll:Ethernet  Hardware Adresse xx:xx:xx:xx:xx 
          inet Adresse:192.168.x.y  Bcast:192.168.x.31  Maske:255.255.255.224
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:94127491 errors:0 dropped:0 overruns:0 frame:0
          TX packets:75411629 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:3882524601 (3.6 GiB)  TX bytes:3400403615 (3.1 GiB)

lo        Protokoll:Lokale Schleife  
          inet Adresse:127.0.0.1  Maske:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:248720 errors:0 dropped:0 overruns:0 frame:0
          TX packets:248720 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:0 
          RX bytes:63182485 (60.2 MiB)  TX bytes:63182485 (60.2 MiB)

ppp0      Protokoll:Punkt-zu-Punkt Verbindung  
          inet Adresse:93.217.101.230  P-z-P:217.0.119.59  Maske:255.255.255.255
          UP PUNKTZUPUNKT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:52 errors:0 dropped:0 overruns:0 frame:0
          TX packets:48 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:3 
          RX bytes:11016 (10.7 KiB)  TX bytes:6711 (6.5 KiB)

tun0      Protokoll:UNSPEC  Hardware Adresse 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet Adresse:80.xxx.xxx.42  P-z-P:80.xxx.xxx.41  Maske:255.255.255.255
          UP PUNKTZUPUNKT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:42 errors:0 dropped:0 overruns:0 frame:0
          TX packets:38 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:100 
          RX bytes:7410 (7.2 KiB)  TX bytes:3590 (3.5 KiB)

Die ppp0-Verbindung wird übrigens über eth1 hergestellt. Ich habe auch noch ein paar andere Interfaces weggelassen, da diese nicht für das Problem wichtig sind.

Und hier noch zu Guter letzt mein iptables-Skript:
#!/bin/sh
#
# Programs
IPT="/sbin/iptables"  

# Interfaces
INTIF="eth0"  
EXTIF="ppp0"  
OVPNIF="tun0"  

# Networks
LAN="192.168.x.0/27"  

# IP Adresses
INTIP=`ifconfig $INTIF | grep inet | cut -d : -f 2 | cut -d \  -f 1`
EXTIP=`ifconfig $EXTIF | grep inet | cut -d : -f 2 | cut -d \  -f 1`
OVPNIP=`ifconfig $OVPNIF | grep inet | cut -d : -f 2 | cut -d \  -f 1`

# Share internet connection?
SHARE="yes"  

# Do you run a Web server? Caution: ports for Tomcat are opened, too!
WEB="yes"  
WEBPUBLIC="yes"  
SPOINT="yes"  

# Set default chain policy
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP

# Flush all chains
$IPT -F
$IPT -X
$IPT -t nat -F PREROUTING
$IPT -t nat -F POSTROUTING

# Add custom chains
$IPT -N inet-in
$IPT -N inet-out
$IPT -N lan-in
$IPT -N lan-out
$IPT -N ip_reject

# Set egress-filtering-rules:
$IPT -A INPUT -i $EXTIF -s 127.0.0.0/8 -j DROP
$IPT -A INPUT -i $OVPNIF -s 127.0.0.0/8 -j DROP
$IPT -t nat -A PREROUTING -i $EXTIF -s 127.0.0.0/8 -j DROP
$IPT -A FORWARD -s 127.0.0.0/8 -j DROP
$IPT -A OUTPUT -s 127.0.0.1/8 -o $EXTIF -j LOG
$IPT -A OUTPUT -s 127.0.0.1/8 -o $EXTIF -j DROP
$IPT -A OUTPUT -o $EXTIF -d $EXTIP -j DROP

# Set basic INPUT rules
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -i $EXTIF -j inet-in
$IPT -A INPUT -i $OVPNIF -j inet-in
$IPT -A ip_reject -j DROP
$IPT -A INPUT -i $INTIF -s $LAN -j lan-in
$IPT -A INPUT -m state --state NEW,INVALID -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Set FORWARD rules
if [ "$SHARE" = "yes" ]; then  
        modprobe ip_tables
        modprobe iptable_nat
        modprobe ip_conntrack_ftp
        $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
        $IPT -A FORWARD -i $INTIF -s $LAN -m state --state NEW -j ACCEPT
        $IPT -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
        $IPT -t nat -A POSTROUTING -o $EXTIF -s $LAN -j MASQUERADE
        $IPT -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP
        $IPT -t nat -A POSTROUTING -o $OVPNIF -s $LAN -j MASQUERADE
        $IPT -t nat -A POSTROUTING -o $OVPNIF -j SNAT --to $OVPNIP
fi

## Set basic OUTPUT rules
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A OUTPUT -o $EXTIF -j inet-out
$IPT -A OUTPUT -o $OVPNIF -j inet-out
$IPT -A OUTPUT -o $INTIF -d $LAN -j lan-out
$IPT -A OUTPUT -m state --state NEW,INVALID -j DROP
$IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

if [ "$WEB" = "yes" ]; then  
        $IPT -A lan-in -p tcp --dport 80 -j ACCEPT
        $IPT -A lan-out -p tcp --sport 80 -j ACCEPT
        if [ "$WEBPUBLIC" = "yes" ]; then  
       	$IPT -A inet-in -p tcp --dport 80 -j ACCEPT
	$IPT -A inet-out -p tcp --sport 80 -j ACCEPT
        fi
fi

if [ "$SPOINT" = "yes" ]; then  
	$IPT -A inet-in -p tcp --dport 443 -j ACCEPT
	$IPT -A inet-out -p tcp --sport 443 -j ACCEPT
	$IPT -A FORWARD -i $OVPNIF -p tcp --dport 443 -j ACCEPT
	$IPT -t nat -A PREROUTING -p tcp -i $OVPNIF --dport 443 -j DNAT --to-destination 192.168.a.b:443
fi

Ich sehe einfach meinen Fehler nicht, oder ist evtl. etwas an den routen falsch?!

Ins Internet komme ich mit dieser Konfiguration sowohl vom Debian Server als auch aus dem 192.168.x.y-er Netz problemlos. Ich kann mich z. B. auch per SSH mit meinem Server von außerhalb verbinden (den Teil des iptables-Skriptes habe ich weggelassen).
Das Einzige, was nicht funktioniert, ist die Weiterleitung auf interne Server.


Bitte, bitte, heflt mir!!

Drizzt

Content-Key: 141599

Url: https://administrator.de/contentid/141599

Printed on: April 24, 2024 at 23:04 o'clock

Member: dog
dog Apr 27, 2010 at 21:45:46 (UTC)
Goto Top
Für meinen alten DSL-Zugang hatte ich eine feste IP-Adresse (T-DSL Business). Das war mir auf Dauer jedoch zu teuer, daher habe ich mir vor kurzem einen neuen DSL-Zugang schalten lassen. Außerdem habe ich ein vTunnel-Abo (openvpn), um wieder eine feste IP-Adresse nutzen zu können.

Und warum nimmst du nicht einfach einen Anbieter mit fester IP - z.B. manitu?
Member: aqui
aqui Apr 28, 2010, updated at Oct 18, 2012 at 16:41:55 (UTC)
Goto Top
Ohne die openvpn Konfig ist sowieso eine Antwort schwer.... Ggf. hilft dir noch das hier:
OpenVPN Server installieren auf pfSense Firewall, Mikrotik. DD-WRT oder GL.inet Router
Das kommt auch mit DynDNS IPs klar und braucht durch die Push Anweisung bei OpenVPN keinerlei Forwardings !!
Member: Drizzt
Drizzt Apr 28, 2010 at 17:42:59 (UTC)
Goto Top
Hallo und danke für die schnellen Antwort.

@dog:

Manitu stellt feste IP-Adressen für ADSL und SDSL-Anschlüsse zur Verfügung, aber nicht für VDSL! Außerdem kostet Manitu 5 EUR pro Monat mehr.
Ist für mich also keine Lösung. Trotzdem Danke!

@aqui:
Die Anleitung habe ich überflogen, allerdings setze ich weder die in der Anleitung verwendete Firewall ein noch habe ich selbst einen OpenVPN-Server. Mein Debian-Server ist der Client. Der OpenVPN-Server läuft auf einem vTunnel-Server.
Ich werde aber nochmal bei deren Support anfragen; vielleicht hilft's ja.

Grüße
Drizzt
Member: aqui
aqui Apr 29, 2010 at 10:49:27 (UTC)
Goto Top
Es ging auch nicht um die HW sondern rein um die Konfig, denn die ist überall bei allen OpenVPN Installationen identisch. Deshalb sollte der Support eigentlich dein problem sofort lösen können...ist ja nur ein Push Kommando in der Konfig !
Member: Drizzt
Drizzt Apr 30, 2010 at 11:37:51 (UTC)
Goto Top
Hallo nochmal,

nein, der Support konnte mein Problem bisher nicht lösen.
Ich vermute nach wie vor, dass es ein Problem mit der Firewall / den Routen gibt, dass ich nicht sehe.

Wie gesagt, die Verbindung über den Tunnel kommt einwandfrei zu stande; es wird halt nur der Traffic in mein privates Netz / aus dem Netz nicht "durchgelassen".

Sieht vielleicht jemand einen Fehler in der Konfiguration?

Grüße
Drizzt
Member: aqui
aqui May 03, 2010 at 10:54:47 (UTC)
Goto Top
Wenn dem so ist dann ist es in der Tat eine reine Firewall Konfig Sache. Ggf. hast du eine Zahlendrehe in den IP Adressen drin ??
Erlaube doch erstmal schlciht alles was vom OpenVPN Client IP Netz in dein lokales Netz will.
Welche lokale OpenVPN Client IP du hast kannst du sehen wenn du bei aktiviertem OpenVPN Client einmal ipconfig eingibst !!
Diesem IP Netz musst du Zugriff auf dein lokales IP Netz in den IP Tables erlauben !!
Member: Drizzt
Drizzt May 03, 2010 at 15:50:43 (UTC)
Goto Top
Hallo aqui,

ja, ich bin mittlerweile auch der Auffassung, dass das Problem mit den Firewall-Regeln zu tun hat, aber ein Zahlendreher kann es nicht sein, da ich die Freischaltung der IP-Adressen / das Routing über Variablen mache (siehe iptables-skript in meinem ersten Post). Die OpenVPN-IP wird in der Variablen OVPNIP gespeichert, aber ich sehe einfach den Fehler im Skript nicht...

So ein Dreck. Ich versuch's jetzt mal mit tcpdump. Mal sehen. Ob das was bringt.

Trotzdem vielen Dank für Eure Unterstützung!

Grüße
Drizzt