2019-05-01

Smartphone-Tethering im Heimnetz

Genau ins schwarze getroffen

Bei meiner neuen Wohnung gibt es leider nur Kupfer mit ADSL, maximale Geschwindigkeit: 12MBit

gotta go fast

Features:

Alternativen

Für eine bessere Latenz beim Online Spielen war eine Lösung schnell gefunden, Handy an den PC anschließen und die Game-Server durch eben dieses routen, schon konnte man lagfrei spielen UND gleichzeitig das Internet benutzen .... the future is now!

Bei mehr Bandbreite sah man leider schwarz, die einzige Festnetz-Alternativen waren die üblichen Verdächtigen mit LTE, Satteliten-DSL oder, leider topographisch auch nicht möglich, Richtfunk.

Die einzige vernünftige Lösung wäre eventuell der Hybrid Tarif der Telekom gewesen, aber ich wollte mich nicht in einen 2 Jahres-Vertrag als Geisel nehmen lassen, wenn das D1 LTE doch nicht so gut wäre.

Bei allen anderen LTE Tarifen waren die Volumentarife inakzeptabel gering gewesen, und hätten durch Nachbuchen die monatlichen Kosten ins unendliche getrieben.

Um die Datenübertragung wirtschaftlich nennenswert zu steigern ging also nur über TCP over Fahrrad.

Laut Stadt ist ein Ausbau restlichen, nicht erschlossenen Straßen ab 2025 geplant, also wohl erst nach meinem Auszug.

Und so lebte ich meinen tristen Internet Alltag weiter, bis eines Tages....

heise artikel über freenet funk

Ich kann mich noch gut daran erinnern, den Artikel etwas desillusioniert auf Arbeit gelesen zu haben, um die Idee gleich danach wieder zu verbannen:

Da es aber keine Vertragslaufzeit gab, habe ich mir einfach mal die SIM-Karte bestellt. Der erste Speedtest hat mir die Freudentränen ins Gesicht gedrückt, ganze 70! MBit mit einem simplen Handy, ohne Antenne oder Verstärker. War dies die lang ersehnte Erlösung?

Nach einigen Tagen Testerei konnte ich folgendes Feststellen:

Es kann sein, dass man 80 MBit hat, und einige Stunden später nur noch 5, besonders am Wochenende wird es doch eher langsam.

speedtest-cli
Retrieving speedtest.net configuration...
Testing from O2 Deutschland (89.204.137.148)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by goetel GmbH (Göttingen) [86.23 km]: 51.224 ms
Testing download speed................................................................................
Download: 44.95 Mbit/s
Testing upload speed................................................................................................
Upload: 19.31 Mbit/s

Es kann auch passieren, dass man zeitweise kein LTE, sondern nur UMTS geschaltet bekommt, dann sind maximal auch wieder nur 8 MBit drin.

Ob die Geschwindigkeit im Verhältnis dazu angepasst wird, wie viel man herunterlädt kann ich bis leider nicht sagen, aber es ist an einigen Tagen vorgekommen, dass kurz nach, oder mitten in einem größeren Download die Geschwindigkeit auf UMTS herabgesetzt wurde und dort erst einmal für längere Zeit blieb.

Online Spiele und VOIP macht man am besten immer noch über die Festnetzleitung oder einer separaten LTE Verbindung.

