Hallo Leute!
Ob es Alzheimer ist, oder nur weil ich zu dumm bin, kämpfe ich seit gestern Abend mit einem Problem und finde keine Lösung...
Also: auf einem Server läuft MySQL. Selbstverständlich aus Sicherheitsgründen lauscht es nur auf 127.0.0.1. Auf dem Server läuft auch OpenVPN.
Das Ziel ist, dass der Nutzer (es gibt nur einen...) der sich per VPN verbindet, in der Lage ist, mit MySQL zu sprechen.
Mir sind nur drei Möglichkeiten eingefallen:
1) MySQL lauscht auf 0.0.0.0 und ich verbiete per Firewall unerwünschte Zugriffe. SCHLECHT, denn man kann nicht wirklich 1000% sicher sein, dass alle unerwünschte Wege gesperrt sind... 2) MySQL lauscht auf die IP des VPNs. Auch schlecht, denn alle Programme, die bereits auf dem Server laufen, müssen umkonfiguriert werden, damit sie MySQL nicht mehr über 127.0.0.1 ansprechen, sondern über die IP des VPNs 3) Per IPTables eine Portweiterleitung einrichten, damit eine Verbindung an 10.50.0.1 (die IP des VPN-Servers) auf die Port 3306 an MySQL (127.0.0.1:3306) weitergeleitet wird.
Gerade kämpfe ich mit der Lösung 3 und schaffe es nicht...
Theoretisch sollte dieses Befehl alles machen:
/sbin/iptables -t nat -A PREROUTING -p tcp -i vpnsrv0 -d 10.50.0.1 --dport 3306 -j DNAT --to-destination 127.0.0.1:3306
Praktisch leider nicht... Ich sehe (iptables -vnL -t nat) dass wenn ich mit telnet eine Verbidung an 10.50.0.1 auf die Port 3306 starte, das Paket kommt über den Regel, aber am Ende kommt keine Verbindung zustande (Connection refused).
Es muss sicherlich ein dummes Denkfehler sein...
Kann jemand mir ein Tipp geben?
Danke Luca Bertoncello (lucabert@lucabert.de)
Luca Bertoncello lucabert@lucabert.de (So 19 Feb 2023 11:04:22 CET):
Theoretisch sollte dieses Befehl alles machen:
/sbin/iptables -t nat -A PREROUTING -p tcp -i vpnsrv0 -d 10.50.0.1 --dport 3306 -j DNAT --to-destination 127.0.0.1:3306
Ich *glaube*, DNAT mit 127.0.0.0/8 geht nicht. Du suchst vermutlich `-j REDIRECT …`
Am 19.02.2023 um 12:07 schrieb Heiko Schlittermann:
Luca Bertoncello lucabert@lucabert.de (So 19 Feb 2023 11:04:22 CET):
Theoretisch sollte dieses Befehl alles machen:
/sbin/iptables -t nat -A PREROUTING -p tcp -i vpnsrv0 -d 10.50.0.1 --dport 3306 -j DNAT --to-destination 127.0.0.1:3306
Ich *glaube*, DNAT mit 127.0.0.0/8 geht nicht. Du suchst vermutlich `-j REDIRECT …`
Hallo Heiko,
so wie ich sehe, -j REDIRECT ist für eine andere Port auf derselben IP... Oder irre ich mich komplett?
Danke Luca Bertoncello (lucabert@lucabert.de)
Luca Bertoncello lucabert@lucabert.de (So 19 Feb 2023 12:22:40 CET):
Am 19.02.2023 um 12:07 schrieb Heiko Schlittermann: Hallo Heiko,
so wie ich sehe, -j REDIRECT ist für eine andere Port auf derselben IP... Oder irre ich mich komplett?
Na, nicht ganz. Du schickst damit Traffic, der eigentlich nicht für Dich ist zu Dir selbst. Aber Du hast Recht, es ist nicht ganz das, was Du brauchst.
Vielleicht hilft das weiter:
https://dev.mysql.com/blog-archive/the-bind-address-option-now-supports-mult...
Alternativ, wenn Dir Bind auf 0.0.0.0, kombiniert mit Firewall zu gefährlich erscheint, dann kannst Du immer noch mit socat einen Listener auf die IP tun, die Du brauchst, und das dann zu 127.0.0.1 schicken.
Am 19.02.2023 um 13:10 schrieb Heiko Schlittermann:
Hallo Heiko!
Vielleicht hilft das weiter:
https://dev.mysql.com/blog-archive/the-bind-address-option-now-supports-multiple-addresses/
Mein Fehler! Es ist kein MySQL, sondern MariaDB. Und leider scheint MariaDB diese Funktion nicht zu unterstützen... :(
Alternativ, wenn Dir Bind auf 0.0.0.0, kombiniert mit Firewall zu gefährlich erscheint, dann kannst Du immer noch mit socat einen Listener auf die IP tun, die Du brauchst, und das dann zu 127.0.0.1 schicken.
Ich werde überlegen... Ich habe wirklich gehofft, dass ich einfach einen dummen Fehler machen und dass es über IPTables geht...
Danke Luca Bertoncello (lucabert@lucabert.de)
Hi,
On Sun, Feb 19, 2023 at 06:48:08PM +0100, Luca Bertoncello lucabert@lucabert.de wrote:
Am 19.02.2023 um 13:10 schrieb Heiko Schlittermann:
Alternativ, wenn Dir Bind auf 0.0.0.0, kombiniert mit Firewall zu gefährlich erscheint, dann kannst Du immer noch mit socat einen Listener auf die IP tun, die Du brauchst, und das dann zu 127.0.0.1 schicken.
Ich werde überlegen... Ich habe wirklich gehofft, dass ich einfach einen dummen Fehler machen und dass es über IPTables geht...
Du kannst den Port auch mittels xinetd weiterleiten. https://www.centosblog.com/port-forwarding-using-xinetd-on-centos/ In deinem Fall is remote_server halt 127.0.0.1 und bind halt die IP vom VPN.
Aber... bist du sicher, dass du sysctl -w net.ipv4.ip_forward=1 und sysctl -w net.ipv4.conf.all.route_localnet=1 schon probiert hast? Nicht dass dein iptables-Problem gar keines ist. https://superuser.com/questions/661772/iptables-redirect-to-localhost sieht zumindest so aus, als sollte das prinzipiell funktionieren. Und ich konnte hier meinen auf 127.0.0.1:25 lauschenden postfix mittels iptables -t nat -A PREROUTING -p tcp --dport 2525 -j DNAT --to-destination 127.0.0.1:25 zunächst nicht über die externe IP und port 2525 erreichen, nach sysctl -w net.ipv4.conf.all.route_localnet=1 allerdings schon. Gesucht mittels "iptables port forwarding localhost". Allerdings auf https://www.startpage.com, nicht google.
Danke Luca Bertoncello (lucabert@lucabert.de)
Ciao, Thomas
Am 19.02.2023 um 20:44 schrieb Thomas Köhler:
Hallo Thomas,
Du kannst den Port auch mittels xinetd weiterleiten. https://www.centosblog.com/port-forwarding-using-xinetd-on-centos/ In deinem Fall is remote_server halt 127.0.0.1 und bind halt die IP vom VPN.
Das hat mir richtig geholfen!
So funktioniert einwandfrei, besten Dank!
Aber... bist du sicher, dass du sysctl -w net.ipv4.ip_forward=1 und sysctl -w net.ipv4.conf.all.route_localnet=1 schon probiert hast? Nicht dass dein iptables-Problem gar keines ist.> https://superuser.com/questions/661772/iptables-redirect-to-localhost sieht zumindest so aus, als sollte das prinzipiell funktionieren.
Ich habe das auch probiert, aber leider geht das nicht... :(
Aber danke für dein Hinweis mit xinetd! Das kannte ich überhaupt nicht...
Grüße Luca Bertoncello (lucabert@lucabert.de)
Thomas Köhler jean-luc@picard.franken.de (So 19 Feb 2023 20:44:08 CET):
sysctl -w net.ipv4.conf.all.route_localnet=1
Ja, das war die Option, die ich meinte. Danke Wobei ja nicht ohne Grund von außen keine Pakete von oder zu den Loopback-Adressen funktionieren sollten.
Luca Bertoncello lucabert@lucabert.de (So 19 Feb 2023 18:48:08 CET):
Am 19.02.2023 um 13:10 schrieb Heiko Schlittermann:
Alternativ, wenn Dir Bind auf 0.0.0.0, kombiniert mit Firewall zu gefährlich erscheint, dann kannst Du immer noch mit socat einen Listener auf die IP tun, die Du brauchst, und das dann zu 127.0.0.1 schicken.
Ich werde überlegen... Ich habe wirklich gehofft, dass ich einfach einen dummen Fehler machen und dass es über IPTables geht...
Vielleicht geht es ja. Mir kommt es nicht unmöglich vor. Die Herausforderung ist aber, dass der Netzwerkstack kein Paket mit einer Remote-Absender-IP und der Ziel-IP 127.0.0.1 nehmen wird. Selbst wenn Du es im DNAT auf 127.0.0.1 umschreibst.
REDIRECT scheint ja nur auf die primäre IP des Interfaces, über die das Paket reinkommt, umzuleiten. Jetzt könntest Du die 127.0.0.1 drauf tun. Aber denn bist Du wieder beim Absatz von oben.
Oder Du machst tatsächlich DNAT, aber auch dann bist Du wieder beim Absatz von oben.
Eigentlich. Es gibt da irgendwo in /proc/net/… was.
Oder einfach in einer Systemd-Unit socat starten
ExecStart=socat TCP-LISTEN:3306,bind=<VIP-IP>,range=<VPN-Net/Mask>,reuseaddr,fork TCP:127.0.0.1:3306
Die Options sind jetzt aus dem Kopf, ich glaube, die heißen so ähnlich, kannst Du selbst in der Manpage von socat finden.
Aber mal ehrlich, ich würde den Listener auf 0.0.0.0 setzen und den Rest in der Firewall erledigen. Und zusätzlich vielleicht in den GRANT-Tables.
lug-dd@mailman.schlittermann.de