Posts Tagged ‘OpenVPN’

Sonntag, 19. März 2017

OpenVPN mit iPhone, iPad und MacBook Air — aber nicht mit Travel Router TP-LINK TL-MR3020

Auf Grund der bald bevorstehenden Reise in die USA habe ich mir heute Zeit genommen, einen VPN-Server einzurichten, mit welchem ich mich unterwegs in den USA mit iPhone, iPad und MacBook Air verbinden kann.

Obwohl heutzutage die meisten Web-Sites mit HTTPS kommunizieren, stelle ich damit sicher, dass allfällige unverschlüsselte Kommunikation im Hotel-WiFi nicht abgehört werden kann. Als netten Nebeneffekt gaukle ich meinen Geräten weiter vor, dass sie sich in der Schweiz befinden und umgehe so allfällige Geoblocks. Da wir seit einem Jahr eine Glasfaster-Internet-Anbindung mit 1 GBit/s symmetrischem Datenverkehr verfügen, sollte die Performance höchstens noch von der hohen Latenz getrübt werden.

Ich hatte bisher bereits eine Lösung im Einsatz (im Grunde zwei, PPTP sowie OpenVPN mit einem Shared Key), doch nun war es an der Zeit, das Gefrickel aufzuräumen und eine zukunftstaugliche, performante und sichere Lösung zu bauen, welche (fast) nativ mit macOS und iOS funktioniert — konkret mit Tunnelblick unter macOS sowie mit OpenVPN.app unter iOS.

Die beiden Applikationen kann man mittels .ovpn-Textdateien als VPN-Clients konfigurieren.

Ich bin im Grossen und Ganzen der Anleitung „How To Set Up an OpenVPN Server on Ubuntu 16.04“ von DigitalOcean gefolgt, habe die Konfiguration dabei aber meiner Heimnetzwerk-Architektur angepasst und mittels Bash-Scripts automatisiert. Denn irgendeinmal muss ich den OpenVPN-Server aktualisieren und bin mit dem DevOps-Ansatz sicher, mittels Knopfdruck wieder eine funktionierende Lösung bereit zu haben.

Die Anleitung zeigt einen netten Weg auf, wie man sich die .ovpn-Dateien vollautomatisierte mittels eines bash-Scripts erstellt.

Ich verwende nun für alle meine Geräte ein eigenständiges Zertifikat, damit ich diese im Notfall einzeln revozieren kann.

Die Konfiguration funktioniert tadellos — einzig bei Tunnelblick (d.h. unter macOS) musste ich die Passagen

...
user nobody
group nogroup
...

wieder auskommentieren, da es sonst zu komischen Fehlermeldungen im OpenVPN-Log des Clients kam. Ausserdem muss man im GUI anklicken, dass der gesamte IPv4-Verkehr durch das VPN geroutet wird:

image-7219

Wehrmutstropfen: Eigentlich war der Aufbau eines VPN-Tunnels pro Device nur als Plan B gedacht. Denn bei Reisen verwende ich einen TP-LINK TL-MR3020 „Reiserouter“ (klitzekleiner Wireless Access Point, der sich mit USB-Stromversorgung betreiben lässt), um diesen mit Hotel-WiFis zu verbinden und die SSID mit den Zugangsdaten meines Heimnetzwerkes anzubieten. So spare ich es mir, dass das Hotel-WiFi auf all meinen Geräten konfiguriert werden muss.

Auf dem Router habe ich mir das quelloffene OpenWrt (Version Attitude Adjustment) installiert und mittlerweile so konfiguriert, damit es mit allen möglichen WLAN-Netzwerken von Unterkünften funktioniert (einige Hersteller von Gästeportalen frickeln massiv mit dem Netzwerk herum, um Clients auf die Landing Pages zu bringen).

Plan A war es nun eigentlich, OpenVPN auf dem Router selbst zu installieren und jedes Mal automatisch eine Verbindung mit meinem OpenVPN-Server in der Schweiz herzustellen, sobald der Router eine Internet-Verbindung herstellen kann. So hätte ich nicht pro Endgerät einzeln eine VPN-Verbindung aufbauen müssen und die Verschlüsselung wäre ohne weitere Interaktion standardmässig aktiviert gewesen.

Eine Anleitung zur Installation von OpenVPN als VPN-Client auf einem TP-LINK TL-MR3020 findet sich dazu im Netz (plus eine generische Anleitung für OpenWRT), doch leider habe ich erst während der Installation bemerkt, dass der Router nicht genügend Speicherplatz mit sich bringt, um die Pakete openvpn, openssl und andere Libraries zu installieren:

image-7220

Da opkg nicht komplett durchgelaufen ist, musste ich die über das Router-Filesystem verstreute Überreste der Pakete eigenhändig entfernen (indem ich die .ipks vom offiziellen Repository händisch herunterlud, mit gzip entpackte und die resultierenden Dateien dann erneut mit tar und gzip entpackte):

