Package: ifupdown
Version: 0.8.41
Severity: normal

Dear Maintainer,

I was doing my network setup, which included statically configured
logical interfaces. So there were dns-nameservers entries in my
/etc/network/interfaces. My configuration files is below (the actual
IPs and MACs is wiped).

I noted that ifup with my setup is producing error messages like this:

...
guessnet: Started tests
guessnet: 3 candidates
guessnet: Got ARP reply from 192.168.0.1 XX:XX:XX:XX:XX:XX
guessnet: ARP reply from 192.168.0.1 XX:XX:XX:XX:XX:XX matches
guessnet: Notified success of scan peer 192.168.0.1 XX:XX:XX:XX:XX:XX
guessnet: Removing candidate enp4s0-direct
guessnet: Keeping candidate enp4s0-router
guessnet: We had changes, notifying the listener
guessnet: Got ARP reply from 192.168.0.1 XX:XX:XX:XX:XX:XX
/etc/network/if-up.d/resolved: 69: DNS: not found
/etc/network/if-up.d/resolved: 1: /run/network/ifupdown-inet-enp4s0: 
DNS=192.168.0.1 192.168.0.12: not found
Failed to parse DNS server address: DNS
Failed to set DNS configuration: Invalid argument

I have found discussion about similar problem there:
https://unix.stackexchange.com/questions/714901/dns-broken-when-using-ifupdown-and-systemd-resolved-after-upgrade-to-ubuntu-22-0

Also I had a look into the /etc/network/if-up.d/resolved and I assume
this is a typo in the line 69:
https://salsa.debian.org/debian/ifupdown/-/blob/master/debian/if-up.d/resolved#L69

Then I edited mine /etc/network/if-up.d/resolved this way:

--- a/network/if-up.d/resolved
+++ b/network/if-up.d/resolved
@@ -43,11 +43,11 @@ if systemctl is-enabled systemd-resolved > /dev/null 2>&1; 
then
     fi
     if  [ -n "$NEW_DNS" ]; then
         cat <<EOF >"$mystatedir/ifupdown-${ADDRFAM}-$interface"
-"$DNS"="$NEW_DNS"
+$DNS="$NEW_DNS"
 EOF
         if  [ -n "$NEW_DOMAINS" ]; then
             cat <<EOF >>"$mystatedir/ifupdown-${ADDRFAM}-$interface"
-"$DOMAINS"="$NEW_DOMAINS"
+$DOMAINS="$NEW_DOMAINS"
 EOF
         fi
     fi
@@ -66,7 +66,7 @@ EOF
     # ignore errors due to nonexistent file
     md5sum "$mystatedir/isc-dhcp-v4-$interface" 
"$mystatedir/isc-dhcp-v6-$interface" "$mystatedir/ifupdown-inet-$interface" 
"$mystatedir/ifupdown-inet6-$interface" > "$newstate" 2> /dev/null || true
     if ! cmp --silent "$oldstate" "$newstate" 2>/dev/null; then
-        DNS DNS6 DOMAINS DOMAINS6 DEFAULT_ROUTE
+        # DNS DNS6 DOMAINS DOMAINS6 DEFAULT_ROUTE
         # v4 first
         if [ -e "$mystatedir/isc-dhcp-v4-$interface" ]; then
             . "$mystatedir/isc-dhcp-v4-$interface"

And now it works well.

I'm guessing that someone might also have a static network
configuration at the same time as systemd-resolved installed, so I hope
this information can help someone.

Kind regards,
Dmytro


-- Package-specific info:
--- /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
# allow-hotplug enp4s0
# iface enp4s0 inet dhcp
# This is an autoconfigured IPv6 interface
# iface enp4s0 inet6 auto

allow-hotplug wlp0s20f3
iface wlp0s20f3 inet manual
    wpa-driver wext
    wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp

allow-hotplug enp4s0

mapping enp4s0
    script /usr/sbin/guessnet-ifupdown
    map autofilter: true
    map verbose: true
    map debug: true
    map default: enp4s0-guest

# sorry, I do not wish to publish the actual addresses there

iface enp4s0-router inet static
    address 192.168.0.44
    netmask 255.255.255.0
    gateway 192.168.0.1
    test peer address 192.168.0.1 mac XX:XX:XX:XX:XX:XX source
    dns-nameservers 192.168.0.1
    dns-nameservers 192.168.0.12

