Posts Tagged ‘OpenVPN’

Sonntag, 19. September 2021

Von Stretch nach Bullseye mit gravierenden Problemen

Gestern lüpfte ich einen zweiten OpenVPN-Server von Debian Stretch auf Bullseye.

Das erfolgte leider nicht kurz- und schmerzlos. Ich kämpfte mit und debuggte während 16 Stunden (abzüglich 7 Stunden Schlaf) an folgenden Problemen:

Konsolen-, SSH- und Telnet-Logins dauern 1min30sec

D.h. nach Eingabe des Passwortes scheint das System zu hängen. Wer sich in Geduld übt, landet nach eineinhalb Minuten in der gewohnten Shell.

Bei mir bildeten sich in diesen ersten 90 Sekunden bereits viele Schweissperlen, denn wie flickt man ein Debian GNU/Linux, wenn man sich nicht mehr einloggen kann? Mittels grub in den Single User/Recovery Mode zu booten wäre ein noch grösserer Alptraum geworden …

Meldungen in syslog:

...
Sep 18 22:40:43 OPENVPN2 systemd[1]: Starting User Manager for UID 1000...
Sep 18 22:42:13 OPENVPN2 systemd[1]: user@1000.service: Main process exited, code=exited, status=1/FAILURE
Sep 18 22:42:13 OPENVPN2 systemd[1]: user@1000.service: Killing process 89451 (gpgconf) with signal SIGKILL.
Sep 18 22:42:13 OPENVPN2 systemd[1]: user@1000.service: Killing process 89452 (awk) with signal SIGKILL.
Sep 18 22:42:13 OPENVPN2 systemd[1]: user@1000.service: Killing process 89457 (dirmngr) with signal SIGKILL.
Sep 18 22:42:13 OPENVPN2 systemd[1]: user@1000.service: Killing process 89452 (awk) with signal SIGKILL.
Sep 18 22:42:13 OPENVPN2 systemd[1]: user@1000.service: Killing process 89457 (dirmngr) with signal SIGKILL.
Sep 18 22:42:13 OPENVPN2 systemd[1]: user@1000.service: Failed with result 'exit-code'.
Sep 18 22:42:13 OPENVPN2 systemd[1]: user@1000.service: Unit process 89452 (awk) remains running after unit stopped.
Sep 18 22:42:13 OPENVPN2 systemd[1]: user@1000.service: Unit process 89457 (dirmngr) remains running after unit stopped.
Sep 18 22:42:13 OPENVPN17 systemd[1]: Failed to start User Manager for UID 1000.
...

Die Lösung:

# apt-get remove gpgconf
...
The following packages will be REMOVED:
  dirmngr duplicity gnupg gnupg-agent gnupg2 gpg gpg-agent gpg-wks-client gpg-wks-server gpgconf gpgsm libgmime-2.6-0 libgpgme11
  libnotmuch4 mutt python3-gpg samba-dsdb-modules scdaemon

Die vielen zu deinstallierenden Pakete liessen mich kurz zweifeln, aber das System lief nach deren Deinstallation problemlos weiter.

Quelle: WireGuard Bounce Server Setup

Wobei, wenn ich die Kommentare so lese: Eventuell war gpgconf gar nicht das Problem, sondern der Nameserver, der nicht reagierte (siehe unten).

Netzwerkprobleme

Probleme mit named und localhost

BIND 9 ist zwar an localhost (127.0.0.1) gebunden und lauscht auf dem Interface …

# lsof -i :53
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
named   653 bind   23u  IPv4  15673      0t0  UDP localhost:domain 
named   653 bind   24u  IPv4  15679      0t0  UDP localhost:domain 
named   653 bind   25u  IPv4  15680      0t0  TCP localhost:domain (LISTEN)
named   653 bind   27u  IPv4  15681      0t0  TCP localhost:domain (LISTEN)
named   653 bind   29u  IPv4  15682      0t0  UDP 10.1.2.3:domain 
named   653 bind   30u  IPv4  15683      0t0  UDP 10.1.2.3:domain 
named   653 bind   31u  IPv4  15684      0t0  TCP 10.1.2.3:domain (LISTEN)
named   653 bind   32u  IPv4  15685      0t0  TCP 10.1.2.3:domain (LISTEN)

… aber die Namensauflösung funktioniert nicht. Wenn man mit telnet 127.0.0.1 53 eine Session aufbauen will, hängt die Verbindung.

Mittels strace analysierte ich dann was im Hintergrund genau vor sich ging, und verglich die Ausgabe mit einem strace auf einem Server, bei dem die Namensauflösung funktionierte:

Defekter Server:

