ipfilter:1|0 this drop packets if guest ip address is different than ipaddress defined in vm config)
Signed-off-by: Alexandre Derumier <aderum...@odiso.com> --- src/PVE/Firewall.pm | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/PVE/Firewall.pm b/src/PVE/Firewall.pm index e8c05eb..eedec74 100644 --- a/src/PVE/Firewall.pm +++ b/src/PVE/Firewall.pm @@ -1624,11 +1624,13 @@ sub ruleset_chain_add_input_filters { } sub ruleset_create_vm_chain { - my ($ruleset, $chain, $options, $macaddr, $direction) = @_; + my ($ruleset, $chain, $options, $macaddr, $direction, $ipfilterchain) = @_; ruleset_create_chain($ruleset, $chain); my $accept = generate_nfqueue($options); + ruleset_addrule($ruleset, $chain, "-m set ! --match-set $ipfilterchain src -j DROP") if (!(defined($options->{ipfilter}) && $options->{ipfilter} == 0)) && $ipfilterchain; + if (!(defined($options->{dhcp}) && $options->{dhcp} == 0)) { if ($direction eq 'OUT') { ruleset_generate_rule($ruleset, $chain, { action => 'PVEFW-SET-ACCEPT-MARK', @@ -1774,7 +1776,7 @@ sub generate_venet_rules_direction { } sub generate_tap_rules_direction { - my ($ruleset, $cluster_conf, $iface, $netid, $macaddr, $vmfw_conf, $vmid, $direction) = @_; + my ($ruleset, $cluster_conf, $iface, $netid, $macaddr, $vmfw_conf, $vmid, $direction, $ipfilterchain) = @_; my $lc_direction = lc($direction); @@ -1785,7 +1787,7 @@ sub generate_tap_rules_direction { my $tapchain = "$iface-$direction"; - ruleset_create_vm_chain($ruleset, $tapchain, $options, $macaddr, $direction); + ruleset_create_vm_chain($ruleset, $tapchain, $options, $macaddr, $direction, $ipfilterchain); ruleset_generate_vm_rules($ruleset, $rules, $cluster_conf, $vmfw_conf, $tapchain, $netid, $direction, $options); @@ -2052,7 +2054,7 @@ sub parse_vmfw_option { my $loglevels = "emerg|alert|crit|err|warning|notice|info|debug|nolog"; - if ($line =~ m/^(enable|dhcp|macfilter|ips):\s*(0|1)\s*$/i) { + if ($line =~ m/^(enable|dhcp|macfilter|ipfilter|ips):\s*(0|1)\s*$/i) { $opt = lc($1); $value = int($2); } elsif ($line =~ m/^(log_level_in|log_level_out):\s*(($loglevels)\s*)?$/i) { @@ -2849,12 +2851,31 @@ sub compile { my $net = PVE::QemuServer::parse_net($conf->{$netid}); next if !$net->{firewall}; my $iface = "tap${vmid}i$1"; - + my $macaddr = $net->{macaddr}; + + my $ipfilterchain = undef; + my $ipaddress = $net->{ipaddress}; + if($ipaddress){ + parse_address_list($ipaddress); + my @ips = split(',', $ipaddress); + my $tapipset = {}; + $tapipset->{vmid} = $vmid; + foreach my $singleip (@ips) { + my $ipset = {}; + $ipset->{cidr} = $singleip; + push @{$tapipset->{ipset}->{$iface}}, $ipset; + + } + generate_ipset_chains($ipset_ruleset, undef, $tapipset); + $ipfilterchain = compute_ipset_chain_name($vmid, $iface); + + } + generate_tap_rules_direction($ruleset, $cluster_conf, $iface, $netid, $macaddr, - $vmfw_conf, $vmid, 'IN'); + $vmfw_conf, $vmid, 'IN', $ipfilterchain); generate_tap_rules_direction($ruleset, $cluster_conf, $iface, $netid, $macaddr, - $vmfw_conf, $vmid, 'OUT'); + $vmfw_conf, $vmid, 'OUT', $ipfilterchain); } }; warn $@ if $@; # just to be sure - should not happen -- 1.7.10.4 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel