Обслуживание DHCP под Ubuntu 18.04

Краткое описание проблемы

У меня есть два сетевых интерфейса в машине, и мне нужно, чтобы они вели себя следующим образом:

  • enp3s0: Основной сетевой интерфейс для машины. Получите через DHCP IP-адрес (будет в 172.16.0.0/24), шлюз и преобразователь DNS для офисной сети и всего мира. Маршрут по умолчанию к этому полученному шлюзу.

  • enp2s0: Локальная подсеть, состоящая не более чем из двух метров и не имеющая доступа к основной сети. Служить DHCP в этой сети (192.168.0.0/24, домен .localnet), и предоставьте локальному компьютеру разрешение DNS .localnet клиентов.

У меня было рабочее решение для всего этого под 16.04, используя /etc/network/ и dnsmasq (без NetworkManager), но я просто потерялся в новой эре сетевых планов и системных разрешений. Все просто продолжает бороться со всем остальным.

Итак, какое мое правильное, современное решение сделать эту работу правильно? В идеале, чтобы мне не пришлось менять его на 20.04.

Дополнительная информация

Для справки вот скрипт, который сделал то, что мне было нужно под 16.04.

#!/bin/bash
#
# Configure the PC to use dual network adapters.
#
# usage: dualnetwork.sh <hinetif> <localnetif>
#
# This configuration is based around the use of the classic ifupdown
# configuration files rather than NetworkManager.  This is substantially
# more stable and easier to work with.  It is probably prudent to also
# uninstall NetworkManager once this is done:
#   sudo apt-get remove network-manager
#
# Must run as root.
#
# Rob Gaddi, 29 Jan 2019

GENERATED="Generated by $0 at $(date)"
HINET=$1
LOCALNET=$2

abort () {
    echo $*
    exit 1
}

[[ ! -z "$LOCALNET" ]] || abort Must provide hinet and localnet interfaces.
ip -br addr | grep $HINET    || abort Interface $HINET not found
ip -br addr | grep $LOCALNET || abort Interface $LOCALNET not found

####################################################################
echo Configuring network interfaces
####################################################################
mkdir -p /etc/network/interfaces.d
echo source-directory /etc/network/interfaces.d > /etc/network/interfaces
cat <<-CONF > /etc/network/interfaces.d/hinet
    # $GENERATED
    auto $HINET
    iface $HINET inet dhcp
CONF
cat <<-CONF > /etc/network/interfaces.d/localnet 
    # $GENERATED
    allow-hotplug $LOCALNET
    iface $LOCALNET inet static
        address 192.168.0.20/24

    iface $LOCALNET inet static
        address 192.168.254.20/24
CONF

####################################################################
echo Installing and configuring dnsmasq
####################################################################
apt-get install --reinstall -y dnsmasq
mkdir -p /etc/dnsmasq.d
cat <<-CONF > /etc/dnsmasq.d/dualnetwork.conf
    # $GENERATED
    no-negcache
    dhcp-range=192.168.0.100,192.168.0.150,4h
    interface=$LOCALNET
    domain=localnet
    dhcp-fqdn
    log-dhcp
CONF
systemctl enable --now dnsmasq.service

редактировать

Это отличается от преобразования /etc/network/interfaces в netplan для плавающего IP тем, что проблема заключается не в планировании IP-адресов компьютера; эта часть довольно проста. Проблема в том, что система обслуживает DHCP в одной сети. Когда я попробовал это очевидным способом, dnsmasq и systemd-resolved продолжали наступать друг другу на ноги. Когда я попытался просто отключить systemd-resolvd и позволить dnsmasq делать всю работу, он никогда не получал вышестоящий DNS-сервер, когда принимал основной сетевой DHCP.

1 ответ

В systemd-resolved.service(8)Есть два возможных способа настроить systemd-resolved, чтобы узнать о вашем сервере dnsmasq:

  • добавить его в /etc/systemd/resolved.conf как "глобальный" DNS-сервер
  • добавить его в *.network файл в одном из каталогов, прочитанных systemd-networkd.

Для последнего может быть достаточно установить nameservers опция в вашем конфиге netplan для enp2s0, указывая на локальный IP, на котором будет работать dnsmasq.

Другие вопросы по тегам