Min router har kraschat ett antal gånger på sistone, så jag tänkte jag skulle prova att använda mig av en pyttedator för att skyffla data mellan mig och det stora, läskiga internetet. Jag kan ha sett till att ha en Tinkerboard S tillgänglig, tillsammans med ett no-name USB-baserat nätverkskort. För att göra livet lite svårare ville jag även testa att sätta upp en brandvägg med hjälp av nftables då det ändå är Framtiden(tm).

TL;DR, en Tinkerboard S är helt överdimensionerad uppgiften att skyffla data givet mina väldigt enkla brandväggsregler och överföringshastigheter i allmänhet. Köp en om du behöver den, den kostar bara några hundra kronor!

Hårdvara

Jag är rätt säker på att det här skulle funka lika bra på den ursprungliga modellen av Tinkerboard, den jag använder har lite eMMC-minne jag använder till systemdisken.

Mjukvara

  • Armbian (senaste uppdateringen)
  • Kernel 4.14.52 (enda tillgängliga version i skrivande stund)
  • nftables v0.7 (det som gick att installera)

Jag är inte helt förtjust i Armbian men har inte orkat få igång någon annan distribution på denna hårdvara än. Syftet med hela experimentet var att det skulle gå snabbt att få igång.

Konfiguration

Börja med att klura ut vad ditt externa nätverkskort får för enhetsnamn, detta kan exempelvis göras genom att först köra nedan utan det externa nätverkskortet inkopplat och en gång med. I utskriften nedan har jag det externa kortet inkopplat:

tinkergate:~# ls /sys/class/net/
dummy0  enx00e04c68028f  eth1  ip6tnl0  lo  sit0  wlan0

Enhetsnamnet som var aktuellt för mig var enx00e04c68028f.

nftables.conf

Baserat på ditt enhetsnamnet från ovan och hur du vill koppla in utrustningen, anpassa konfigurationsfilen nedan. Jag låter främlingar ansluta till min dator över ssh, mosh, http och https men om du är lite petigare så bör du anpassa tcp_accepted samt udp_accepted nedan, och glöm inte att ta bort portforwarden nedan om du inte vill ha den!

#!/usr/bin/nft -f

# WAN till externa kortet, LAN till det inbyggda
define wan = enx00e04c68028f
define lan = eth1

# En maskin som får en port forwardad
define amarillo = 192.168.0.10

flush ruleset

table inet filter {
  # Portar vi släpper in till brandväggen utifrån.
  set tcp_accepted {
    type inet_service; flags interval;
    elements = {
      ssh,
      http,
      https
    }
  }

  set udp_accepted {
    type inet_service; flags interval;
    elements = {
      60000-61000, # mosh
    }
  }

  chain base_checks {
    ct state { established, related } accept
    ct state invalid drop
  }

  chain input {
    type filter hook input priority 0; policy drop;

    jump base_checks

    iifname { lo, $lan } accept

    ip protocol icmp icmp type { echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable } accept

    # Acceptera tjänsterna definierade ovan
    tcp dport @tcp_accepted accept
    udp dport @udp_accepted accept

    reject with icmpx type port-unreachable
  }

  chain forward {
    type filter hook forward priority 0; policy drop;

    jump base_checks

    iifname { lo, $lan } accept

    # Utan denna regel får du ingen trafik till amarillo
    ip daddr $amarillo ct status dnat accept
  }

  # Vi är snälla och tillåter all trafik utåt
  chain output {
    type filter hook output priority 0; policy accept;
  }
}

table ip nat {
  chain prerouting {
    type nat hook prerouting priority -100;

    # Skicka port 12345 till amarillo
    tcp dport 12345 dnat $amarillo comment "gimme foobar plz"
  }

  chain postrouting {
    type nat hook postrouting priority 100;
    oifname $wan masquerade;
  }
}

Prestandatester

Jag har verkligen inte testat det här på något värdigt sätt, men nedan är lite anekdotisk bevisföring och data som lätt skulle kunna misstas för testdata.

Värt att notera är att jag sitter på 250 Mbit upp/ner på Bredbandsbolaget/Telenor.

iperf3 externt

10 simultana koppel, testat mot speedtest.serverius.net. Anropet jag använde för upp- och nerlänk:

# Reverse mode, dvs servern skickar och min klient tar emot
iperf3 -c speedtest.serverius.net -p 5002 -P 10 -4 -R -t 120

# Min klient skickar, servern tar emot
iperf3 -c speedtest.serverius.net -p 5002 -P 10 -4 -t 120

Upplänk