.
./kmod-tun_3.3.8-1_ar71xx
./kmod-tun_3.3.8-1_ar71xx/etc
./kmod-tun_3.3.8-1_ar71xx/etc/modules.d
./kmod-tun_3.3.8-1_ar71xx/etc/modules.d/30-tun
./kmod-tun_3.3.8-1_ar71xx/lib
./kmod-tun_3.3.8-1_ar71xx/lib/modules
./kmod-tun_3.3.8-1_ar71xx/lib/modules/3.3.8
./kmod-tun_3.3.8-1_ar71xx/lib/modules/3.3.8/tun.ko
./kmod-tun_3.3.8-1_ar71xx/postinst
./liblzo_2.06-1_ar71xx
./liblzo_2.06-1_ar71xx/usr
./liblzo_2.06-1_ar71xx/usr/lib
./liblzo_2.06-1_ar71xx/usr/lib/liblzo2.so
./liblzo_2.06-1_ar71xx/usr/lib/liblzo2.so.2
./liblzo_2.06-1_ar71xx/usr/lib/liblzo2.so.2.0.0
./libopenssl_1.0.1h-1_ar71xx
./libopenssl_1.0.1h-1_ar71xx/usr
./libopenssl_1.0.1h-1_ar71xx/usr/lib
./libopenssl_1.0.1h-1_ar71xx/usr/lib/libcrypto.so.1.0.0
./libopenssl_1.0.1h-1_ar71xx/usr/lib/libssl.so.1.0.0
./openvpn_2.2.2-2_ar71xx
./openvpn_2.2.2-2_ar71xx/conffiles
./openvpn_2.2.2-2_ar71xx/etc
./openvpn_2.2.2-2_ar71xx/etc/config
./openvpn_2.2.2-2_ar71xx/etc/config/openvpn
./openvpn_2.2.2-2_ar71xx/etc/init.d
./openvpn_2.2.2-2_ar71xx/etc/init.d/openvpn
./openvpn_2.2.2-2_ar71xx/etc/openvpn
./openvpn_2.2.2-2_ar71xx/lib
./openvpn_2.2.2-2_ar71xx/lib/upgrade
./openvpn_2.2.2-2_ar71xx/lib/upgrade/keep.d
./openvpn_2.2.2-2_ar71xx/lib/upgrade/keep.d/openvpn
./openvpn_2.2.2-2_ar71xx/usr
./openvpn_2.2.2-2_ar71xx/usr/sbin
./openvpn_2.2.2-2_ar71xx/usr/sbin/openvpn
./zlib_1.2.7-1_ar71xx
./zlib_1.2.7-1_ar71xx/usr
./zlib_1.2.7-1_ar71xx/usr/lib
./zlib_1.2.7-1_ar71xx/usr/lib/libz.so
./zlib_1.2.7-1_ar71xx/usr/lib/libz.so.1
./zlib_1.2.7-1_ar71xx/usr/lib/libz.so.1.2.7

So konnte ich die Überreste schlussendlich entfernen (der Router bootete nach der Bereinigungsaktion tatsächlich noch) und der Router hat nun wieder 800 KB Speicher frei … wie zu DOS-Zeiten!

Tags: , , , , , , , , , ,
Labels: IT

1 Kommentar | neuen Kommentar verfassen

Freitag, 21. Oktober 2016

Wenn eine Linux-Anwendung trotz logrotate in das rotierte Log-File schreibt

Am letzten Wochenende habe ich meine Site-to-Site OpenVPN-Infrastruktur auf Vordermann gebracht (Github-Repo folgt). Da ich aus Debugging-Gründen anfänglich sehr, sehr viel geloggt habe (verb 5 in der lokalen OpenVPN .conf-Datei) sind die Log-Dateien innert eines Tages auf satte 110 MB angewachsen. Mittlerweile — da alles sauber läuft — verwende ich verb 3 und die Log-Files sind nur noch einige Kilobytes gross.

Dennoch habe ich mich entschieden, logrotate so zu konfigurieren, dass die Log-Dateien täglich rotiert werden. Leider musste ich nach der ersten Durchführung aber realisieren, dass OpenVPN munter weiter in /var/log/openvpn/append.log.1 weiterschreibt, obwohl nun /var/log/openvpn/append.log angesagt wäre. Mit meinem Linux-Halbwissen gehe ich davon aus, dass der Filepointer des OpenVPN-Daemons auf dieselbe Datei zeigt, auch wenn sich deren Namen ändert.

Glücklicherweise kennen die Entwickler von logrotate dieses Problem und bieten dafür eine handliche Option namens copytruncate an:

