家庭网络折腾记录(一):基础环境搭建
前文中提到的方案 需要的环境 是一台安装了 OpenWRT/ImmortalWRT 的路由器和一台作为 DNS 和代理机的机器,OpenWRT 的安装过程这里不再赘述,按对应机型查看官方文档即可,配置过程在搭建好完整的 DNS 和代理环境之后再开始介绍。
前置条件:
- 最好需要有现成的科学上网环境,例如在 OpenWRT 上运行一个临时的 OpenClash 之类的软件,方便在虚拟机上下载我们后续所需的文件。
我选择在一台已有的 Proxmox 平台上创建一个 Debian 13 虚拟机作为 DNS 和代理机。
创建虚拟机
创建个普通的虚拟机就行,整体上没什么不同,但是有一点(不知道是否重要)需要注意,在设置 cpu 的那个界面,我这里 proxmox 默认选择的是 x86-64-v2-AES,但一会儿下载的 clash 内核需要 x86-64-v3(也可以选择下载支持 v2 的版本),虽然我不懂选择这个有没有什么明显的优化,但是似乎也没有造成明显的负面影响,所以我在这里手动选择了 x86-64-v3

其他的页面一路确认过去就行
安装最小化的系统
Debian 的安装过程不再赘述,怎么装都行,在观察了其他博主的文章后,经我测试在 软件选择 界面只选择SSH server那一项是可行的,这样就会的到一个最小化的系统。

Debian 第一次安装时可能还存在 这个问题,修改镜像源后仍然很慢,原因是安全相关的更新仍然走官方源,该话题下提到的可能的解决方案是断网安装。
实际上我当时真的等了一小时多:(
NOTE如果你已有好的代理环境,请忽略这条,我是因为当时代理出问题才很慢的
配置
TIP以下需要在
root环境下进行
配置一个静态 ip
编辑 /etc/network/interfaces,目前应该只有 nano 编辑器,所以输入nano /etc/network/interfaces,并输入以下内容,nano的用法和普通编辑器类似,直接粘贴进去就好,退出时使用Ctrl+X
# 这部分自带的不用管
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# 下面这里开始是需要改动的内容
# The primary network interface
allow-hotplug ens18 #网卡名称,使用 ip addr 查看
iface ens18 inet static # 设置为静态 ip
# 我选择了这个较为有意义的 ip,.53 我打算作为主路由和这台机器共用的虚拟 ip
address 192.168.1.153/24
gateway 192.168.1.1 # 网关地址,设置为你的主路由
network 192.168.1.0
broadcast 192.168.1.255
# ! 这是在本机配置好 DNS 服务之后才这样设置的,现在请暂时设置为你的主路由或代理机!
dns-nameservers 127.0.0.1
然后输入以下命令重启网络服务
systemctl restart networking.serviceCAUTION
dns-nameservers在本方案完全配置好之后默认使用本机的 DNS 服务,但现在请不要这样设置,另外这里【可能】有一个坑,下面讲
可能的坑
在我第一次配置好后,我想把 DNS 改成 127.0.0.1,却发现没有成功,运行dig <域名>等命令发现其中的 SERVER: 字段仍然显示我原先的旁路由 ip(因为我一开始设置了一台已有的 OpenWRT 旁路由用于科学下载资源),运行dig @127.0.0.1 <域名>,指定 DNS 服务器为本机后,发现成功返回 fake ip,且 SERVER: 字段为本机,Adguard Home 面板上也有记录,说明 DNS 服务没有问题。
再尝试临时修改 /etc/network/interfaces 为主路由 ip,发现仍然没有变化,才意识到现在使用的 dns 可能是由 DHCP 下发的(但这台机器根本没有在使用 dhcp 啊!)
在排查过程中,我发现 Debian 系统的 DNS 设置除了在 /etc/network/interfaces,还有 /etc/resolv.conf,查看该文件的 manpage 发现其中提到
The resolver is a set of routines in the C library that provide access to the Internet Domain Name System (DNS). The resolver configuration file contains information that is read by the resolver routines the first time they are invoked by a process. The file is designed to be human readable and contains a list of keywords with values that provide various types of resolver information. The configuration file is considered a trusted source of DNS information; see the trust-ad option below for details.
If this file does not exist, only the name server on the local machine will be queried, and the search list contains the local domain name determined from the hostname.`
看来该文件的优先级较高,问题应该出在它身上了,cat /etc/resolv.conf查看它的内容,发现有以下关键的两行
# Generated by dhcpcd ...
nameserver 192.168.1.100 # 原先的旁路由 ip,设置在主路由的 dhcp 选项中看来确实是 dhcp 覆盖了该文件中的 dns 设置,但经过我排查,发现本机没有在运行 dhcpcd,目前的 ip 也确实是由 /etc/network/interfaces 设置的静态 ip,经过我对安装过程的回忆,我猜想是在安装过程中使用 dhcp 获取了 ip 地址以及 dhcp 选项中的 dns 服务器,现在不使用 dhcp 了,但是 dns 设置保留在了 /etc/resolv.conf 中。
既然 dhcpcd 已经不再运行,该文件就没有再次被覆盖的风险,所以我的解决的方案是删除自动生成的文件,再手动创建
rm /etc/resolv.conf
echo "nameserver 127.0.0.1" | tee /etc/resolv.conf # 在配置好本机的 DNS 服务后再执行事故现场情景再现:

事后我进行复盘,用相同方法安装了一台 Debian 虚拟机,在安装好后立刻执行ip addr和cat /etc/network/interfaces,看到以下内容,证实了是安装过程中临时使用dhcp造成的


配置网关功能
设置必要的内核参数,让这台机器具有网关的功能
# 参考:https://evine.win
# 开启流量转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/90-override.conf
# 流量转发设备建议设置 default_qdisc 为 fq_codel,详细信息可以阅读:https://www.starduster.me/2020/03/02/linux-network-tuning-kernel-parameter/#netcoredefault_qdisc
echo "net.core.default_qdisc = fq_codel" >> /etc/sysctl.d/90-override.conf
# 用于控制反向路径过滤(Reverse Path Filtering)的一个内核参数,它决定了系统如何处理进入的数据包的源地址校验。
# 如果命令 sysctl -a | grep '\.rp_filter' 输出中你的网卡对应的值是 2,则需要重新覆盖设置为 0。
# 0:表示不开启源地址校验。系统不会检查进入的数据包的源地址,即使数据包的源地址不可达,也不会被系统丢弃。
# 1:表示开启严格的反向路径校验。系统会检查每个进入的数据包,确保其反向路径是最佳路径。如果不是,数据包将被丢弃。
# 2:表示开启松散的反向路径校验。系统会检查进入的数据包的源地址是否可达,即反向路径是否能通(通过任意网络接口)。如果反向路径不通,数据包将被丢弃。
echo "net.ipv4.conf.default.rp_filter = 0" >> /etc/sysctl.d/90-override.conf
echo "net.ipv4.conf.*.rp_filter = 0" >> /etc/sysctl.d/90-override.conf
# 使设置生效
sysctl --system安装必要软件
目前需要的软件有
- 系统工具:
sudo,bind9-dnsutils - 下载工具:
curl,wget,git - 解压工具:
bzip2,xz-utils,unzip
先apt update更新一下,然后安装以上软件
apt install -y --no-install-recommends \
sudo \
bind9-dnsutils \
curl \
wget \
git \
bzip2 \
xz-utils \
unzip总结
目前已经装好了 Debian 系统,配置了网络,设置了内核参数,安装好必要软件,后面将会开始建立 DNS 服务