# strace ping -c 1 emeidi.com
...
socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 5
setsockopt(5, SOL_IP, IP_RECVERR, [1], 4) = 0
connect(5, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
clock_gettime(CLOCK_REALTIME, {tv_sec=1631995746, tv_nsec=794103764}) = 0
poll([{fd=5, events=POLLOUT}], 1, 0)    = 1 ([{fd=5, revents=POLLOUT}])
sendto(5, "{\311\1\0\0\1\0\0\0\0\0\0\6emeidi\3com\0\0\1\0\1", 28, MSG_NOSIGNAL, NULL, 0) = 28
poll([{fd=5, events=POLLIN}], 1, 1000)  = 0 (Timeout)
clock_gettime(CLOCK_REALTIME, {tv_sec=1631995747, tv_nsec=795739261}) = 0
poll([{fd=5, events=POLLOUT}], 1, 0)    = 1 ([{fd=5, revents=POLLOUT}])
sendto(5, "{\311\1\0\0\1\0\0\0\0\0\0\6emeidi\3com\0\0\1\0\1", 28, MSG_NOSIGNAL, NULL, 0) = 28
poll([{fd=5, events=POLLIN}], 1, 1000)  = 0 (Timeout)
close(5)                                = 0
...

Funktionierender Server:

# strace ping -c 1 emeidi.com
...
socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 5
setsockopt(5, SOL_IP, IP_RECVERR, [1], 4) = 0
connect(5, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=5, events=POLLOUT}], 1, 0)    = 1 ([{fd=5, revents=POLLOUT}])
sendto(5, "UK\1\0\0\1\0\0\0\0\0\0\6emeidi\3com\0\0\1\0\1", 28, MSG_NOSIGNAL, NULL, 0) = 28
poll([{fd=5, events=POLLIN}], 1, 1000)  = 1 ([{fd=5, revents=POLLIN}])
ioctl(5, FIONREAD, [463])               = 0
recvfrom(5, "UK\201\200\0\1\0\1\0\r\0\r\6emeidi\3com\0\0\1\0\1\300\f\0\1"..., 2048, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [28->16]) = 463
poll([{fd=5, events=POLLOUT}], 1, 999)  = 1 ([{fd=5, revents=POLLOUT}])
sendto(5, "W}\1\0\0\1\0\0\0\0\0\0\6emeidi\3com\0\0\34\0\1", 28, MSG_NOSIGNAL, NULL, 0) = 28
poll([{fd=5, events=POLLIN}], 1, 998)   = 1 ([{fd=5, revents=POLLIN}])
ioctl(5, FIONREAD, [278])               = 0
recvfrom(5, "W}\201\200\0\1\0\0\0\0\0\r\6emeidi\3com\0\0\34\0\1\1a\fr"..., 65536, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [28->16]) = 278
close(5)                                = 0
...

Macht man dasselbe mit der internen IP des Servers (bspw. 10.1.2.3) kann eine Session aufgebaut werden. Die Namensauflösung konnte ich nicht durchführen, weil mir der oder die Befehle nicht geläufig waren — im Nachhinein aber las ich dann, dass es sich bei DNS-Abfragen nicht um Klartextkommandos handelt.

Nun gut, dies bewog mich zu einem Workaround, ohne das eigentliche Problem zu beseitigen. Ich passte kurzerhand meine /etc/resolv.conf an:

#nameserver 127.0.0.1
nameserver 10.1.2.3

options timeout:1
options single-request

Ich vermutete zuerst Probleme in systemd-resolved. Installieren resp. entfernen tut man das Paket mit:

# apt-get install libnss-resolve
# apt-get remove libnss-resolve

Ist das Paket installiert, hat man neben /etc/resolv.conf auch noch Konfigurationen in /etc/systemd/resolved.conf und /run/systemd/resolve/resolve.conf. Typischer systemd-Wahnsinn. (siehe dazu Ubuntu – 18.04 Unable to connect to server due to “Temporary failure in name resolution” sowie Ubuntu 18.04 DNS resolution fails after a while)

Als ich systemd-resolved mit meinen Pröbelein zerschossen hatte, tauchten in /var/log/syslog noch folgende Fehlermeldungen auf:

Sep 18 20:35:04 localhost dbus-daemon[329]: [system] Activating via systemd: service name='org.freedesktop.resolve1' unit='dbus-org.freedesktop.resolve1.service' requested by ':1.15' (uid=0 pid=2015 comm="resolvectl ")
Sep 18 20:35:04 localhost dbus-daemon[329]: [system] Activation via systemd failed for unit 'dbus-org.freedesktop.resolve1.service': Unit dbus-org.freedesktop.resolve1.service not found.

Siehe auch Activation via systemd failed for unit ‚dbus-org.freedesktop.resolve1.service‘: Unit dbus-org.freedesktop.resolve1.service not found

Site-to-site OpenVPN erlaubt Pings in nur eine Richtung

