• 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] firewalld: Keine source-IP definierbar?

gehrke

Administrator
Teammitglied
Moin *,

ich arbeite mich gerade in firewalld unter CentOS7 ein. Dabei stoße ich auf ein konkretes Problem bei der Definition einer Regel, welche die mitgelieferte Regel 'bacula-client' erweitern soll um die Festlegung auf eine bestimmte Quell-IP.

Das habe ich gemacht...

Den gelieferten Regelsatz kopiert:
Code:
# cp /usr/lib/firewalld/services/bacula-client.xml /etc/firewalld/services/bacula-client-gehrke.xml
.
Eine Zeile 6 für die Quell-IP hinzugefügt:
Code:
# cat --number /etc/firewalld/services/bacula-client-gehrke.xml
     1  <?xml version="1.0" encoding="utf-8"?>
     2  <service>
     3    <short>Bacula Client (only from bacula-dir)</short>
     4    <description>This option allows a Bacula server to connect to the local machine to schedule backups. You need the bacula-client package installed for this option to be useful.</description>
     5    <port protocol="tcp" port="9102"/>
     6    <source ipv4="172.16.21.10" />
     7  </service>
Die Konfiguration geladen und die Regel hinzugefügt:
Code:
# firewall-cmd --reload
success

# firewall-cmd --zone=public --add-service=bacula-client-gehrke
Error: INVALID_SERVICE: bacula-client-gehrke
Im journal zeigt sich der Hinweis auf das Element 'source':
Code:
Sep 21 00:19:17 j8.gehrke.local firewalld[31101]: 2015-09-21 00:19:17 ERROR: Failed to load service file '/etc/firewalld/services/bacula-client-gehrke.xml': PARSE_ERROR: Unexpected element source
Sep 21 00:19:19 j8.gehrke.local firewalld[31101]: 2015-09-21 00:19:19 ERROR: PARSE_ERROR: Unexpected element source
Sep 21 00:19:47 j8.gehrke.local firewalld[31101]: 2015-09-21 00:19:47 ERROR: INVALID_SERVICE: bacula-client-gehrke
Laut
Code:
man firewalld.service
kann man in einer solchen Definition das Element 'destination' verwenden, aber 'source' gibt es gar nicht.

Bin etwas verwundert, weil bei allen mir bekannten Firewall-Implementierungen immer auch die Quell-IP als Merkmal adressierbar war.
Womit kann ich erreichen, dass die Firewall blockiert, wenn Anfragen von einem anderen als dem gewünschten System kommen? :???:
TNX

cu, gehrke
 

marce

Guru
Ich nutze es zwar nicht, aber http://www.firewalld.org/documentation/man-pages/firewalld.zone.html meint, Du sollst source address verwenden.
 
OP
gehrke

gehrke

Administrator
Teammitglied
Dank für Deine Antwort. Ich lerne ja noch, aber soweit ich das Tool/Konzept bislang verstanden habe, geht es im von Dir verlinkten Abschnitt um die Definition einer Zone. Ich brauche aber eine einzelne Regel.
 

marce

Guru
wenn man sich aber http://www.firewalld.org/documentation/man-pages/firewalld.zone.html#rule angeschaut könnte das auch für Dich zutreffen.
 
OP
gehrke

gehrke

Administrator
Teammitglied
Hhmm, bin da scheinbar noch nicht ganz durchgestiegen.

Das hier funktioniert aber schon mal:
Code:
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=172.16.21.10 port port=9102 protocol=tcp accept'
success
 
OP
gehrke

gehrke

Administrator
Teammitglied
marce schrieb:
wenn man sich aber http://www.firewalld.org/documentation/man-pages/firewalld.zone.html#rule angeschaut könnte das auch für Dich zutreffen.
TNX

Aber wenn ich das richtig lese, dann habe ich die Wahl, entweder nach Port und Protocol ('The general rule structure') oder nach Source Address ('Rule structure for source black or white listing') einzugrenzen. Alle drei zusammen scheint nicht möglich.
:???:
 
OP
gehrke

gehrke

Administrator
Teammitglied
Das war offensichtlich eine Fehlinterpretation meinerseits.
TNX

So geht es auch:
Code:
# cat /etc/firewalld/zones/public.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <rule family="ipv4">
    <port port="9102" protocol="tcp" />
    <source address="172.16.21.10" />
    <log />
    <accept />
  </rule>
</zone>
 
OP
gehrke

gehrke

