webcodr

Interface monitoring with Wireshark on an EdgeRouter

Here is just a neat little trick to use Wireshark for monitoring interfaces on your EdgeRouter. This is incredibly useful for debugging purposes.

The following commands work on macOS or a Linux distribution only.

ssh [email protected]_ip 'sudo tcpdump -f -i eth0 -w -' | wireshark -k -i -

If you’re monitoring the interface with your SSH connection to the EdgeRouter, you may want to ignore traffic on port 22.

ssh [email protected]_ip 'sudo tcpdump -f -i eth1 -w - not port 22' | wireshark -k -i -

Update for Windows users

After some fiddling around, I found a working solution for Windows 10 users. You just have to install the SSH client beta and Wireshark for Windows.

ssh [email protected]_ip "sudo tcpdump -f -i eth0 -w -" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -

Troubleshooting advice:

  • The Windows SSH client will only work on command shells with admin privileges.
  • Use only double quotes. The Windows command line doesn’t like single quotes as well as a shell on unixoid operating systems.
  • Adjust the path to Wireshark if it’s not installed in the default directory.
  • CTRL + C or CTRL + X will not work to terminate the SSC connection. You have to close the window instead.

NGINX Reverse Proxy on Raspberry Pi with Let's Encrypt

Another weekend, another guide. This time I will show you, how to setup a reverse proxy with NGINX on a Raspberry Pi and secure the connection with a certificate from Let’s Encrypt.

NOTICE OF CAUTION BEGIN

Your Raspberry Pi will be exposed to the internet on port 80 for HTTP and port 443 for HTTPS/TLS. A potential attacker could have access to your network. Please make sure, that you keep yourself up to date on security issues and install updates regularly.

To secure your network, I recommend an isolated VLAN for your Pi and the web servers.

If this makes you uncomfortable, please re-consider running web servers within your network, that can be accessed from outside.

NOTICE OF CAUTION END

Still here? Okay, you have been warned. Let’s go.

Please make sure, to forward port 80 and 443 from your router to the Raspberry Pi.

Install NGNIX and Certbot

This guide assumes that you’re running the latest version of Raspian on your Pi. It’s based on Debian Stretch. If you’re using an older version based Jessie or even Wheezy, please consider a dist upgrade. This is not without risk, so back-up your current installation!

If you’re already running a web server on your Pi, you should disable it. Otherwise NGINX will not be able to use port 80 and 443. If you need that other web server, you should configure it to run on other ports and use NGINX to forward the connections.

Now, to the installation:

sudo apt-get update
sudo apt-get install nginx-full certbot -y

The NGINX service will automatically start after APT finished.

Issue a certificate

In order to create a certificate, Certbot will need access to port 80, but that’s no problem. Look at the following command:

sudo certbot certonly --authenticator standalone -d example.com --pre-hook "service nginx stop" --post-hook "service nginx start"

This tells certbot to issue a certificate for example.com by using a standalone web server to validate the domain for the Let’s Encrypt service. In order to run the server, you have to shutdown NGINX until certbot is finished. The pre hook and post hook parameters will help you with that.

After the certificate is successfully issued, your new certificate and all other necessary files will be available here: /etc/letsencrypt/live/example.com

Configure NGINX

Don’t like vim? Just use whatever editor you prefer instead.

Add a new site config to NGINX:

sudo vim /etc/nginx/sites-enabled/example.com

All files in /etc/nginx/sites-enabled/ will be automatically used by NGINX.

Here is a config for example.com, that will be forwarded to 10.0.0.2.

Please adjust it to your needs and paste/save it.

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass http://10.0.0.2:80;
  }
}

server {
  listen 443 ssl;
  server_name example.com;
  ssl on;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;
  ssl_protocols TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
  ssl_prefer_server_ciphers on;
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; 

  location / {
    proxy_pass https://10.0.0.2:443;
  }
}

To test your config, use the following command:

sudo nginx -t

The validator will tell you, if anything is wrong and why it’s not working.

No errors? Great, just restart NGINX and your reverse proxy is working.

sudo service nginx restart

Certificate auto-renewal

The certbot certificate renewal will renew all certificates you created with cerbot.

Checking the renewal process:

sudo certbot renew --dry-run --pre-hook "service nginx stop" --post-hook "service nginx start"

The parameter --dry-run allows to test the renewal without actually replacing the certificates.

In order to renew the certificates automatically, open crontab for root:

sudo crontab -e

Add the following cron job and save.

0 0 1 * * sudo certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

And you’re done. From now on, you’re certificates will be renewed every month automatically.

More domains? No problem, just issue the certificate and add another site config.

Telekom EntertainTV mit Ubiquiti EdgeRouter X

Da bei Sky Deutschland nun auch noch die Formel 1 entf├Ąllt und zus├Ątzlich in den letzten Jahren diverse Rechte, z.B. die Premier League, auch abhanden gekommen sind, habe ich mich dazu entschlossen auf EntertainTV von der Telekom umzusteigen.

In diesem Post erkl├Ąre ich meine EdgeRouter- bzw. Netzwerk-Konfiguration, da ein IPTV-System wie EntertainTV besondere Anforderungen stellt. Damit IPTV ├╝berhaupt funktionieren kann, muss die Telekom Multicasts verwenden. Im Gegensatz zu DVB-C oder DVB-S2, wird hier nicht jedem Kunden alles geschickt, um sich auszusuchen, was man anschaut. Man bekommt nur das geliefert, was auch tats├Ąchlich angesehen wird. Multicasts erlauben hier die effiziente Verteilung von Paketen, ohne das eigene Netz zu ├╝berlasten.

Damit Multicasts funktionieren, muss auch die lokale Netzwerk-Hardware mitspielen. Darum empfiehlt die Telekom u.A. ihre IPTV-Receiver direkt mit dem Router zu verbinden. Das ist sicher kein Problem, wenn der Telefonanschluss im Wohnzimmer ist, aber gerade in ├Ąlteren Wohnungen, ist das eher selten der Fall und Kabelkan├Ąle sind auch rar. Sobald Switches oder Access Points ins Spiel kommen, m├╝ssen die Ger├Ąte das Internet Group Multicast Protocol in Version 3 (IGMPv3) unterst├╝tzen. Wenn sie das nicht tun, wird aus dem Multicast ein Broadcast an alle Ger├Ąte ins Netzwerk. Bei einem HD-Stream mit 10 Mbit/s und 20 Ger├Ąten im Netzwerk, w├╝rde man so 200 Mbit/s Last erzeugen. Das mag im LAN noch evtl. verschmerzbar sein, aber in einem WLAN sieht die Sache anders aus. Leider unterst├╝tzt insbesondere Consumer-Netzwerk-Hardware oft kein IGMP oder nur eine ├Ąltere Version, die ebenfalls ins Broadcasts resultiert.

Eine wirklich g├╝nstige L├Âsung gibt’s daf├╝r leider nicht. Man kann sich entweder mit entsprechend IGMP-f├Ąhiger Hardware helfen oder mit einem separaten Netz ├╝ber ein VLAN. Dummerweise unterst├╝tzten Consumer-Ger├Ąte meist auch keine VLANs.

Ohne Managed Switches, die IGMPv3 und/oder VLANs unterst├╝tzen, kommt man hier leider nicht weit. Mein Netzwerk besteht daher nur noch aus Netzwerk-Hardware von Ubiquiti: ein EdgeRouter X, drei UniFi Switches und zwei UniFi Access Points.

Konfiguration

Folgende Punkte beschreiben die Konfiguration der UniFi-Hardware und des EdgeRouters. Wie immer gilt: ich verwende einen EdgeRouter X, aber es sollte auch problemlos mit jedem anderen EdgeRouter funktionieren.

UniFi

Der einfache Teil vorweg: f├╝r die UniFi-Ger├Ąte reicht es, IGMP Snooping in den Einstellungen unter Networks bzw. Wireless Networks f├╝r das jeweilige Netz zu aktivieren und die Ger├Ąte neu zu provisionieren.

