内网枢纽升级2.5G,嗨皮

利用凯晶T201P J4125准系统与Arch Linux部署基于PPPoE网络的综合网络枢纽平台

Posted by Bob Guo on August 25, 2022

对于笔者这样的poweruser来说,将家庭网络中枢更换成一个可以自己管控的Linux服务器应该说是一个no-brainer的选择。正好之前收到一台低价的凯晶T201P准系统,家里还有几块硬盘不知道怎么放(笔记本战士),那就搭个软路由用呗。
在继续阅读之前,需要指出的是本文大量借用了互联网上现有的资料与内容,限于笔者技术能力,部分内容只能囫囵吞枣,在抄作业前请仔细确认该配置文件符合你的需求,本文仅供参考。
先看一下网络拓扑图: Internet Infrastructure
FttH千兆入户进入光猫,光猫仅用作光电转换(与为机顶盒提供专有连接)用,包括PPPoE在内的所有服务均需要在这台服务器上进行。从这台服务器上走两路连接,一路接到客厅的小米AX3600无线路由器,由它提供给电视、手机、平板等设备;另一路接到笔者工作台上的千兆交换机,提供给两台电脑、PS5以及未来安装的Switch二代机、XSX等设备。这样一想,现在就开始部署2.5G设备似乎是一个有钱没处花的决定,但是考虑到2.5G两项优势(可以跑满现代机械硬盘、可以swap-in千兆网络环境),作为战未来主义者,这样的投资似乎也算合理。

Chaper 1 部署核心路由

凯晶T201P是啥

凯晶T201P是一台基于Intel Celeron J4125处理器的NAS/软路由一体机,搭载四个RTL 8125 2.5Gb网卡。 motherboard默认情况下,这台机器只提供两个SATA接口,即两个3.5英寸的硬盘位,但可以通过一个额外购置的PCIe拆分卡和定制的BIOS固件提供两个额外的SATA接口,利用左右两侧的2.5英寸硬盘位。SATA board这台机器最大的特点就是它十分的小巧,并且拥有全金属的外壳。笔者的弱电柜里能够装下戴尔的SFF主机,一个这样的迷你设备自然也是毫不费劲。deployed由于这篇文章并非凯晶T201P的评测,这部分就简单带过。
CPU Motherboard Installed

安装Arch Linux

应该说,对于本文面向的读者群体而言,安装Arch Linux算得上一个并无多少难点的东西。插盘开机联网分区写表pacstrap然后arch-chroot进去改配置装grub推出reboot,十分的简单。需要注意的是,在pacstrap时,你至少需要安装这些包:

base base-devl linux-firmware linux linux-headers netctl dnsmasq ppp dhcpcd nano

笔者使用的是Arch Linux官方提供的内核(linux包),理论上你可以使用其他内核,但可能遇到一些内核选项上的兼容问题,所以no warranty here. nano是笔者比较偏好的CLI编辑器方案,你用VIM或者Emacs也行,反正自己用的舒服就行,笔者没兴趣也不想挑起编辑器战争。
在Arch Linux里输入ifconfig,可以看到机器有四个网口,从enp3s到enp6s0。 ifconfig你的机器上可能不一样,但这并不重要。在这篇文章中,笔者将会指定enp6s0作为WAN口,连接光猫,剩下三个口是LAN口,连接其他设备。Ports为了方便起见,你也可以通过udev重新指定设备名称以方便配置,但在本文里将不涉及这类操作。

配置PPPoE与网桥

笔者的家庭网络拓扑在上图已有明确展示,因此,在安装完操作系统和必要的软件包之后,就需要开始配置PPPoE服务了。
如果是一般的Arch Linux工作站,相信很多人会选择使用NetworkManager来管理网络。这套系统已经覆盖了大多数人的使用需求,应该说足够实用。但是,由于资料的缺失,在搭建软路由系统时,笔者采用了另一套系统:基于systemd的netctl。
在安装系统时,netctl所必需的软件包已经安装到位,接下来需要做的是复制预设的配置文件并按需配置。使用

cp /etc/netctl/examples/pppoe /etc/netctl

将PPPoE连接使用的文件复制过去,并使用文本编辑器修改对应的端口、填入ISP提供的用户名和密码等。

Description=’Example PPPoE connection’ #为了看着方便可以修改
Interface=eth0 #这里记得改成对应的网卡,比如enp6s0
Connection=pppoe #不要动
User=’example@yourprovider.com’ #ISP提供的用户名
Password=’very secret’ #ISP提供的密码

其他的东西都可以不动,直接保存,启动,就像这样:

netctl start pppoe