iface enp4s0-direct inet static
    address XX.XX.XXX.XX
    netmask 255.255.255.0
    gateway XX.XX.XXX.X
    test peer address XX.XX.XXX.X mac XX:XX:XX:XX:XX:XX source
    dns-nameservers XX.XX.XXX.XXX
    dns-nameservers XX.XXX.XXX.XXX

iface enp4s0-guest inet dhcp


--- /etc/network/interfaces.d/*:
cat: '/etc/network/interfaces.d/*': No such file or directory

--- up and down scripts installed:
/etc/network/if-down.d:
total 8
-rwxr-xr-x 1 root root 372 Apr 21  2020 openvpn
-rwxr-xr-x 1 root root 759 Sep 27 16:09 resolved
lrwxrwxrwx 1 root root  32 Jan 31 13:58 wpasupplicant -> 
../../wpa_supplicant/ifupdown.sh

/etc/network/if-post-down.d:
total 4
-rwxr-xr-x 1 root root 1409 Jun  5  2018 wireless-tools
lrwxrwxrwx 1 root root   32 Jan 31 13:58 wpasupplicant -> 
../../wpa_supplicant/ifupdown.sh

/etc/network/if-pre-up.d:
total 8
-rwxr-xr-x 1 root root 4191 Sep 15  2018 wireless-tools
lrwxrwxrwx 1 root root   32 Jan 31 13:58 wpasupplicant -> 
../../wpa_supplicant/ifupdown.sh

/etc/network/if-up.d:
total 12
-rwxr-xr-x 1 root root  385 Apr 21  2020 openvpn
-rwxr-xr-x 1 root root 4661 Feb 13 19:47 resolved
lrwxrwxrwx 1 root root   32 Jan 31 13:58 wpasupplicant -> 
../../wpa_supplicant/ifupdown.sh


-- System Information:
Debian Release: bookworm/sid
  APT prefers testing
  APT policy: (800, 'testing'), (700, 'stable'), (600, 'unstable'), (500, 
'stable-security'), (50, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 6.1.0-3-amd64 (SMP w/8 CPU threads; PREEMPT)
Kernel taint flags: TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=uk_UA.UTF-8, LC_CTYPE=uk_UA.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages ifupdown depends on:
ii  adduser   3.131
ii  iproute2  6.1.0-1
ii  libc6     2.36-8

Versions of packages ifupdown recommends:
ii  isc-dhcp-client [dhcp-client]  4.4.3-P1-1.1

Versions of packages ifupdown suggests:
ii  ppp     2.4.9-1+1.1+b1
pn  rdnssd  <none>

-- Configuration Files:
/etc/network/if-up.d/resolved changed:
case "$ADDRFAM" in
    inet|inet6) : ;;
    *) exit 0 ;;
esac
if systemctl is-enabled systemd-resolved > /dev/null 2>&1; then
    interface=$IFACE
    if [ ! "$interface" ]; then
        return
    fi
    # TODO handle lo interface settings
    if [ "$interface" = "lo" ]; then
        return
    fi
    ifindex=$(cat "/sys/class/net/$interface/ifindex")
    if [ ! "$ifindex" ]; then
        return
    fi
    mystatedir=/run/network
    mkdir -p $mystatedir
    statedir=/run/systemd/resolve/netif
    mkdir -p $statedir
    chown systemd-resolve:systemd-resolve $statedir
    oldstate="$(mktemp)"
    # ignore errors due to nonexistent file
    md5sum "$mystatedir/isc-dhcp-v4-$interface" 
"$mystatedir/isc-dhcp-v6-$interface" "$mystatedir/ifupdown-inet-$interface" 
"$mystatedir/ifupdown-inet6-$interface" > "$oldstate" 2> /dev/null || true
    NEW_DEFAULT_ROUTE=$IF_DNS_DEFAULT_ROUTE
    NEW_DNS=$(echo $IF_DNS_NAMESERVERS $IF_DNS_NAMESERVER)
    NEW_DOMAINS=$(echo $IF_DNS_DOMAIN $IF_DNS_SEARCH)
    DNS=DNS
    DOMAINS=DOMAINS
    if [ "$ADDRFAM" = "inet6" ]; then
        DNS=DNS6
        DOMAINS=DOMAINS6
    fi
    if  [ -n "$NEW_DNS" ]; then
        cat <<EOF >"$mystatedir/ifupdown-${ADDRFAM}-$interface"
$DNS="$NEW_DNS"
EOF
        if  [ -n "$NEW_DOMAINS" ]; then
            cat <<EOF >>"$mystatedir/ifupdown-${ADDRFAM}-$interface"
$DOMAINS="$NEW_DOMAINS"
EOF
        fi
    fi
    case "$NEW_DEFAULT_ROUTE" in
        1|yes|true|on) NEW_DEFAULT_ROUTE=yes ;;
        0|no|false|off) NEW_DEFAULT_ROUTE=no ;;
        *) NEW_DEFAULT_ROUTE= ;;
    esac
    if [ -n "$NEW_DEFAULT_ROUTE" ]; then
        cat <<EOF >>"$mystatedir/ifupdown-${ADDRFAM}-$interface"
DEFAULT_ROUTE="$NEW_DEFAULT_ROUTE"
EOF
    fi
    newstate="$(mktemp)"
    # ignore errors due to nonexistent file
    md5sum "$mystatedir/isc-dhcp-v4-$interface" 
"$mystatedir/isc-dhcp-v6-$interface" "$mystatedir/ifupdown-inet-$interface" 
"$mystatedir/ifupdown-inet6-$interface" > "$newstate" 2> /dev/null || true
    if ! cmp --silent "$oldstate" "$newstate" 2>/dev/null; then
        # DNS DNS6 DOMAINS DOMAINS6 DEFAULT_ROUTE
        # v4 first
        if [ -e "$mystatedir/isc-dhcp-v4-$interface" ]; then
            . "$mystatedir/isc-dhcp-v4-$interface"
        fi
        # v4 manual config overrides
        if [ -e "$mystatedir/ifupdown-inet-$interface" ]; then
            . "$mystatedir/ifupdown-inet-$interface"
        fi
        # v6 preffered
        if [ -e "$mystatedir/isc-dhcp-v6-$interface" ]; then
            . "$mystatedir/isc-dhcp-v6-$interface"
        fi
        # v6 manual config overrides
        if [ -e "$mystatedir/ifupdown-inet6-$interface" ]; then
            . "$mystatedir/ifupdown-inet6-$interface"
        fi
        resolvectl_failed=
        if [ "$DNS" ] || [ "$DNS6" ] ; then
            cat <<EOF >"$statedir/$ifindex"
LLMNR=yes
MDNS=no
SERVERS=$(echo $DNS6 $DNS)
DOMAINS=$(echo $DOMAINS6 $DOMAINS)
EOF
            if [ -n "$DEFAULT_ROUTE" ]; then
                cat <<EOF >>"$statedir/$ifindex"
DEFAULT_ROUTE=$DEFAULT_ROUTE
EOF
            fi
            chown systemd-resolve:systemd-resolve "$statedir/$ifindex"
            # In addition to creating the state file (needed if we run before
            # resolved is started), also feed the information directly to
            # resolved.
            if systemctl --quiet is-active systemd-resolved; then
                resolvectl llmnr "$ifindex" yes || resolvectl_failed=$?
                resolvectl mdns "$ifindex" no || resolvectl_failed=$?
                if [ "$DOMAINS6" ] || [ "$DOMAINS" ]; then
                    resolvectl domain "$ifindex" $DOMAINS6 $DOMAINS || 
resolvectl_failed=$?
                else
                    resolvectl domain "$ifindex" "" || resolvectl_failed=$?
                fi
                resolvectl dns "$ifindex" $DNS6 $DNS || resolvectl_failed=$?
                if [ "$DEFAULT_ROUTE" ]; then
                    resolvectl default-route "$ifindex" $DEFAULT_ROUTE || 
resolvectl_failed=$?
                fi
            fi
        else
            rm -f "$statedir/$ifindex"
            if systemctl --quiet is-active systemd-resolved; then
                resolvectl revert "$ifindex" || resolvectl_failed=$?
            fi
        fi
        # resolved was running, but without dbus, it means state files
        # will not be read & resolvectl commands failed, restart it
        if [ "$resolvectl_failed" ]; then
                systemctl try-restart systemd-resolved
        fi
    fi
    rm -f "$oldstate" "$newstate"
fi


-- no debconf information

Reply via email to