it-swarm.com.de

SSH-Portweiterleitung mit Firewall-Cmd

Ich versuche, einen SSH-Tunnel in einen Server hinter NAT zu erstellen:

ssh vom Laptop -> Host mit Portweiterleitung in der Firewall -> Direkt in den Gast einsteigen (172.16.0.2, hinter Host NAT).

Verwenden von iptables auf dem Host - es wird funktionieren:

# iptables -I OUTPUT  -d 0.0.0.0/0 -j ACCEPT
# iptables -I FORWARD  -d 0.0.0.0/0 -j ACCEPT
# iptables -I INPUT  -d 0.0.0.0/0 -j ACCEPT
# iptables -t nat -I PREROUTING -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22

Allerdings, iptables werden beim Neustart des Hosts nicht gespeichert, da der Firewalld-Dienst ausgeführt wird (Firewalld ist die Standardeinstellung in RHEL 7).

Also versuche ich das gleiche zu tun Portweiterleitung mit Firewall-cmd.

Die Verwendung von firewall-cmd auf dem Host funktioniert NICHT:

# firewall-cmd --permanent --zone=public --add-forward-port=port=222:proto=tcp:toport=22:toaddr=172.16.0.2'
# firewall-cmd --permanent --zone=public --add-masquerade
# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -d 0.0.0.0/0 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -d 0.0.0.0/0 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -d 0.0.0.0/0 -j ACCEPT

# firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" forward-port port="222" protocol="tcp" to-port="22" to-addr='"172.16.0.2"

# firewall-cmd --reload

# firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp4s0f0
  sources: 
  services: ssh dhcpv6-client
  ports: 8139/tcp
  protocols: 
  masquerade: yes
  forward-ports: port=222:proto=tcp:toport=22:toaddr=172.16.0.2
  source-ports: 
  icmp-blocks: 
  rich rules: 
     rule family="ipv4" destination address="0.0.0.0/0" forward-port port="222" protocol="tcp" to-port="22" to-addr="172.16.0.2" 

# firewall-cmd --direct --get-all-rules

ipv4 filter INPUT 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 filter OUTPUT 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 filter FORWARD 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 nat PREROUTING 0 -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22

Wenn Sie nun versuchen, eine Verbindung zum Gast herzustellen - von meinem Laptop über den Host-Port 222 -, wird die SSH-Verbindung abgelehnt:

ssh -l stack my-Host -p 222
ssh: connect to Host my-Host port 222: Connection refused

Irgendeine Idee, was ich vermisse?

6
Noam Manos

Du könntest es versuchen firewall-cmd --add-forward-port:

firewall-cmd --permanent --add-forward-port=port=222:proto=tcp:toaddr=172.x.x.x:toport=22
firewall-cmd --reload

Allgemeine Syntax ( https://firewalld.org/documentation/man-pages/firewall-cmd.html ):

firewall-cmd [--permanent] [--zone=zone] \
 --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] \
 [--timeout=timeval]
4
mwfearnley

Ich habe mich persönlich einem ähnlichen Problem gestellt und diese Lösung ist mir zu Hilfe gekommen. Bitte probieren Sie es aus und lassen Sie mich wissen, ob es geholfen hat.

Es gibt nur wenige Möglichkeiten, auf einen Server hinter NAT zuzugreifen: Portweiterleitung: Sie können den Router/die Firewall so konfigurieren, dass der eingehende Datenverkehr an einen internen Server weitergeleitet wird. Normalerweise müssen Sie das Protokoll (UDP/TCP), den externen Service-Port und den internen Service-Port angeben.

Versuchen Sie für die Weiterleitung des SSH-Ports mit Firewall-Cmd diesen Befehl:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 222 -j DNAT \--to 172.x.x.x.:22 

Aus dem gegebenen Code verstehe ich, dass Sie dies erreichen wollen. Überprüfen Sie daher unbedingt den Anschluss. In meinem Fall habe ich das gleiche mit Port 80 versucht.

Diese Regel gibt die Tabelle NAT) an, um mithilfe der integrierten PREROUTING-Kette eingehende HTTP-Anforderungen ausschließlich an die angegebene Ziel-IP-Adresse weiterzuleiten

0
James Andreson

Die "Symptome" und die Daten, die Sie präsentieren, sind denen sehr ähnlich, die wir bei der Verwendung von KVM (libvirt) mit dem "Standardnetzwerk") erlebt haben. Aus diesem Grund finden wir die Antwort unten sehr relevant ...

Die "einzige" Möglichkeit, einen Port mit KVM (libvirt) mit dem "Standardnetzwerk" (virbr0) weiterzuleiten, ist die Verwendung des von @Antony Nguyen informierten Hacks/Workarounds. Oder einfacher Sie kann libvirt-hook-qem verwenden.

Dieser Thread enthält eine vollständige Erklärung, wie dieses Problem für CentOS 7 (und sicherlich für andere Distributionen) mit libvirt-hook-qemu gelöst werden kann: https://superuser.com/a/1475915/19584 .

0
Eduardo Lucio

Es hört sich so an, als wären Ihre Probleme kein Problem mit Ihren Firewall-Cmd-Befehlen, aber etwas mit OpenStack zu tun?

Als Referenz werde ich die endgültige Antwort (von James Slagle, vermutlich diese ) auf die Bugzilla-Bericht posten, die Sie gemacht haben - nur für den Fall, dass es jemandem hilft:

Wie von Eric vorgeschlagen, hängt dieses Problem mit der OSP-Bereitstellung zusammen, wodurch die Fehlerbesitzer auf TripleO umgestellt werden.

Beachten Sie, dass bekannt ist, dass es OSP 14 und unten bewirkt.

Nein, dies ist nicht korrekt, je nachdem, wie ich den Fehler interpretiere. Sie versuchen, Firewall-Regeln auf dem Host (titan08) hinzuzufügen, auf dem sich eine VM namens undercloud-0 befindet.

in undercloud-0 ist OpenStack installiert. Auf dem physischen Host selbst (titan08) werden jedoch keine OpenStack-Drehzahlen oder -Konfigurationen vorgenommen.

In diesem Fall geht es anscheinend ausschließlich um die Konfiguration der Firewall des physischen Hosts und nicht um die OpenStack-VM.

Wie Eric betonte, werden die Regeln, die Sie mit firewalld hinzufügen möchten, nicht auf dem physischen Host (titan08) gespeichert.

Ist mein Verständnis richtig?

Wenn Sie OpenStack auf einer VM installieren, werden keine Änderungen am physischen Host selbst vorgenommen.

0
mwfearnley