[Bug 221379] bsdinstall(8): Installer doesn't support default router outside local subnet
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Wed Aug 9 23:02:41 UTC 2017
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=221379
Bug ID: 221379
Summary: bsdinstall(8): Installer doesn't support default
router outside local subnet
Product: Base System
Version: CURRENT
Hardware: Any
OS: Any
Status: New
Severity: Affects Some People
Priority: ---
Component: bin
Assignee: freebsd-bugs at FreeBSD.org
Reporter: nrg_freebsd-bugs at voidptr.de
*Problem:*
When the default gateway isn't contained in the subnet described by the local
system's IP address and Subnet mask, bsdinstall(8) fails when it tries to add
the default route, throwing the user back to the start of the install process.
*Background:*
IPv4 exhaustion has led some server providers to use rather questionable
networking hacks to conserve IP space — namely, using gateway addresses outside
the local subnet so the first address on the local subnet (x.x.x.1) doesn't
have to be a router and can be used for customer machines instead.
I'm currently seeing this on a KVM virtual machine from OneProvider (an
Online.net reseller), but apparently OVH, Hetzner, and a bunch of smaller
players do the same thing.
My (slightly anonymized) network config:
vtnet0:
inet 195.154.123.234 netmask 0xffffffff broadcast 195.154.123.234
Destination Gateway Flags Netif Expire
default 62.210.112.1 UGS vtnet0
62.210.112.1 52:54:00:00:82:41 UHS vtnet0
On a "normal" FreeBSD system, this can be achieved using an rc.conf something
like this:
ifconfig_vtnet0="inet 195.154.123.234 netmask 255.255.255.255"
gateway_if="vtnet0"
gateway_ip="62.210.112.1"
static_routes="gateway default"
route_gateway="-host $gateway_ip -interface $gateway_if"
route_default="default $gateway_ip"
Or temporarily using route(8):
route add -host 62.210.112.1 -iface vtnet0
route add default 62.210.112.1
*Problem details:*
The installer tries `route add default 62.210.112.1` directly, which of course
fails because there is no route to 62.210.112.1 yet (see
usr.sbin/bsdinstall/scripts/netconfig_ipv4:94 in base).
Manually configuring the network from a shell doesn't work because
`netconfig_ipv4` *always* re-configures (and thereby breaks) the network, even
when nothing was changed.
Responding "No" to "Would you like to configure IPv4 for this interface?" also
doesn't help because something in bsdinstall(8) deletes the file behind the
/etc/resolv.conf symlink every time the installer is launched.
*Possible solutions (as far as I can see):*
1. As a workaround, we could at least stop bsdinstall from deleting/overwriting
/etc/resolv.conf unless the user explicitly requests changes to the
configuration.
I've attached `always-write-resolvconf.patch` that gives the user an option to
configure resolv.conf even when they skipped the configuration of network
addresses and gateways.
2. Preferably, `netconfig_ipv4` should detect the gateway-outside-subnet
scenario and generate a working rc.conf for it.
This is a bit more involved, mainly because we need to implement a portable
method of detecting if a given IP (the gateway) is inside a given network (the
IP + subnet mask of the local machine).
For this, I've built a truly awk-ful function — I had to reimplement bitwise
operations from scratch because the awk version in FreeBSD base doesn't support
the `and()` function…
>From there on it's just some additional shell code along the lines of `if !
router_inside_subnet; then route add -host $defaultrouter -iface $interface;
fi; route add default $defaultrouter`.
See `router-outside-subnet.patch` for that one.
Probably needs some improvements in terms of readability. Testing should be
less of an issue: the only finicky bit is the is-it-inside-subnet check, and if
that crashes or gives a false-negative result, the script just adds a
superfluous route that doesn't hurt anyone.
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list