Linxmuster-Import-Subnets mit OpenSense 24.7 und LMN 7.2 legt keine statischen Routen an

Hello,
ich wollte mich „mal kurz“ erkundingen, ob das linuxmuster-import-subnets-Skript mit OpenSense 24.07 und LMN 7.2 noch funktionieren sollte?

Ich habe folgende Grundsituation:

subnets.csv:

# server subnet definition
10.0.0.0/16;10.0.0.253;10.0.255.1;10.0.255.254;;;SETUP
# # add your subnets below;;;;;;
# #Lehrenretz VLAN Tag 20;;;;;;
10.21.0.0/16;10.21.0.253;10.21.0.200;10.21.0.250;;;SETUP
# Schülernetz VLAN TAG 15 
10.17.0.0/16;10.17.0.253;10.17.0.200;10.17.0.250;;;SETUP

Der Import lässt sich erfolgreich ausführen:

root@server:~# linuxmuster-import-subnets 
#### linuxmuster-import-subnets                                           ####
------------------------------------------------------------------------------
#### Reading setup data:                                                  ####
#### * Server address: 10.0.0.1                                           ####
#### * Server network: 10.0.0.0/16                                        ####
#### Processing dhcp subnets:                                             ####
#### * 10.0.0.0/16                                                        ####
#### * 10.21.0.0/16                                                       ####
#### * 10.17.0.0/16                                                       ####
#### Restarting isc-dhcp-server ..................................... OK! ####
#### Processing netplan configuration:                                    ####
#### * Removed old routes.                                                ####
#### * Added new routes for all subnets.                                  ####
WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running.
#### * Applied new netplan configuration.                                 ####
#### Downloading firewall configuration:                                  ####
#### get 10.0.0.254 /conf/config.xml /var/cache/linuxmuster/opnsense.xml  ####
#### * Download finished successfully.                                    ####
#### * Saved changed config.                                              ####
#### Uploading firewall configuration:                                    ####
#### put 10.0.0.254 /var/cache/linuxmuster/opnsense.xml /conf/config.xml  ####
#### * Upload finished successfully.                                      ####
#### Applied new gateway.                                                 ####
#### Updating subnet routing on firewall:                                 ####
#### * Got 2 routes.                                                      ####
#### * Route c1107bff-fd9a-4a5d-b78b-51ad5427426d - 10.17.0.0/16 deleted. ####
#### * Route 10.17.0.0/16 deleted.                                        ####
#### * Route ca501ab3-dba3-4e10-a5ff-6adb77c6c9cd - 10.21.0.0/16 deleted. ####
#### * Route 10.21.0.0/16 deleted.                                        ####
#### * Added route for subnet 10.21.0.0/16.                               ####
#### * Added route for subnet 10.17.0.0/16.                               ####
#### Applied new routes.

Jetzt würde man erwarten, dass in der OpnSense die Route für 10.17 und 10.21 gesetzt werden, folgendes Bild findet man aber vor:

Erwartet hätte ich folgende Konfiguration (manuell angelegt):

Anscheindend werden die Routen auch wieder gelöscht, wnen ich das Skript „linuxmuster-import-subnets“ erneut aufrufe.

Problem daran ist natürlich, dass die Clients hinter 10.17 und 10.21 keine Internetverbindung bekommen, wenn die Rückroute nicht da ist.

Kann dieses Verhalten jemand bestätigen - oder liegts mal wieder an mir?

Timo

Salut,
wir haben auch Probleme mit dem import der Subnetze - auf den Opensense habe ich noch gar nicht geschaut, aber uns war zunächst aufgefallen, dass das Skript die /etc/netplan/01-netcfg.yaml nicht mehr richtig (?) schreibt – da waren zumindest bei uns vorher Routen für jedes einzelne Subnetz drin

routes:
      - to: 10.16.1.0/24
        via: 10.16.1.253
      - to: 10.16.2.0/24
        via: 10.16.1.253
...

aber wenn man das Skript jetzt durchlaufen lässt, löscht es diese raus und legt sie auch nicht neu an. Von daher kann ich mir vorstellen, dass es nicht an Dir liegt.