pi@Tupperwarez:~$ ping heise.de
PING heise.de (193.99.144.80) 56(84) bytes of data.
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=1 ttl=240 time=48.0 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=2 ttl=240 time=120 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=3 ttl=240 time=75.0 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=4 ttl=240 time=38.1 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=5 ttl=240 time=108 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=6 ttl=240 time=100 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=7 ttl=240 time=62.1 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=8 ttl=240 time=114 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=9 ttl=240 time=96.0 ms
pi@Tupperwarez:~$ ping heise.de
PING heise.de (193.99.144.80) 56(84) bytes of data.
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=24 ttl=240 time=125 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=25 ttl=240 time=210 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=26 ttl=240 time=169 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=27 ttl=240 time=177 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=28 ttl=240 time=43.4 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=29 ttl=240 time=102 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=30 ttl=240 time=93.8 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=31 ttl=240 time=54.8 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=32 ttl=240 time=38.2 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_seq=33 ttl=240 time=51.8 ms
vnstat -m -i funk

 funk  /  monthly

       month        rx      |     tx      |    total    |   avg. rate
    ------------------------+-------------+-------------+---------------
      Jan '20     13.12 GiB |   12.67 GiB |   25.79 GiB |  429.32 kbit/s
      Dec '19    165.70 GiB |    5.83 GiB |  171.53 GiB |  537.24 kbit/s
      Nov '19    147.28 GiB |   43.02 GiB |  190.29 GiB |  615.86 kbit/s
      Oct '19    146.46 GiB |    7.03 GiB |  153.49 GiB |  480.72 kbit/s
      Sep '19    162.57 GiB |   10.65 GiB |  173.22 GiB |  560.60 kbit/s
      Aug '19    237.49 GiB |   26.85 GiB |  264.34 GiB |  827.91 kbit/s
      Jul '19     63.12 GiB |   33.42 GiB |   96.53 GiB |  302.33 kbit/s
    ------------------------+-------------+-------------+---------------

Auch wenn ich einige Monate im Bereich der 200 GB war, kam bis jetzt noch keine Kündigung, oder Benachrichtigung.

Integration

Eine Lösung für das Leidige Internet-Thema wurde gefunden, nur wie integriere ich alles ins Netzwerk?

Lösung: BananaPI als dynamischer Router, je nachdem was alles angeschlossen ist.

Die Idee ist, dass ich, je nachdem welche Smartphones am Pi angeschlossen sind, die Routen für bestimmte Server automatisch konfiguriert werden.

Ist z.B. das Funk-Smartphone angeschlossen läuft die Default-Route darüber, ist es gerade nicht angeschlossen, läuft es über den Festnetz Anschluss.

Solche Regeln habe ich dann für verschiedene Internet-Dienste mit verschiedenen Prioritäten aufgestellt:

Leider ist das Routing momentan nur sehr basic über IP Adressen möglich, ich will eventuell noch versuchen die Datenströme per Protokoll, Port oder Packet tagging zu routen, da es sehr mühselig ist für jeden Internetdienst alle Server IPs herraussuchen zu müssen, die man gesondert routen möchte.

Das Problem habe ich mittlerweile gelöst

Das Script dazu:

#!/bin/bash
#Prios
#League IPs = congstar, vodafone, eth0
#Twitch IPs = eth0, funk
#TS = vodafone, funk, eth0
#Default Route = funk, eth0

NET_DIR=/sys/class/net/
APPLE_GATEWAY=172.20.10.1
FRITZ_BOX_GATEWAY=192.168.178.1
HOME_SUBNET=192.168.178.0

CONGSTAR_NIC=congstar
FUNK_NIC=funk
VODAFONE_NIC=vodafone
WIRE_NIC=eth0

declare -A configs
configs[$CONGSTAR_NIC]=$APPLE_GATEWAY
configs[$FUNK_NIC]=$APPLE_GATEWAY
configs[$VODAFONE_NIC]=$APPLE_GATEWAY
configs[$WIRE_NIC]=$FRITZ_BOX_GATEWAY

telegramString=""

#IP Ranges for routing

league=(
	"162.249.72.0/24" \
    "162.249.73.0/24" \
    "162.249.74.0/24" \
    "162.249.75.0/24" \
    "162.249.76.0/24" \
    "162.249.77.0/24" \
    "162.249.78.0/24" \
    "162.249.79.0/24" \
    "185.40.64.0/24" \
    "185.40.65.0/24" \
    "185.40.66.0/24" \
    "185.40.67.0/24" \
)

twitch=(
	185.42.204.33
)

teamspeak=(
	84.200.93.247 \
)

default_route_array=(
	default
)

# Priority Maps

priority_league=(
	$CONGSTAR_NIC \
	$VODAFONE_NIC\
	$WIRE_NIC \
	$FUNK_NIC
)

priority_teamspeak=(
	$VODAFONE_NIC \
	$WIRE_NIC \
	$CONGSTAR_NIC \
	$WIRE_NIC
)

