Skip to content

Latest commit

 

History

History
1192 lines (828 loc) · 33.1 KB

04.Ubuntu_设置系统网络.md

File metadata and controls

1192 lines (828 loc) · 33.1 KB

0.前期准备

在上一篇文章 03.Ubuntu_设置系统参数 中,已经设置了系统参数,现在开始设置系统网络。

由于网络设置中涉及网桥,需根据实际情况判断是否需要关闭 PVE 服务器内其他路由系统。

同样,请判断是否需要断开 Ubuntu Server 的上级物理路由器,并将 Ubuntu Server 连接光猫。

1.设置网络服务

修改网络配置之前,需检查 systemd-networkd.service 服务状态,确保该服务开机自启。

若服务状态为 enabled; preset: enabled ,表示该服务已设置为开机自启。

## 检查 systemd-networkd.service
$ sudo systemctl status systemd-networkd.service

#### 系统 systemd-networkd.service 状态示例输出
● systemd-networkd.service - Network Configuration
     Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled; preset: enabled)

若服务状态为 disabled; preset: enabled ,表示该服务暂未设置为开机自启。

## 检查 systemd-networkd.service
$ sudo systemctl status systemd-networkd.service

#### 系统 systemd-networkd.service 状态示例输出
○ systemd-networkd.service - Network Configuration
     Loaded: loaded (/lib/systemd/system/systemd-networkd.service; disabled; preset: enabled)

systemd-networkd.service 服务设置为开机自启,执行以下命令。

## 设置 systemd-networkd.service 开机自启
$ sudo systemctl enable systemd-networkd.service

Ubuntu Server 系统默认使用 netplan 进行网络设置,为了避免干扰,需移除相关配置文件:

  • netplan 默认网络配置文件

  • systemd-networkd 运行时网络配置文件

注意:一旦移除了网络相关配置文件,请不要重启系统,否则系统将无法通过网络访问。

