]> git.proxmox.com Git - pve-firewall.git/commitdiff
simulator: use new bridge naming scheme
authorStefan Hanreich <s.hanreich@proxmox.com>
Fri, 12 Apr 2024 08:07:36 +0000 (10:07 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Sun, 21 Apr 2024 11:04:47 +0000 (13:04 +0200)
We now allow bridges without the vmbr prefix, so we need to allow them
here in the simulator as well.

Reviewed-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
src/PVE/FirewallSimulator.pm
src/PVE/Service/pve_firewall.pm

index 140c46ebf5d9b9ca07dbabcd399ad8aa0ad79737..fa5ed0e5e8baa4b6ea10fe7f0035bf97ccfc5028 100644 (file)
@@ -7,6 +7,12 @@ use PVE::Firewall;
 use File::Basename;
 use Net::IP;
 
+use base 'Exporter';
+our @EXPORT_OK = qw(
+$bridge_name_pattern
+$bridge_interface_pattern
+);
+
 # dynamically include PVE::QemuServer and PVE::LXC
 # to avoid dependency problems
 my $have_qemu_server;
@@ -27,6 +33,9 @@ my $debug = 0;
 
 my $NUMBER_RE = qr/0x[0-9a-fA-F]+|\d+/;
 
+our $bridge_name_pattern = '[a-zA-Z][a-zA-Z0-9]{0,9}';
+our $bridge_interface_pattern = "($bridge_name_pattern)/(\\S+)";
+
 sub debug {
     my $new_value = shift;
     $debug = $new_value if defined($new_value);
@@ -397,7 +406,7 @@ sub route_packet {
            $pkg->{physdev_in} = $target->{fwln} || die 'internal error';
            $pkg->{physdev_out} = $target->{tapdev} || die 'internal error';
 
-       } elsif ($route_state =~ m/^vmbr\d+$/) {
+       } elsif ($route_state =~ m/^$bridge_name_pattern$/) {
 
            die "missing physdev_in - internal error?" if !$physdev_in;
            $pkg->{physdev_in} = $physdev_in;
@@ -531,11 +540,6 @@ sub simulate_firewall {
        $from_info->{type} = 'host';
        $start_state = 'host';
        $pkg->{source} = $host_ip if !defined($pkg->{source});
-    } elsif ($from =~ m|^(vmbr\d+)/(\S+)$|) {
-       $from_info->{type} = 'bport';
-       $from_info->{bridge} = $1;
-       $from_info->{iface} = $2;
-       $start_state = 'from-bport';
     } elsif ($from eq 'outside') {
        $from_info->{type} = 'bport';
        $from_info->{bridge} = 'vmbr0';
@@ -559,6 +563,11 @@ sub simulate_firewall {
        $from_info = extract_vm_info($vmdata, $vmid, $netnum);
        $start_state = 'fwbr-out';
        $pkg->{mac_source} = $from_info->{macaddr};
+    } elsif ($from =~ m|^$bridge_interface_pattern$|) {
+       $from_info->{type} = 'bport';
+       $from_info->{bridge} = $1;
+       $from_info->{iface} = $2;
+       $start_state = 'from-bport';
     } else {
        die "unable to parse \"from => '$from'\"\n";
     }
@@ -569,10 +578,6 @@ sub simulate_firewall {
        $target->{type} = 'host';
        $target->{iface} = 'host';
        $pkg->{dest} = $host_ip if !defined($pkg->{dest});
-    } elsif ($to =~ m|^(vmbr\d+)/(\S+)$|) {
-       $target->{type} = 'bport';
-       $target->{bridge} = $1;
-       $target->{iface} = $2;
     } elsif ($to eq 'outside') {
        $target->{type} = 'bport';
        $target->{bridge} = 'vmbr0';
@@ -591,6 +596,10 @@ sub simulate_firewall {
        my $vmid = $1;
        $target = extract_vm_info($vmdata, $vmid, 0);
        $target->{iface} = $target->{tapdev};
+    } elsif ($to =~ m|^$bridge_interface_pattern$|) {
+       $target->{type} = 'bport';
+       $target->{bridge} = $1;
+       $target->{iface} = $2;
     } else {
        die "unable to parse \"to => '$to'\"\n";
     }
index 30d14d96374b207cccf98ee7c0159ad50b178998..65cb2b84dd8a0079f0fb2587871c37af04bef39e 100755 (executable)
@@ -18,6 +18,7 @@ use PVE::Tools qw(dir_glob_foreach file_read_firstline);
 
 use PVE::Firewall;
 use PVE::FirewallSimulator;
+use PVE::FirewallSimulator qw($bridge_interface_pattern);
 
 use base qw(PVE::Daemon);
 
@@ -312,14 +313,14 @@ __PACKAGE__->register_method ({
            from => {
                description => "Source zone.",
                type => 'string',
-               pattern => '(host|outside|vm\d+|ct\d+|vmbr\d+/\S+)',
+               pattern => "(host|outside|vm\\d+|ct\\d+|$bridge_interface_pattern)",
                optional => 1,
                default => 'outside',
            },
            to => {
                description => "Destination zone.",
                type => 'string',
-               pattern => '(host|outside|vm\d+|ct\d+|vmbr\d+/\S+)',
+               pattern => "(host|outside|vm\\d+|ct\\d+|$bridge_interface_pattern)",
                optional => 1,
                default => 'host',
            },