就像systemd一样,将start换成enable就可以启用这个服务。现在打开终端,输入ip addr,你就应该能看到一个ppp0的网络设备,有IP地址也能上网。 PPPoE is established 如果出现问题,可以使用这两条命令中的任意一条来查找问题根源:

netctl status pppoe
journalctl -xn

你会发现netctl的使用方式跟systemd服务很像,甚至连翻log用的指令都很接近。其实,你甚至可以直接用systemctl直接操作netctl@对应的配置文件。不过很多时候问题的根源是最简单的账号密码输错了,看都不用看如果确定账号密码没错那有可能是光猫端的延迟,重启光猫一般也能解决。再不能解决的话,那就只能打电话给ISP了。
服务器能上网之后,就需要部署网桥了,这会方便接下来进行其他的配置。网桥的定义当然,考虑到机器只有区区三个LAN口,你大可以手动操作,同时部署多个服务对每个LAN口进行单独的配置,但就像使用ZFS/LVM会让sysadmin面对存储有更大余裕一样,部署网桥之后更换、升级、扩容这些只需要修改一个配置文件就行,不香?按你胃,netctl同样支持部署和管理网桥设备,基本操作也是一样:复制预设文件、修改、启动。

cp /etc/netctl/examples/bridge /etc/netctl

由于Markdown本身的特性,在这里笔者删除了注释的内容。

Description=”LAN Bridge connection” #同样可以随便改藐视
Interface=br0 #生成的桥接默认叫做br0
Connection=bridge #连接形式是网桥 BindsToInterfaces=(enp3s0 enp4s0 enp5s0) #括号里填写的是需要绑定到这个桥的网络端口
#MACAddress=eth1 #这个选项是进行MAC地址克隆,默认注释掉(即不使用)
IP=dhcp #IP分配形式是DHCP #SkipForwardingDelay=yes #跳过转发延迟,默认注释

同样用netctl启动,现在看看是不是网桥就出来了? br0 is established

配置端口转发与iptables

建立起PPPoE连接与网桥之后,下一步就需要正式部署路由功能了。DHCP服务、包转发、防火墙等都需要进行调试。 首先需要做的是启动DHCP服务。笔者使用的是dnsmasq,同时负责DHCP和DNS服务。编辑/etc/dnsmasq.conf如下:

interface=br0 # 使dnsmasq只侦听来自内网口(intern0,即局域网)的请求
expand-hosts # 为 /etc/hosts 中的主机名添加一个域名
domain=PegionFishNetwork # 允许DHCP主机的完全限定域名(需要启用“expand-hosts”)
dhcp-range=10.0.0.2,10.0.0.255,255.255.255.0,10h # 定义局域网中DHCP地址范围:从 10.0.0.2 至10.0.0.255,子网掩码为 255.255.255.0,DHCP租期10小时

保存,启动dnsmasq.service,完成。
至于包转发,Linux内核早就拥有原生支持。在/etc/sysctl.d/文件夹下新建一个文件30-ipforward.conf,并编辑如下:

net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1

通过这样的方式,可以同时支持IPv4和IPv6的包转发。sysctl的具体优化可以参考其他文章,在此就不做过多赘述。
最后一步当然是配置防火墙。为了抄作业方便,笔者使用仍然是iptables。配置文件/etc/iptables/iptables.rules的内容如下:

*mangle
:PREROUTING ACCEPT [2675:724529]
:INPUT ACCEPT [1728:657249]
:FORWARD ACCEPT [870:59569]
:OUTPUT ACCEPT [1950:446640]
:POSTROUTING ACCEPT [2456:487124]
COMMIT
*filter
:INPUT ACCEPT [31:2894]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [44:4818]
-A INPUT -i lo -j ACCEPT
-A INPUT -i br0 -j ACCEPT
-A INPUT ! -i br0 -p udp -m udp –dport 67 -j REJECT –reject-with icmp-port-unreachable
-A INPUT ! -i br0 -p udp -m udp –dport 53 -j REJECT –reject-with icmp-port-unreachable
-A INPUT ! -i br0 -p tcp -m tcp –dport 0:1023 -j DROP
-A INPUT ! -i br0 -p udp -m udp –dport 0:1023 -j DROP
-A FORWARD -d 10.0.0.0/16 -i br0 -j DROP
-A FORWARD -s 10.0.0.0/16 -i br0 -j ACCEPT
-A FORWARD -d 10.0.0.0/16 -i ppp0 -j ACCEPT
COMMIT
*nat
:PREROUTING ACCEPT [18:1153]
:INPUT ACCEPT [1:40]
:OUTPUT ACCEPT [5:334]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT

简单来说,这个配置会干掉所有br0以外的访问(即无法从外部访问到这台服务器),但并不影响包括BT下载在内的其他任务。挺好。

Chapter 2 配置边缘服务

理论上在配置完端口转发与iptables之后,你就可以插上网线重启上网了。不过,众所周知,软路由的核心竞争力就是完整Linux平台带来的高可用性。什么梯子媒体中心代理镜像站都可以自己搭建,所以接下来的章节将会介绍笔者自己部署的网络服务。
需要注意的是,部分服务涉及本地存储,在这篇文章中,所有供边缘服务使用的存储均挂载在/FileShare文件夹下,后文不再赘述。

配置V2rayA

众所周知,在这个神奇的国度,部署V2ray或类似服务是自称技术人的基础条件。我个人比较喜欢在客户端上单独部署代理应用(例如Qv2ray、v2rayNG等),但对于PS5、Xbox、Switch这些无法安装homebrew(起码未破解前)的设备,或者Chromebook这类在可以安装代理前先得通过代理激活的Catch 22型设备而言,能够有一个可以直接指向的代理会很舒服。当然,你可以选择指向任何一个开放局域网连接的代理设备,但…….总得找个理由部署软路由不是?
按你胃,笔者选用的是V2rayA作为V2ray客户端。它最大的特性是基于Web的UI,方便在手机平板PC上管理网站。V2rayA可以直接从archlinuxcn库中安装,也可以通过aur自己下载编译安装。安装完成后,使用

systemd enable –now v2raya

启动V2rayA服务。默认端口是2017,打开之后先设置管理员用户密码,然后开始配置即可。

配置Samba

文件分享是AIO重要的组成部分,不爽不要玩。使用samba就可以在几乎所有平台上分享文件,很舒服。

pacman -S samba

不过需要注意的是,Arch Linux的samba包并不包括默认的smb.config配置文件。你需要从samba的官方Git服务器中下载这个文件并进行自定义。由于笔者的服务满足笔者个人使用即可,故配置的较为简单

[FileShare] # 配置名称
comment = Fileshare # 注释
path = /FileShare # 对应的文件/设备路径
vaild users = bob # 有权使用的用户
public = no # 是否公开
writable = yes # 是否可写入

不过需要注意的是,samba的账号体系跟host OS并不一致,所以如果现在就start smb.service并尝试登陆的结果大概率是系统提示你并无此账户。所以,在启动服务之前,还得建立账户并设置密码。
使用smbpasswd指令可以一步完成这一点,以bob用户为例,输入

smbpasswd -a bob

然后就如同passwd一样按屏幕指示输入密码即可。
部署完成之后,启动smb.service,在文件管理器里输入双反斜杠+IP地址,登录,就可以看到共享出来的FileShare文件夹了。 samba_complete

配置qBittorrent

尽管笔者并不推荐与支持采用盗版手段获取多媒体内容,但考虑到某些不是很适合公开写出来的原因,在目前版本下,采用BT/PT的方式算是必要之恶。总之,一个BT软件必不可少。笔者比较喜欢的是qBitTorrent,主要是它有一个跟桌面端使用体验完全一致的Web UI,这点对于服务器来说十分合适。 作为开源软件,qBittorrent已经被archlinux官方支持,包括带nox后缀的Web UI Only版本。只需要使用

pacman -S qbittorrent-nox

就可以安装。安装完成后,启动qbittorrent-nox,同意许可协议,然后就可以启动服务,在浏览器里用8080这个端口打开它的页面。 Qbittorrent's WebUI 默认的用户名是admin,密码是adminadmin,登陆后可以在设置-WebUI里自行更换。 Qbittorrent's Setup UI

配置Cockpit

Cockpit一词的直译是驾驶舱,所以这个软件包的作用应该说是十分直白的-它是一个服务器面板。与在国内比较流行的宝塔这样的流氓软件不同,Cockpit由红帽开发,是正统开源软件,可以直接从pacman安装,虽然没有什么一键部署LAMP这样的功能,但用起来也十分舒服。
安装Cockpit只需要这么一条指令:

pacman -S cockpit

但由于cockpit的分离策略,有一些功能需要额外安装其他的包。用于管理虚拟机的cockpit-machines、pacman前端cockpit-packagekit、监测系统运行的cockpit-pcp、管理podman容器的cockpit-podman,以及管理存储的cockpit-storaged。安装完成之后,只需要用systemd启动cockpit就行。打开浏览器,端口号9090,回车就能看到cockpit的登陆界面。使用Host OS的用户名和密码登录就可以看到页面了。 Cockpit's Login page Cockpit's Homepage