From b453122789ec4c6f39e6ceb9900e0e80a6abeb99 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 16 Mar 2020 18:55:10 +0900 Subject: [PATCH 1/2] network: add a flag to ignore gateway provided by DHCP server Closes #15117. --- man/systemd.network.xml | 8 +++++++- src/network/networkd-dhcp4.c | 5 ++++- src/network/networkd-network-gperf.gperf | 1 + src/network/networkd-network.c | 1 + src/network/networkd-network.h | 1 + test/fuzz/fuzz-network-parser/directives.network | 1 + 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/man/systemd.network.xml b/man/systemd.network.xml index a174a1fb24..3dfc43e43d 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -1474,7 +1474,13 @@ "link" scope will be used. For anything else, scope defaults to "global". - + + UseGateway= + + When true (the default), the gateway will be requested from the DHCP server and added to the + routing table with a metric of 1024, and a scope of "link". + + UseTimezone= diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 13e3e32f40..3f6580422e 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -323,6 +323,9 @@ static int link_set_dhcp_routes(Link *link) { } } + if (!link->network->dhcp_use_gateway) + return 0; + r = sd_dhcp_lease_get_router(link->dhcp_lease, &router); if (IN_SET(r, 0, -ENODATA)) log_link_info(link, "DHCP: No gateway received from DHCP server."); @@ -451,7 +454,7 @@ static int dhcp_remove_router(Link *link, sd_dhcp_lease *lease, const struct in_ assert(link); assert(address); - if (!link->network->dhcp_use_routes) + if (!link->network->dhcp_use_gateway) return 0; r = sd_dhcp_lease_get_router(lease, &router); diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index e1b9b5687a..e690ef85a9 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -163,6 +163,7 @@ DHCPv4.UseMTU, config_parse_bool, DHCPv4.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_use_hostname) DHCPv4.UseDomains, config_parse_dhcp_use_domains, 0, offsetof(Network, dhcp_use_domains) DHCPv4.UseRoutes, config_parse_bool, 0, offsetof(Network, dhcp_use_routes) +DHCPv4.UseGateway, config_parse_bool, 0, offsetof(Network, dhcp_use_gateway) DHCPv4.RequestOptions, config_parse_dhcp_request_options, 0, 0 DHCPv4.Anonymize, config_parse_bool, 0, offsetof(Network, dhcp_anonymize) DHCPv4.SendHostname, config_parse_bool, 0, offsetof(Network, dhcp_send_hostname) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index f99886d5f9..248172f8a2 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -384,6 +384,7 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .dhcp_use_dns = true, .dhcp_use_hostname = true, .dhcp_use_routes = true, + .dhcp_use_gateway = true, /* NOTE: this var might be overwritten by network_apply_anonymize_if_set */ .dhcp_send_hostname = true, .dhcp_send_release = true, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index f8ecb1f687..6fe87d8915 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -109,6 +109,7 @@ struct Network { bool dhcp_use_sip; bool dhcp_use_mtu; bool dhcp_use_routes; + bool dhcp_use_gateway; bool dhcp_use_timezone; bool rapid_commit; bool dhcp_use_hostname; diff --git a/test/fuzz/fuzz-network-parser/directives.network b/test/fuzz/fuzz-network-parser/directives.network index a729adcc86..bfaeaaf4be 100644 --- a/test/fuzz/fuzz-network-parser/directives.network +++ b/test/fuzz/fuzz-network-parser/directives.network @@ -73,6 +73,7 @@ UseDNS= RoutesToDNS= UseDomains= UseRoutes= +UseGateway= IAID= UserClass= UseNTP= From 0d7bd445d26590aad7b05040c9d8423fcd6e5d4f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 16 Mar 2020 19:08:36 +0900 Subject: [PATCH 2/2] test-network: add a test case for DHCPv4.UseGateway=no --- .../conf/dhcp-client-ipv4-use-gateway-no.network | 9 +++++++++ test/test-network/systemd-networkd-tests.py | 14 ++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 test/test-network/conf/dhcp-client-ipv4-use-gateway-no.network diff --git a/test/test-network/conf/dhcp-client-ipv4-use-gateway-no.network b/test/test-network/conf/dhcp-client-ipv4-use-gateway-no.network new file mode 100644 index 0000000000..fb31772201 --- /dev/null +++ b/test/test-network/conf/dhcp-client-ipv4-use-gateway-no.network @@ -0,0 +1,9 @@ +[Match] +Name=veth99 + +[Network] +DHCP=ipv4 +IPv6AcceptRA=false + +[DHCPv4] +UseGateway=no diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 5df1fed985..388e615602 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -2921,6 +2921,7 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): 'dhcp-client-ipv4-dhcp-settings.network', 'dhcp-client-ipv4-only-ipv6-disabled.network', 'dhcp-client-ipv4-only.network', + 'dhcp-client-ipv4-use-gateway-no.network', 'dhcp-client-ipv4-use-routes-no.network', 'dhcp-client-ipv6-only.network', 'dhcp-client-ipv6-rapid-commit.network', @@ -3040,6 +3041,19 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.assertRegex(output, r'default via 192.168.5.1 proto dhcp src 192.168.5.181 metric 1024') self.assertRegex(output, r'192.168.5.1 proto dhcp scope link src 192.168.5.181 metric 1024') + def test_dhcp_client_ipv4_use_gateway_no(self): + copy_unit_to_networkd_unit_path('25-veth.netdev', 'dhcp-server-veth-peer.network', 'dhcp-client-ipv4-use-gateway-no.network') + + start_networkd() + self.wait_online(['veth-peer:carrier']) + start_dnsmasq(additional_options='--dhcp-option=option:dns-server,192.168.5.6,192.168.5.7', lease_time='2m') + self.wait_online(['veth99:routable', 'veth-peer:routable']) + + output = check_output('ip route show dev veth99') + print(output) + self.assertRegex(output, r'192.168.5.0/24 via 192.168.5.5 proto dhcp src 192.168.5.181 metric 1024') + self.assertNotRegex(output, r'default via 192.168.5.1') + def test_dhcp_client_ipv4_ipv6(self): copy_unit_to_networkd_unit_path('25-veth.netdev', 'dhcp-server-veth-peer.network', 'dhcp-client-ipv6-only.network', 'dhcp-client-ipv4-only.network')