少女祈祷中...

前言

买了台迷你主机,并打算把他当作家中的主路由来使用
这里使用的是非 Docker 方式的软路由搭建方式,一大堆坑,快被坑麻了,最后才汇总出这么一篇教程

Docker + OpenWRT 方式参看

N100双网口小主机使用docker版openwrt做主路由(PPPoE拨号)超详细!!!! | qllokirin
N100双网口小主机使用docker版openwrt做主路由(PPPoE拨号)超详细!!!! | qllokirin
https://qllokirin.github.io/2024/04/11/25.N100_op/

背景

  • 双网口 X86 主机
  • Ubuntu Server 2404

需求

  • 为下游设备分配公网 IPv6
  • DNS 缓存
  • 广告屏蔽

预期网络拓扑

网卡配置

确认网卡名称

1
ip a

应有类似输出

1
2
3
4
5
6
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
. . .
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
. . .
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
. . .

其中 enp1s0enp2s0 为两个网口的名称

本文中 enp1s0 作为 WAN,enp2s0 作为 LAN

打开网卡设置文件 /etc/netplan/50-cloud-init.yaml ,其中 50-cloud-init.yaml 每台设备可能有所不同

/etc/netplan/50-cloud-init.yaml
1
2
3
4
5
6
7
8
9
10
11
12
network:
ethernets:
enp1s0: # WAN
dhcp4: true # 公网启用 DHCP
optional: true
enp2s0: # LAN
dhcp4: false # 内网关闭 DHCP
optional: true
addresses:
- 192.168.3.1/24 # 固定本机内网 IP
version: 2
renderer: networkd

其中 192.168.3.1 将作为本机 IP 及网关

输入如下指令生效

1
2
sudo netplan generate
sudo netplan apply

启用转发

编辑 /etc/sysctl.conf,在最末尾添加如下内容

1
2
3
4
5
6
7
8
9
10
# 启用 IPv4 转发
net.ipv4.ip_forward=1

# 启用 IPv6 转发
net.ipv6.conf.all.forwarding=2
net.ipv6.conf.default.forwarding=2
net.ipv6.conf.all.accept_ra=2
net.ipv6.conf.default.accept_ra=2
net.ipv6.conf.all.use_tempaddr=2
net.ipv6.conf.default.use_tempaddr=2

输入如下指令生效

1
sudo sysctl -p

配置 DNSmasq

DNSmasq 可以提供 DNS 缓存和 DHCP 服务

安装 DNSmasq

1
sudo apt install dnsmasq -y

配置其配置文件 /etc/dnsmasq.conf,添加如下内容

/etc/dnsmasq.conf
1
2
3
4
5
6
7
8
9
10
listen-address=127.0.0.1, 192.168.3.1                   # 设置 DNS 缓存监听地址
port=53 # 指定 DNS 端口,用于 DHCP/TFTP
server=223.5.5.5 # 指定外网 DNS
interface=enp2s0 # 指定内网网口

dhcp-range=192.168.3.3,192.168.3.255,255.255.255.0,12h # 用于分配的起始/结束 IP,子网掩码,租期
dhcp-option=option:router,192.168.3.1 # 指定 DHCP 网关

enable-ra # 启用 Router Advertisements
dhcp-range=::,constructor:enp2s0,ra-only,slaac # 向局域网发送 RA,使用 slaac 分配地址,此处需注意网卡

启用 DNSmasq

1
2
3
4
5
# 关闭 systemd-resolved,不然会因端口占用无法启动 DNSmasq
sudo systemctl stop systemd-resolved.service
sudo systemctl disable systemd-resolved.service
# 启动 DNSmasq
sudo systemctl enable dnsmasq.service

配置防火墙

本文使用 iptables 来进行路由设置

1
2
3
4
5
sudo ufw disable                       # 关闭 ufw
sudo apt remove --auto-remove nftables # 移除 nftables
sudo apt purge nftables
sudo apt install iptables # 安装 iptables
sudo apt install iptables-persistent

配置 iptables

1
2
3
4
5
6
7
8
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
sudo iptables -A INPUT -p ipv6-icmp -j ACCEPT
sudo iptables -A FORWARD -p ipv6-icmp -j ACCEPT
sudo iptables -A OUTPUT -p ipv6-icmp -j ACCEPT
sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
sudo ip6tables -A FORWARD -p ipv6-icmp -j ACCEPT
sudo ip6tables -A OUTPUT -p ipv6-icmp -j ACCEPT
sudo netfilter-persistent save

配置 PPPoE 拨号上网

