Этот вопрос является точной копией следующего:
] У меня есть два сетевых интерфейса на машине, и мне нужно, чтобы они работали следующим образом:
enp3s0 : Основной сетевой интерфейс для машины. Получение IP-адреса через DHCP (будет в 172.16.0.0/24). ), шлюз и преобразователь DNS для офисной сети и мира в целом.Маршрут по умолчанию - к этому полученному шлюзу.
enp2s0 : Локальная подсеть, состоящая не более чем на 2 метра и ничего, что должно иметь доступ к основной сети. Обслуживать DHCP в этой сети (192.168.0.0/24, домен - .localnet
) и предоставлять локальному компьютеру разрешение DNS для клиентов .localnet
.
У меня было рабочее решение для всего этого до 16.04, используя / etc / network /
и dnsmasq (без NetworkManager), но я просто потерялся в новой эре netplan и с разрешением systemd . Все просто продолжает бороться со всем остальным.
Итак, какое у меня правильное, современное решение, чтобы заставить эту работу работать правильно? В идеале так, чтобы не пришлось менять до 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.
На systemd-resolved.service(8)
, существует два возможных способа настроить systemd-разрешенный для знания о dnsmasq сервере:
/etc/systemd/resolved.conf
как "глобальный" сервер DNS*.network
файл в одном из каталогов, прочитанных systemd-networkd.Для последнего может быть достаточно установить a nameservers
опция в Вашем netplan конфигурируется для enp2s0
, указывая на локальный IP, на котором будет работать dnsmasq.