IPtables-Probleme – Unterstützung erwünscht

IPtables-Probleme – Unterstützung erwünscht

Ich versuche, eine Firewall für meinen Raspberry Pi zu erstellen. Die Regeln, die ich brauche, sind

  1. Eingehendes SSH zulassen - so funktioniert es

  2. Ausgehendes SSH zulassen - das funktioniert NICHT und ist mein Hauptproblem

  3. 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
  4. 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.
  5. Ausgehende E-Mails zulassen - so funktioniert es
  6. Ausgehende Pings zulassen und eine Antwort erhalten - das funktioniert
  7. 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 22von 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 , --dportanstelle von zu verwenden --sportund 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 loSchnittstellenregel 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 NEWZustand, 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: INPUToder OUTPUT, nur einmal. So wird deutlicher, dass das --sport 22für SSH im ausgehenden Fall nicht geholfen hat ( --dport 22ist erforderlich). RELATEDEs wäre nützlich gewesen, wenn es udpRegeln für zugehörige icmpFehlerantworten gegeben hätte. In dieser Einstellung ist es möglicherweise nicht erforderlich.

verwandte Informationen