Tipps & Tricks: OpenVPN mit OpenWrt, inkl. Start/Stop Script und Firewallregeln

b0wtie

Junior Member
Dieser Thread ist dazu gedacht, eine möglichst ausführliche OpenVPN-Anleitung für OpenWrt Router zu bieten. Außerdem versuche ich auf einige Vorteile einzugehen, die durch das Zusammenspiel von OpenVPN und OpenWrt entstehen. Diese beziehen sich hauptsächlich auf die Firewall.

Einiges vorweg
  • Ich habe diese Anleitung in ähnlicher Form damals schon in dem Forum eines anderen VPN Dienstleisters geschrieben, dessen Nähe zu einem bestimmten Forum mir aber zu Denken gab. Nun bin ich hier und möchte euch trotzdem nicht vorenthalten, was ich in den letzten beiden Jahren so über OpenVPN gelernt habe (und das ist ganz sicher nur ein Bruchteil des Möglichen).
  • Man wird NIEMALS die volle Geschwindigkeit erreichen (geht von ca. 2 MB/s aus), wenn man das VPN mit openVPN von einem Router laufen lässt. Die kleine CPU muss alle Datenpakete ver- und entschlüsseln. Mehr schafft sie fast nie. Die Routerlösung hat andere Vorteile: Sie hat eine perfekt konfigurierbare Firewall und schützt auch Geräte, die nicht selbst ein VPN aufbauen können (wie NAS Systeme oder Reciever). Ich teste gerade, wie gut sich hardwarebeschleunigtes VPN von einer Firewall wie bspw. der ZyWall aufbauen lässt. Bis dahin muss man mit der Geschwindigkeit leben.

Los geht’s! Die Grundinstallation
  • Ich gehe davon aus, dass ihr OpenWrt auf euren Router geflasht und einen SSH Zugang habt. Wer bis hierhin nicht gekommen ist, möge bitte das OpenWrt Wiki konsultieren.
  • Installiert euch nun einige Pakete mit folgenden Befehlen
    Code:
    opkg update
    opkg install luci
    opkg install luci-i18n-german
    opkg install openvpn-openssl
  • Startet nun die Weboberfläche (die übrigens nicht unbedingt benötigt wird) mit dem Befehl
    Code:
    /etc/init.d/uhttpd start
    /etc/init.d/uhttpd enable
  • Nun fügen wir noch ein virtuelles Netzwerkgerät hinzu.
    Code:
    cat >> /etc/config/network << EOF
    config interface ’PPinterface’
        option proto 'none'
        option ifname 'tun314'
    EOF
    Die Bezeichnung „tun314“ kann frei gewählt werden. Ihr könnt es auch „tun666“ nennen :) Allerdings muss man das später in den *.ovpn Konfigurationen anpassen.

