问题摘要
我的机器上有两个网络接口,需要它们按以下方式运行:
enp3s0:机器的主网络接口。通过 DHCP 接收 IP 地址(将为 172.16.0.0/24)、网关和 DNS 解析器,用于办公室网络和整个世界。默认路由是到此接收的网关。
enp2s0:本地子网仅由距离超过 2 米的物体组成,并且没有任何物体可以访问主网络。 服务此网络(192.168.0.0/24,域为
.localnet
)上的 DHCP,并为本地机器提供.localnet
客户端的 DNS 解析。
我在 16.04 下有一个解决所有这些问题的解决方案,使用/etc/network/
和域名系统(没有 NetworkManager),但我只是迷失在新时代的网络计划和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。当我以显而易见的方式尝试时,域名系统和systemd-已解决一直踩着对方的脚趾。当我试图禁用systemd-resolvd并让域名系统完成所有工作时它从未得到上游 DNS 服务器当它接受主网络 DHCP。
答案1
根据systemd-resolved.service(8)
,有两种可能的方法来配置 systemd-resolved 来了解您的 dnsmasq 服务器:
- 将其添加
/etc/systemd/resolved.conf
为“全局” DNS 服务器 - 将其添加到
*.network
systemd-networkd 读取的目录之一中的文件中。
对于后者,nameservers
在您的 netplan 配置中设置一个选项可能就足够了enp2s0
,指向 dnsmasq 将在其上运行的本地 IP。