Die Sache wurde immer mysteriöser: Aus dem entfernten Subnetz, in welchem der hier Probleme verursachende Server steht, konnte ich problemlos zur anderen Site pingen. Sowohl den VPN-Endpunkt, als auch alle anderen IPs im Subnetz hier. Das funktionierte auch von anderen Geräten im entfernten Subnetz aus.

Doch im Umkehrschluss funktionierte das nicht; d.h. von meinem Heimnetzwerk konnte ich nur den OpenVPN-Endpunkt pingen, aber nichts im entfernten Subnetz. Die ICMP-Pakete kamen zwar beim Zielgerät an (bspw. dem Internet-Router), dieser antwortete, aber das Antwortpaket wurde dann von auf dem entfernten OpenVPN-Endpunkt nicht von eth0 auf tun0 weitergeleitet.

Immerhin lernte ich für das Debugging nützliche tcpdump-Befehle kennen:

# tcpdump -n icmp and host 10.1.2.1
# tcpdump -i tun0 -n icmp and host 10.1.2.1
# tcpdump -i eth0 -n icmp and host 10.1.2.1

Die Ausgabe ist auch deshalb hilfreich, weil derselbe ping-Prozess immer dieselbe id trägt. Und die Sequenznummern sieht man auch gleich angezeigt. So konnte man isolieren, wo genau die ICMP-Pakete „verloren“ gingen respektive noch durchkamen.

Ausserdem kann man iptables so konfigurieren, dass sie verarbeitete Pakete ins syslog loggen (eine Regel iptables -I FORWARD -i eth0 -o tun0 -j ACCEPT existiert dabei schon und ist aktiv):

# iptables -I FORWARD -i eth0 -o tun0 -j LOG --log-prefix "OUTGOING "
# iptables -I FORWARD -i tun0 -o eth0 -j LOG --log-prefix "INCOMING "

Das Logging wird deaktiviert, indem man die Regel wieder entfernt:

# iptables -D FORWARD -i eth0 -o tun0 -j LOG --log-prefix "OUTGOING "
# iptables -D FORWARD -i tun17 -o eth0 -j LOG --log-prefix "INCOMING "

In dmesg entdeckte ich dann auch noch folgende Fehlermeldungen, was mich bewog, den Kernel zu aktualisieren:

...
cgroup2: unknown option "nsdelegate,memory_recursiveprot"
...

Die finale Lösung: Aktualisiere von Kernel-Version 4.9.0-16 auf 5.10.46-4, und Neustart.

# apt-get install linux-image-amd64

Tags: , , , , , , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 27. Juni 2021

OpenVPN warnt MULTI: packet dropped due to output saturation (multi_process_incoming_tun)

Fri Jun 25 21:10:49 2021 us=113808 user1/1.2.3.4:7609 MULTI: packet dropped due to output saturation (multi_process_incoming_tun)

Es gibt offenbar zwei Lösungen für das Problem:

  • UDP: Das VPN anstelle über TCP mittels UDP aufbauen (aufwändig; erfordert den Rollout einer neuen Konfigurationsdatei auf alle Clients).
  • TCP Queue Limit erhöhen: Serverseitig fügt man in die Serverkonfiguration die Zeile tcp-queue-limit 256 ein und startet den Server neu (Quelle)

Letzteres scheint bis jetzt gut zu klappen.

Tags: , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 27. Mai 2021

EdgeRouter ER-X wird mit aktiviertem hwnat bei Facetime-Anrufen instabil

Seit einiger Zeit fällt mir auf, dass FaceTime Video-Anrufe von mir (Fiber7, 1 Gbit/s symmetrisch) zu einem Bekannten (upc, mit ein paar 100 MBit/s up- and down, best effort) ruckeln und stocken.