/var/log/openvpn/*.log {
	daily
	missingok
	rotate 366
	compress
	delaycompress
	copytruncate
	create 600 root root
}

Quelle: openvpn logrotate

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 2. November 2014

SNMP-Proxy einrichten

Seit Jahren zeichne ich minütlich Vitalwerte meiner IT-Infrastruktur auf. Dafür verwende ich das quelloffene cacti, dessen Entwicklung zwar seit mehr als einem Jahr stillsteht, meine Bedürfnisse aber immer noch abdeckt. An der Code-Qualität hege ich meine Zweifel, habe mich bisher aber damit arrangiert, insbesondere weil aus meiner Sicht derzeit keine Alternative zur Verfügung steht. Item!

Seit einigen Monaten habe ich das Netzwerk hier in unserer gemeinsamen Wohnung in Bern mittels OpenVPN mit dem Netzwerk im Elternhaus verbunden. Zum Einsatz kommen zwei Router, welche mit DD-WRT geflasht sind (die Konfiguration von OpenVPN auf diesen Kisten ist eine weitere Pendenz in der Liste der geplanten Blog-Artikel).

Der Linux-Server, auf welchem cacti installiert ist und der Poller läuft, befindet sich im Elternhaus. Meine OpenVPN-Konfiguration hat es nun an sich, dass ich den Router in meiner Wohnung nicht per SNMP abfragen kann, weil dessen interne IP aus dem entfernten Netzwerk nicht ansprechbar ist.

Vor einer Woche hatte ich deshalb die zündende Idee, mich auf die Suche nach einem SNMP-Proxy zu machen, welchen ich auf einem Client im LAN unserer Wohnung aufsetze und mittels cacti via SNMP darüber die SNMP-Werte des Routers abfragen kann. Die Wahl fiel auf meinen Mac mini, auf dem SNMP bereits aktiviert ist und bereits von cacti abgefragt wird.

Nach einigen Recherchen mit Google war rasch klar, dass net-snmp die Funktionalität mit sich bringt, einzelne OIDs oder einen ganzen OID-Baum von einem SNMP-fähigen Drittsystem einzubinden und so als Proxy zu wirken.

Die Anleitungen, die man im Netz findet, sind leider etwas holprig, weshalb ich hier für die Nachwelt festhalten möchte, wie ich das Setup schlussendlich zum Laufen gekriegt habe — im Grunde ist es äusserst simpel:

/etc/snmp/snmpd.conf

(Auf dem Rechner, welcher im selben Subnetz wie der abzufragende Router steht)

...
# Proxy to let remote cacti retrieve local router SNMP information

# Define a simple view 'systemview', which includes everthing under .1.3.6.1
view    systemview     included      .1.3

# Map 'public' community to the 'notConfigUser'
com2sec notConfigUser  default       public

# Map 'notConfigUser' to 'notConfigGroup'
group   notConfigGroup v1            notConfigUser
group   notConfigGroup v2c           notConfigUser

# Give 'notConfigGroup' read access to objects in the view 'systemview'
access  notConfigGroup ""            any       noauth    exact  systemview none none

# v1/v2c community string for each proxied host
com2sec -Cn my_router_int notConfigUser  default       my_router

# Allow the 'notConfigUser' (a member of 'notConfigGroup') access for these contexts
access  notConfigGroup my_router_int        any     noauth  prefix  systemview none none

# Proxy configuration
proxy -Cn my_router_int -v 1 -c public 192.168.168.168 .1.3

Via: [HOWTO] Graph multiple servers using an SNMP proxy

Diese Konfiguration kann problemlos in die eigene Konfiguration eingepflegt werden, anzupassen sind einzig die IP des Routers (hier: 192.168.168.168), der über den Proxy abgefragt werden können soll, sowie dessen Community-Namen (hier fahrlässigerweise public).

Aus ästhetischen und verständlichen Gründen anzupassen sind zudem die Bezeichnungen my_router_int sowie my_router. my_router ist der Community-Name, mit welchem die SNMP-Daten des Drittsystems abgefragt werden können. my_router_int wiederum scheint eine Rolle bei der internen Zugriffsverwaltung zu spielen.

Unter Mac OS X verwende ich das von mir auf Github geteilten Restart-Script, um den SNMP-Server neu zu starten.

Test

Mittels des Tools snmpwalk prüfen wir in einer Shell direkt auf dem Proxy, ob net-snmp den OID-Baum tatsächlich einbindet:

$ snmpwalk -v 1 -c my_router localhost
SNMPv2-MIB::sysDescr.0 = STRING: Linux DD-WRT 3.X.X #110 Sun Mar 24 15:46:47 CET 2013 mips
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (12623972) 1 day, 11:03:59.72
SNMPv2-MIB::sysContact.0 = STRING: user@domain.tld
...

Klappt!

cacti

Schlussendlich muss das neue Gerät noch in cacti erfasst werden. Das stellt den erfahrenen cacti-Benutzer vor keine Probleme, einzig muss darauf geachtet werden, dass man nicht die IP des Routers, sondern diejenige des Proxys und der in snmpd.conf definierte Community-String (im obigen Beispiel -c my_router, also my_router) angibt. Belässt man den Community-Wert auf public frägt man stattdessen die Werte des Proxys selber ab — und nicht diejenigen des zu überwachenden Routers.

Weiterführende Links

Ein ETH-Mitarbeiter hat aufgeschrieben, wie man so etwas via SSH-Tunnel hinkriegt, wenn man keinen VPN-Tunnel hat.

Tags: , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen