• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Firewall: Domainname in Individuelle Regeln

Hallo,
Folgendes Problem der Firewall kann ich mit YAST nicht lösen:

Ich möchte einen bestimmten Port nur für meinen PC zu Hause an einem externen Server freischalten.
Das geht problemlos über YAST / Firewall / Individuelle Regeln

Leider ändert sich meine IP Adresse natürlich von Zeit zu Zeit, was zur Folge hat, dass ich mich wieder am Server einloggen muss und mit YAST im Firewall Modul die alte IP Adresse löschen und die neue eingeben muss.

Das ist doch etwas mühsam.

Da ich über eine DNSDomain verfüge, hätte ich mir gedacht, dass man diese hier bei den individuellen Regeln eintragen können müsste.
Das wird aber von YAST nicht akzeptert. Es muss eine IP Adresse sein.

Gibt es da doch irgendeinen Weg?
 
f.gruber schrieb:
Da ich über eine DNSDomain verfüge, hätte ich mir gedacht, dass man diese hier bei den individuellen Regeln eintragen können müsste.
Das wird aber von YAST nicht akzeptert. Es muss eine IP Adresse sein.
Gibt es da doch irgendeinen Weg?

Mit der SuSEfirewall und IP- Tables wirst du das nicht per DNS realisieren können. Mehr Informationen wären schon hilfreich, um dir helfen zu können.
 

framp

Moderator
Teammitglied
Ich fasse mal zusammen wie ich Dein Problem verstehe:

1) Du hast einen Server mit der IP ServerIP
2) Dort möchtest Du einen Port ServerPort nur für einen Client mit der ClientIP öffnen
3) Der Client steht in einer Domain und heisst da z.B. Client.hugo.com
4) Du möchtest Client.hugo.com in die FW Regel von Server haben.

a) Wenn der Client in einer Domain (ich gehe aus die gehört Dir) steht, dann kontrollierst Du doch wann er seine IP ändert. Dann verstehe ich Dein Problem nicht. EInfach die IP rein und ist gut.
b) Oder ... ist das eine IP bzw ein DNS Name von einem der vielen Provider - und Dein Client erhält jedesmal wenn er sich im Internet anmeldet einen neuen DNS Namen sowie IP? Dann ist das schlecht. Portknocking wäre da eine elegante Lösung um den Port zu öffnen. Siehe auch hier. knock und knockd sind als rpms bei openSuSE verfügbar. Muss nur noch installiert und konfiguriert werden ;-)
 
framp schrieb:
Ich fasse mal zusammen wie ich Dein Problem verstehe:
1) Du hast einen Server mit der IP ServerIP
2) Dort möchtest Du einen Port ServerPort nur für einen Client mit der ClientIP öffnen
3) Der Client steht in einer Domain und heisst da z.B. Client.hugo.com
4) Du möchtest Client.hugo.com in die FW Regel von Server haben.
Ja, was ich mit Hilfe von YAST und einer benutzerdefinierten Regel ja konfiguriert habe.
framp schrieb:
a) Wenn der Client in einer Domain (ich gehe aus die gehört Dir) steht, dann kontrollierst Du doch wann er seine IP ändert. Dann verstehe ich Dein Problem nicht. Einfach die IP rein und ist gut.
Ich habe mich wahrscheinlich ungenau ausgedrückt.
Der Client, also mein Homecomputer, hat einen Domainnamen bei DynDNS. Wenn ich diesen Domainnamen, also z.B. meinname.dyndns.com, statt einer IP Adresse mit YAST in die benutzerdefinierten Regeln eintragen könnte, dann müsste ich nicht jedes Mal eine neue IP Adresse eintragen, wenn sich die meine geändert hat.
framp schrieb:
b) Oder ... ist das eine IP bzw ein DNS Name von einem der vielen Provider - und Dein Client erhält jedesmal wenn er sich im Internet anmeldet einen neuen DNS Namen sowie IP? Dann ist das schlecht. Portknocking wäre da eine elegante Lösung um den Port zu öffnen. Siehe auch hier. knock und knockd sind als rpm bei openSuSE verfügbar. Muss nur noch installiert und konfiguriert werden ;-)
Portknocking?!?
Habe mir den Link angeschaut und auch Wikipedia. Was es nicht alles gibt! Zunächst allerdings scheint es mir für mein Problemchen etwas zu aufwändig, aber ich werde mir das Stichwort merken.
 

framp

Moderator
Teammitglied
In den FW Rules können nur IPs stehen. Man könnte bei Dir ein Crontask aufsetzen, der ein Scpript aufruft, welches die aktuelle IP in dyndsn prüft und dann die FW Rule dann updated. Muss aber sauber programmiert werden :roll:

