Debian 12 安装及配置软路由全记录

本次安装主要参考星野玲的文章《使用 Debian 作为路由器》,并在 ChatGPT 的指导下完成。博主使用 ARM 小主机,而我的主机是 X86 架构(Bosgame 双网口2.5G intel N100 小主机),虽然都安装了 Debian 系统,但因CPU架构差异导致我在安装过程中经历多次水土不服的情况,好在有 ChatGPT,最终一一克服这些困难,成功完成路由功能配置。

bosgame-2

一、安装 Debian 系统

当前 Debian 最新版 12.9,在Debian官网下载好映像文件,使用 Ventoy 启动盘引导启动。一路点击【下一步】完成安装。在系统安装中遇到最大的问题是关于网卡的驱动适配。我的 X86 N100 小主机配备 RTL 8125B 2.5G 有线网卡,但 Debian 系统会自动适配安装 RTL8169 驱动,虽然能用,网速打折扣勉强达到千兆。我当然不甘心如此,于是自己手动重装驱动若干次,最终在ChatGPT指导下,一步步检测完成网卡驱动安装,实现网卡完整功能。

二、修改系统网络配置

通常情况下安装的 Linux 系统不具备路由功能,但 Linux 系统天生就是为网络而生的操作系统,网络功能强大无比,仅需要适当配置就可实现路由功能。唯一的问题是设置适配很复杂,对于小白来说基本是不可能完成任务。所以一边参考现成文章,一边咨询 ChatGPT ,我这个电脑业余水平的人也可以尝试一下。

1.配置远程SSH终端

参照博主文章,第一步首先配置路由器远程安全的 SSH 访问。这部分来说相对比较简单,创建存放密钥文件夹,写入密钥,编辑sshd配置文件,原则只有一个确保安全访问,避免 SSH 暴露在互联网遭受攻击,这里不再赘述。

2.设置网络

参照博主文章修改网络配置文件编辑 /etc/network/interfaces,并在文件中写入如下内容:

source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
​
auto enp1s0
allow-hotplug enp1s0
iface enp1s0 inet static
    address 192.168.3.1/24
​
auto eth1
allow-hotplug eth1
iface eth1 inet dhcp
iface eth1 inet6 auto

启动网络运行出现错误,将错误信息及配置内容提交给 ChatGPT 检查,指出存在一个潜在问题:为 enp1s0 配置了两个接口定义,分别是:

  1. iface enp1s0 inet dhcp(用于 DHCP)

  2. iface enp1s0 inet auto(重复配置)

ChatGPT 指出这可能会导致 ifup 命令出错,并使网络接口启动失败。修改如下后,重启网络服务后运行正常。这是我遇到第一个水土不服的情况。

# 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
​
auto enp2s0
allow-hotplug enp2s0
iface enp2s0 inet static
   address 192.168.100.1/24
   
auto enp1s0
allow-hotplug enp1s0
iface enp1s0 inet dhcp   
​

3.开启转发

编辑 /etc/sysctl.conf 文件。

sudo vim /etc/sysctl.conf

/etc/sysctl.conf 的末尾添加以下内容。

net.ipv4.ip_forward=1
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.default.accept_ra=2
net.ipv6.conf.default.use_tempaddr=1

应用配置。

sudo sysctl -p

为了让配置生效,重启系统。

sudo reboot

重启之后 我的N100的 LAN 口的 IP 地址已经变成了 192.168.100.0/24 这个网段,将笔记本电脑IP地址设为 192.168.100.10,用RJ45网线连接到 N100 的 LAN 口,可以ping 通 192.168.100.1,远程 SSH 连接,说明配置生效。接下来为了更好适配路由功能,需要安装一些必要软件。

4.安装 docker 及 docker-compose

这里我没有使用博主文章中指令安装 Docker 和 Docker-compose,直接询问ChatGPT 给出指令。

#更新系统
sudo apt update && sudo apt upgrade -y
#安装必要依赖
sudo apt install -y ca-certificates curl gnupg
#添加Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
sudo chmod a+r /etc/apt/keyrings/docker.asc
#添加Docker 官方软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#更新软件包索引并安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#启动并设置Docker 开机自启
sudo systemctl enable --now docker
#验证是否安装成功
docker --version
docker-compose --version

5.安装配置 Dnsmasq

我考虑要用可视化 docker 管理工具以后大量的 Docker 应用,所以先安装了 Portainer CE,然后按照文章的步骤建立了一个文件夹存放 Dnsmasq 配置文件。

mkdir -p ~/config/dnsmasq
vim ~/config/dnsmasq/dnsmasq.conf

写入以下内容。