priority_twitch=(
	$WIRE_NIC \
	$FUNK_NIC
)

priority_route=(
	$FUNK_NIC \
	$WIRE_NIC
)

# $1 = Array, $2 = Array With IPs, $3 = Name, $4 = Place in udp route
setUpRoute() {
	declare -a nicArray=("${!1}")
	declare -a ipArray=("${!2}")

	echo "Trying to set up priority routing for $3 with canidates: (${nicArray[@]}))"
	for nic in "${nicArray[@]}"; do
		isPresent $nic
		if [ $? -eq 0 ]; then
			#Setup NAT

			if [ -z $4 ]; then
				setupNAT $nic
				echo "Route ${configs[$nic]} over $nic ( ${nicArray[@]} )"
				setRoute "${configs[$nic]}" "$nic" ipArray[@]
				telegramString+="$3 -> $nic
				"
			else
				setupNAT $nic
				echo "Route ${configs[$nic]} over $nic ( ${nicArray[@]} )"
				setRoute "${configs[$nic]}" "$nic" ipArray[@] "udp_routing_table"
				telegramString+="$3 -> $nic [udp table]
				"
			fi


			break
		fi
	done
}

# $1 = Array, $2 = Array With IPs, $3 = Name, $4 = Place in udp route
tearDownRoute() {
	declare -a nicArray=("${!1}")
	declare -a ipArray=("${!2}")

	echo "Trying to set up priority routing for $3 with canidates: (${nicArray[@]}))"
	for nic in "${nicArray[@]}"; do
		isPresent $nic
		if [ $? -eq 0 ]; then
			#Setup NAT

			if [ -z $4 ]; then
				setupNAT $nic
				echo "Route ${configs[$nic]} over $nic ( ${nicArray[@]} )"
				deleteRoute "${configs[$nic]}" "$nic" ipArray[@]
			else
				setupNAT $nic
				echo "Route ${configs[$nic]} over $nic ( ${nicArray[@]} )"
				deleteRoute "${configs[$nic]}" "$nic" ipArray[@] "udp_routing_table"
			fi


			break
		fi
	done
}

setRoute() {
	
	declare -a iArray=("${!3}")

	for ip in "${iArray[@]}"
	do
		:
		if [ -z $4 ]; then
			echo "ip route add $ip via $1 dev $2"
			ip route add $ip via $1 dev $2
		else
			echo "ip route add $ip via $1 dev $2 table $4"
			ip route add $ip via $1 dev $2 table $4
		fi
	done
}

deleteRoute() {

	declare -a iArray=("${!3}")

	for ip in "${iArray[@]}"
	do
		:
		if [ -z $4 ]; then
			echo "ip route delete $ip via $1 dev $2"
			ip route delete $ip via $1 dev $2
		else
			echo "ip route delete $ip via $1 dev $2 table $4"
			ip route delete $ip via $1 dev $2 table $4
		fi
	done
}

notify() { 
	telegram-send $1
} 

#Removes all routing entries previously set
purgeTable() {
	echo "Clean up current routes"

	ip route flush
} 

# Check if network adapter is currently plugged in
isPresent() {
	ip link show $1 | grep "state" > /dev/null
	res=$?
	if [ -d "$NET_DIR/$1" ] && [ $res -eq 0 ]; then
		echo "${1} is present"
		return 0
	else
		return 1
	fi
} 

setDefaultRoute() {
	ip route add default via $1 dev $2	
}

setupNAT() {
	 echo "Setup NAT for $1"
	 iptables -t nat -A POSTROUTING -o $1 -j MASQUERADE
}

telegram-send "Network Change detected..."

sleep 1

purgeTable

#League

setUpRoute priority_league[@] league[@] "League"

#Twitch

setUpRoute priority_twitch[@] twitch[@] "Twitch"

#Teamspeak

setUpRoute priority_teamspeak[@] teamspeak[@] "Teamspeak"

#Default Route

setUpRoute priority_route[@] default_route_array[@]  "Default Route"

sleep 2
telegram-send "Routes changed:
 ${telegramString}
"

echo "Setup:"

printf "\n Routing Table:\n\n"

ip route show

Netzwerk