Falls jemand ein UniFi Security Gateway als Router verwenden sollte, m├╝ssen noch weitere Einstellungen im CLI des Controllers vorgenommen werden, damit der IGMP Proxy l├Ąuft. Eine Anleitung dazu gibt’s hier.

EdgeRouter

Wie auch f├╝r das USG gilt, dass auf dem EdgeRouter ein IGMP Proxy laufen muss. Das verlangt Einstellungen, die nur ├╝ber das CLI erfolgen k├Ânnen. Der Einfachheit halber, werde ich auch die entsprechenden Firewall-Regeln ├╝ber das CLI beschreiben, da man die einfach kopieren und nach seinen W├╝nschen anpassen kann – im Gegensatz zu einer Screenshot-Orgie.

Firewall

Grunds├Ątzlich sollte jeder EdgeRouter min. zwei Firewall-Rulesets haben, in und local. Bei mir hei├čen sie WAN_IN sowie WAN_LOCAL und werden daher auch in diesem Beispiel verwendet. Das Modem h├Ąngt an eth0 und die Verbindung wird ├╝ber eth1 ins restliche Netzwerk verteilt.

Die folgenden Firewall-Regeln richten sich an Nutzer von EntertainTV bzw. Telekom-Kunden im BNG. Wer noch nicht im BNG ist bzw. das alte Entertain nutzt, muss teilweise andere IP-Adressen freigeben und dazu VLAN 8 verwenden, weil im alten Netz die Internetverbindung (VLAN 7) und Entertain (VLAN 8) getrennt laufen, siehe den Beitrag von TauSys.

Als erstes m├╝ssten IGMP und Multicast UDP-Pakete f├╝r WAN_IN erlaubt werden:

set firewall name WAN_IN rule 1 action accept
set firewall name WAN_IN rule 1 description 'Allow IGMP'
set firewall name WAN_IN rule 1 log disable
set firewall name WAN_IN rule 1 protocol igmp
set firewall name WAN_IN rule 2 description 'Allow IPTV Multicast UDP'
set firewall name WAN_IN rule 2 destination address 224.0.0.0/4
set firewall name WAN_IN rule 2 log disable
set firewall name WAN_IN rule 2 protocol udp

Anschlie├čend werden Multicast UDP-Pakete lokal f├╝r WAN_LOCAL erlaubt:

set firewall name WAN_LOCAL rule 1 action accept
set firewall name WAN_LOCAL rule 1 description 'Allow Multicast'
set firewall name WAN_LOCAL rule 1 destination address 224.0.0.0/4
set firewall name WAN_LOCAL rule 1 log disable
set firewall name WAN_LOCAL rule 1 protocol all

Bitte beachtet, dass die Reihenfolge der Regeln entsprechend passt und die neuen Regeln immer vor der Drop-Regel stehen, die nicht erlaubte Pakete entsorgen soll.

Was hat es mit dem Netz 224.0.0.0/4 auf sich? Sehr vereinfacht gesagt: ein Bereich bestimmter IPv4-Adressen, die f├╝r Multicast-Verwaltung genutzt werden k├Ânnen.

IGMP Proxy

Der schon mehrfach genannte IGMP Proxy ist ein vergleichsweise simples Tool, um IGMP-Pakete an die entsprechenden Stellen weiterzuleiten. Ohnehin w├╝rden die Pakete im Router quasi h├Ąngenbleiben.

set protocols igmp-proxy interface eth1 alt-subnet 0.0.0.0/0
set protocols igmp-proxy interface eth1 role downstream
set protocols igmp-proxy interface eth1 threshold 1
set protocols igmp-proxy interface eth1 whitelist 232.0.0.0/16
set protocols igmp-proxy interface pppoe0 alt-subnet 0.0.0.0/0
set protocols igmp-proxy interface pppoe0 role upstream
set protocols igmp-proxy interface pppoe0 threshold 1

Das Beispiel geht davon aus, dass die restlichen Ger├Ąte ├╝ber eth1 am EgdeRouter h├Ąngen. Falls jemand ein VLAN verwendet, wie ich es im vorherigen Post beschrieben habe, muss an das Interface noch die VLAN-ID angeh├Ąngt werden, z.B. eth1.10.

Entertain bzw. EntertainTV funktionieren aktuell nur via IPv4, daher ist eine IPv6-Konfiguration nicht notwendig.

Das war’s eigentlich schon. Ihr m├╝sst nur noch einen Commit machen und speichern. Der IGMP Proxy sollte damit automatisch starten.

Ich hatte die ganze Konfiguration bereits anhand diverser Blog- und Foren-Posts im Vorraus gemacht und erstaunlicherweise hat sie auf Anhieb funktioniert. Es treten keinerlei Broadcast-Probleme auf.

Falls Ihr den Verdacht habt, das l├Ąsst sich mit Wireshark sehr einfach ├╝berpr├╝fen: einfach die aktive Netzwerk-Schnittstelle abfragen und auf Broadcasts bzw. ungew├Âhnlich viele UDP-Pakete achten, die von den EntertainTV-IP-Adressen kommen.

Wer Interesse hat, einen EdgeRouter X oder ein anderes der genannten Ger├Ąte zu kaufen und mich unterst├╝tzen m├Âchte, kann folgende Amazon-Links benutzen. Vielen Dank!

DrayTek Vigor 130

Ubiquiti EdgeRouter X

Ubiquiti UniFi AP AC Lite

Ubiquiti UniFi US-8

Ubiquiti UniFi US-8-60W POE

EdgeRouter VLAN isolation

In this post I will show you, how to create a VLAN with your EdgeRouter and how to fully isolate it from all your other networks.

The following configuration shows my VLAN setup for IPTV services, since the receivers do not need access to the other networks and an isolated network for IPTV can avoid trouble with multicast/IGMP. You don’t use IPTV? No problem, you could use the config to create a guest network or for other untrusted devices.

I’m using an EdgeRouter X, but this configuration will work on any other EdgeRouter. The general approach should even work on a UniFi router like the USG.

Update (15. February 2018)

I have completely rewritten the firewall configuration guide, since the first version had a substantial flaw: it will cut the access from the VLAN to your LAN, but the VLAN can connect to all router services. So, someone could open an SSH connection to your EdgeRouter and that’s bad.

If you have already followed the old guide, please delete the ruleset and use the new guide to create a proper firewall config.

Network Setup

  • 10.0.0.0/24: home network on eth1
  • 192.168.1.0/24: management LAN for my DSL modem on eth0
  • 10.0.1.0/24: eth2, eth3 and eth4 as switched ports on the EdgeRouter X

My management LAN is connected to the other networks via a custom NAT rule.

The main LAN consists of the three UniFi switches (US-8 and US-8 POE) and two UniFi access points (AP AC Lite). UniFi switches are fully supporting VLANs, so I can terminate a VLAN to any switch port within the network.

Why private class A networks? Well, why not? And I like short IP addresses.

But the management LAN is a private class C network? Yeah, I’m leaving the modem on it’s default network configuration to avoid trouble, if I ever have to reset it’s config. I like to experiment with other firmware versions. Currently I’m trying a firmware for australian ISPs. So far it’s working great and it disables some the VDSL error corrections from my ISP that can cause higher latencies.

Here we go

The IPTV VLAN will be on eth1 with VLAN ID 10 and will be terminated on a UniFi switch in the living room. If you need a guide, how to setup a VLAN on a UniFi switch and to assign it to a switch port, just click here.

Create the VLAN

  1. Go to the dashboard of your EdgeRouter, click on Add Interface and select VLAN:

    Create VLAN

  2. Go to section SERVICES and click Add DHCP server:

    Create VLAN DHCP server

  3. Stay in SERVICES, go to the tab DNS, Add Listen interface and choose the interface of your VLAN:

    Create VLAN DNS forwarding

VLAN 10 is now ready to use, but it’s not isolated from the other networks. The EdgeRouter’s job is to route between networks. A device on VLAN 10 could access the LAN, your NAS for example.

Create network group

  1. Go to FIREWALL/NAT, then to Firewall/NAT Groups and create a new network group:

    Create Network Group

  2. Edit the new network group and add all networks except the VLAN:

    Create Network Group Add Networks