Inga konstigheter.

[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-120.00 sec   364 MBytes  25.5 Mbits/sec  262             sender
[  4]   0.00-120.00 sec   364 MBytes  25.5 Mbits/sec                  receiver
[  6]   0.00-120.00 sec   398 MBytes  27.8 Mbits/sec  275             sender
[  6]   0.00-120.00 sec   398 MBytes  27.8 Mbits/sec                  receiver
[  8]   0.00-120.00 sec   400 MBytes  27.9 Mbits/sec  265             sender
[  8]   0.00-120.00 sec   399 MBytes  27.9 Mbits/sec                  receiver
[ 10]   0.00-120.00 sec   354 MBytes  24.7 Mbits/sec  261             sender
[ 10]   0.00-120.00 sec   353 MBytes  24.7 Mbits/sec                  receiver
[ 12]   0.00-120.00 sec   312 MBytes  21.8 Mbits/sec  240             sender
[ 12]   0.00-120.00 sec   312 MBytes  21.8 Mbits/sec                  receiver
[ 14]   0.00-120.00 sec   390 MBytes  27.3 Mbits/sec  264             sender
[ 14]   0.00-120.00 sec   390 MBytes  27.3 Mbits/sec                  receiver
[ 16]   0.00-120.00 sec   353 MBytes  24.6 Mbits/sec  261             sender
[ 16]   0.00-120.00 sec   352 MBytes  24.6 Mbits/sec                  receiver
[ 18]   0.00-120.00 sec   380 MBytes  26.6 Mbits/sec  255             sender
[ 18]   0.00-120.00 sec   380 MBytes  26.5 Mbits/sec                  receiver
[ 20]   0.00-120.00 sec   350 MBytes  24.5 Mbits/sec  285             sender
[ 20]   0.00-120.00 sec   350 MBytes  24.5 Mbits/sec                  receiver
[ 22]   0.00-120.00 sec   397 MBytes  27.8 Mbits/sec  261             sender
[ 22]   0.00-120.00 sec   397 MBytes  27.7 Mbits/sec                  receiver
[SUM]   0.00-120.00 sec  3.61 GBytes   259 Mbits/sec  2629             sender
[SUM]   0.00-120.00 sec  3.61 GBytes   258 Mbits/sec                  receiver

iperf Done.

Nerlänk

Här kan den uppmärksamme notera att det är signifikant lägre siffror än för upplänken, vilket gjorde mig initialt förbryllad - situationen brukar nämligen vara tvärt om?

Medan jag övervakade (med trubbiga mått) körningen hände inget särskilt och andra tester (typ bredbandskollen) indikerar att jag har en symmetrisk upp- och nerlänk, så här antar jag helt enkelt att servern jag kört mot inte har bandbredden eller har strypt den för mig.

[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-120.00 sec   266 MBytes  18.6 Mbits/sec  231             sender
[  4]   0.00-120.00 sec   266 MBytes  18.6 Mbits/sec                  receiver
[  6]   0.00-120.00 sec   211 MBytes  14.7 Mbits/sec  207             sender
[  6]   0.00-120.00 sec   210 MBytes  14.7 Mbits/sec                  receiver
[  8]   0.00-120.00 sec   242 MBytes  16.9 Mbits/sec  220             sender
[  8]   0.00-120.00 sec   242 MBytes  16.9 Mbits/sec                  receiver
[ 10]   0.00-120.00 sec   248 MBytes  17.3 Mbits/sec  230             sender
[ 10]   0.00-120.00 sec   248 MBytes  17.3 Mbits/sec                  receiver
[ 12]   0.00-120.00 sec   224 MBytes  15.6 Mbits/sec  260             sender
[ 12]   0.00-120.00 sec   224 MBytes  15.6 Mbits/sec                  receiver
[ 14]   0.00-120.00 sec   254 MBytes  17.7 Mbits/sec  229             sender
[ 14]   0.00-120.00 sec   253 MBytes  17.7 Mbits/sec                  receiver
[ 16]   0.00-120.00 sec   256 MBytes  17.9 Mbits/sec  198             sender
[ 16]   0.00-120.00 sec   255 MBytes  17.8 Mbits/sec                  receiver
[ 18]   0.00-120.00 sec   238 MBytes  16.7 Mbits/sec  216             sender
[ 18]   0.00-120.00 sec   238 MBytes  16.6 Mbits/sec                  receiver
[ 20]   0.00-120.00 sec   201 MBytes  14.1 Mbits/sec  203             sender
[ 20]   0.00-120.00 sec   201 MBytes  14.1 Mbits/sec                  receiver
[ 22]   0.00-120.00 sec   191 MBytes  13.3 Mbits/sec  272             sender
[ 22]   0.00-120.00 sec   191 MBytes  13.3 Mbits/sec                  receiver
[SUM]   0.00-120.00 sec  2.28 GBytes   163 Mbits/sec  2266             sender
[SUM]   0.00-120.00 sec  2.27 GBytes   163 Mbits/sec                  receiver

iperf Done.

Bredbandskollen

Detta test var ju mest ett test av min uppkopplingshastighet, tinkergate har ju uppenbarligen inga problem att skyffla data i den här takten?

iperf3 internt

Det här är mest ett test av det interna nätverkskortet. Jag har av lättja inte kopplat om USB-kortet till internt bruk, utan vi låtsas att detta är ett mer generellt test av systembussen på datorn. Eller något.

Klient är min skrivbordsdator, en rätt biffig maskin som kör Windows 10. Parametrar för iperf3 är identiska med tidigare, fast med adresser anpassade efter mitt nätverk.

Nerlänk

Inga konstigheter alls här, faktiskt.

[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-120.00 sec  1.33 GBytes  95.0 Mbits/sec    0             sender
[  4]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec                  receiver
[  6]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec    0             sender
[  6]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec                  receiver
[  8]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec    0             sender
[  8]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec                  receiver
[ 10]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec    0             sender
[ 10]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec                  receiver
[ 12]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec    0             sender
[ 12]   0.00-120.00 sec  1.32 GBytes  94.8 Mbits/sec                  receiver
[ 14]   0.00-120.00 sec  1.32 GBytes  94.8 Mbits/sec    0             sender
[ 14]   0.00-120.00 sec  1.32 GBytes  94.8 Mbits/sec                  receiver
[ 16]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec    0             sender
[ 16]   0.00-120.00 sec  1.32 GBytes  94.8 Mbits/sec                  receiver
[ 18]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec    0             sender
[ 18]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec                  receiver
[ 20]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec    0             sender
[ 20]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec                  receiver
[ 22]   0.00-120.00 sec  1.33 GBytes  94.9 Mbits/sec    0             sender
[ 22]   0.00-120.00 sec  1.32 GBytes  94.8 Mbits/sec                  receiver
[SUM]   0.00-120.00 sec  13.3 GBytes   949 Mbits/sec    0             sender
[SUM]   0.00-120.00 sec  13.3 GBytes   949 Mbits/sec                  receiver

iperf Done.

Upplänk

Genomströmningen här är något lägre än för nerlänken, men det är bokstavligt talat nere på decimalnivå. Herregud.

[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  sender
[  4]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  receiver
[  6]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  sender
[  6]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  receiver
[  8]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  sender
[  8]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  receiver
[ 10]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  sender
[ 10]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  receiver
[ 12]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  sender
[ 12]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  receiver
[ 14]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  sender
[ 14]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  receiver
[ 16]   0.00-120.00 sec  1.31 GBytes  93.8 Mbits/sec                  sender
[ 16]   0.00-120.00 sec  1.31 GBytes  93.8 Mbits/sec                  receiver
[ 18]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  sender
[ 18]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  receiver
[ 20]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  sender
[ 20]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  receiver
[ 22]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  sender
[ 22]   0.00-120.00 sec  1.32 GBytes  94.2 Mbits/sec                  receiver
[SUM]   0.00-120.00 sec  13.2 GBytes   942 Mbits/sec                  sender
[SUM]   0.00-120.00 sec  13.2 GBytes   942 Mbits/sec                  receiver

iperf Done.

Slutsats

Inga av testerna nedan har rört CPU eller generell belastning nämnvärt, och jag har kört en parallell ping-session för att se om vi börjar tappa paket någonstans, en egenhet jag har upplevt med konsument-brandväggar. Jag noterade två (2 st) tappade paket.

Hade jag varit lite mer ambitiös hade jag testat kontrollerat med någon populär bittorrent-fil, då det med riktigt populära filer gör det lätt att komma upp i tusentals anslutningar, något som knäckt konsument-brandväggar tidigare.

Det som verkligen hade varit intressant att testa är en uppsättning virtuella nätverk och se hur processorn hanterar detta. Dock har jag ingen relevant testmiljö för detta så det får lämnas som en övning för läsaren. 🙂

Behöver du en brandvägg för att skyffla data hemma? Då är det här en enhet som är helt överdimensionerad uppgiften, rekommenderas!