Die Probleme beginnen wenige Sekunden nach der Etablierung des Anrufs. Symptome:

  • Pings von mir aus an die öffentliche IP-Adresse des Bekannten liegen normalerweise im 20-30ms Bereich. Während Facetime-Anrufen ist das in ca. 60-70 Prozent der Fälle weiter so, dann aber kommt es vor, dass die Latenz mehrerer aufeinanderfolgenden Pakete auf bis zu 600ms hochschnellt. Es kommt auch immer wieder vor, dass Ping-Pakete komplett verloren gehen.
  • Smokeping auf die öffentliche IP-Adresse des Bekannten zeigt einen besorgniserregenden Packet Loss.
  • Der Endpunkt eines OpenVPN-Tunnels beim Bekannten vermeldet zur selben Zeit wiederholt folgende Warnungen:
    Thu May 27 21:44:10 2021 Authenticate/Decrypt packet error: bad packet ID (may be a replay): [ #33668492 / time = (1621559394) Fri May 21 03:09:54 2021 ] -- see the man page entry for --no-replay and --replay-window for more info or silence this warning with --mute-replay-warnings

Screenshots:

Die (triviale) Lösung: Auf dem EdgeRouter ER-X mit Firmware v1.10.0 muss das sog. Hardware Offloading (kurz hwnat) deaktiviert werden:

Offizielle Anleitung (CLI), aber dasselbe geht auch über das GUI und den Config Tree: System > Offloading > hwnat = disable.

Das Problem ist im Support-Eintrag Connecting to wireguard on edgerouter messes up outgoing UDP packets #23 beschrieben, mitsamt der Lösung:

If you use a Mediatek device with hwnat your UDP packages might get lost. Currently the only solution is to disable hwnat


UDP re-order problem


With hwnat disabled, the wg0 interface works great and the ER-X routes all my internet traffic out of it just fine, although CPU has much more overhead.

As soon as I enable hwnat, I start seeing problems, but only in certain scenarios, not all. For example, with hwnat disabled, I can use OpenVPN as a client on a local machine. Thus that OpenVPN connection gets routed out through the wg interface first, then on to server. The OpenVPN server shows the endpoint IP of the server ER-X wg is connected to as the OpenVPN client’s IP, not my ISP IP (what I want). As soon as I enable hwnat, this breaks. I can still make the initial outgoing connection and bring up the OpenVPN tunnel, but packets get dropped so that OpenVPN through the wg interface is unusable with hwnat enabled.

Also noticed Apple FaceTime is broken when hwnat is enabled with wg interface. Lots of disconnects and moments of me hearing them but them not hearing me. Again, disabling hwnat fixes it instantly, but again, at the cost of CPU.

Nachtrag

Das Problem ist leider immer noch nicht gelöst. Zuerst einmal scheint die Deaktivierung von hwnat über das Web GUI erst dann zu greifen, wenn man den Router neu startet. Bei mir zeigte das GUI „disabled“ an, doch auf der Kommandozeile erschien folgendes:

$ configure
[edit]
user@ROUTER# show system offload hwnat
 hwnat disable

$ show ubnt offload
IPSec offload module: loaded

HWNAT offload module: loaded

Traffic Analysis    :
  export    : disabled
  dpi       : disabled
    version       : 1.354

Nach dem Neustart dann:

$ show ubnt offload
IPSec offload module: not loaded

HWNAT offload module: not loaded

Traffic Analysis    :
  export    : disabled
  dpi       : disabled
    version       : 1.354

Trotz alledem macht FaceTime weiterhin Probleme.

Via: ERX Hardware Offload won’t load

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

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 8. Juli 2018

OpenVPN meldet „INSECURE cipher with block size less than 128 bit (64 bit).“

Zwar erscheint die folgende Fehlermeldung seit längerem in den Logs meiner Site-to-Site-VPNs, doch heute erst hatte ich die Zeit, mich dem Problem anzunehmen:

Sun Jul  8 09:24:37 2018 Outgoing Static Key Encryption: Cipher 'BF-CBC' initialized with 128 bit key
Sun Jul  8 09:24:37 2018 WARNING: INSECURE cipher with block size less than 128 bit (64 bit).  This allows attacks like SWEET32.  Mitigate by using a --cipher with a larger block size (e.g. AES-256-CBC).

Zuerst dachte ich, dass ich die statischen Schlüssel der VPN-Verbindungen neu erstellen muss, weshalb ich zuerst einmal das Script optimierte. Falsch gedacht! Obwohl ich die Schlüssel ersetzt hatte, erschien beim erneuten Verbindungsaufbau erneut dieselbe Fehlermeldung.

Nach etwas Googlen dann die effektive Lösung: Ich muss die Konfigurationsdateien der jeweiligen Verbindungen anpassen! Folgende Zeile habe ich nun in die OpenVPN-Konfigurationsdateien auf beiden Seiten eingefügt:

...
cipher      AES-256-CBC
...

Et voilà! Auf der Seite des Servers sehe ich nun in der Log-Datei:

Sun Jul  8 10:47:17 2018 OpenVPN 2.4.0 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 18 2017
Sun Jul  8 10:47:17 2018 library versions: OpenSSL 1.0.2l  25 May 2017, LZO 2.08
Sun Jul  8 10:47:17 2018 Outgoing Static Key Encryption: Cipher 'AES-256-CBC' initialized with 256 bit key
Sun Jul  8 10:47:17 2018 Outgoing Static Key Encryption: Using 160 bit message hash 'SHA1' for HMAC authentication
Sun Jul  8 10:47:17 2018 Incoming Static Key Encryption: Cipher 'AES-256-CBC' initialized with 256 bit key
Sun Jul  8 10:47:17 2018 Incoming Static Key Encryption: Using 160 bit message hash 'SHA1' for HMAC authentication
...

Tags: , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

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:

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:

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

1 Kommentar | 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