Administrator
Teammitglied
Oder so:
Code:
# cat /etc/firewalld/zones/public.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <rule family="ipv4">
    <service name="bacula" />
    <source address="172.16.21.10" />
    <accept />
  </rule>
</zone>
Das scheint mir im Moment die mächtigste Option zu sein, weil damit die bestehenden Service-Definitionen kombiniert werden können mit IP-basierten Eingrenzungen.
 
OP
gehrke

gehrke

Administrator
Teammitglied
Ich glaube, dass ich mittlerweile einenStand erreicht haben, der permanent funktioniert. Ob es der Weisheit letzter Schluss ist, werden wir sehen...

Noch mal zum Ziel: Auf einem Server mit 3 Ethernet-Interfaces möchte ich auf einem Interface (nur für das Admin-LAN) SSH-Server und Bacula-FD zulassen, letzteres aber nur vom bekannten Bacula-Director.
Die anderen beiden Interfaces bekommen vom DHCP-Server andere Subnetze zugewiesen und sollen andere Dienste anbieten (später).
Code:
[root@j8 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether <xxx> brd ff:ff:ff:ff:ff:ff
    inet 172.16.10.7/24 brd 172.16.10.255 scope global dynamic enp1s0
       valid_lft 6572sec preferred_lft 6572sec
    inet6 <xxx> scope link 
       valid_lft forever preferred_lft forever
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether <xxx> brd ff:ff:ff:ff:ff:ff
    inet 172.16.20.9/24 brd 172.16.20.255 scope global dynamic enp2s0
       valid_lft 5472sec preferred_lft 5472sec
    inet6 <xxx> scope link 
       valid_lft forever preferred_lft forever
4: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether <xxx> brd ff:ff:ff:ff:ff:ff
    inet 172.16.22.9/24 brd 172.16.22.255 scope global dynamic enp3s0
       valid_lft 4156sec preferred_lft 4156sec
    inet6 <xxx> scope link 
       valid_lft forever preferred_lft forever
CentOS verwendet standardmäßig den NetworkManager:
Code:
[root@j8 /]# nmcli connection show
NAME                         UUID                                  TYP             GERÄT  
Kabelgebundene Verbindung 2  10fe9c53-7c23-40b3-bd08-69d615ea8d23  802-3-ethernet  enp3s0 
Kabelgebundene Verbindung 1  b0a4fb84-e243-4ca4-a909-40508c8c6a15  802-3-ethernet  enp1s0 
Kabelgebundene Verbindung 3  cdeea685-befc-43cb-92f9-6a1b92d340c1  802-3-ethernet  enp2s0
Gelöst habe ich das momentan, indem ich die Default-Zonen-Konfigurationen für public und work kopiert und angepasst habe:
Code:
[root@j8 /]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <interface name="enp2s0"/>
  <interface name="enp3s0"/>
  <service name="dhcpv6-client"/>
</zone>
Code:
[root@j8 /]# cat /etc/firewalld/zones/work.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Work</short>
  <description>For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <interface name="enp1s0"/>
  <service name="ipp-client"/>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <rule family="ipv4">
    <source address="172.16.21.10"/>
    <service name="bacula"/>
    <accept/>
  </rule>
</zone>
Etwas zickig ist firewalld bei der Zusammenarbeit mit dem NetworkManager:
https://www.certdepot.net/rhel7-get-started-firewalld/
Code:
[root@j8 /]# nmcli con mod "Kabelgebundene Verbindung 1" connection.zone work
[root@j8 /]# nmcli con up "Kabelgebundene Verbindung 1"
Verbindung wurde erfolgreich aktiviert (aktiver D-Bus-Pfad: /org/freedesktop/NetworkManager/ActiveConnection/3)
Ohne obige Anweisungen wird die Konfiguration nicht permanent, denn dann landen alle Interfaces bei einem Neustart in der Default-Zone (public).

Nun sieht es so aus:
Code:
[root@j8 ~]# firewall-cmd --zone=public --list-all --permanent
public (default, active)
  interfaces: enp2s0 enp3s0
  sources: 
  services: dhcpv6-client
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules:
Code:
[root@j8 ~]# firewall-cmd --zone=work --list-all --permanent
work (active)
  interfaces: enp1s0
  sources: 
  services: dhcpv6-client ipp-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 
        rule family="ipv4" source address="172.16.21.10" service name="bacula" accept
Das Interface 'enp1s0' läuft in Zone work, die anderen beiden in Zone public.

Dank an alle Beteiligten...
 
Oben