A quick guide to firewall directions

Before you create the firewall rulesets, you should know and understand the firewall ruleset directions:

  • IN: traffic entering the router from an interface
  • OUT: traffic exiting the router to an interface
  • LOCAL: traffic entering the router and destined to router itself (internal services, like DNS, DHCP, VPN etc.)

I will also provide a short explanation for each firewall ruleset and its direction.

If you’re having trouble to understand the directions, there is a very helpful diagram in the Ubiquiti forums.

Create firewall ruleset VLAN10_ISOLATION_IN

The following firewall ruleset blocks traffic into all networks of your network group, but will allow already established connections.

Direction IN means any traffic from eth1.10 to any other of your EdgeRouter’s interfaces.

  1. Go to Firewall Policies and click Add Ruleset:

    Create Firewall Ruleset IN

  2. Edit the new ruleset and setup the interfaces:

    Create Firewall Ruleset IN Interfaces

  3. Add a new firewall rule to allow established and related packets:

    Create Firewall IN Rule 1 Basic

    Create Firewall IN Rule 1 Advanced

  4. Add a new firewall rule to drop packets into network group LAN:

    Create Firewall IN Rule 2 Basic

    Create Firewall IN Rule 2 Advanced

  5. Your firewall ruleset should look like this:

    Create Firewall IN Rules

Create firewall ruleset VLAN10_ISOLATION_LOCAL

This ruleset will block any traffic to your EdgeRouters services, with the exception of DNS and DHCP.

Direction LOCAL means any traffic from eth1.10 directly to your EdgeRouter and its services.

  1. Create another firewall ruleset like VLAN10_ISOLATION_IN:

    Create Firewall Ruleset LOCAL

  2. Edit the new ruleset and setup the interfaces:

    Create Firewall Ruleset LOCAL Interfaces

  3. Add a new firewall rule to allow DNS:

    Create Firewall LOCAL Rule 1 Basic

    Create Firewall LOCAL Rule 1 Advanced

  4. Add a new firewall rule to allow DHCP:

    Create Firewall LOCAL Rule 2 Basic

    Create Firewall LOCAL Rule 2 Advanced

  5. Your firewall ruleset should look like this:

    Create Firewall IN Rules

Optional: assign network groups to custom NAT rules

Edit NAT rule configuration

If you’re using custom NAT rules, you have to add your new network group to the rules to exclude the VLAN. Firewall rules alone will not isolate any networks from custom NAT rules.

That’s it. VLAN 10 is now fully isolated from all other networks. The firewall will drop all packages from eth.10 to the network group and my custom NAT rule will only work from networks of the group.

If you have interest in buying one of the above mentioned devices, please consider to support me through the following Amazon Germany ref links. Thank you!

DrayTek Vigor 130

Ubiquiti EdgeRouter X

Ubiquiti UniFi AP AC Lite

Ubiquiti UniFi US-8

Ubiquiti UniFi US-8-60W POE

Synology DSM and Let's Encrypt Trouble

This is just a quick note to all with problems to create Let’s encrypt certificates with Synology DSM.

I had trouble for months with this. DSM returnd always that port 80 is closed, but my EdgeRouter config said otherwise and content from the Synology web server itself was accessible via port 80. So, no ISP issue either.

After some research, I used acme.sh with a DNS-based challenge on macOS and imported the certificate. Well, it works, but I wanted a real solution.

Again, after a little more than some reseach, I found a valuable hint. In dual-stack configurations with both, real IPv4 and IPv6 addresses, the Synology Let’s Encrypt client uses IPv6 for the challenge. Of course port 80 was only opened for IPv4 connections. I opened the port and … it didn’t work. I’m not sure why, since I am no master of the CLI-based configuration of a router.

Next idea: turn off IPv6 in Synology’s dynamic DNS service. Well, turns out, you can’t configure which protocols the services will use. Turning off IPv6 in the network settings also didn’t help.

The solution: use a dynamic DNS service that can configure the protocols or does not have IPv6 support. After some fiddling around with the list of supported services in DSM, I decided to use NoIP. And? It works, finally!

Why NoIP? Well, some of the supported services websites seemed ancient and frankly, I don’t want to pay money just for creating a new certifacte every 90 days.

Dear Synology devs

If you read this, please consider adding the DNS challenge option. This was proposed multiple times in the Synology forums since you introduced Let’s Encrypt support and it would help in such situations, where port 80 cannot be accessed due to firewall or ISP issues like dual-stack lite. Thank you.

TL;DR

If you’re having trouble with Synology DSM, Let’s Encrypt and port 80 error messages and you’re using a dual-stack connection like me, turn off IPv6 for your dynamic DNS service or try to open your firewall for IPv6 port 80.

Real-world Node.js Performance Improvements

I just updated from Node.js 8.2.1 to 8.4.0 within my current project. The update to V8 6.0 really shines as I noticed some major real-world performance improvements.

So I decided to do some tests with the above mentioned versions and the latest LTS version, 6.11.2.

Testing methodology

The Webpack build contains the following tasks:

  • Building of two stylesheets with SASS and Autoprefixer
  • Transpiling with Babel of a large AngularJS app written in ES2015
  • Copying images and some other static files
  • Chunking into vendor.js and application.js

Each test ran nine times for each Node.js version.

The tests were conducted in dev mode (no minification, no uglification) with a Debian-based Docker container on Windows 10 Pro with HyperV.

Hardware

  • Core i7-7700K (the Docker container had access to all cores)
  • 16 GB RAM (8 GB for the Docker container)
  • PCIe SSD

As you can see, the system has more than enough power and is significantly faster than my MacBook. Docker on HyperV is incredibly fast and a joy to work with.

Results

Node.js performance benckmark

The improvement between version 8.2.1 and 8.4.0 is a bummer. V8 6.0
does a great job. Node.js 6 used Crankshaft as JIT, Node 8.0 to 8.2 used a combinaton of Crankshaft and Turbofan (V8 5.9). As of version 8.3.0 Node.js utilizes only Turbofan with V8 6.0.

About 10% improvement with a minor version is a really big step and I’m really looking forward to the next V8 versions and even more power.

Ubiquiti EdgeRouter X vs. MikroTik hEX

Da ich auch mal Router testen wollte und den EdgeRouter X (ER-X) eh schon besitze, habe ich mir ein vergleichbares Ger├Ąt von MikroTik besorgt, den hEX bzw. den RB350Gr3 (dritte Generation des hEX).

MikroTik ist ein Netzwerkausr├╝ster aus Lettland. Wie Ubiquiti bieten sie professionelle Netzwerk-Hard- und Software zu bezahlbaren Preisen an. Man kann sogar Einzelteile wie Boards, Ports, Geh├Ąuse usw. einzeln kaufen und sich damit seinen Traum-Router zusammenbauen.

Die Kontrahenten

Sie k├Ânnten zwar von au├čen nicht unterschiedlicher sein, ihre inneren Werte sind jedoch sehr vergleichbar. Beide bieten f├╝nf Gigabit-Ports und k├Ânnen an Port 1 ├╝ber 24 V Passive PoE mit Strom versorgt werden. Au├čerdem nutzen beide den gleichen SoC von MediaTek und damit die gleiche CPU: einen 880 MHz MIPS Dual Core (4 Threads). Preislich liegen sie mit ca. 55 - 60 Euro nat├╝rlich auch gleich auf.

Ubiquiti EdgeRouter X

Ubiquiti EdgeRouter X

Putzig, was? Der ER-X ist wirklich klein, aber davon sollte man sich nicht t├Ąuschen lassen. Er bietet f├╝nf v├Âllig frei konfigurierbare Gigabit-Ports. Einmal WAN, einmal LAN und drei Switch-Ports mit separatem Netz? Kein Problem. Zweimal WAN mit automatischem Fail Over? Klar. Reiner Switch-Betrieb? Und ob, auch wenn er alleine daf├╝r zu schade ist.

