Ich versuche, eine Firewall für meinen Raspberry Pi zu erstellen. Die Regeln, die ich brauche, sind
Eingehendes SSH zulassen - so funktioniert es
Ausgehendes SSH zulassen - das funktioniert NICHT und ist mein Hauptproblem
- Eingehende und ausgehende VNC zulassen - derzeit funktioniert dies halbwegs, da ich eine Verbindung herstellen kann, aber keine Aktionen ausführen kann. Keine wirkliche Priorität
- Ausgehendes https zulassen – Ich kann eine Website besuchen, aber ich glaube, ich muss eine weitere Zeile für DNS hinzufügen, damit dies beim Booten ordnungsgemäß funktioniert.
- Ausgehende E-Mails zulassen - so funktioniert es
- Ausgehende Pings zulassen und eine Antwort erhalten - das funktioniert
- Alles andere fallen lassen – Ich vermute, das funktioniert, weil ich kein ausgehendes SSH durchführen kann, daher glaube ich, dass das Problem an meiner Regel liegt.
Ich weiß, dass mein SSH im Allgemeinen funktioniert, da ich ohne geladene Firewall ein ausgehendes SSH von einem Pi zu einem anderen durchführen kann.
#!/bin/sh
#Flush all rules
iptables -F
#Allow incoming and outgoing SSH
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
#Allow VNC sessions
sudo iptables -A INPUT -s 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -j ACCEPT
sudo iptables -A OUTPUT -d 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --sports 5900:5905,6000:6005 -j ACCEPT
#Accept only incoming etstablished and allow new or established outgoing
sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
#Accept port 587 for email
sudo iptables -A INPUT -p tcp --sport 587 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
#Allow ping requests to go out and get a reply
sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
#Drop all other packets and protocols
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT DROP
Antwort1
Ihr Problem mit der SSH-Leitung besteht darin, dass Sie versuchen, den Quellport 22
von Ihrem lokalen Computer aus zuzulassen. Wenn Sie jedoch eine Verbindung zu einem Remote-SSH-Server herstellen, verwendet Ihr Computer hierfür nicht Port 22. Er verwendet einen zufälligen Port, normalerweise im höheren Portbereich. Dies ist sinnvoll, da Sie, wenn Port 22 für ausgehende SSH-Verbindungen verwendet würde, jeweils nur eine Verbindung zu einem SSH-Server herstellen könnten.
Um dies zu beheben, besteht die einfachste Möglichkeit darin , --dport
anstelle von zu verwenden --sport
und jede Verbindung zuzulassen, deren Zielport 22
(ssh) ist.
sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
Bitte beachten Sie, dass Siehinzufügendiese Zeile, anstatt sie zu ersetzen, wie @bcs78 in den Kommentaren angemerkt hat.
Es ist im Allgemeinen auch keine gute Idee, den Verkehr für die interne Loopback-Verbindung zu blockieren. Einige Programme sind auf diese Verbindung angewiesen und funktionieren ohne sie nicht richtig. Fügen Sie dies am Anfang Ihres Skripts hinzu:
sudo iptables -A INPUT -i lo -j ACCEPT
Antwort2
Fügen Sie einmal pro Kette einen Catch-All hinzuStaatsbürgerlichRegel, die die meisten anderen Regeln vereinfacht:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -F
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Plus die übliche lo
Schnittstellenregel zum Zulassen aller lokalen Dienste. Entfernen Sie diese, wenn Sie der Meinung sind, dass sie wirklich nicht benötigt wird:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Jetzt müssen Sie Ihre anderen Regeln nicht duplizieren (ich verlasse den NEW
Zustand, als er da war, auch wenn er nicht sehr nützlich ist und nicht durchgehend vorhanden war):
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 10.10.10.1 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.0.150 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
Die ersten beiden Regeln kümmern sich um alles, es ist nicht nötig, jede Regel zu duplizieren, und jetzt ist die anfängliche Richtung des Flusses klar: INPUT
oder OUTPUT
, nur einmal. So wird deutlicher, dass das --sport 22
für SSH im ausgehenden Fall nicht geholfen hat ( --dport 22
ist erforderlich). RELATED
Es wäre nützlich gewesen, wenn es udp
Regeln für zugehörige icmp
Fehlerantworten gegeben hätte. In dieser Einstellung ist es möglicherweise nicht erforderlich.