Sollte das der ssh Port sein, den Du schützen willst. Da gibt es im ssh enthaltene Mittel sich vor unerwünschten 'Gästen' zu schützen ohne den ssh Port zuzumachen. -> Wie sichere ich meinen ssh Server
 
framp schrieb:
In den FW Rules können nur IPs stehen. Man könnte bei Dir ein Crontask aufsetzen, der ein Scpript aufruft, welches die aktuelle IP in dyndsn prüft und dann die FW Rule dann updated. Muss aber sauber programmiert werden :roll:
Klingt nach Arbeit. Aber vielleicht habe ich einmal zu viel Zeit :???:
framp schrieb:
Sollte das der ssh Port sein, den Du schützen willst.
Es ist der LDAP Port.
framp schrieb:
Da gibt es im ssh enthaltene Mittel sich vor unerwünschten 'Gästen' zu schützen ohne den ssh Port zuzumachen. -> Wie sichere ich meinen ssh Server
Aha, wieder eine interessante Seite! :roll:
 

framp

Moderator
Teammitglied
Mir ist noch etwas eingefallen - sofern Du den ssh Port auf dem Server - entsprechend sicher - offen hast: Beim Starten Deines Clients wird per ssh auf Deinem Server ein shell Script ausgeführt, welches die iptables Rule für Deinen Client auf dem Port 389 öffnet.
 
Wenn der Server über ssh erreichbar ist würde ich einen ssh-Tunnel benutzen, dann ist die Verbindung auch verschlüsselt.
 

framp

Moderator
Teammitglied
Tooltime schrieb:
Wenn der Server über ssh erreichbar ist würde ich einen ssh-Tunnel benutzen, dann ist die Verbindung auch verschlüsselt.
Sehr guter AlterativVorschlag! Einfach den LDAP Traffic über ssh tunneln. Dann ist kein separater offener LDAP Port 389 notwendig.

Allerdings setzt das immer noch voraus dass der TE auch ssh zur Verfügung hat. Dazu hat er sich noch nicht geäußert ...
 
framp schrieb:
Tooltime schrieb:
Wenn der Server über ssh erreichbar ist würde ich einen ssh-Tunnel benutzen, dann ist die Verbindung auch verschlüsselt.
Sehr guter AlterativVorschlag! Einfach den LDAP Traffic über ssh tunneln. Dann ist kein separater offener LDAP Port 389 notwendig.
Allerdings setzt das immer noch voraus dass der TE auch ssh zur Verfügung hat. Dazu hat er sich noch nicht geäußert ...
SSH habe ich zur Verfügung.

Ich habe aber für das ganze Problem einen einfachen Workaround gemacht. Da ich das LDAP Login nur für Testzwecke gebraucht hätte, habe ich das betreffende PHP Skript umgeschrieben, sodass es, wenn es in der Testumgebung läuft, den LDAP Server nicht braucht.

Trotzdem vielen Dank für die Vorschläge und Ideen.
 

framp

Moderator
Teammitglied
f.gruber schrieb:
... Da ich das LDAP Login nur für Testzwecke gebraucht hätte, habe ich das betreffende PHP Skript umgeschrieben, sodass es, wenn es in der Testumgebung läuft, den LDAP Server nicht braucht. ...
Das ist natürlich die einfachste Lösung.

BTW: -> Paperwork ;)
 
spoensche schrieb:
...
Mit der SuSEfirewall und IP- Tables wirst du das nicht per DNS realisieren können. ...
Ich mache das mit einem kleinen binary und einem iptables-Script. Wenn sich die IP-Adresse ändert muss das iptables-Script restartet werden (onlinechanged-Ereignis):
Code:
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <arpa/inet.h>

int main(int argc, char* argv[])
{
  struct hostent *hptr;
  struct in_addr addr;
  char *dnsname = NULL; 
  dnsname = argv[1];
  
 if (dnsname == NULL) {
    fprintf (stdout, "%s: hostname is missing!\n", argv[0]);
    exit (1);
  }
  hptr = gethostbyname (dnsname);
  if (hptr) {
    addr.s_addr = *((long*)hptr->h_addr_list[0]);
    printf ("%s\n", inet_ntoa(addr));
  }
  else if (!hptr) {
    fprintf (stdout, "%s: unknown hostname: %s\n", argv[0], argv[1]);
    exit (1);
  }
  return 0;
}
Code:
gcc -o hci hci.c
Code:
# iptables -A FORWARD -d "$(/usr/bin/hci <dyn.dns.cx>)" -j ACCEPT
Code:
# iptables -L -n -v
Chain INPUT (policy ACCEPT 84 packets, 60194 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            ###.###.###.80

Chain OUTPUT (policy ACCEPT 71 packets, 3692 bytes)
 pkts bytes target     prot opt in     out     source               destination
 

framp

Moderator
Teammitglied
AL9374 schrieb:
Mit der SuSEfirewall und IP- Tables wirst du das nicht per DNS realisieren können. ...
Hier liegt die Betonung auf DNS. In Deinem Vorschlag wird ja mit dem Programm der DNS Name in eine Ip umgewandelt. Geht auch einfacher mit
Code:
host www.google.de | awk '/has address/ { print $4; exit}'
;)
Allerdings musst Du noch Code drumrum schreiben, der die alte iptables rule entfernt und die neue Regel einführt und das von cron aufrufen lassen. Das manuelle Aufrufen wollte der TE ja gerade nicht.
 