Auf dem ER-X l├Ąuft eine Linux-Distribution namens EdgeOS, die auch auf allen weiteren EdgeMAX-Ger├Ąten von Ubiquiti eingesetzt wird. Auf Einschr├Ąnkungen im Vergleich zu den gr├Â├čeren Br├╝dern verzichetet man dankenswerterweise.

EdgeOS bietet ein recht umfangreiches Web-Interface mit dem sich viele Aufgaben schnell und einfach erledigen lassen. F├╝r die wichtigsten Standard-Anwendungsf├Ąlle stehen Assistenten (Wizards) bereit. Ein simples Setup f├╝r WAN mit vier LAN-Ports als Switch und PPPoE inkl. Firewall ist damit in einer Minute erledigt. IPv6 wird leider bisher vom Web-Interface kaum unterst├╝tzt, bis auf eine Option in den Wizards f├╝r ein Standard-Setup mit Firewall, das aber ohne weitere manuelle Konfiguration nicht funktioniert, kann es nur noch IPv6-Adressen f├╝r die Interfaces anzeigen.

Alles weitere inkl. der tiefgreifenderen Konfigurationsm├Âglichkeiten muss ├╝ber das CLI erledigt werden. Klingt nun schlimmer als es ist. EdgeOS basiert auf Vyatta, einer Linux-Distribution speziell f├╝r Netzwerkger├Ąte. Vyatta hat ein ├╝bersichtliches, recht einfach zu erlernendes Interface. ├änderungen werden nicht sofort aktiv, erst nach dem man den Befehl commit abschickt werden sie aktiv aber noch nicht gespeichert. Sollte man sich also z.B. mal bei einer Firewall-├änderung aussperren, reicht ein Neustart des ER-X und alles l├Ąuft wie zuvor. Um zu speichern wird der Befehl save genutzt.

Man muss also keine Angst vor dem CLI haben. Kaputt machen kann man nichts, sofern man nicht gleich jede Änderung speichert.

Zus├Ątzlich bietet der EdgeRouter X via CLI zuschaltbare Hardware-Beschleunigung f├╝r NAT und IPsec (aktuell Beta). Lt. eines Mitarbeiters auf Reddit ├╝berlegt Ubiquiti derzeit au├čerdem Deep Packet Inspection (DPI) in Hardware zu unterst├╝tzen – da fehlt wohl noch ein passender Treiber. Damit w├Ąre er fast auf dem Niveau des n├Ąchst gr├Â├čeren Bruders, dem EdgeRouter Lite (ca. 90 - 100 Euro).

MikroTik hEX

MikroTik hEX

Zugegeben, das Geh├Ąuse wirkt im Vergleich zum ER-X etwas billig, es st├Ârt aber auch nicht. Ich habe jedenfalls noch niemanden gesehen, der Router wegen ihres Geh├Ąuse-Designs kauft. Die Metallh├╝lle des ER-X mag Hitze besser ableiten, aber da beide Ger├Ąte nicht sonderlich hei├č werden, spielt das eine untergeordnete Rolle.

Die Ports lassen sich genauso frei konfigurieren wie bei der Konkurrenz. Selbst Port Mirroring in Hardware ist m├Âglich, was meines Wissens nach aktuell beim ER-X nur via Software geht.

Zusammen mit dem hEX kommt eine Lizenz f├╝r RouterOS, MikroTiks Gegenst├╝ck zu EdgeOS. Es kann allerdings auch separat lizenziert und auf x86-Hardware betrieben werden. Wer sich das Web-Interface (WebFig) vorab ansehen m├Âchte, kann das hier tun.

Der hEX kommt wird vorkonfiguriert geliefert: WAN liegt auf Port 1, die restlichen Ports sind dem Switch zugeordnet. Ein DHCP-Server, DNS-Forwarding usw. sind bereits eingerichtet. Assistenten f├╝r andere Konfigurationen gibt es aber nicht. wenn lieber selbst Hand anlegen m├Âchte, besteht beim ersten Login die M├Âglichkeit einfach per Klick alle vordefinierten Einstellungen zur├╝ckzusetzen.

WebFig ist standardm├Ą├čig an LAN-Port 2 ├╝ber die IP-Adresse 192.168.88.1 erreichbar. Alternativ bietet MikroTik mit WinBox ein Windows-Programm, das wie eine Art Wrapper f├╝r WebFig aussieht, sich aber durch Fenster-Unterst├╝tzung innerhalb der Software besser und schneller bedienen l├Ąsst. F├╝r Mac-User gibt es WinBox inkl. Wine als fertiges Bundle – funktioniert bei mir bisher probemlos.

Im Gegensatz zum Web-Interface von EdgeOS kann WebFig alle Funktionen konfigurieren. ├ťber einen Paket-Manager lassen sich au├čerdem weitere M├Âglichkeiten nachr├╝sten, u.A. IPv6, das als inaktives Paket mitgeliefert wird.

Die Oberfl├Ąche erschl├Ągt einen auf den ersten Blick durch die vielen Optionen und ist etwas gew├Âhnungsbed├╝rftig, wenn man vorher nur mit EdgeOS zu tun hatte. Nach ein paar Problemen komme ich aber mit WebFig ziemlich gut klar. Die grunds├Ątzlichen Vorg├Ąnge unterscheiden sich ja nicht. Umgekehrt ist sicherlich auch EdgeOS f├╝r einen MikroTik-Nutzer erstmal sehr ungewohnt.

Das CLI von RouterOS ist ebenso so logisch und einfach strukturiert wie in EdgeOS, auch wenn natürlich die Syntax anders aussieht. Änderungen sind im Gegensatz zu EdgeOS sofort aktiv und werden direkt gespeichert. Um Probleme zu verhindern, bietet RouterOS den Safe Mode für das CLI und WebFig. Darin gemachte Änderungen werden auch sofort umgesetzt, aber erst gespeichert, wenn man das entsprechende Kommando gibt. Im Zweifelsfall reicht ein Neustart und nichts ist passiert.

In Sachen Hardware-Beschleunigung zeigt sich der hEX knausriger als der ER-X, da aktuell nur IPsec unterst├╝tzt wird. Ob da weitere Planungen anstehen, konnte ich leider nicht in Erfahrung bringen. Bleibt die Frage, ob das ├╝berhaupt geht? Offiziell unterst├╝tzt der SoC beider Ger├Ąte nur Hardware-IPsec. Es ist also wahrscheinlich, dass der ER-X zus├Ątzliche Hardware f├╝r NAT und DPI besitzt.

Benchmark

Mein Benchmark-Szenario basiert auf iPerf3 mit einer, zehn und 100 gleichzeitigen TCP-Verbindungen und ist damit eher theoretischer Natur. Einen ausgefeilten Test mit zigtausenden HTTP-Downloads in verschiedenen Gr├Â├čen wie Ars Technica kann ich leider derzeit nicht bieten. Vielleicht sollte ich “routerperf” entwickeln. :D

Der Benchmark fand zwischen meinem PC und dem MacBook Pro statt. Der Windows-Rechner verf├╝gt ├╝ber eine Intel-LAN-Schnittstelle, w├Ąhrend der Mac ├╝ber einen Thunderbolt-Ethernet-Adapter mit dem LAN verbunden war. Sind also beides keine Kr├╝cken.

Als Referenzwerte dienen Durchl├Ąufe an beiden Rechnern, die ├╝ber einen Cisco SoHo-Switch verbunden waren.

In allen anderen Szenarien war der Mac als Server am WAN-Port des jeweiligen Routers und der PC am entsprechenden LAN-Port in einem separaten Netz. Das NAT findet via Masquerading in IPTables statt.

Ergebnis

Benchmark Results

Das Hardware-NAT des ER-X schl├Ągt richtig ein, w├Ąhrend die Leistung ohne Hardware-Unterst├╝tzung ungew├Âhnlich inkonsistent ist. Das volle Potenzial wird erst mit mehreren Verbindungen wirklich genutzt. Der hEX dagegen skaliert in dieser Situation wie man es erwartet.

