Mobilfunk-Internettraffic außerhalb eines VPNs einschränken
In diesem Beitrag wird erklärt, wie wir die iptables
Firewall eines IoT Gerätes konfiguriert haben, sodass eine Wartung über ein Wireguard VPN-Netz möglich ist, während andere Internetzugriffe aus oder in das Mobilfunknetz verhindert werden.
Gegebenheiten
- (Optional) Ethernetverbindung ins Internet via Lokales LAN (
eth0
) - (Optional) LTE-Verbindung ins Internet via USB LTE Modem (
usb0
, IP-Adresse192.168.8.1
bzw.fe80::c0b0:4fff:fefe:fefe
) - Wireguard VPN-Server (
vpn.mydomain.tld
)
Ziel
Die LTE-Verbindung soll ausschließlich für Verbindungen zum Wireguard-VPN-Server genutzt werden können. Nicht als allgemeine Internetverbindung, da der Traffic der SIM-Karte möglichst gering gehalten werden muss (Beschränkung des Datenvolumens!).
Für die Übertragung größerer Datenmengen aus dem Internet (OS-Updates, … ) soll eine optionale Ethernetverbindung genutzt werden.
Daher: Beschränkung der ausgehenden Verbindungen über usb0
Interface auf Verbindungen zum VPN-Server. Weitere Ausnahmen:
- DNS-Anfragen (um Wireguard-Host aufzulösen)
- Ping Requests ins Internet (zum Debugging)
Die LTE-Schnittstelle wird vom Treiber des Netzwerk-Modems automatisch weniger hoch priorisiert als die Ethernet-Schnittstelle. Ist die Ethernet-Schnittstelle verfügbar, werden Daten bevorzugt hierüber (uneingeschränkt) ausgetauscht.
Implementierung
iptables
Firewallregel, um allen ausgehenden Traffic über das usb0
interface zu blockieren:
sudo iptables -t filter -A OUTPUT -o usb0 -j REJECT
sudo ip6tables -t filter -A OUTPUT -o usb0 -j REJECT
Wichtig: Die Blockierregel wird mit -A
(“append”) hinzugefügt. Alle Ausnahmen zu dieser Blockierregel werden im Folgenden mit -I
(“insert”) hinzugefügt, damit sie in der Abarbeitung / Priorisierung weiter vorne stehen und triggern, bevor es zum “REJECT” kommt.
Verbindungen zum LTE Router selbst erlauben - sonst funktioniert gar nichts mehr:
sudo iptables -t filter -I OUTPUT -o usb0 -d 192.168.8.1 -j ACCEPT
sudo ip6tables -t filter -I OUTPUT -o usb0 -d fe80::c0b0:4fff:fefe:fefe -j ACCEPT
Allerdings müssen Verbindungen zum VPN-Server erlaubt bleiben:
sudo iptables -t filter -I OUTPUT -o usb0 -d vpn.mydomain.tld -p udp --dport 51821 -j ACCEPT
- 51821 = Wireguard port
- Falls der VPN-Server auch via IPv6 erreichbar ist, Kommando mit
ip6tables
wiederholen
… und auch zum DNS, denn sonst kann der Hostnamen des Wireguard VPN Servers nicht aufgelöst werden:
sudo iptables -t filter -I OUTPUT -o usb0 -p udp --dport 53 -j ACCEPT
sudo ip6tables -t filter -I OUTPUT -o usb0 -p udp --dport 53 -j ACCEPT
Ausgehende Pings erlauben
Wer zu Debugging-Zwecken ausgehende Pings (ICMP requests) ins LTE-Netz erlauben will, kann eine Ausnahme hinzufügen:
sudo iptables -t filter -I OUTPUT -o usb0 -p icmp --icmp-type echo-request -j ACCEPT
sudo ip6tables -t filter -I OUTPUT -o usb0 -p icmpv6 --icmpv6-type echo-request -j ACCEPT
Alle via Mobilfunk eingehenden Verbindungen blockieren
Um zu verhindern, dass der SSH Port oder ein Webserver direkt aus dem Mobilfunknetz erreicht werden können, wird der Zugriff aus dem Mobilfunknetz weiter eingeschränkt. Services auf dem Target dürfen von außen nur über das Wireguard VPN erreichbar sein.
sudo iptables -t filter -A INPUT -i usb0 -j REJECT
sudo iptables -t filter -I INPUT -i usb0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -t filter -A INPUT -i usb0 -j REJECT
sudo ip6tables -t filter -I INPUT -i usb0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Die -m conntrack
Regeln bewirken, dass für eingehende Pakete eine Ausnahme gemacht wird, wenn sie zuvor vom Target selbst angefragt wurden. Schließlich sollen Antworten auf DNS-Anfragen oder Ping-Anfragen das Target weiterhin durchdringen können.
Ergebnis
pi@target:~ $ sudo iptables -L -t filter -n -v
Chain INPUT (policy ACCEPT 640 packets, 56736 bytes)
pkts bytes target prot opt in out source destination
456 69620 ACCEPT all -- usb0 * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 REJECT all -- usb0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 583 packets, 72865 bytes)
pkts bytes target prot opt in out source destination
3 252 ACCEPT icmp -- * usb0 0.0.0.0/0 0.0.0.0/0 icmptype 8
29 1921 ACCEPT udp -- * usb0 0.0.0.0/0 0.0.0.0/0 udp dpt:53
366 77068 ACCEPT udp -- * usb0 0.0.0.0/0 <vpnip> udp dpt:51821
0 0 ACCEPT all -- * usb0 0.0.0.0/0 192.168.8.1
69 6061 REJECT all -- * usb0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
<vpnip>
entspricht hier der aufgelösten IP Adresse zu vpn.mydomain.tld
. 51821
ist der genutzte Wireguard Port.
Nur Verbindungen, die direkt über das usb0
Interface gehen, werden von der Firewall beschränkt. Verbindungen, die innerhalb des VPN-Netzes hergestellt werden, bleiben unberührt. So kann beispielsweise unbeschränkt über das Wireguard VPN auf den SSH Port und alle weiteren Dienste auf den Targets zugegriffen werden.
Falls auch Zugriffe innerhalb des VPNs beschränkt werden sollen, können entsprechende iptables
Regeln mit einem -i <wireguardinterface>
Parameter versehen werden, sodass diese nur auf das Wireguard-Interface abzielen.