安装 pppoeconf

1
sudo apt install pppoeconf -y

enp1s0 接到光猫上,不如后面无法扫描到网络

输入如下指令配置 pppoeconf

1
pppoeconf

按照提示输入运营商账号密码,其他一路 Yes 即可

打开 /etc/ppp/peers/dsl-provider 并在末尾添加如下内容

/etc/ppp/peers/dsl-provider
1
+ipv6

重启电脑并检查网络

1
2
sudo reboot
ip a

应出现一个名为 ppp0 的网卡,并有相应的 IPv4/IPv6 地址

为下游设备分配 IPv6

安装 wide-dhcpv6-client

1
sudo apt install wide-dhcpv6-client

打开 /etc/wide-dhcpv6/dhcp6c.conf 并修改为如下内容

/etc/wide-dhcpv6/dhcp6c.conf
1
2
3
4
5
6
7
8
interface ppp0 {
send ia-pd 0;
};
id-assoc pd 0 {
prefix-interface enp2s0 { # 记得修改为你的 LAN 口
sla-id 1;
};
};

新建 /etc/systemd/system/dhcp6c.service 并键入如下内容

/etc/systemd/system/dhcp6c.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[Unit]
Description=WIDE DHCPv6 Client
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/sbin/dhcp6c -f ppp0
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=3
NoNewPrivileges=yes
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=strict
ReadWritePaths=/run/ /var/log/
ProtectKernelTunables=yes
ProtectControlGroups=yes
SystemCallFilter=~@mount
SystemCallArchitectures=native
LockPersonality=yes
MemoryDenyWriteExecute=yes
RestrictRealtime=yes
RemoveIPC=yes

[Install]
WantedBy=multi-user.target

随后

1
2
3
systemctl stop wide-dhcpv6-client.service
systemctl disable wide-dhcpv6-client.service
systemctl enable dhcp6c.service

重启电脑,完成路由设置

anti-AD 广告屏蔽

利用 anti-AD 所提供的 DNSmasq 配置文件来进行广告屏蔽

打开 /etc/dnsmasq.conf,添加如下内容

/etc/dnsmasq.conf
1
addn-hosts=/etc/dnsmasq.host

输入如下指令

1
2
sudo wget https://anti-ad.net/anti-ad-for-dnsmasq.conf -O /etc/dnsmasq.host
sudo systemctl restart dnsmasq.service

/etc 下新建 host.sh 并键入如下内容

/etc/host.sh
1
2
sudo wget https://anti-ad.net/anti-ad-for-dnsmasq.conf -O /etc/dnsmasq.host
systemctl restart dnsmasq.service

以超级用户的身份进入 CRON

1
2
su
crontab -e

添加如下规则

1
0 * * * * /etc/host.sh

每小时将执行一次 /etc/host.sh 以同步广告列表

旁路由设置

断开旁路由的所有网线并重置旁路由
将电脑网口与路由器 LAN 口相连,进入路由管理页面
设置如下:

  • 静态 IP 上网
  • IP 地址:192.168.3.2
  • 子网掩码:255.255.255.0
  • 默认网关:192.168.3.1
  • 首选 DNS 服务器:192.168.3.1
  • 路由器局域网地址:192.168.4.1

保存,随后将旁路由的 WAN 口与主路由的 LAN 口相连,完成设置

连接 WIFI,可以使用 192.168.4.1 进入旁路由设置,也可以通过 192.168.3.1 进入主路由设置

相关问题

配置 IPv6 后部分网站无法访问

诸如百度、知乎,博客园等网站使用在启用 IPv6 后无法打开,可能是因为 MSS 值设置的原因

将 MSS 值设为 1432

1
2
sudo ip6tables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o ppp0 -j TCPMSS --set-mss 1432
sudo netfilter-persistent save

感谢

如何使用Debian/Ubuntu等Linux做软路由(物理机版本,非虚拟机容器版) - 知乎
如何使用Debian/Ubuntu等Linux做软路由(物理机版本,非虚拟机容器版) - 知乎
https://zhuanlan.zhihu.com/p/587068225
X86 软路由配置 IPv6 踩坑小记
X86 软路由配置 IPv6 踩坑小记
https://blog.otakusaikou.com/2020/11/11/x86-soft-router-and-ipv6/
解决PPPoE宽带上网IPv6卡顿问题 - 王晔
解决PPPoE宽带上网IPv6卡顿问题 - 王晔
https://wangye.org/posts/2023/08/circumventing-ipv6-path-mtu-discovery-issues-with-mss-clamping.html