Da beide die gleiche CPU verwenden ist das Ergebnis bei nur einer Verbindung umso erstaunlicher. Es w├Ąre durchaus m├Âglich, dass es sich hier um einen Bug handelt. Ein ├Ąhnliches Problem gab es im Sommer mit dem UniFi Security Gateway, das auf der Hardware des EdgeRouter Lite basiert.

In der Realit├Ąt d├╝rfte die Differenz zwischen dem hEX und ER-X ein St├╝ck kleiner ausfallen, denn nicht jede Verbindung l├Ąuft ├╝ber TCP und die Paketgr├Â├če hat hier auch ein St├╝ck mitzureden.

Fazit

Ich bin mit beiden Ger├Ąten sehr zufrieden. F├╝r knapp 60 Euro bekommt man in beiden F├Ąllen ein ├╝berzeugendes Produkt, das auch gehobenen Anspr├╝chen im Heimnetz mehr als gerecht wird.

Nur wer sich gl├╝cklich sch├Ątzen kann eine Gigabit-Internetverbindung zu besitzen, d├╝rfte mit dem ER-X die schlauere Wahl treffen – auch wenn in der Realit├Ąt der Unterschied geringer ausfallen wird. Ganz nebenbei: der hEX hat nat├╝rlich auch gr├Â├čere Br├╝der.

Letztendlich d├╝rfte es f├╝r die meisten von uns eine reine Geschmacksfrage sein. Ich werde beide im Wechsel einsetzen und die Entwicklung beobachten. Da beide praktischerweise 24 V Passive PoE unterst├╝tzen, lassen sie sich sehr einfach tauschen. Kabel bei einem abstecken, beim anderen anstecken – fertig.

Wer Interesse daran hat den hEX oder den EdgeRouter X zu kaufen und mich unterst├╝tzen m├Âchte, kann folgende Amazon-Links benutzen. Vielen Dank!

MikroTik hEX (RB350Gr3)

Ubiquiti EdgeRouter X

Adios, Kabel-Internet (Update)

Zum Nachtrag vom 13.1.2017

Wie im Guide zum Vigor 130 bzw. EdgeRouter X schon angedeutet, bin ich von meiner bisherigen Vodafone/Kabel Deutschland-Verbindung zur Telekom mit VDSL 100 gewechselt.

Damit halbiert sich mein Downstream, da Vodafone hier 200 Mbit/s anbietet und VDSL mit Vectoring bekanntlich nur max. 100 Mbit/s hergibt. Als Trostpflaster gibt’s aber immerhin 15 Mbit/s mehr Upstream.

F├╝r Entscheidung war das aber alles zweitranging. In den letzten Monaten gab es immer mehr Probleme mit der Kabel-Verbindung, sei’s durch merkw├╝rdiges Verhalten der Fritzbox 6490, zunehmender Last im Kabelsegment oder mit Routing/Peering der Kabel-Infrastruktur.

Gerade letzteres habe ich eigentlich erst richtig gemerkt, als der Vergleich zur Telekom m├Âglich war.

Die Symptome:

  • Als der Anschluss auf 200 Mbit/s geschaltet wurde, waren stabile Downloadraten von 23 - 25 MB/s in Steam die Regel. Inzwischen sind sie nur noch die Ausnahme und nur au├čerhalb der Hauptlastzeiten m├Âglich. Gilt nicht nur f├╝r Steam, generell f├╝r alle Downloads.

  • Wenn Steam die Bandbreite nicht auslasten kann, ├Âffnet es zus├Ątzliche TCP-Verbindungen. K├Ânnen schon mal an die 50 - 70 St├╝ck sein. Ab dem Punkt steigt die Fritzbox langsam aus, weil sie mit NAT nicht mehr hinterher kommt. Ping-Zeiten steigen deutlich an, Surfen nebenbei macht keinen Spa├č mehr … der EdgeRouter X l├Ąchelt dank Hardware-NAT nur m├╝de.

  • Teils massive Probleme mit Ping-Zeiten und Packet Loss in Battlefield 1, manchmal v├Âllig unspielbar. Lag f├╝r mich immer an EA, bis ich ein paar Runden via VDSL gespielt habe …

  • Apple Music war richtig lahm, Streaming von Filmen aus dem iTunes Store war auf PC und Mac ein Graus bis unbrauchbar, Downloads im App Store waren mal pfeilschnell, dann wieder unglaublich langsam usw. – hatte ich alles auf Apple geschoben, aber wie schon bei Battlefield 1 lag’s an Vodafone. Gleiches gilt auch f├╝r teils extrem langsam Downloads aus dem PlayStattion Network.

  • Ich schaue gerne die Reviews von SF Debris, es war aber zunehmend schwer sich die Videos ├╝berhaupt anzusehen. Die Seite l├Ądt im Vodafone-Netz extrem lahm und die Videos brauchen gef├╝hlte Ewigkeit, bis mal ein bisschen matschiges 240p zu sehen ist. ├ťber die Telekom starten die Videos sofort – in HD.

  • Vermehrt Probleme mit YouTube, manchmal so schlimm, dass selbst Videos in SD nicht mehr fl├╝ssig liefen.

  • Starke Schwankungen bei den Ping-Zeiten, auch ohne Last.

Ein Vergleich:

Vodafone

~ ÔŁ»ÔŁ»ÔŁ» ping -c 100 google.de
PING google.de (172.217.21.195): 56 data bytes
64 bytes from 172.217.21.195: icmp_seq=0 ttl=53 time=21.271 ms
...
64 bytes from 172.217.21.195: icmp_seq=99 ttl=53 time=28.892 ms

--- google.de ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 19.163/30.845/111.265/15.526 ms

Telekom

~ ÔŁ»ÔŁ»ÔŁ» ping -c 100 google.de
PING google.de (172.217.21.163): 56 data bytes
64 bytes from 172.217.21.163: icmp_seq=0 ttl=57 time=21.731 ms
...
64 bytes from 172.217.21.163: icmp_seq=99 ttl=57 time=21.594 ms

--- google.de ping statistics ---
100 packets transmitted, 100 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 21.482/21.760/22.146/0.156 ms

Mit IPv6 schaut’s f├╝r Vodafone sogar noch etwas schlechter aus.

Diese Ping-Messungen habe ich an einem fr├╝hen Nachmittag ausgef├╝hrt, also sollte sich die Last im Segmet bzw. Netz doch in Grenzen gehalten haben.

Meine Diagnose:

  1. Die Fritzbox 6490 mag f├╝r Normalnutzer okay sein, aber nicht f├╝r mich. Den Bridge-Modus l├Ąsst Vodafone leider durch Einschnitte in FritzOS nicht mehr zu und ein reines Kabelmodem f├╝r EURODOCSIS 3.0 zu finden ist ein Ding der Unm├Âglichkeit.

  2. Mein zust├Ąndiges Kabel-Segment wird zunehmend ├╝berlastet. Fr├╝her war ich hier der einzige weit und breit mit einer Internet-Verbindung ├╝ber Kabel. Da es zumindest bis Dezember 2016 auch keine Alternativen f├╝r anst├Ąndige Bandbreiten gab, geht in dem Segment nun zunehmend die Post ab.

  3. Das interne Routing von Vodafone geht z.T. ├╝ber sehr viele Hops, sowohl mit IPv4 als auch IPv6. Das ist grunds├Ątzlich nicht weiter schlimm, aber es erh├Âht die Anf├Ąlligkeit f├╝r Fehler und Packet Loss.

  4. Der vermutlich schwerwiegendste Punkt: das Peering in andere Netze ist z.T. eine Katastrophe. Alle og. Probleme mit den Servern von Apple, EA, Google/YouTube, Sony usw. liegen daran. ├ťber den Punkt kann ich nicht mehr hinwegsehen. Bandbreiten und Ping-Schwankungen sind eine Sache, aber wenn ich f├╝r mich wichtige Dienste nicht mehr richtig nutzen kann, ist der Ofen wirklich aus.

Kabel Deutschland bzw. jetzt Vodafone hatte ich fast acht Jahre ohne gr├Â├čere Probleme, aber da ich auch beruflich auf die Internetverbindung angewiesen bin, muss ich an der Stelle den Stecker ziehen.