Gruß
Sascha

Hi Sascha,
das kann ich nicht bestätigen - bei mir wird die Netplan-Datei korrekt angepasst.

Timo

Hi Timo,
das ist natürlich ärgerlich, weil es dann möglicherweise zwei verschiedene Probleme gibt…
Es wundert mich aber auch ein bisschen denn wenn ich mir auf gitub den code vom import-Skrip anschaue dann steht da in der Funktion, die die yaml-Datei schreibt an der entscheiden Stelle (ab Zeile 123)

        for item in subnets:
            # skip if subnet gateway is the default
            if servernet_router == gateway:
                continue
            subnet = item.split(':')[0]
            # tricky: concenate dict object for yaml using eval
            subroute = eval('{"to": \'' + subnet + '\', "via": \'' + servernet_router + '\'}')
            ifcfg['routes'].append(subroute)

Das heißt er würde eine Route nur schreiben, wenn die Variable „servernet_router“ anders wäre als „gateway“. Wenn ich mir anschaue, was in der Zeile steht, die die route tatsächlich schreibt, dann müsste „servernet_router“ die routeradresse enthalten, die du in der csv für das jeweilige subnet angegeben hast. in der entsprechenden schleife wird die variable servernet_router aber niemals verändert sondern bleibt auf dem wert, den sie im hauptprogramm bekommt (zeile 304, servernet_router = firewallip). da ist es auch kein wunder, das keine routen geschrieben werden, den (bei uns) ist gateway == firewall. wenn man die abfrage rausnimmt, schreibt er zwar die routen für die subnetze, setze als routeradresse aber logischerweise immer die firewall-up ein und nicht den eintrag aus der CSV.

das habe ich zumindest bei uns jetzt als grund identifiziert warum die yaml keine einträge für die subnetze bekommt.
wie sieht denn in deinem skript /usr/sbin/linuxmuster-import-subnets die funktion „updateNetplan“ aus ?

Gruß
Sascha

Mein Gateway ist != L3-Net-Router.
Vermutlich werden daher bei mir die Routen gesetzt.

Hier der entsprechende Auszug (ist sicherlich gleich wie bei dir):

 88 # functions begin
 89 # update static routes in netplan configuration
 90 def updateNetplan(subnets):
 91     printScript('Processing netplan configuration:')
 92     cfgfile = constants.NETCFG
 93     # create backup of current configuration
 94     timestamp = str(datetime.datetime.now()).replace('-', '').replace(' ', '').replace(':', '').split('.')[0]
 95     bakfile = cfgfile + '-' + timestamp
 96     rc = subprocess.call('cp ' + cfgfile + ' ' + bakfile, shell=True)
 97     if rc != 0:
 98         printScript('* Failed to backup ' + cfgfile + '!')
 99         return False
100     # read netplan config file
101     with open(cfgfile) as config:
102         netcfg = yaml.safe_load(config)
103     iface = str(netcfg['network']['ethernets']).split('\'')[1]
104     ifcfg = netcfg['network']['ethernets'][iface]
105     # remove deprecated gateway4
106     try:
107         del ifcfg['gateway4']
108         printScript('* Removed deprecated gateway4 statement.')
109     except:
110         None
111     # first delete the old routes if there are any
112     try:
113         del ifcfg['routes']
114         printScript('* Removed old routes.')
115     except:
116         None
117     # set default route
118     ifcfg['routes'] = []
119     subroute = eval('{"to": \'default\', "via": \'' + gateway + '\'}')
120     ifcfg['routes'].append(subroute)
121     # add subnet routes if there are any beside server network
122     if len(subnets) > 0:
123         for item in subnets:
124             # skip if subnet gateway is the default
125             if servernet_router == gateway:
126                 continue
127             subnet = item.split(':')[0]
128             # tricky: concenate dict object for yaml using eval
129             subroute = eval('{"to": \'' + subnet + '\', "via": \'' + servernet_router + '\'}')
130             ifcfg['routes'].append(subroute)
131         printScript('* Added new routes for all subnets.')
132     # save netcfg
133     with open(cfgfile, 'w') as config:
134         config.write(yaml.dump(netcfg, default_flow_style=False))
135     rc = subprocess.call('netplan apply', shell=True)
136     if rc == 0:
137         printScript('* Applied new netplan configuration.')
138     else:
139         printScript('* Failed to apply new netplan configuration. Rolling back to previous status.')
140         subprocess.call('cp ' + bakfile + ' ' + cfgfile, shell=True)
141         subprocess.call('netplan apply', shell=True)
142         return False