AL9374 schrieb:
Code:
host www.google.de | awk '/has address/ { print $4; exit}'
Allerdings musst Du noch Code drumrum schreiben, der die alte iptables rule entfernt und die neue Regel einführt ...
Mit iptables auf der Kommandozeile habe ich gar keine Erfahrung und auch keinen Durchblick. Kann mir jemand einige Codezeilen vorschlagen, wie man so eine Regel für einen bestimmten Port per Kommando definiert?
 

framp

Moderator
Teammitglied
Code:
iptables -I INPUT -s "$(host <dyndnsName> | awk '/has address/ { print $4; exit}')" --dport 389 -j ACCEPT
Das in einem Cron Job einbauen und es sollte tun. Nur werden dann nach und nach immer mehr IP Adressen berechtigt - da sich ja die IP ändert. D.h. man muss noch Logik einbauen, die alten IPs wieder aus den Regeln rauszuschmeissen. Das ist allerdings kein Einzeiler mehr :roll:

BTW: Ich dachte das Problem wäre für Dich gelöst?
 
framp schrieb:
Code:
iptables -I INPUT -s "$(host <dyndnsName> | awk '/has address/ { print $4; exit}')" --dport 389 -j ACCEPT
Das in einem Cron Job einbauen und es sollte tun. Nur werden dann nach und nach immer mehr IP Adressen berechtigt - da sich ja die IP ändert. D.h. man muss noch Logik einbauen, die alten IPs wieder aus den Regeln rauszuschmeissen ...
Genau das habe ich mir gedacht! Das wäre nämlich meine nächste Frage gewesen ...
Aber das ist nicht so wichtig. Man könnte ja alle paar Monate mit YAST die nicht mehr sinnvollen Einträge löschen, das müsste ja gehen, oder?

Dass natürlich in der Zwischenzeit jemand anderer diese IP-Adresse(n) hat und damit für jemand anderen der Port offen ist, das ist mir auch klar ...
 

framp

Moderator
Teammitglied
f.gruber schrieb:
... Man könnte ja alle paar Monate mit YAST die nicht mehr sinnvollen Einträge löschen, das müsste ja gehen, oder?
Nein, denn die FW Regeln werden nicht im YAST verzeichnet wenn Du sie wie oben per direktem Befehl eingibst. Sie sind nach einem Neustart des Rechners/FW weg. Wenn Du einen Server hast der so gut wie nicht restartet wird musst Du die FW Regeln manuell löschen. Das kann man machen in einem kleinen Script machen (iptables -L nach Port 389 Regeln durchsuchen und diese dann löschen).
Dass natürlich in der Zwischenzeit jemand anderer diese IP-Adresse(n) hat und damit für jemand anderen der Port offen ist, das ist mir auch klar ...
Wollte nur sicherstellen dass das Dir bewusst ist. ;)
 

framp

Moderator
Teammitglied
spoensche schrieb:
Man kann einzelnen IP-Tables Regeln auch ersetzen, (Stichwort Replace) und hast dir das Suchen erspart.
Gute Idee! Man prüft ob es schon eine Regel gibt und replaced sie dann bzw erzeugt sie.
 
framp schrieb:
...
Allerdings musst Du noch Code drumrum schreiben, der die alte iptables rule entfernt und die neue Regel einführt und das von cron aufrufen lassen. Das manuelle Aufrufen wollte der TE ja gerade nicht.
Ein kleines Skript mit den iptables-Regeln reicht hier. Es wird nach jedem Wechsel der ext. IP-Adresse (onlinechanged Ereignis), aufgerufen.
Code:
#!/bin/sh
#
BLACKLIST=/var/tmp/blacklist
ipt=/usr/sbin/iptables
#
$ipt -F
$ipt -t nat -F
$ipt -t mangle -F
$ipt -X
$ipt -t nat -X
$ipt -t mangle -X
$ipt -P FORWARD DROP
$ipt -P INPUT DROP
# ...
# ...
$ipt -I FORWARD 3 -d "$(/usr/bin/hci <dyn.dns.cx>)" -j ACCEPT
# ...
# ...
 
Oben