## 移除 Netplan 配置文件
$ sudo rm -rvf /etc/netplan/*

## 移除 systemd 运行时网络配置文件
$ sudo rm -rvf /run/systemd/network/*

2.设置网桥接口

本机 systemd-networkd 配置文件一般在 /etc/systemd/network 目录下。

2.1.网桥设备

使用 neovim 编辑器创建 网桥设备 配置文件,执行以下命令。

## 创建 网桥设备 配置文件
$ sudo nvim /etc/systemd/network/25-bridge-device.netdev

在编辑器对话框中输入以下内容,并保存。

参数 说明
Name bridge1 网桥设备名称,可自定义,建议使用小写英文字符
Kind bridge 设备类型为网桥
# This configuration file is customized by fox,
# Optimize for bridge device.

[NetDev]
Name=bridge1
Kind=bridge

[Bridge]
STP=yes

2.2.网桥网络

设置网桥网络之前,需要对所使用的网络地址段进行规划,演示参数如下:

  • IPv4 地址(本机):172.16.1.1

  • IPv4 子网掩码:255.255.255.0 ( 即 /24

根据 RFC-4193 中给出的定义,IPv6 的私有地址 ULA 前缀为 FC00::/7

该前缀包含 FC00::/8FD00::/8 两个部分,严格意义上 ULA 目前应该使用 FD00::/8

在实际使用场景下,建议使用类似 RFC4193 IPv6 Generator 的工具来生成符合规范的 ULA 地址。

该工具只需要输入接口(例如服务器的 bridge1 )的 MAC 地址即可。

当需启用 IPv6 ULA 地址时,请参考文件:fox_network_25_bridge_network_ula.network

使用 neovim 编辑器创建 网桥网络 配置文件,执行以下命令。

## 创建 网桥网络 配置文件
$ sudo nvim /etc/systemd/network/25-bridge-network.network

在编辑器对话框中输入以下内容,并保存。

参数 说明
IPv6AcceptRA no 在网桥接口上不接收 RA(路由器通告)
DHCPPrefixDelegation yes 在网桥接口上启用 PD(前缀委派)
LinkLocalAddressing ipv6 使用 IPv6 地址配置网桥 LLA (本地链路地址)
Address 172.16.1.1/24 给网桥接口分配的 IPv4 地址
RequiredForOnline yes 在线状态检测

注意:若需使用 QoS 参数,请参考以下文件。

# This configuration file is customized by fox,
# Optimize for bridge network.

[Match]
Name=bridge1

[Network]
IPv6AcceptRA=no
DHCPPrefixDelegation=yes
LinkLocalAddressing=ipv6

[Address]
Address=172.16.1.1/24

[Link]
RequiredForOnline=yes

2.3.网桥成员

不同种类的网卡在 Ubuntu Server 中所使用的名称有所不同。

执行以下命令获取当前所有网卡信息。

## 获取网卡信息
$ cat /proc/net/dev

可见 Ubuntu Server 在 PVE 中设置为 q35 机型后,其 VirtIO 网卡均以 enp 开头。

#### 网卡信息示例输出
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:    6368      84    0    0    0     0          0         0     6368      84    0    0    0     0       0          0
enp6s18:  266834    4110    0   19    0     0          0         0    47202     163    0    0    0     0       0          0
enp6s19: 1548869    8737    0    0    0     0          0         0    66283     494    0    0    0     0       0          0
enp6s20: 1515926    8372    0    0    0     0          0         0    10382     106    0    0    0     0       0          0
enp6s21: 1516028    8373    0    0    0     0          0         0    10382     106    0    0    0     0       0          0

其中 enp6s18 在本文中将作为 WAN 口连接光猫,因此网桥成员为其余网卡。

使用 neovim 编辑器创建 网桥成员 配置文件,执行以下命令。

## 创建 网桥成员 配置文件
$ sudo nvim /etc/systemd/network/25-bridge-ports.network

在编辑器对话框中输入以下内容,并保存。

# This configuration file is customized by fox,
# Optimize for bridge ports.

[Match]
Name=enp6s19
Name=enp6s20
Name=enp6s21

[Network]
Bridge=bridge1

3.设置回环接口

本段回环接口设置主要为了安全加固,为可选设置项。

使用 neovim 编辑器创建 回环接口 配置文件,执行以下命令。

## 创建 回环接口 配置文件
$ sudo nvim /etc/systemd/network/50-lo.network

由于回环接口的配置文件很长,因此请查阅文件 fox_network_50_lo.network 进行复制。

4.设置光猫接口

一般情况下,路由器进行 PPPoE 拨号后,光猫将无法访问。

为了访问光猫,需要给连接光猫的网口 enp6s18 增加一个与光猫同网段的静态 IPv4 地址。

演示地址为 192.168.1.2/24

注意:给网口添加静态 IPv4 地址时,不要添加默认路由。

使用 neovim 编辑器创建 光猫访问 配置文件,执行以下命令。

## 创建 静态IPv4 配置文件
$ sudo nvim /etc/systemd/network/50-static-onu.network

在编辑器对话框中输入以下内容,并保存。

# This configuration file is customized by fox,
# Optimize for ONU access.

[Match]
Name=enp6s18

[Network]
LinkLocalAddressing=no

[Address]
Address=192.168.1.2/24

[Link]
RequiredForOnline=no

5.设置 PPPoE 接口

在上版构建 Linux 路由器的文章中,使用了 pppoeconf 工具来创建拨号配置。

但该工具已多年未更新,导致其设置 PPPoE 拨号的配置文件为 /etc/network/interfaces

这与当前使用 Systemd Network 进行网络配置的方式不太一致。

因此,这次以创建 systemd 服务的方式来进行 PPPoE 拨号。

5.1.拨号参数

PPPoE 拨号的主配置文件一般位于 /etc/ppp/peers 目录下。

配置文件名可自定义,演示值为 pppoe1

使用 neovim 编辑器创建 PPPoE 拨号 配置文件,执行以下命令。

## 创建 PPPoE拨号 配置文件
$ sudo nvim /etc/ppp/peers/pppoe1

在编辑器对话框中输入以下内容,并保存。

注意:配置文件中 mtu 参数默认值为 1492 ,该参数与运营商相关,请根据实际情况进行调整。

# This configuration file is customized by fox,
# Optimize PPPoE parameters for Linux Router.
#
# The mtu parameter is optional,
# default is 1492.
#
# eg:
#       mtu 1492
#
# If IPv6 is missing,
# try to add IPv6 related parameters.
#
# eg:
#       +ipv6
#

# Set PPPoE user name
user "<your_pppoe_user_name>"

# Always retry on failure
maxfail 0

# Always replaces an existing default route
defaultroute
replacedefaultroute

# Other adjustable parameters
default-asyncmap
hide-password
lcp-echo-interval 0
lcp-echo-failure 5
noaccomp
noauth
noipdefault
noproxyarp
persist

PPPoE 拨号的密码配置文件一般位于 /etc/ppp 目录下。

使用 neovim 编辑器编辑 PPPoE 密码 配置文件,执行以下命令。

## 编辑 CHAP 认证 PPPoE密码 配置文件
$ sudo nvim /etc/ppp/chap-secrets

## 如果拨号失败,可能运营商不支持 CHAP 加密认证,则尝试改用 PAP 认证
## 编辑 PAP 认证 PPPoE密码 配置文件
$ sudo nvim /etc/ppp/pap-secrets

在编辑器对话框中输入以下内容,并保存。

# This configuration file is customized by fox,
# Optimize PPPoE user and password.
#
# Secrets for authentication using CHAP/PAP
# client    server  secret          IP addresses

"<your_pppoe_user_name>" * "<your_pppoe_user_password>"

执行以下命令对密码配置文件的权限进行修正。

## 修正 CHAP 认证文件权限
$ sudo chmod 600 /etc/ppp/chap-secrets

## 当使用 PAP 认证时,则改用以下命令修正 PAP 认证文件权限
$ sudo chmod 600 /etc/ppp/pap-secrets

5.2.拨号网络

由于拨号服务可能意外退出,为了在服务重启后能再次拿到 IPv6 地址,需要对拨号接口进行调整。

使用 neovim 编辑器创建 拨号网络 配置文件,执行以下命令。

## 创建 拨号网络 配置文件
$ sudo nvim /etc/systemd/network/75-pppoe.network

在编辑器对话框中输入以下内容,并保存。

额外说明:

# This configuration file is customized by fox,
# Optimize for PPPoE dialing.

[Match]
Name=pppoe1
Type=ppp

[Network]
IPv6AcceptRA=yes
LLMNR=no

[IPv6AcceptRA]
DHCPv6Client=always
UseDNS=no
UseDomains=no

[DHCPv6]
RapidCommit=yes
UseDNS=no
UseNTP=no
UseDomains=no

[Link]
RequiredForOnline=yes

5.3.拨号服务

根据前文,用于拨号的物理网口为 enp6s18 ,拨号配置文件名为 pppoe1 ,拨号成功后网络设备名为 pppoe1

在创建 PPPoE 拨号服务的过程中会用到这 3 个参数,请根据实际情况进行调整。

拨号服务命名规则:pppd-<physical_port_name>@<pppoe_name>.service

因此本文中演示服务名为:[email protected]

参数 说明
physical_port_name enp6s18 用于拨号的物理网口的名称
pppoe_name pppoe1 PPPoE 拨号的配置文件的名称

使用 neovim 编辑器创建 PPPoE 服务 配置文件,执行以下命令。

## 创建 PPPoE服务 配置文件
$ sudo nvim /etc/systemd/system/[email protected]

在编辑器对话框中输入以下内容,并保存。

# This configuration file is customized by fox,
# Optimize for PPPoE systemd service.

[Unit]
Description=PPP connection for %I
Documentation=man:pppd(8)
BindsTo=sys-subsystem-net-devices-%j.device
After=sys-subsystem-net-devices-%j.device
After=network.target
Before=default.target

[Service]
Type=notify
ExecStartPre=/lib/systemd/systemd-networkd-wait-online -i %J -o carrier
ExecStart=/usr/sbin/pppd plugin rp-pppoe.so %J call %I linkname %I ifname %I up_sdnotify
ExecStop=/bin/kill $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
StandardOutput=null
Restart=always
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=strict
ReadWritePaths=/run/ /etc/ppp/
ProtectControlGroups=yes
SystemCallFilter=~@mount
SystemCallArchitectures=native
LockPersonality=yes
MemoryDenyWriteExecute=yes
RestrictRealtime=yes

[Install]
WantedBy=sys-devices-virtual-net-%i.device
WantedBy=default.target

由于修改了服务项,需要执行以下命令进行重载。

## 服务重载
$ sudo systemctl daemon-reload

执行以下命令让 PPPoE 拨号服务开机自启。

## 设置 PPPoE 拨号服务开机自启
$ sudo systemctl enable [email protected]

由于现在防火墙暂未设置,不建议现在启动服务进行拨号,以避免安全隐患。

如果后续使用中,PPPoE 拨号服务出现异常,执行以下命令进行检查。

## 检查 PPPoE 拨号服务
$ sudo journalctl -eu [email protected]

## 查看系统启动时间分布
$ sudo systemd-analyze blame

## 检查导致启动缓慢的服务
$ sudo systemd-analyze critical-chain systemd-networkd-wait-online.service

## 检查网络配置情况
$ sudo networkctl status -a

5.4.定时任务

本步骤为可选操作,主要用于设置定时重新拨号或重启服务器。

修改系统定时任务配置之前,需检查 cron.service 服务状态,确保该服务开机自启。

## 检查 cron.service
$ sudo systemctl status cron.service

## 设置 cron.service 开机自启
$ sudo systemctl enable cron.service

执行以下命令来编辑系统定时任务。

## 查看系统定时任务
$ sudo crontab -l

## 编辑系统定时任务,编辑器选择 nano
$ sudo crontab -e

在配置文件末尾,增加以下配置项。

## 定时任务配置项

## 每 3 天 PPPoE 重新拨号

0 4 */3 * * /usr/bin/systemctl restart [email protected]