interface=enp2s0
port=53
server=8.8.8.8
server=8.8.4.4
enable-ra
log-dhcp
dhcp-range=192.168.100.2,192.168.100.254,1h
# dhcp-range=::,constructor:enp2s0,ra-staeless,1h
dhcp-option=option:router,192.168.100.1
dhcp-option=option:dns-server,192.168.100.1
dhcp-option=option6:dns-server,[fe80::8647:9ff:fe46:ef85]

接着,在 Portainer 使用Stack 配置安装 Dnsmasq

version: "3"
services:
  dnsmasq:
    container_name: dnsmasq
    cap_add: 
      - NET_ADMIN
    image: jpillora/dnsmasq
    network_mode: host
    volumes:
      - "/home/laaa/config/dnsmasq/dnsmasq.conf:/etc/dnsmasq.conf:ro"
    restart: always

部署并启动容器, 这样实现 DNS 功能和 DHCP 服务,再次连接 N100 LAN 口可以自动获得 IP 地址。

6.安装 PPPoE 拨号

因为我的宽带网络是直接获取IP地址,无需 PPPoE 拨号,此部分无需安装。

7.开启 NAT 转换

使用 nftables 来开启 NAT 转换。

编辑 /etc/nftables.conf 文件。

在此之前,所有安装基本无困难通过,即便遇到问题,在ChatGPT帮助下也能很快解决。但是这里参照博主文章进行了nat 转换规则配置。配置后,网络不能正常,互联网访问也不正常,让 ChatGPT进行修改后,可以正常工作,路由功能也正常。但是有一个新的问题,每次服务器重启后,导致远程主机不能访问 Docker 端口,原因不明。ChatGPT 提出了无数个解决方案,我一一测试,均未能解决此问题。每次系统重启后,我的 docker 应用就不能访问,只有再执行 'sudo systemctl restart nftables' 重启网络服务后,方可正常访问。其实这样也没有多大问题,只是需要每次重启系统后再执行一次这条指令,但是心里有一点点不舒坦。

第二天,我干脆将配置 nftables 表清空,然后完全不参照博主设置,让 ChatGPT 给出一个配置 NAT 转换指令集,按照它给出步骤一步步重做,完成后测试一切正常,重启系统,也一切正常。困扰我数十个小时问题就这样解决了,具体过程附后。至此,所有网络适配完成。

后记

虽然我的小主机 N100 完整适配了路由功能,并可取代我目前使用的华硕路由器,但我并未实施。目前家中各类连网的智能化设备包括智能照明、监控摄像头、亚马逊Echo、智能插座、NAS 服务器以及各种手持设备,零零总总接近50个,更换一次网络实在太麻烦,太多的不确定性。折腾这个小主机路由功能的初衷只是练练手,学习一下计算机网络知识,仅此而已。

后来,我在这个小主机上安装了很多其他网络应用,包括目前这个个人网站也迁移到这个主机上了。鉴于这个小主机强悍的性能,我把 EMBY 影视服务器也迁移过来运行,考虑到用户端需要重新适配,目前采用双系统双运行模式,暂未迁移客户,条件成熟只需要简单适配就可迁移过来。那么原来安装于 群晖NAS 系统上的 Emby 服务端就可以下线卸载了,让NAS专心于NAS的事务。

bosgame-3

附:全新配置 nftables

  • 对 ChatGPT 提出需求如下。

现在配置 nftables,将 enp1s0 设置为 WAN 接口,enp2s0 设置为 LAN 接口。

  • ChatGPT 提供指令及步骤。

步骤1: 创建 NAT 表和设置规则: 先创建 nftables 的 NAT 表,然后设置链。

sudo nft add table ip nat

配置 NAT 转发规则: 你需要配置 POSTROUTING 链,进行 NAT 转换,使 LAN 网络能够访问外网:

sudo nft add chain ip nat POSTROUTING { type nat hook postrouting priority 100 \; }

步骤2: 配置 NAT 转换规则(将 LAN 流量转换为 WAN 地址): 使用 masquerade 对 LAN 网络进行地址伪装,使其能够通过 WAN 接口访问外网。

sudo nft add rule ip nat POSTROUTING oifname "enp1s0" masquerade

这条规则的意思是:如果数据包的输出接口为 enp1s0(WAN 接口),则进行地址伪装。 步骤 3:设置过滤规则(可选)

如果你还需要配置防火墙规则,可以添加基本的过滤规则以控制哪些流量可以进出。

例如,允许 LAN 访问外网,禁止其他流量:

sudo nft add chain ip filter forward { type filter hook forward priority 0 \; }
sudo nft add rule ip filter forward iifname "enp2s0" oifname "enp1s0" accept
sudo nft add rule ip filter forward iifname "enp1s0" oifname "enp2s0" accept

步骤 4:保存配置

保存 nftables 配置,确保系统重启后仍然有效:

sudo nft list ruleset > /etc/nftables.conf

然后,确保 nftables 在启动时自动加载该配置:

sudo systemctl enable nftables