Обслуживание 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.