iOS: In unbekannten WLANs automatisch mit VPN verbinden

Mit VPN-Verbindungens ist es, wie mit Backups. Meistens benötigt man sie, wenn man vorher nicht daran gedacht hat, sie zu erstellen.

Ich bin viel unterwegs und häufig in fremden oder offenen WLANs eingeloggt. Prinzipiell bin ich in solchen Situationen, wenn möglich, am Liebsten mit meinem heimischen VPN verbunden.

Lange Zeit nutzte ich ich nur aus einem einzigen Grund OpenVPN: Die iOS-App bietet eine Möglichkeit, das VPN anzuknipsen und iOS stellt die Verbindung immer wieder her, wenn sie abgebrochen wurde. Dies ist wenig elegant und OpenVPN relativ komplex. Ich hatte also keine Lust mehr darauf und musste bisher ja auch immer daran denken, das VPN auf dem iPhone explizit anzuschalten. Ich war also entweder nicht in WLANs oder dann selten in meinem VPN.

Nach der Umstellung auf meinen EdgeRouter und dem Switch auf L2TP als VPN-Standard las ich davon, dass man mit iOS-Profilen die Möglichkeit hat, WLANs zu whitelisten und bei allen anderen WLANs automatisch eine VPN-Verbindung aufzubauen. Nach einer Suche auf GitHub bin ich auf ein höchst praktisches Projekt von Kris Linquist gestoßen. iOS-VPN-Autoconnect bietet eine schlanke HTML-Seite, die ein paar Daten abfragt und lokal per JavaScript eine entsprechende Profildatei erstellt. Diese habe ich per AirDrop auf mein Telefon geabeamed und bin nun immer im VPN, wenn ich in einem anderen, als meinem heimischen WLAN eingeloggt bin. Das ist sehr simpel und funktioniert bisher zuverlässig.

Wenn es nicht funktionierte, lag es bisher an schlechten WLANs oder mangelnder Internetkonnektivität. In diesen fällen war aber immer das WLAN auch ohne VPN nicht wirklich nutzbar und ich bin auf LTE ausgewichen.

Telekom VDSL und Entertain mit DrayTek Vigor130 und Ubiquiti Edgerouter X

In letzter Zeit ging mir die Fritz!Box immer mehr auf die Nerven.

Nachdem mir Anfang des Jahres nach vielen Jahren meine 7390 verstorben ist, habe ich mir eine 7490 gekauft. Schmerzlich musste ich feststellen, dass AVM immer mehr funktionen streicht, die ich in meinem Setup aber dringend benötige.

Ich betreibe z.B. Jails auf einem FreeBSD-Server. Gegenüber dem Router haben alle Jails unterschiedliche IP-Adressen, aber die selbe MAC, da sie ja die selbe Netzwerkkarte benutzen. In aktuellen Fritz!OS-Versionen ist es nicht mehr möglich, für die Jails konsistente Portweiterleitungen einzurichten, da diese immer an die MAC-Adresse gekoppelt sind und die IP in der Firewall ständig geändert wird.

Ich habe mir dann kurzfristig noch eine EdgeRouter X (ERX) von Ubiquiti dazu geordert. Die Fritz!Box hat dann die Internetverbindung aufgebaut und sämtlichen Traffic einfach an den ERX durchgereicht. Inklusive doppeltem NAT und allen anderen Nachteilen, die diese Lösung mit sich bringt. Ich habe also den Entschluss gefasst, die Fritz!Box abzuschaffen und das ganze Netzwerksetup ein mal vernüftig aufzubauen.

Nach einiger Recherche setze ich jetzt folgende Hardware ein:
• Mein VDSL-Modem ist ein DrayTek Vigor130
• Das Routing und den Aufbau der PPoE-Verbindung übernimmt der Ubiquiti EdgeRouter X.
• Als WLAN-Accesspoint kommt ein Ubiquiti UniFi AP AC Lite zum Einsatz
• Des Weiteren tun noch zwei Netgear GS108Ev3-Switches ihren Dienst.

Das Zielsetup zum Ersetzen der Fritz!Box war dann also folgendes.