## 定时重启系统

0 3 8,24 * * /usr/sbin/reboot

6.设置硬件卸载

本步骤为可选操作,内容为关闭网络接口的硬件卸载(Offload)。

使用 neovim 编辑器创建 硬件卸载 配置文件,执行以下命令。

## 创建 硬件卸载 配置文件
$ sudo nvim /etc/systemd/network/90-offload.link

在编辑器对话框中输入以下内容,并保存。

注意:配置文件中 OriginalName 参数为 enp* ,该参数与网卡名称相关,请根据实际情况进行调整。

# This configuration file is customized by fox,
# Optimize for nic offload.

[Match]
OriginalName=enp*

[Link]
GenericSegmentationOffload=no
GenericReceiveOffload=no
TCPSegmentationOffload=no
TCP6SegmentationOffload=no
LargeReceiveOffload=no

7.设置防火墙

修改防火墙配置之前,需检查 nftables.servicesshguard.service 服务状态,确保该服务开机自启。

## 检查 nftables.service
$ sudo systemctl status nftables.service

## 设置 nftables.service 开机自启
$ sudo systemctl enable nftables.service

## 检查 sshguard.service
$ sudo systemctl status sshguard.service

## 设置 sshguard.service 开机自启
$ sudo systemctl enable sshguard.service

