Hallo @all,
an alle die die Firewall weiterhin nutzen möchten! Ich denke ich habe die Lösung des Problems gefunden.
Es ist nicht wie viele glauben, nicht zu verstehen wie die Firewall der Diskstation funktioniert. Sie funktioniert ganz nach dem Schema der iptables, und dies auch sorgfältig und zuverlässig. Die Regeln werden von oben nach unten abgearbeitet. Gibt es einen Match zu einem Eintrag, so werden die Pakete entweder angenommen bzw. weitergereicht oder eben abgelehnt.
Kommen wir zu dem Punkt, dass der Storj Knoten ausschließlich auf den Port 28967 lauscht. Dies hat zur Folge dass die eingehende Kommunikation der Satelliten ausschließlich über diesen Port initiiert wird und deshalb auch im NAT des Routers dieser Port offen bzw. zum jeweiligen Client im Netzwerk weitergereicht werden muss. Dies leuchtet bestimmt allen ein und ist somit gängige Praxis.
Die Listening Ports können wir uns anzeigen lassen:
Rich (BBCode):
netstat -tlpn | grep docker
tcp6 0 0 :::28967 :::* LISTEN 1692/docker-proxy
tcp6 0 0 :::14002 :::* LISTEN 1712/docker-proxy
Soweit so gut. Nun kommen wir zu dem Punkt dass wir die Firewall der Diskstation näher betrachten. Wir möchten definitiv alle Verbindungen die über den Port 28967 ankommen auch zulassen.
Die Firewall Regeln werden auf das jeweilige interface angewandt welches man oben rechts auswählen kann. Hat man mehrere physikalische LAN Adapter so werden diese als Auswahlmöglichkeit angezeigt.
Man kann also somit folgendes Interfaces wählen: "Alle Schnittstellen" / "LAN1" / "LAN2" / "LANx" ... / "PPPoE" / "VPN".
Dies hat zur Folge, dass die Ethernetadapter somit auch eine IP Adresse aus dem internen Netzwerk haben.
Nehmen wir an wir beifinden uns in einem Netzwerk 192.168.0.0/24.
Unser Router hat die IP Adresse 192.168.0.1 und unsere Diskstation besitzt die Adresse 192.168.0.2
Damit wir uns in unserem lokalen Netzwerk nicht selbst aussperren und weiterhin auf die Diskstation zugreifen können definiert man gewöhnlich den ersten Eintrag in der Firewall wie folgt.
Das gesamte lokale Netzwerk darf auf die Dsikstation zugreifen. Somit lautet die Regel:
Rich (BBCode):
Ports: Alle Protokoll: Alle Quell-IP: 192.168.0.0/255.255.255.0 Aktion: Zulassen
Als zweite Regel können wir uns nun um den Port kümmern auf welchem unser Docker Storj Knoten lauscht. Dies ist insofern wichtig damit die Pakete den Container erreichen.
Rich (BBCode):
Ports: 28967 Protokoll: TCP Quell-IP: Alle Aktion: Zulassen
Und zu guter letzt definiert man noch die Regel am Ende der Kette mit einem sog. "Block All" die wie folgt aussieht.
Rich (BBCode):
Ports: Alle Protokoll: Alle Quell-IP: Alle Aktion: Verweigern
In diesem Moment gehen wir davon aus, dass wir alle notwendigen Regeln für den erfolgreichen Betrieb des Knoten definiert haben. Dem ist aber nicht so und wir bekommen sofort nach dem Starten des Knotens ein FATAL error weil die Zeitsynchronisation zwischen dem Knoten und den Satelliten nicht stattfinden kann.
Nun stellen wir uns die Frage, warum denn eigentlich nicht. Der einzige Port über den kommuniziert wird ist sowohl in der NAT (Router) geöffnet als auch in der Firewall der Diskstation erlaubt.
Zusätzlich ist auch die Kommunikation des gesamten internen Netzwerks durch unsere erste Regel erlaubt.
Was fehlt also noch?
Des Rätsels Lösung ist Docker selbst.
Wer sich an meinen Beitrag
#390 erinnert, der weiß dass ich hier zusätzlich zu den IP Adressen der Satelliten folgende Adresse hinzugenommen habe. Es ging hierbei um die Adresse 172.17.0.2 worüber ich mich selbst gewundert habe, dass es sich hierbei um eine IP Adresse aus dem reservierten Adressraum für private IP Adressen handelt.
Zu diesem Zeitpunkt war ich selbst verwundert weshalb über diese IP Adresse ein einkommender Traffic stattfindet. Jedoch entschloss ich mich diese genau wie auch die Satelliten zu behandeln und legte eine Regel in der Firewall an. Dies half nicht für lange Zeit, denn es folgten ständig weitere Fehler wie auch teils von euch berichtet wurde.
Lange Rede kurzer Sinn...
Ursache für das Scheitern der eingehenden Verbindungen durch die Firewall ist, dass docker eine Bridge anlegt über die zum lokalen Netzwerk der Diskstation (über eth0) kommuniziert. Die Bridge kann man als virtuallen Hub betrachten und alle angeschlossenen Schnittstellen sehen auch alle Ethernetpakete.
Die Bridge heißt standardmäßig "docker0" und besitzt per default die IP-Adresse 172.17.0.1
Um dies zu verifizieren können wir uns die Bridge auf unserem System anzeigen lassen:
Rich (BBCode):
brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242141aa0a1 no docker843113a
Um anschließend noch die IP Adresse zu verifizieren führen wir folgenden Befehl aus:
Rich (BBCode):
ifconfig docker0
docker0 Link encap:Ethernet HWaddr 02:42:14:1A:A0:A1
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
Somit ist klar, dass Docker versucht mit der Netzwerkbridge "docker0" Pakete an den physikalischen Adapter z.B. eth0 zu schicken. Diese wiederum werden aber in der Firewall blockiert aufgrund dessen, dass Pakete nur aus dem Netzwerk 192.168.0.0/24 angenommen werden.
Also müssen wir dafür sorgen damit der gesamte docker Traffic auch zugelassen wird.
Wir erstellen also eine neue Regel in der Firewall und setzen diese z.B. direkt an die zweite Position.
Rich (BBCode):
Ports: Alle Protokoll: Alle Quell-IP: 172.17.0.0/255.255.0.0 Aktion: Zulassen
et voilà...
Nun können wir den Knoten sauber starten, die Systemzeiten werden abgeglichen und der Knoten läuft ohne erkennbare Errors im Log.
Zum Abschluss noch ein Screenshot welcher meine Eintellungen zum Test zeigt. Nur die farbig markierten Regeln sind die relevanten für eine saubere Kommunikation mit eurem Storagenode.
Ihr müsst entsprechend die erste farbig markierte Regel eurem Netzwerk anpassen. In meinem Fall befinde ich mich in dem lokalen Netzwerk 10.0.0.0/8
Bei den meisten von euch vermutlich eher 192.168.0.0/24 oder auch Fritzbox typisch 192.168.178.0/24
Viele Grüße
luddi