Kann mir das Skript auch mal genauer anschauen, aber vermutlich erst die Tage :frowning:

Ok, dann liegt es daran nicht. Ich habe eh langsame den Verdacht, dass die Router-Adressen, die man in der CSV für die Subnetze angibt total unerheblich sind (ich bin aber auch mehr Programmierer und weniger Administrator), den die landen laut Skript weder in der yaml noch auf dem Gateway und auch Du hast bei Deinem händischen Beispiel ja für alle Subnetz dasselbe Gateway angegeben und nicht die, die Du in Deinem CSV hast…

Kleine Sache am Rande, meinst Du wirklich OpenSense 24.07 oder die aktuellste Version 24.7 (ohne die Null) ?

Gruß
Sascha

Nö, die sind wichtig - vorallem dann wenn du dein Netzwerk auf L3 segementieren möchtest.
Auf dem Server brauchst du Sie, damit er mit den Clients kommunizieren kann, auf der Firewall für die Rückroute des Internetverkehrs.
M.E.n. gehts nicht ohne.

Außerdem könnte man prinzipiell ja auch verschiedene Netzwerke hinter verschiedenen Routern verfügbar machen (glaub den Use-Case gibts in Schulnetzen eher selten, aber wer weiß).

Genau, weil das in diesem Netzwerk so sein muss.

Von der Firewall werde ich mit 24.7 begrüßt:
*** firewall.xxxx.lan: OPNsense 24.7 ***

Hab ich wohl geschlafen beim Thread erstellen, sorry.

Jaso! Und die Clients in den Subnetzen brauchen natürlich acuh das jeweilige Standard-Gateway :F

Ok, ich hatte auch schlecht geschaut – die Router-Adressen werden vom Skript mit den Subnetzen nach /etc/dhcp/subnets.conf geschrieben. Ich glaub, ich muss das Subnetting erst zu Ende verstehen, bevor ich da hilfreich sein kann.
Vielleicht schaltet sich ja noch jemand mit mehr Ahnung ein.

Gruß
Sascha

Hi.

Etwas ähnliches lief hier schon mal. Sucht mal nach „GW_LAN“ …. vielleicht hilft das irgendwie weiter

hth,
Michael

Moin,

Um auf Deine Ursprungsfrage zurück zu kommen:
ich habe das mal in meiner Spieleumgebung (Server/Opensense/Clients in VirtualBox) ausprobiert - sowohl mit OpenSense 24.1 also auch mit 24.7 werden die Routen eingetragen.
Was hingegen bei mir nicht passiert ist das Löschen der Routen - selbst wenn ich die Einträge in der CSV wieder entferne und das Skript erneut durchlaufen lasse - die Routen auf der Firewall bleiben stehen (in der /etc/dhcp/subnets.conf und der netplan Datei werden die einträge für die entfernten Subnetze hingegen ordnungsgemäß gelöscht).

Bei dem beobachteten Fehler in unserem Produktivsystem muss ich zurückrudern, das war selbst verschuldet - als Gateway für das Servernetz hatten wird die Firewall eingetragen statt das extra einzurichtende Layer3-Gateway (…253). Doku lesen hätte halt doch geholfen, Dein Hinweis hat mich auf die Spur gebracht, danke dafür!

Gruß
Sascha

Hm, dann muss ich mal in diesem Setup genauer suchen, wo es herkommen kann. Danke für das gegen testen auf deinem Spielplatz!

Freut mich, dass es in deinem Kontext weitergeholfen hat :-).