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
- Tinkerboard S
- Deltaco USB-A to Gigabit Ethernet network adapter (baserad på RTL8153 enligt paketet)
- Laddare, nätverkssladdar
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!