Der Vigor130 soll als reines Modem zum Einsatz kommen. Der EdgeRouter soll die Internetverbindung vie Telekom VDSL aufbauen. Er soll sich um die VLANs kümmern, um Entertain nutzen zu können, DHCP anbieten, das IPv6-Subnet, das von der Telekom zugeteilt wird über Prefix-Delegation an die Clients im LAN verteilen, sowie einen L2TP-VPN-Server anbieten. Der Router soll DNS-Forwarding machen und hierfür die Nameserver nutzen, die die Telekom ihm zuweist.

Nach einegm Rumprobieren habe ich jetzt alles ans Laufen bekommen. Das Modem hängt an eth0 des ERX. Das Modem hat die IP 192.168.1.1.. eth0 des ERX hat die 192.168.1.2.. Das Interne Netz läuft als 192.168.178.0/24 und die restlichen Ethernet-Ports des ERX laufen im Switch-Modus alle auf dem selben Netz.

Das ich im Netz immer nur Teil-Lösungen gefunden habe, oder welche, die eher exotische Setups bedienen, dachte ich, ich teile meine Config mal mit Euch.

Sie sollte fast Copy-Paste-fähig sein. Die einzigen Dinge, die Du ändern musst, sind deine VDSL-Zugangsdaten und den Preshared Key des VPN.

Über SSH kannst Du dann noch VPN-User hinzufügen.

configure

set vpn l2tp remote-access authentication local-users username <USERNAME> password <PASSWORD>

commit; save

Portweiterleitungen usw. lassen sich anschließend sehr gut über das Webinterface unter 192.168.178.1 einrichten.

Hier nun also die Config:

##config.boot