Vodafone wird mit Sicherheit an den Problemen arbeiten – dauert halt. Eine Segment-Aufteilung kann sich ├╝ber mehrere Monate bis ein Jahr ziehen. Internes Routing l├Ąsst sich auch nicht von heute auf morgen verbessern, ebenso das Peering.

Man hat es hier mit den Angeboten f├╝r 200 Mbit/s bzw. in vielen Haushalten auch schon 400 Mbit/s wohl ├╝bertrieben ohne die Infrastruktur dahinter auszubauen.

Zumindest im Mobilfunk-Bereich hat Vodafone in den letzten Jahren einiges deutlich verbessert. Schaffen sie im Kabelnetz hoffentlich auch noch. Konkurrenz belebt das Gesch├Ąft.

Solange bin ich aber wieder Telekom-Kunde. VDSL mit Vectoring ist nur eine ├ťbergangsl├Âsung bis FTTH im gro├čen Stil kommt, aber bin nicht mehr auf ein Shared Medium wie Kabel angewiesen und ab dem MSAN h├Ąngt man im BNG, dem neuen, verdammt flotten Backbone-Netz der Telekom.

Au├čerdem kann ich meine Wunsch-Hardware nutzen, auch wenn es nicht viele Vectoring-taugliche DSL-Modems da drau├čen gibt.

F├╝r die meisten tut’s der ├╝bliche Speedport, der mir zumindest in seinem Verhalten unter Last besser gef├Ąllt als die Fritzbox. Der Vergleich hinkt nat├╝rlich etwas, da die Fritte deutlich mehr kann.

In Sachen WLAN sind sie beide ziemlich meh, besonders im Vergleich zu meinen fr├╝heren AirPorts oder jetzt UniFi Access Points – ist nat├╝rlich wieder unfair. Gibt weit teurere Consumer-Ger├Ąte, die viel schlimmer sind, siehe Ars Technica.

Nachtrag vom 13.1.2017:

Nach diesem Bericht von Golem ist mir dann auch klar, warum ich die Probleme mit Vodafone hatte. Traffic Shaping verz├Âgert oder verwirft Pakete einfach, je nach Konfiguration bzw. Last. Das erkl├Ąrt die schwankenden Ping-Zeiten, den Packet Loss in Spielen, die inkonsistenten Download-Raten usw.

Es ist zwar logisch, dass Vodafone QoS einsetzt, damit das Netz nicht komplett zum Teufel geht. Man kann aber nicht einfach den Backbone-Ausbau verschlafen oder gar sogar absichtlich verz├Âgern, w├Ąhrend man den Kabel-Kunden immer mehr Bandbreite anbietet und die DSL-Kunden ins Kabelnetz lockt bzw. mancherorts wohl sogar dr├Ąngt.

Webpack 2 with Pug and SASS

Until now I used some Gulp tasks with Jade and SASS to create the HTML and CSS files as a base for the webcodr blog theme. A crude little setup, but it worked.

I decided to write an replacement with Webpack 2 and to share it with you: WebCodr/design GitHub repo

First steps

The original setup used the identend SASS syntax and Jade templates. Since the indented syntax is more trouble than it’s worth, I had to convert to the SCSS syntax, a superset of the CSS syntax.

Unfortunately there was a copyright claim for “Jade” and they had to rename the project to Pug. The Jade Node module is still available but unmaintained. It’s time to use Pug.

SASS to SCSS

Don’t worry, that’s quite simple. The SASS people provide a tool called sass-convert and it’s really easy to use:

sass-convert --from=sass --to=scss -R assets/styles/

Just pass the tool the format you want to convert, the new format, -R for recursive conversion and add the directory name. After sass-convert finished, you find the new SCSS files along with their SASS predecessors. You can now delete the old SASS files, adjust your build tool and you’re done.

Jade to Pug

It depends on your templates how easy or complicated this step is. My template files are rather simple, so just renaming the file extensions from .jade to .pug and using Pug instead of Jade did the job. If you are having trouble, there is a migration guide from Jade to Pug.

Using Webpack 2