Die Firewall.
Wir fügen in die Firewall Config an einer bestimmten Stelle das Interface „PPinterface“ zur Zone „wan“ hinzu. Öffnet dazu die Datei /etc/config/firewall:
Code:
vi /etc/config/firewall
Damit öffnet ihr die Datei in einem Editor. Drückt die Taste „i“ (am unteren Bildschirmrand erscheint „INSERT“. Navigiert zu dieser Stelle:

Code:
##ACHTUNG DAS IST KEIN BEFEHL ZUM KOPIEREN/EINFÜGEN###
config zone
    option name 'wan'
    option input 'REJECT'
    option output 'ACCEPT'
    option forward 'REJECT'
    option masq '1'
    option mtu_fix '1'
    option network 'wan wan6 PPinterface'

In der letzten Zeile muss das PPinterface eingefügt werden. Drückt jetzt „ESC“ und tippt danach „:wq“. Bestätigt das mit Enter —> fertig.

Ich hatte ständig DNS-Leaks bis mir auffiel, dass das durch die IPv6 Adressen passierte! Da ich es nicht brauche, habe ich es systemweit deaktiviert: Unter "Netzwerk" - "Schnittstellen" - "LAN" gibt es unten die Einstellungen zum "DHCP-Server". Dort habe ich bei "IPv6 Settings" alles deaktiviert.

Zuletzt noch ein Problem, das ich nicht lösen konnte. Ich habe erfolglos versucht, das OpenVPN sauber in OpenWrts Konfigurationsökosystem zu integrieren. Dazu habe ich mir eine *.ovpn geschnappt und deren Werte in /etc/config/openvpn eingefügt. Das ging auch zumindest soweit, bis der Tunnel erfolgreich aufgebaut wurde. Alles war OK, aber die Verbindung war EXTREM langsam. Vielleicht findet sich hier ein Profi der mir dabei helfen kann.


=================================================================
Script zum Steuern des VPNs.
=================================================================

Dieses Script wird dazu verwendet, das VPN aufzubauen oder abzuschalten oder um unterschiedliche Serverstandorte zu wählen.

Script Installation:
Code:
cat >> /root/PP_openvpn.sh << EOF
ARG=$1
HelpMe() {                                         
echo "Start me with the name of the desired Country.                 
This name has to match the exact *.ovpn file in the config directory."
exit
}


defaultValues() {
#Das ist die Standardconfig
ARG="Bucharest" 
restartOpenvpn
}


restartOpenvpn() {                                                                                                                                 
kill `cat /var/run/openvpn_PP.pid`                                                                                                                
/usr/sbin/openvpn --status /var/run/openvpn_PP.status --writepid /var/run/openvpn_PP.pid --cd /etc/openvpn --config /etc/openvpn/$ARG.ovpn --daemon
}

killVPN() {
kill `cat /var/run/openvpn_PP.pid`
rm /var/run/openvpn_PP.pid
echo "sent kill signal"
}
##############################


case "$ARG" in
'')
defaultValues
;;
stop)
killVPN
;;
*)
restartOpenvpn
;;
help)
HelpMe
;;
esac
EOF

chmod a+x /root/PP_openvpn.sh

Damit könnt ihr das VPN starten.
Das Script hört auf Argumente. Startet ihr es mit sh PP_openvpn.sh Amsterdam wird es ein VPN dorthin aufbauen, vorausgesetzt die Konfigurationsdatei von Amsterdam liegt in /etc/openvpn/Amsterdam.ovpn mit ihren Zertifikaten bereit (siehe unten).
Der Wert der als Standard genutzt werden soll ist in der Funktion „defaultValues“ auf Bucharest gesetzt. Das könnt ihr natürlich ändern.

Ihr benötigt nur noch die Konfigurationsdateien. Die bekommt ihr im Mitgliederbereich unter „Download“ - „Linux“ - „OpenVPN Konfigurationsdateien“. Ladet euch die „linux_udp.zip“ Datei herunter und entpackt sie auf euren PC.
Jetzt müssen wir leider einige Änderungen an den gewünschten Konfigurationen vornehmen und sie dann auf den Router schieben. Ihr könnt die Dateien entweder unter eurem Betriebsystem oder direkt auf dem Router ändern. Wenn ihr wenig Erfahrung mit textbasierten Editoren in der Konsole habt ist ersteres vielleicht die bessere Wahl, andererseits machen Note- und Wordpad gerne mal Probleme mit dem Zeichensatz. Benutzt also lieber einen guten Texteditor wie Notepad2 oder Notepad++. Folgende Änderungen sind notwendig:

  • 1.) fügt hinter auto-user-pass noch „ /etc/openvpn/password“ ein (ein Leerzeichen zwischen pass und /etc)
  • 2.) WICHTIG: Ändert „dev tun“ in „dev tun314“ (oder was auch immer ihr oben gewählt habt)
  • 3.) löscht die beiden letzten Zeilen (sie beginnen mit „up“ und „down“

Kopiert jetzt alle regionsbezogenen Dateien auf den Router. Mac- und Linuxnutzer können das mit
Code:
scp Amsterdam.* root@openwrt:/etc/openvpn/
direkt aus der Konsole tun. Windowsnutzer laden sich „WinSCP“ runter. Die Dateien kommen nach /etc/openvpn/.

Nur noch eins: Benutzer und Passwort müssen in die Datei „/etc/openvpn/password“.
Code:
cat >> /root/PP_openvpn.sh << EOF
NUTZERNAME
PASSWORT
EOF

gebt nun diesen Befehl ein und schaut euch im log an, ob alles geht:
Code:
sh PP_openvpn.sh && logread -f

Wenn ihr aus dem LogRead Modus raus wollt, drückt Strg+C.

=================================================================
Erweiterte Firewall Regeln
=================================================================


Firewall-Regeln sind DER Vorteil von OpenWrt! Hier ist fast alles möglich. Mit diesen Regeln kann man einen PC oder ein Gerät entweder am VPN vorbeilenken, so dass es immer ungeschützt parallel zum VPN betrieben wird, während alle anderen Geräte mit dem Router ins VPN wechseln, oder man kann ein Gerät im VPN einsperren, so dass es bei ausgeschaltetem VPN keine Internetverbindung aufbauen kann.

I.) Vorkehrungen
Wahrscheinlich ist euer OpenWrt Router hinter einem Hauptrouter angeklemmt, der die Internetverbindung aufbaut. Ihr benötigt dessen IP-Adresse (die des Hauptrouters). Bei einer Fritzbox lautet diese vermutlich 192.168.178.1.
Findet die MAC-Adresse des gewünschten Geräts heraus. Das geht in OpenWrts Konfiguration unter "System - DHCP und DNS".