在上版构建 Linux 路由器的文章中,使用了 iptables 进行防火墙配置,以及 iptables-restore 对防火墙进行持久化。

但 OpenWrt 从 22.03 版本开始,防火墙后端不再使用 iptables ,取而代之的是 nftables

当然,不仅 OpenWrt 有这样的变化,其他 Linux 发行版也有类似的情况,具体原因请查阅 Netfilter 官网相关信息。

因此,本文中防火墙配置工具同步变更为 nftables ,防火墙命令从 OpenWrt 23.05.0 版本中导出。

主要修改有:

  • 默认启用 flowtable ,并对监听接口进行修改(OpenWrt 的 flowtable 监听了端口 pppoe-wan

  • 默认禁止外网 IPv4 / IPv6 对本机的 Echo Request

  • 防火墙默认行为从 reject 变更为 drop

  • 已配置内网 DNS 服务器组规则( NFTsets ),将非组内 IP 的 DNS 请求重定向至本机

    • 对内网 DNS 服务器组的 IPv6 地址,使用后缀匹配模式进行额外处理
  • 访问光猫的网口与PPPoE接口共享防火墙策略,简化防火墙命令

根据内核相关文档 Netfilter’s flowtable infrastructure 中的描述:

Since Linux kernel 5.13, the flowtable infrastructure discovers the real netdevice behind VLAN and PPPoE netdevices. The flowtable software datapath parses the VLAN and PPPoE layer 2 headers to extract the ethertype and the VLAN ID / PPPoE session ID which are used for the flowtable lookups. The flowtable datapath also deals with layer 2 decapsulation.

You do not need to add the PPPoE and the VLAN devices to your flowtable, instead the real device is sufficient for the flowtable to track your flows.

考虑到 OpenWrt 23.05 内核版本为 5.15.* ,Ubuntu Server 24.04 内核版本为 6.8.* ,因此将 PPPoE 拨号后生成的端口从 flowtable 中移除是个更好的选择,这样不仅能向前兼容,还能解决 nftables 服务与 PPPoE 拨号服务启动顺序带来的冲突。

nftables.service 启动时会自动加载 /etc/nftables.conf 配置文件 ,也就是防火墙的默认配置。

修改防火墙设置之前,执行以下命令将其备份。

## 备份 nftables 配置文件
$ sudo mv /etc/nftables.conf /etc/nftables.conf.bak

注意:在应用防火墙配置之前请仔细阅读防火墙配置文件,并根据实际情况修改以下内容。

  • 访问光猫网口名称,演示值为:enp6s18

  • flowtable 包含的网口,演示值为:enp6s18, enp6s19, enp6s20, enp6s21

  • 网桥接口名称,演示值为:bridge1

  • PPPoE 接口名称,演示值为:pppoe1

  • 内网 DNS 服务器组,可自定义或移除

使用 neovim 编辑器创建 nftables 配置文件,执行以下命令。

## 创建新的 nftables 配置文件
$ sudo nvim /etc/nftables.conf

由于防火墙配置文件很长,因此请查阅文件 fox_firewall_nftables.conf 进行复制。

8.设置 Dnsmasq

修改 Dnsmasq 配置之前,需检查 dnsmasq.service 服务状态,确保该服务开机自启。

如果看到 dnsmasq.service 服务报错,是因为当前服务暂未配置,无需担心。

## 检查 dnsmasq.service
$ sudo systemctl status dnsmasq.service

## 设置 dnsmasq.service 开机自启
$ sudo systemctl enable dnsmasq.service

Dnsmasq 的主配置文件一般位于 /etc 目录下,但修改主配置文件之前,需要做几步额外操作。

一般情况下,Dnsmasq 只需单个配置文件即可完成配置,本文中拆分配置文件主要是为了方便维护。

说明:以下配置内容参考了 OpenWrt 的相关设置,可根据实际需求进行调整。

文件名 路径 说明
dhcpbogushostname.conf /usr/share/dnsmasq 不会进行 DHCP 分配的虚假主机名列表
rfc6761.conf /usr/share/dnsmasq 不会转发到上游 DNS 服务器进行查询的域名列表
dnsmasq.staticv4.conf /etc/dnsmasq.d 内网 IPv4 静态地址绑定配置文件
dnsmasq.dnssvr.conf /etc/dnsmasq.d 上游 DNS 服务器配置文件
dnsmasq.conf /etc dnsmasq 主配置文件

8.1. Dnsmasq 附加配置

使用 neovim 编辑器创建 dhcpbogushostname.conf 配置文件,执行以下命令。

## 创建 dhcpbogushostname 配置文件
$ sudo nvim /usr/share/dnsmasq/dhcpbogushostname.conf

在编辑器对话框中输入以下内容,并保存。

# This configuration file is customized by OpenWrt
#
# dhcpbogushostname.conf included configuration file for dnsmasq
#
# includes a list of hostnames that should not be associated with dhcp leases
# in response to CERT VU#598349
#
# file included by default, option dhcpbogushostname 0 to disable

dhcp-name-match=set:dhcp_bogus_hostname,localhost
dhcp-name-match=set:dhcp_bogus_hostname,wpad

使用 neovim 编辑器创建 rfc6761.conf 配置文件,执行以下命令。

## 创建 rfc6761 配置文件
$ sudo nvim /usr/share/dnsmasq/rfc6761.conf

在编辑器对话框中输入以下内容,并保存。

# This configuration file is derived from OpenWrt
#
# RFC6761 included configuration file for dnsmasq
#
# includes a list of domains that should not be forwarded to Internet name servers
# to reduce burden on them, asking questions that they won't know the answer to

server=/alt/
server=/bind/
server=/example/
server=/home.arpa/
server=/internal/
server=/invalid/
server=/lan/
server=/local/
server=/localhost/
server=/onion/
server=/test/

8.2. IPv4 地址绑定

使用 neovim 编辑器创建 IPv4 静态地址绑定 配置文件,执行以下命令。

## 创建 静态地址绑定 配置文件
$ sudo nvim /etc/dnsmasq.d/dnsmasq.staticv4.conf

在编辑器对话框中输入以下内容,并保存。

注意:当前该配置文件中静态绑定项为空,具体绑定方法参见配置文件中的示例。

# This configuration file is customized by fox,
# Optimize dnsmasq parameters for Linux Router.
#
# eg:
#       dhcp-host=00:0c:29:f4:27:c1,172.16.10.201,foxmachine-1,2h
#       dhcp-host=00:0c:29:f4:27:c2,172.16.10.202,foxmachine-2,2d,set:dnsv4ha
#       dhcp-host=00:0c:29:f4:27:c3,172.16.10.203,foxmachine-3,1w,set:gwpass,set:dnspass

8.3.上游 DNS 服务器

使用 neovim 编辑器创建 上游 DNS 服务器 配置文件,执行以下命令。

## 创建 上游DNS服务器 配置文件
$ sudo nvim /etc/dnsmasq.d/dnsmasq.dnssvr.conf

在编辑器对话框中输入以下内容,并保存。

# This configuration file is customized by fox,
# Optimize dnsmasq parameters for Linux Router.
#
# For use DNS server deployed in other virtual machines,
# please modify 'server' parameter according to
# your network environment.
#
# eg:
#       server=172.16.1.2
#       server=172.16.1.3
#       server=fdac::2
#       server=fdac::3
#       server=127.0.0.1#6053
#       server=::1#6053

server=223.5.5.5
server=180.184.1.1
server=119.29.29.29

server=2402:4e00::
server=2400:3200::1

8.4. Dnsmasq 主配置

修改 Dnsmasq 主配置文件之前,执行以下命令将其备份。

## 备份 Dnsmasq 主配置文件
$ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak

使用 neovim 编辑器创建 Dnsmasq 主配置文件,执行以下命令。

## 创建 Dnsmasq 主配置文件
$ sudo nvim /etc/dnsmasq.conf

在编辑器对话框中输入以下内容,并保存。

额外说明:

  • 请根据系统内存使用情况,调整缓存参数 cache-size

  • 配置文件中内网域名为 fox.internal ,请根据实际情况进行调整

  • 请检查配置文件中 DHCP 服务器相关配置项,并根据实际情况进行调整

# This configuration file is customized by fox,
# Optimize dnsmasq parameters for Linux Router.
#
# For use other DNS software like Adguard Home or SmartDNS,
# please set 'port' to zero to disables DNS function,
# leaving only DHCP and/or TFTP.
#
# eg:
#       port=0
#
# For use DNS server deployed in other virtual machines,
# please modify 'dhcp-option' parameter according to
# your network environment.
#
# eg:
#       dhcp-option=tag:dnsv4,6,172.16.1.2,172.16.1.3
#       dhcp-option=tag:dnsv4ha,6,172.16.1.1
#       dhcp-option=tag:dnsv6,option6:dns-server,[fdac::2],[fdac::3]
#
# For use a bypass router deployed in another virtual machine,
# please modify 'dhcp-option' parameter according to
# your network environment.
#
# eg:
#       dhcp-option=tag:gwpass,3,172.16.1.5
#       dhcp-option=tag:dnspass,6,172.16.1.5

# Main Config

conf-dir=/etc/dnsmasq.d/,*.conf
conf-file=/etc/dnsmasq.conf
conf-file=/usr/share/dnsmasq/dhcpbogushostname.conf
conf-file=/usr/share/dnsmasq/rfc6761.conf

log-facility=/var/log/dnsmasq.log
log-async=20

cache-size=2048
max-cache-ttl=7200
fast-dns-retry=1800

interface=bridge1
ra-param=bridge1,900,2700

domain=fox.internal
local=/fox.internal/

bind-dynamic
bogus-priv
dhcp-authoritative
dhcp-rapid-commit
domain-needed
enable-ra
local-service
log-dhcp
no-hosts
no-negcache
no-resolv
no-round-robin
rebind-localhost-ok
stop-dns-rebind
strip-subnet

# DHCP Server Config

dhcp-broadcast=tag:needs-broadcast
dhcp-ignore-names=tag:dhcp_bogus_hostname
dhcp-leasefile=/var/lib/misc/dnsmasq.leases

dhcp-range=set:dnsv4,172.16.1.100,172.16.1.200,255.255.255.0,1d
dhcp-range=set:dnsv6,::,constructor:bridge1,slaac,45m

dhcp-option=tag:dnsv4,6,172.16.1.1
dhcp-option=tag:dnsv6,option6:dns-server

9.设置 SmartDNS

若需使用 SmartDNS 优化系统 DNS 请求,则更推荐将 SmartDNS 设置为 Dnsmasq 的上游 DNS 服务器。

SmartDNS 可使用 Debian 官方源进行安装,但其版本通常较为 “过时” 。

因此,更推荐使用其 Github 仓库中的最新稳定版进行安装,官方仓库请参阅 pymumu/smartdns

下载 SmartDNS 最新版本时,请根据系统架构选择合适的版本,执行以下命令。

## 创建存放 SmartDNS 安装包的临时目录
$ mkdir -p /tmp/SmartDNS

## 进入目录
$ cd /tmp/SmartDNS

## 下载 SmartDNS 安装包
$ curl -LR -O https://github.com/pymumu/smartdns/releases/download/Release46/smartdns.1.2024.06.12-2222.x86_64-linux-all.tar.gz

## 解压缩 SmartDNS 安装包
$ tar zxf smartdns.1.2024.06.12-2222.x86_64-linux-all.tar.gz

## 进入安装包目录
$ cd smartdns

## 设置脚本可执行权限
$ chmod +x ./install

## 安装 SmartDNS
$ sudo ./install -i

修改 SmartDNS 配置之前,需检查 smartdns.service 服务状态,确保该服务开机自启。

## 检查 smartdns.service
$ sudo systemctl status smartdns.service

## 设置 smartdns.service 开机自启
$ sudo systemctl enable smartdns.service

9.1. SmartDNS 附加配置

本步骤为可选操作,通过安装 SmartDNS 附加配置文件,以达到屏蔽广告或加速中国境内域名解析速度的目的。

若需使用 SmartDNS 屏蔽广告,则需下载广告规则配置文件。

## 创建 SmartDNS 配置文件目录
$ sudo mkdir -p /etc/smartdns.d

## 下载广告规则配置文件
$ sudo curl -LR -o /etc/smartdns.d/neodevhost.smartdns.conf https://neodev.team/lite_smartdns.conf

SmartDNS 的加速规则通过 bash 脚本安装,脚本生成的配置文件位于 /etc/smartdns.d 目录。

关于脚本的详细介绍,请参阅 SmartDNS China List 安装脚本

## 下载加速规则安装脚本
$ sudo curl -LR -o /opt/smartdns-plugin.sh https://gitee.com/callmer/smartdns_china_list_installer/raw/main/smartdns_plugin.sh

## 设置脚本可执行权限
$ sudo chmod +x /opt/smartdns-plugin.sh

## 设置脚本文件防篡改
$ sudo chattr +i /opt/smartdns-plugin.sh

## 执行脚本
$ sudo bash /opt/smartdns-plugin.sh

9.2.定时任务

本步骤为可选操作,主要用于设置 SmartDNS 定时更新附加配置文件和定时重启。

## 编辑系统定时任务,编辑器选择 nano
$ sudo crontab -e

在配置文件末尾,增加以下配置项。

## 定时任务配置项

20 9 * * * /usr/bin/curl --retry-connrefused --retry 5 --retry-delay 5 --retry-max-time 60 -fsSLR -o /etc/smartdns.d/neodevhost.smartdns.conf https://neodev.team/lite_smartdns.conf

30 9 * * * /usr/bin/systemctl restart smartdns.service

若使用了 SmartDNS 加速规则的安装脚本,由于脚本自带服务重启功能,因此定时任务可修改如下。

## 定时任务配置项

20 9 * * * /usr/bin/curl --retry-connrefused --retry 5 --retry-delay 5 --retry-max-time 60 -fsSLR -o /etc/smartdns.d/neodevhost.smartdns.conf https://neodev.team/lite_smartdns.conf

30 9 * * * /usr/bin/bash /opt/smartdns-plugin.sh

9.3. SmartDNS 主配置

SmartDNS 配置较为复杂,可按需制定各类 DNS 请求规则,建议先查阅官方提供的 配置指导配置选项

修改 SmartDNS 主配置文件之前,建议关闭 SmartDNS 并清理 DNS 缓存文件。

## 关闭 smartdns.service
$ sudo systemctl stop smartdns.service

## 清理进程标识文件
$ sudo rm -rvf /var/run/smartdns.pid /run/smartdns.pid

SmartDNS 的主配置文件一般位于 /etc/smartdns 目录下,修改配置文件之前,执行以下命令将其备份。

## 备份 SmartDNS 主配置文件
$ sudo mv /etc/smartdns/smartdns.conf /etc/smartdns/smartdns.conf.bak

使用 neovim 编辑器创建 SmartDNS 主配置文件,执行以下命令。

## 创建 SmartDNS 主配置文件
$ sudo nvim /etc/smartdns/smartdns.conf

在编辑器对话框中输入以下内容,并保存。

额外说明:

  • SmartDNS 端口监听参数为 6053@lo ,请根据实际情况进行调整

  • 检查配置文件中关于本地域名及其上游 DNS 服务器相关配置,请根据实际情况进行调整

# This configuration file is customized by fox,
# Optimize SmartDNS parameters for Linux Router.
#
# For use common DNS server as upstream DNS server,
# please modify 'server' parameter according to
# your network environment.
#
# eg:
#       server 223.5.5.5
#       server 180.184.1.1
#       server 119.29.29.29
#       server 114.114.114.114
#       server 2402:4e00::
#       server 2400:3200::1

conf-file /etc/smartdns.d/*.conf

log-level notice

bind [::]:6053@lo
bind-tcp [::]:6053@lo

cache-size 32768
max-query-limit 1024
max-reply-ip-num 24

prefetch-domain yes

serve-expired yes
serve-expired-ttl 129600
serve-expired-reply-ttl 30
serve-expired-prefetch-time 28800

rr-ttl-min 60
rr-ttl-max 28800
rr-ttl-reply-max 14400

server 172.16.1.1 -group intranet -exclude-default-group
nameserver /internal/intranet
domain-rules /internal/ -speed-check-mode none -no-cache

server-tcp 180.184.2.2 -bootstrap-dns
server-tcp 114.114.115.115 -bootstrap-dns
server-tcp 2400:3200:baba::1 -bootstrap-dns
server-tcp 2400:7fc0:849e:200::4 -bootstrap-dns

server-tls dot.pub
server-tls dns.alidns.com

server-https https://doh.pub/dns-query
server-https https://dns.alidns.com/dns-query

9.4.调整 Dnsmasq

需修改 Dnsmasq 的上游 DNS 服务器配置文件,将 SmartDNS 设置为上游 DNS 服务器。

使用 neovim 编辑器编辑 Dnsmasq 上游 DNS 服务器配置文件,执行以下命令。

## 编辑 上游DNS服务器 配置文件
$ sudo nvim /etc/dnsmasq.d/dnsmasq.dnssvr.conf

在编辑器对话框中修改 server 参数,并保存。

# This configuration file is customized by fox,
# Optimize dnsmasq parameters for Linux Router.
#
# For use DNS server deployed in other virtual machines,
# please modify 'server' parameter according to
# your network environment.
#
# eg:
#       server=172.16.1.2
#       server=172.16.1.3
#       server=fdac::2
#       server=fdac::3
#       server=127.0.0.1#6053
#       server=::1#6053

server=127.0.0.1#6053
server=::1#6053

10.设置系统 DNS

Ubuntu Server 默认使用 systemd-resolved.service 服务,需将其禁用来避免 53 端口被占用。

停止并禁用 systemd-resolved.service 服务,执行以下命令。

## 停止 systemd-resolved.service
$ sudo systemctl disable --now systemd-resolved.service

## 禁用 systemd-resolved.service
$ sudo systemctl mask systemd-resolved.service

移除系统当前使用的 DNS 配置文件。

## 移除 DNS 配置文件
$ sudo rm -rvf /etc/resolv.conf

使用 neovim 编辑器创建 DNS 配置文件,执行以下命令。

## 创建新的 DNS 配置文件
$ sudo nvim /etc/resolv.conf

在编辑器对话框中输入以下内容,并保存。

注意:其中 search 参数为本地域名,请根据实际情况进行调整。

# This configuration file is customized by fox,
# Optimize system resolve parameters for Linux Router.
#
# For use local domain,
# please modify 'search' parameter according to
# your network environment.
#
# eg:
#       search fox.internal

nameserver 127.0.0.1
nameserver ::1

options edns0 timeout:1 trust-ad
search fox.internal

为了防止系统中其他服务意外修改 DNS 配置文件,需要修改配置文件的权限。

## DNS 配置文件防篡改
$ sudo chattr +i /etc/resolv.conf

执行以下命令检查权限是否修改成功。

## 检查 DNS 配置文件权限
$ lsattr /etc/resolv.conf

#### 示例输出
----i----------------- /etc/resolv.conf

至此,Ubuntu 服务器设置系统网络步骤完成。