Webpack 2 isn`t finished yet. The current version is 2.2.0 RC3, but even the Beta version were stable enough to use it for production purposes.

Here’s my package.json file with all necessary modules:

{
  "name": "WebCodr_Design",
  "version": "2.0.0",
  "scripts": {
    "server": "webpack-dev-server",
    "dist": "webpack --config webpack.config.prod.babel.js"
  },
  "dependencies": {},
  "devDependencies": {
    "autoprefixer": "^6.6.1",
    "babel-core": "^6.21.0",
    "babel-preset-es2015": "^6.18.0",
    "css-loader": "^0.26.1",
    "csso-loader": "^0.2.1",
    "extract-text-webpack-plugin": "^2.0.0-beta.4",
    "html-loader": "^0.4.4",
    "node-sass": "^4.1.1",
    "postcss-loader": "^1.2.1",
    "pug": "^2.0.0-beta6",
    "pug-html-loader": "^1.0.10",
    "sanitize.css": "^4.1.0",
    "sass-loader": "^4.1.1",
    "webpack": "2.2.0-rc.3",
    "webpack-dev-server": "2.2.0-rc.0"
  }
}

I wrote two little helper scripts to run a dev server on port 8080 and to build a production version of the assets, mainly the CSS file. Currently there is no JavaScript file for webcodr. But it would be really easy to add JavaScript to the Webpack config.

The Webpack config or where the magic happens

I can’t stand the old JavaScript syntax anymore, so I write all my stuff in ES2015 and that’s why Babel is present in the dev dependencies.

import webpack from 'webpack'
import path from 'path'
import autoprefixer from 'autoprefixer'
import ExtractTextPlugin from 'extract-text-webpack-plugin'

let extractStyles = new ExtractTextPlugin('[name].css')
let extractHtml = new ExtractTextPlugin('[name].html')

let config = {
  stats: {
    assets: false,
    colors: true,
    version: false,
    hash: true,
    timings: true,
    chunks: false,
    chunkModules: false
  },
  entry: {
    index: [
      path.resolve(__dirname, 'templates/index.pug')
    ],
    post: [
      path.resolve(__dirname, 'templates/post.pug')
    ],    
    'css/application': [
      path.resolve(__dirname, 'assets/styles/application.scss')
    ]
  },
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: '[name].js'
  },
  module: {
    rules: [
      {
        test: /\.pug$/,
        loader: extractHtml.extract({
          loader: ['html-loader', 'pug-html-loader?pretty&exports=false']
        })
      },
      {
        test: /\.scss$/,
        loader: extractStyles.extract({
          loader: [
            {
              loader: 'css-loader'
            },
            {
              loader: 'postcss-loader'
            },
            {
              loader: 'sass-loader'
            }
          ]
        })
      }
    ]
  },
  plugins: [
    new webpack.LoaderOptionsPlugin({
      minimize: false,
      debug: true,
      options: {
        postcss: [
          autoprefixer({
            browsers: ['last 2 version', 'Explorer >= 10', 'Android >= 4']
          })
        ],
        sassLoader: {
          includePaths: [
            path.resolve(__dirname, 'node_modules/sanitize.css/')
          ]
        }
      }
    }),
    extractStyles,
    extractHtml
  ]
}

export default config

Explanations:

  • stats: Webpack 2 is really verbose, this options will help to make it shut up. ;)

  • entry: I defined three entry points for Webpack. Two for Pug files and one for my SCSS file. The property name is the filename for saving the finished file and the array item points to the source file.

  • output: Defines where to put the files and how to name them.

  • module: The module rules tell Webpack what to do with different file extensions. Since Webpack 2 is JavaScript module bundler it creates JavaScript files and we have to use a plug-in to get HTML and CSS files. The extract text plug-in looks for the content of the defined loaders and extracts it into the file you want.

    To convert Pug into HTML I had to use the Pug HTML loader and the HTML loader. The extract text plug-in now knows what to extract of the generated JavaScript files.

    The same goes for SASS. The SASS loader converts SASS into CSS, after that the PostCSS loader applies the Autoprefixer and finally the CSS loader tells the extract text plug-in what to do.

  • plugins: webpack.LoaderOptionsPlugin contains the loader config for Webpack 1 loaders. Webpack 2 compatible loaders can be configured directly with the loader definition. As you can see, PostCSS loader and SASS loader are not compatible with Webpack 2 yet.

    After the configuration of the legacy loaders, I just had to add the extraction plug-in instances and that’s it.

When Webpack is started, it will iterate through the entry points and apply the appropriate rules based on the regular expressions in the property test. Each rule applies the loaders in reverse order, so the last loader will be applied first. The loaders itself obtain their configs from the query as the Pug HTML loader does or the from the loader options plug-in, only the extract text plug-in is an exception as it needs two configurations: the loaders and where to put the extracted content.

After Webpack is finished, the files are located in the output directory. There are two files for each entry point: a HTML or CSS file and JavaScript file. As mentioned above, Webpack 2 is a JavaScript module bundler and can only create JavaScript files without help from plug-ins. Without extraction, this JavaScript files would contain the HTML or CSS code as a Webpack runtime module and could be used within JavaScript.

You could now open one of the HTML files in your browser, but there’s a better way. You would have to manually start Webpack for each change to make … meh.

yarn run server

This will start the Webpack Dev Server on Port 8080. It watches for changes and re-builds all affected files. You just have to reload the browser tab. Not comfy enough? There is a possibility of auto-reloading and even hot JavaScript module replacement which will be explored in a future blog post.

Adding JavaScript support

What do you think? Is it complicated to create JavaScript files with a JavaScript module bundler? Of course not!

Add the following rule to your config:

{
  test: /\.js$/,
  exclude: /node_modules\/*/,
  use: ['babel-loader'],
  options: {
    presets: [
      ['es2015']
    ]
  }
}

Any entry point with JavaScript files will be processed with Babel for ES2015 support. Pretty neat, huh?

Need ES2016 or ES2017? No problem, just add a suitable Babel preset with npm or yarn to your project and adjust the config.

You’re using TypeScript or CoffeeScript? No problem, just look for a compatible loader.

Conclusion

Some say Webpack is too complicated. Well, it can be quite confusing if you’re just using it without knowledge what it really does, but it’s no rocket science.

I used Webpack to replace a rather large and complex collection of Gulp tasks to build the assets for the website of a customer. For certain things like SVG sprite maps I still use Gulp, but all other tasks are done by Webpack faster and way more easy, especially things like hashes in filenames for production purposes or automatically splitting the main JavaScript file into an application file and a vendor file with certain libraries/frameworks like AngularJS.

The same goes for Karma to run the Jasmine tests. Just add the Webpack plug-in for Karma, make some small adjustments to the Webpack config, let Webpack handle the rest and you’re done.

Compared to the old Gulp tasks, the Webpack setup is easier to understand, faster and much more fun to use. New team members have not to dig into a bunch of Gulp tasks and related helper methods. A quick introduction to the Webpack config is mostly enough to understand how it works.

If you have about 1,000 lines of code with Gulp tasks and helper functions or some really small tasks and a about 150 lines of Webpack config, what do you prefer?

TL;DR

Use Webpack 2, it’s awesome. :P

VDSL via Vigor 130 und EdgeRouter X

Meine Fritzbox 6490 ging mir ja schon l├Ąnger auf den Zeiger, aber seit ca. acht Wochen geht auch die Verbindung von Vodafone bzw. Kabel Deutschland zunehmend zum Teufel. Passenderweise hat die Telekom hier vor ein paar Wochen den VDSL-Ausbau inkl. Vectoring abgeschlossen. Seit dem 4.1. steht die Leitung und ich bin bisher ├Ąu├čerst angetan. Es halbiert sich zwar die Bandbreite auf 100 Mbit/s down (daf├╝r gibt’s 40 statt 25 Mbit/s up), daf├╝r ist die Leitung wesentlich stabiler. Genauers dazu schreibe ich in einem separaten Blog-Post in K├╝rze. Genaueres dazu hier.

Bisheriges Netzwerk

Die Internet-Verbindung wird ├╝ber die Fritzbox 6490 aufgebaut, die sonst au├čer VoIP nichts tut. An der Fritte h├Ąngt ein Ubiquiti EdgeRouter X, der dann das eigentliche Netzwerk aufbaut. Das Netz verteilt sich vom Wohnzimmer aus ├╝ber drei SoHo-Switches von Cisco und zwei Ubiquiti UniFi AC Lite Access Points an die jeweiligen Endger├Ąte.

Diese Konstellation f├╝hrt zu doppeltem NAT. H├Ąsslich, aber auch nicht weiter tragisch. Der EdgeRouter X kann Hardware-NAT und kostet h├Âchstens 400 - 500 ┬Ás. Ein geringer Aufpreis f├╝r wesentlich mehr Kontrolle ├╝ber mein Netzwerk. Nur die IPv6-Konfiguration zwischen Fritbox und EdgeRouter wollte einfach nicht klappen – diese unendliche Geschichte will ich hier aber nicht weiter ausbreiten, hat sich eh erledigt.

Neues Netzwerk

Mit VDSL sieht die Sache nat├╝rlich etwas anders aus. Der Telefonanschluss ist im Flur, also mussten erstmal Kabel gelegt werden … bei dem Thema sind Mietwohnungen dezent schei├če. Von Kabelkan├Ąlen hatte zum Bauzeitpunkt kein Mensch was geh├Ârt.

Zum Testen der Verbindung kam erstmal ein Speedport 724 V von der Telekom zum Einsatz. Klingt doof? So ├╝bel ist die Kiste gar nicht, allerdings ging’s auch nur mit doppeltem NAT, weil die Speedports leider keinen Modem-Betrieb mehr k├Ânnen und generell ist mein Nutzungsprofil doch etwas anspruchsvoller. Daher habe ich einen Vigor 130 von DrayTek gekauft und als Vectoring-taugliches VDSL-Modem im Einsatz. Der EdgeRouter wird nun einfach per PPPoE ├╝ber den Vigor versorgt.

Konfiguration

Kommen wir zum Herzst├╝ck des Posts, denn die Konfiguration ist zwar grunds├Ątzlich einfach, hat aber auch ein paar T├╝cken – insbesondere wenn IPv6 im Spiel ist.

DrayTek Vigor 130

Der gute Vigor wird bereits als Modem inkl. VLAN-Tagging f├╝r die Telekom vorkonfiguriert geliefert. Man muss eigentlich nur die neueste Firmware einspielen und das war’s.

Falls der Vigor wider erwarten doch nicht als Modem vorkonfiguriert geliefert wird, findet bei iDomiX Hilfe (Text und Video).

Ubiquiti EdgeRouter

Ausgangsbasis ist der EdgeRouter X mit EdgeOS 1.9.1. Es sollte grunds├Ątzlich genauso mit einem gr├Â├čeren EdgeRouter und neueren EdgeOS-Versionen funktionieren.

Netzwerk-Setup

Ich gehe hierbei davon aus, dass jemand, der diesen Post liest zumindest Grundkenntnisse im Umgang eines EdgeRouters hat, also Default-IP, Default-Login-Daten, Web-Interface-Zugang usw.

F├╝r die grunds├Ątzliche Konfiguration bietet Ubiquiti zum Gl├╝ck entsprechende Assistenten (Wizards) an, die den ganzen Vorgang vereinfachen und mir auch ersparen hier monstr├Âse Listings mit Firewall-Regeln zu posten.

Der Wizard “Basic Setup” macht grunds├Ątzlich alles, was man braucht:

EdgeRouter Screenshot 1

Als WAN-Port habe ich mich f├╝r eth0 entschieden. Die Einwahl erfolgt ├╝ber PPPoE mit den entsprechenden Login-Daten der Telekom. VLAN-Tagging ist hier nicht n├Âtig, das ├╝bernimmt der Vigor bereits (VLAN 7). Die Default-Firewall sollte auf jeden Fall aktiviert werden, genauso wie DHCPv6 PD. Die Prefix Length ist mit /56 bereits korrekt voreingestellt und auch hier gilt, dass die Firewall an sein sollte.

Die Option “Only use one LAN” wird deaktiviert. Anschlie├čed wird das Netz f├╝r eth1 konfiguriert. Ich nutze hier ein privates Klasse A-Netz. F├╝r die Switching-Ports eth2, eth3 und eth4 gibt es ein separates Klasse A-Netz.

Unter “User Setup” verwende ich meine bestehenden User weiter. Sollte der EdgeRouter bisher nie konfiguriert worden sein, empfehle ich aber dringend einen neuen Nutzer mit eigenem Passwort anzulegen. Ein Router sollte nie ├╝ber seine Standard-Zugangsdaten zug├Ąnglich sein.

Nach dem Speichern startet sich der EdgeRouter neu und ist anschlie├čend ├╝ber die IP 10.0.0.1 an eth1 wieder erreichbar. Im Dashboard sollte nun relativ bald unter pppoe0 die ├Âffentliche IPv4-Adresse sichtbar sein und damit auch die Internet-Verbindung bestehen.

Grunds├Ątzlich ist’s damit getan, wenn einem IPv4 ausreicht.

F├╝r mein privates Netzwerk nehme ich anschlie├čend noch ein paar Einstellungen an der Firewall vor (Port-Weiterleitungen) und am DHCP-Server vor. Wenn man zufrieden ist, sollte man ein Backup der Konfiguration machen. Das geht unter “System” -> “Back Up Config”.

IPv6

Leider unterst├╝tzt das Web-Interface bisher kaum IPv6, daher muss man ein paar Einstellungen via CLI vornehmen.

Unter macOS und Linux ist das einfach im Terminal im SSH m├Âglich. Unter Windows bleibt einem aktuell nur das Linux Subsystem von Windows 10 oder ein SSH-Client wie PuTTY.

Beispiel:

ssh [email protected]

Anschlie├čend wird nach dem Passwort des Users gefragt.

Bei mir sieht die Sache so aus (Login ├╝ber SSH-Alias mit Key):

~ ÔŁ»ÔŁ»ÔŁ» ssh edge                                                                                                                              
Welcome to EdgeOS

By logging in, accessing, or using the Ubiquiti product, you
acknowledge that you have read and understood the Ubiquiti
License Agreement (available in the Web UI at, by default,
http://192.168.1.1) and agree to be bound by its terms.

Linux 3.10.14-UBNT #1 SMP Mon Nov 14 03:56:39 PST 2016 mips
Welcome to EdgeOS
[email protected]:~$

Damit ist nun das CLI des EdgeRouters offen und man kann loslegen.

Folgendes muss eingegeben werden:

configure

set interfaces ethernet eth1 ipv6 dup-addr-detect-transmits 1
set interfaces ethernet eth0 pppoe 0 dhcpv6-pd pd 0 interface eth1 host-address '::dead:beef'
set interfaces ethernet eth0 pppoe 0 dhcpv6-pd pd 0 interface eth1 no-dns
set interfaces ethernet eth0 pppoe 0 dhcpv6-pd pd 0 interface eth1 prefix-id 42
set interfaces ethernet eth0 pppoe 0 dhcpv6-pd pd 0 interface eth1 service slaac
set interfaces ethernet eth0 pppoe 0 dhcpv6-pd pd 0 prefix-length 56
set interfaces ethernet eth0 pppoe 0 dhcpv6-pd prefix-only
set interfaces ethernet eth0 pppoe 0 dhcpv6-pd rapid-commit enable
set interfaces ethernet eth0 pppoe 0 ipv6 address autoconf
set interfaces ethernet eth0 pppoe 0 ipv6 dup-addr-detect-transmits 1
set interfaces ethernet eth0 pppoe 0 ipv6 enable
set system offload hwnat enable
commit
save

Erl├Ąuterungen:

  • configure startet das Konfiguration-System von EdgeOS/Vyatta
  • set interfaces ethernet eth1 ipv6 dup-addr-detect-transmits 1 legt die Anzahl fest, wie oft versucht wird doppelte IPv6-Addressen herauszufinden
  • set interfaces ethernet eth0 pppoe 0 dhcpv6-pd pd 0 interface eth1 host-address '::dead:beef' legt die Host-Adresse nach dem Adress-Prefix der Telekom fest. Ich finde ::dead:beef ziemlich witzig, aber hier kann sich jeder selbst austoben, solange es im Hexadezimal-Bereich liegt.
  • set interfaces ethernet eth0 pppoe 0 dhcpv6-pd pd 0 interface eth1 prefix-id 42 legt die Prefix-ID fest, die zus├Ątzlich in die Adresse aufgenommen wird. Was au├čer 42 sollte es sonst sein? :D
  • set interfaces ethernet eth0 pppoe 0 dhcpv6-pd pd 0 interface eth1 service slaac SLAAC steht f├╝r Stateless Address Autoconfiguration – damit erzeugt der Port seine IP-Adresse anhand des Prefixes selbst
  • set interfaces ethernet eth0 pppoe 0 ipv6 address autoconf aktiviert die automatische IPv6-Adress-Konfiguration f├╝r das PPPoE-Interface
  • set interfaces ethernet eth0 pppoe 0 ipv6 enable aktiviert dann letztendlich IPv6
  • set system offload hwnat enable aktiviert Hardware-NAT f├╝r IPv4
  • commit wendet die neue Konfiguration an
  • save speichert die neue Konfiguration ab

Nach commit starten sich die betroffenen Interfaces neu und es erfolgt eine neue Einwahl ├╝ber PPPoE. Anschlie├čend befinden sich im Dashboard unter pppoe0 die IPv4-Adresse sowie die entsprechenden globalen und lokalen IPv6-Adressen.

Alternativ l├Ąsst sich das via CLI anschauen (au├čerhalb von configure):

[email protected]:~$ show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface    IP Address                        S/L  Description
---------    ----------                        ---  -----------
...
eth1         10.0.0.1/24                       u/u  Local 2
             2003:xxxx:xxxx:xx42::dead:beef/64
...

Alle Ger├Ąte im Netzwerk sollten nun eine oder mehrere IPv6-Adressen besitzen und via IPv6 ins Internet kommen. Das l├Ąsst sich sehr einfach ├╝ber die Seite ipv6-test.com herausfinden.

Zugang zum Vigor-Web-Interface

Da der Vigor auf der IP-Adresse 192.168.1.1 rumh├Ąngt, kommen wir nun leider erstmal nicht an sein Web-Interface ran. Das l├Ąsst sich aber recht einfach in EdgeOS ├Ąndern:

Dazu muss eth0 (├╝ber diesen Port der EdgeRouter ja am Vigor 130) eine IP-Adresse aus Netz des Vigors zugewiesen werden. Ich verwende hier 192.168.1.2/24.

EdgeRouter Screenshot 2

Das alleine reicht noch nicht, da die NAT bisher die Verbindung in das andere Netz nicht kennt. Unter “Firewall/NAT” -> “NAT” -> “Add Source NAT Rule”, tr├Ągt man daher folgendes ein und speichert.

EdgeRouter Screenshot 3

Anschlie├čend sollte der Zugriff ├╝ber die IP-Adresse 192.168.1.1 auf den Vigor sofort funktionieren.

So, das war’s dann eigentlich schon. Ich hoffe, diese kleine Anleitung konnte dem ein oder anderen etwas weiterhelfen.

Da nicht alles davon auf meinem Mist gewachsen ist, m├Âchte mich an dieser Stelle noch beim Autor des Blogs TauSys bedanken. Falls jemand in og. Konfiguration noch Entertain miteinbeziehen m├Âchte, sei ihm dieser Post w├Ąrmstens empfohlen.

Wer Interesse daran hat den Vigor 130 oder den EdgeRouter X zu kaufen und mich unterst├╝tzen m├Âchte, kann folgende Amazon-Links benutzen. Vielen Dank!

DrayTek Vigor 130

Ubiquiti EdgeRouter X