II.) Vor der Konfiguration noch eine WICHTIGE VORAUSSETZUNG:
Code:
opkg update
opkg install ip
Ohne das Paket könnt ihr keine manuellen Routen setzen und die Ausnahme / Exklusivregeln können nicht aktiviert werden.

1.) Gerät am VPN vorbei.
Wird ein Gerät ausgenommen surft es immer ohne VPN und dafür mit voller Geschwindigkeit. Bei mir für große Downloads interessant.

Geht zu "Netzwerk - Firewall - Benutzerdefinierte Regeln" und fügt den folgenden Inhalt ein. Achtet dabei darauf, die IP Adresse eures Hauptrouters / Modems anzupassen, ebenso wie die MAC Adresse des Rechners, den ihr umleiten wollt.

Code:
### Routen und Flushing
echo "## flushing..."
ip rule delete fwmark 0x55
ip route flush table 7
ip route flush cache

echo "## route into table 7..."
# ACHTUNG!!! #############  Adresse des Hauptrouters in den nächsten Zeilen ändern. Hier 192.168.111.1
ip route add default via 192.168.111.1 dev eth0 table 7
echo "## rule... for table 7"
ip rule add fwmark 0x55 priority 1000 table 7
ip route flush cache
echo "## iptables"


### Ausnahmen vom VPN
# MAC ADRESSE ERSETZEN
iptables -t mangle -A PREROUTING -m mac --mac-source 00:10:92:4F:dd:8D -j MARK --set-mark 0x55

2.) Gerät im VPN einsperren.
Das ganze funktioniert aber auch andersherum: Fahrt ihr das VPN im Router herunter, oder der Router startet es nach der Zwangstrennung nicht korrekt) hat das Gerät einfach kein Internet. So kann es NUR NOCH durch das VPN nach draußen.
Dazu nehmt den gleichen Code wie oben, aber die letzte Zeile muss dafür lauten:

Code:
### only VPN
#MAC ADRESSE ERSETZEN
iptables -I FORWARD -m mac --mac-source 00:10:92:4F:dd:8D -o eth0 -j DROP

Weitere Ergänzungen sind denkbar. Ihr könnt einzelne Webseiten ins VPN oder daran vorbeileiten, oder zusätzlich einen VPN Server betreiben, um von unterwegs auf das heimische NAS oder den Festplattenreceiver zugreifen zu können. Aber das würde doch hier den Rahmen sprengen.

Viel Erfolg!
 
Hallo,
eine gute Anleitung hast du da geschrieben. Ich habe, wie du, ebenfalls das Problem einer langsamen Internet-Leitung bei Nutzung eines PP-VPN-Servers. Ich habe die ovpn Konfigurationsdateien ebenfalls über ssh in die OpenVPN Ordner gelegt. Verbindung klappt, aber ist sehr langsam. Hat dazu schon jemand eine Lösung gefunden?
 
Back
Top