firewall {
    all-ping enable
    broadcast-ping disable
    ipv6-name IPv6_WAN_IN {
        default-action drop
        description "IPv6 packets from the Internet to LAN"
        enable-default-log
        rule 1 {
            action accept
            description "Allow established sessions"
            state {
                established enable
                related enable
            }
        }
        rule 2 {
            action drop
            state {
                invalid enable
            }
        }
        rule 5 {
            action accept
            description "Allow ICMPv6"
            log disable
            protocol icmpv6
        }
    }
    ipv6-name IPv6_WAN_LOCAL {
        default-action drop
        description "IPv6 packets from the Internet to the router"
        enable-default-log
        rule 1 {
            action accept
            description "Allow established sessions"
            log disable
            state {
                established enable
                related enable
            }
        }
        rule 2 {
            action drop
            log disable
            state {
                invalid enable
            }
        }
        rule 5 {
            action accept
            description "Allow ICMPv6"
            log disable
            protocol icmpv6
        }
        rule 110 {
            action accept
            description "Allow DHCPv6 packets"
            destination {
                port 546
            }
            protocol udp
            source {
                port 547
            }
        }
    }
    ipv6-name WANv6_IN {
        default-action drop
        description "WAN inbound traffic forwarded to LAN"
        enable-default-log
        rule 10 {
            action accept
            description "Allow established/related sessions"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    ipv6-name WANv6_LOCAL {
        default-action drop
        description "WAN inbound traffic to the router"
        enable-default-log
        rule 10 {
            action accept
            description "Allow established/related sessions"
            state {
                established enable
                related enable
            }
        }
        rule 20 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
        rule 30 {
            action accept
            description "Allow IPv6 icmp"
            protocol ipv6-icmp
        }
        rule 40 {
            action accept
            description "allow dhcpv6"
            destination {
                port 546
            }
            protocol udp
            source {
                port 547
            }
        }
    }
    ipv6-receive-redirects disable
    ipv6-src-route disable
    ip-src-route disable
    log-martians enable
    name WAN_IN {
        default-action drop
        description "WAN to internal"
        enable-default-log
        rule 1 {
            action accept
            description "Allow established/related"
            state {
                established enable
                related enable
            }
        }
        rule 3 {
            action drop
            description "Drop invalid state"
            state {
                invalid enable
            }
        }
    }
    name WAN_IPTV {
        default-action drop
        description "Telekom Entertain"
        enable-default-log
        rule 1 {
            action accept
            description "Allow IPTV Multicast UDP"
            destination {
                address 224.0.0.0/4
            }
            log disable
            protocol udp
            source {
            }
        }
        rule 2 {
            action accept
            description "Allow IGMP"
            log disable
            protocol igmp
        }
    }
    name WAN_LOCAL {
        default-action drop
        description "WAN to router"
        enable-default-log
        rule 1 {
            action accept
            description "Allow Ping"
            log disable
            protocol icmp
        }
        rule 2 {
            action accept
            description "Allow Multicast"
            destination {
                address 224.0.0.0/4
            }
            log disable
            protocol all
        }
        rule 7 {
            action accept
            description "Allow established/related"
            state {
                established enable
                related enable
            }
        }
        rule 8 {
            action drop
            description "Drop invalid state"
            log enable
            state {
                invalid enable
            }
        }
        rule 30 {
            action accept
            description IKE
            destination {
                port 500
            }
            log disable
            protocol udp
        }
        rule 40 {
            action accept
            description ESP
            log disable
            protocol esp
        }
        rule 50 {
            action accept
            description NAT-T
            destination {
                port 4500
            }
            log disable
            protocol udp
        }
        rule 60 {
            action accept
            description L2TP
            destination {
                port 1701
            }
            ipsec {
                match-ipsec
            }
            log disable
            protocol udp
        }
    }
    options {
        mss-clamp {
            mss 1412
        }
    }
    receive-redirects disable
    send-redirects enable
    source-validation disable
    syn-cookies enable
}
interfaces {
    ethernet eth0 {
        address 192.168.1.2/24
        duplex auto
        speed auto
        vif 7 {
            description "Internet (PPPoE)"
            pppoe 0 {
                default-route auto
                dhcpv6-pd {
                    pd 0 {
                        interface eth1 {
                            no-dns
                            prefix-id 42
                            service slaac
                        }
                        interface switch0 {
                            host-address ::dead:beef
                            prefix-id :1
                            service slaac
                        }
                        prefix-length 56
                    }
                    prefix-only
                    rapid-commit enable
                }
                firewall {
                    in {
                        ipv6-name IPv6_WAN_IN
                        name WAN_IN
                    }
                    local {
                        ipv6-name IPv6_WAN_LOCAL
                        name WAN_LOCAL
                    }
                }
                ipv6 {
                    address {
                        autoconf
                    }
                    dup-addr-detect-transmits 1
                    enable {
                    }
                }
                mtu 1492
                name-server auto

                ## Hier PPPoE-Zugangsdaten ändern
                password KENNWORT
                user-id ANSCHLUSSKENNUNGZUGANGSNUMMER0001@t-online.de
            }
        }
        vif 8 {
            address dhcp
            description "Telekom Entertain"
            firewall {
                local {
                    name WAN_IPTV
                }
            }
            mtu 1500
        }
    }
    ethernet eth1 {
        description Local
        duplex auto
        ipv6 {
            dup-addr-detect-transmits 1
        }
        speed auto
    }
    ethernet eth2 {
        description Local
        duplex auto
        speed auto
    }
    ethernet eth3 {
        description Local
        duplex auto
        speed auto
    }
    ethernet eth4 {
        description Local
        duplex auto
        speed auto
    }
    loopback lo {
    }
    switch switch0 {
        address 192.168.178.1/24
        description Local
        mtu 1500
        switch-port {
            interface eth1 {
            }
            interface eth2 {
            }
            interface eth3 {
            }
            interface eth4 {
            }
            vlan-aware disable
        }
    }
}
port-forward {
    auto-firewall enable
    hairpin-nat enable
    lan-interface switch0
    wan-interface pppoe0
}
protocols {
    igmp-proxy {
        interface eth0.8 {
            alt-subnet 0.0.0.0/0
            role upstream
            threshold 1
        }
        interface eth1 {
            alt-subnet 0.0.0.0/0
            role downstream
            threshold 1
            whitelist 239.35.0.0/16
        }
    }
}
service {
    dhcp-server {
        disabled false
        hostfile-update disable
        shared-network-name LAN {
            authoritative disable
            subnet 192.168.178.0/24 {
                default-router 192.168.178.1
                dns-server 192.168.178.1
                lease 86400
                start 192.168.178.100 {
                    stop 192.168.178.200
                }
            }
        }
        static-arp disable
        use-dnsmasq disable
    }
    dns {
        forwarding {
            cache-size 1000
            listen-on switch0
            options listen-address=192.168.178.1
        }
    }
    gui {
        http-port 80
        https-port 443
        older-ciphers enable
    }
    nat {
        rule 5001 {
            description "Masquerade outgoing pppoe0"
            log disable
            outbound-interface pppoe0
            protocol all
            type masquerade
        }
        rule 5011 {
            description "Webinterface Modem"
            destination {
                address 192.168.1.0/24
            }
            log disable
            outbound-interface eth0
            protocol all
            type masquerade
        }
    }
    ssh {
        port 22
        protocol-version v2
    }
    unms {
        disable
    }
}
system {
    login {
        user ubnt {
            authentication {
                encrypted-password $6$KAQUivwa0C$tawQZnN4aM4CxmQo0RgfUQjij.YJ239CN.1B6yaPfin1jCZvsZ4kSVSlqEXurai5AQSX.XAMfC3rIVuKnmEpM1
                plaintext-password ""
            }
            level admin
        }
    }
    ntp {
        server 0.ubnt.pool.ntp.org {
        }
        server 1.ubnt.pool.ntp.org {
        }
        server 2.ubnt.pool.ntp.org {
        }
        server 3.ubnt.pool.ntp.org {
        }
    }
    offload {
        hwnat enable
    }
    static-host-mapping {
    }
    syslog {
        global {
            facility all {
                level notice
            }
            facility protocols {
                level debug
            }
        }
    }
    time-zone Europe/Berlin
    traffic-analysis {
        dpi disable
        export enable
    }
}
vpn {
    ipsec {
        auto-firewall-nat-exclude disable
        ipsec-interfaces {
            interface pppoe0
        }
    }
    l2tp {
        remote-access {
            authentication {
                mode local
            }
            client-ip-pool {
                start 192.168.178.85
                stop 192.168.178.99
            }
            dns-servers {
                server-1 192.168.178.1
            }
            idle 1800
            ipsec-settings {
                authentication {
                    mode pre-shared-secret
                    
                    ## Hier Preshared Secret festlegen
                    pre-shared-secret PRESHAREDSECRET
                }
                ike-lifetime 3600
                lifetime 3600
            }
            mtu 1492
            outside-address 0.0.0.0
        }
    }
}


/* Warning: Do not remove the following line. */
/* === vyatta-config-version: "config-management@1:conntrack@1:cron@1:dhcp-relay@1:dhcp-server@4:firewall@5:ipsec@5:nat@3:qos@1:quagga@2:system@4:ubnt-pptp@1:ubnt-udapi-server@1:ubnt-unms@1:ubnt-util@1:vrrp@1:webgui@1:webproxy@1:zone-policy@1" === */
/* Release version: v1.10.0.5056246.180125.0954 */

FreeBSD-Server inkl. Jails auf neue Version upgraden

Ich bin gerade dabei, einen FreeBSD-Server, der als Host für diverse ezjail-Jails dient, auf eine neue FreeBSD-Version upzugraden. Als Referenz für mich dokumentiere ich das ganze hier einfach mal.

Das System läuft aktuell auf 10.1 und wird auf 10.3 gehoben. Bei späteren Upgrades müssen die Versionsnummern entsprechend angepasst werden.

Als erstes bringen wir das aktuell installierte System auf den letzten Stand und aktualisieren die Ports.

freebsd-update fetch
freebsd-update install
portsnap fetch update

Im nächsten Schritt laden wir die neuen Systemfiles herunter, installieren den neuen Kernel und rebooten das System.

freebsd-update upgrade -r 10.3-RELEASE
freebsd-update install
shutdown -r now

Nach dem Reboot installieren wir die restlichen Systemfiles und rekompilieren alle installierten Ports. Anschließend starten wir den Server noch mal neu. Die Option -m DISABLE_VULNERABILITIES=yes setze ich, damit ich nicht mitten im Upgrade aufhören muss, falls bei einem Port Sicherheitslücken bekannt sind. Temporär damit hinter der Firewall zu leben erscheint mir sinnvoller, als ein gebrickter Server. 😉

freebsd-update install
portmaster -af -m DISABLE_VULNERABILITIES=yes
shutdown -r now

Nach dem Reboot ist der Server an sich auf 10.3. Nun müssen noch die ezjail-Jails upgegradet werden.

Hierfür laden und installieren wir zunächst die aktualisierten Files für die Basejail und starten anschließend ezjail neu.

ezjail-admin install -r 10.3-RELEASE
env UNAME_r=10.3-RELEASE ezjail-admin update -s 10.1-RELEASE -U
ezjail-admin update -P
service ezjail-admin restart

Jetzt müssen wir nur noch in jeder einzelnen Jail die Ports rekompilieren und einmal neustarten.

portmaster -af -m DISABLE_VULNERABILITIES=yes
service -R

Das war’s. Wenn keine Probleme auftreten und kann man damit in ner Stunde durch sein. Wenn mehrere Jails betrieben werden und viele Ports gebaut werden müssen, dauert es entsprechend länger.

Status einer SSH-Session an sudo weitergeben

Wenn man sich per SSH auf einen Rechner connected und anschließend mit “sudo“ root-Rechte erlangt, kann man in dieser Session nicht feststellen, ob man per SSH verbunden ist, oder nicht. Ich brauchte dies z.B., um meinen Shell-Prompt in diesem Fall anders anzuzeigen.

Es ist aber sehr einfach, hier Abhilfe zu schaffen. Wir müssen sudo nur sagen, dass es die Variablen betreffend SSH im Environment halten soll.

Hierfür müssen wir nur folgende Zeile in die sudo-Config (/usr/local/etc/sudoers oder /etc/sudoers) eintragen:

Defaults env_keep += "SSH_TTY SSH_CONNECTION SSH_CLIENT"

Von nun an sind die drei Variablen auch in sudo-Sessions verfügbar.

Omnifocus, Todoist, Remember the Milk – Die Qual der Wahl der richtigen Todoliste

Todoist auf dem iPad mini
Andreas Lorenz beschreibt in seinem Beitrag „How to get the best out of Omnifocus – for PC Users“ wie er als iOS-User, der dienstlich einen PC benutzt das Beste aus Omnifocus heraus holt und es auch ganz ohne eine fehlende Webapp oder einen Mac-Client nutzt.

Ich bin auch bis heute noch stark begeistert von Omnifocus. Mitte letzten Jahres habe ich nach 8 Jahren als pro-Member Remember the Milk den Rücken gekehrt und bin zu Omnifocus gewechselt. Beim Setup meines Systems habe ich mich ganz stark von Sven Fechner und seinen sehr ausführlichen Artikeln zu Omnifocus inspirieren lassen. Ich konnte mich jedoch mit der iOS-only-Lösung auf Arbeit nie so richtig anfreunden, auch wenn Die Apps für Mac, iOS und Apple Watch am schönsten und durchdachtetsten sind. Nur E-Mails weiterleiten oder Siri um Tasks anzulegen hat mich zu sehr eingeschränkt und ich hatte zu oft das Gefühl, nicht alles im Griff zu haben.

Nach drei Monaten Omnifocus bin ich dann zu Todoist gewechselt und hier bisher am glücklichsten, auch wenn mir hier ein paar Dinge fehlen und wieder andere etwas umständlich sind. Im Design der Apps, sowohl auf iOS, als auch im Web haben alle Elemente ziemlich viel Whitespace. Ich würde mir wünschen, mehr Content sehen zu können und alles etwas kompakter zu haben. Auch das Templating-System ist etwas umständlich und arbeitet mit wenig intuitiven CSV-Files. Die App für die Apple Watch hat leider (noch) keine Compliation und ist manchmal etwas lahm. Außerdem wäre es schön, Start-Dates für Tasks vergeben zu können.

Mit der Veröffentlichung der neuen Remember the Milk-App ging dann jetzt auch die neue Webapp online, die ich im letzten Jahr in der closed Beta intensiv im Einsatz hatte. Auch hier fehlen mir aber noch ein paar Dinge, die mich wieder zu einem Wechsel bewegen könnten. Eine App für die Apple Watch fehlt bisher und eine Möglichkeit verschachtelte Projekte anzulegen fehlt mir auch. Das Handling von Subtasks ist etwas hakelig, das macht Todoist besser. Dafür bietet RTM eine extrem mächtige Query Language um Filter zu erstellen und die Möglichkeit, auch ganze Tasklisten per E-Mail zu importieren.

Ich werde jetzt erst ein mal bei Todoist bleiben und die anderen Entwicklungen beobachten. Ein trusted System, dem man nicht traut, weil man das Gefühl hat, es nicht so nutzen zu können, wie man möchte, oder Angst hat, es nicht komplett zu durchschauen, macht eben einfach keinen Sinn.