[pve-devel] [RFC pve-container 3/4] systemd: deal with gateways outside the subnet

Wolfgang Bumiller w.bumiller at proxmox.com
Fri Oct 16 15:57:12 CEST 2015


---
 src/PVE/LXC/Setup/Base.pm | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/PVE/LXC/Setup/Base.pm b/src/PVE/LXC/Setup/Base.pm
index ba7453d..cbb23a1 100644
--- a/src/PVE/LXC/Setup/Base.pm
+++ b/src/PVE/LXC/Setup/Base.pm
@@ -11,6 +11,7 @@ use File::Path;
 
 use PVE::INotify;
 use PVE::Tools;
+use PVE::Network;
 
 sub new {
     my ($class, $conf, $rootdir) = @_;
@@ -266,6 +267,10 @@ Name = $d->{name}
 [Network]
 Description = Interface $d->{name} autoconfigured by PVE
 DATA
+
+	my $routes = '';
+	my ($has_ipv4, $has_ipv6);
+
 	# DHCP bitflags:
 	my @DHCPMODES = ('none', 'v4', 'v6', 'both');
 	my ($NONE, $DHCP4, $DHCP6, $BOTH) = (0, 1, 2, 3);
@@ -275,25 +280,34 @@ DATA
 	    if ($ip eq 'dhcp') {
 		$dhcp |= $DHCP4;
 	    } elsif ($ip ne 'manual') {
+		$has_ipv4 = 1;
 		$data .= "Address = $ip\n";
 	    }
 	}
 	if (defined(my $gw = $d->{gw})) {
 	    $data .= "Gateway = $gw\n";
+	    if ($has_ipv4 && !PVE::Network::is_ip_in_cidr($gw, $d->{ip}, 4)) {
+		$routes .= "\n[Route]\nDestination = $gw/32\nScope = link\n";
+	    }
 	}
 
 	if (defined(my $ip = $d->{ip6})) {
 	    if ($ip eq 'dhcp') {
 		$dhcp |= $DHCP6;
 	    } elsif ($ip ne 'manual') {
+		$has_ipv6 = 1;
 		$data .= "Address = $ip\n";
 	    }
 	}
 	if (defined(my $gw = $d->{gw6})) {
 	    $data .= "Gateway = $gw\n";
+	    if ($has_ipv6 && !PVE::Network::is_ip_in_cidr($gw, $d->{ip6}, 6)) {
+		$routes .= "\n[Route]\nDestination = $gw/128\nScope = link\n";
+	    }
 	}
 
 	$data .= "DHCP = $DHCPMODES[$dhcp]\n";
+	$data .= $routes if $routes;
 
 	PVE::Tools::file_set_contents($filename, $data);
     }
-- 
2.1.4




More information about the pve-devel mailing list