基于Ubuntu搭建软路由实现拨号上网
介绍
- 本文所讨论的环境是光猫走桥接,然后在软路由设备上进行拨号连接网络,其他场景不讨论
- 本文全部使用的UFW防火墙,如果使用其他防火墙,务必确保配置正确
- 后文讨论的路由器配置基本都是通用内容,可能设置的位置描述有差异,灵活参考配置即可
网络拓扑
整个网络拓扑如图所示:

这里的软路由设备由单独的一个小主机使用Ubuntu server24系统进行搭建,
如果路由器支持二开,也可以使用路由器安装对应的路由系统搭建。不过不在本文讨论范围
光猫配置
因为需要用软路由设备进行拨号,所以光猫必须配置为封装PPPoE的桥接模式,默认是路由模式,拨号由光猫完成
可以关闭光猫的dhcp功能
所有操作均需要超级管理员账号和密码
具体操作可以网络搜索关键字:“修改光猫为桥接”,本文不讨论具体方法
软路由部署
- 首先是先有🐔还是现有🥚的问题,因为需要用软路由拨号,在拨号前是没有网络的,所以软件安装需要在其他网络环境下操作!
- 这里可以先在光猫上设置拨号连接,然后等设备软件安装完成后再切换为桥接
- 在设备上安装好Ubuntu操作系统,本文使用Ubuntu server24.04版本搭建
- 其次将光猫过来的网线接入对应网口,再从另一个网口接后续设备,我这里接的是路由器
网口配置
这次使用的小主机具有多个网口,一个作为wan口,其他全部做lan口,在软件层组合成一个虚拟口使用

网络配置需要注意:
光猫网段(一般是192.168.1.0/24)、软路由网段、路由器网段(一般是192.168.0.0/24)不要设置成相同网段
配置文件:/etc/netplan/50-cloud-init.yaml
1 | network: |
配置文件中的 routes 是额外配置的下一级路由器的网段路由,这点要注意
sysctl参数配置
要让Linux设备成为路由设备,需要开启报文转发,由系统参数决定
将这些配置写到cat /etc/sysctl.conf文件末尾,然后执行sysctl -p命令生效!我这里还修改了TCP的参数
1 | # forward |
pppoe拨号
- 安装软件
拨号使用pppoeconf软件,需要在其他网络环境下提前安装1
2apt update
apt install -y pppd pppoeconf - 打开ipv6
默认拨号只获取IPV4,需要在配置文件中打开IPV6,执行该命令打开1
echo "+ipv6" >> /etc/ppp/options
- 配置
执行pppoeconf命令,然后它会自动寻找接了运营商的网口进行配置
根据提示输入宽带账户和密码,不懂的内容默认就行
配置完成后,如果用户名和密码无误,则会自动拉起,此时ip a可以看到对应网口上已经获取到了ip地址
ipv6 dhcp配置
拨号完成后可以看到wan口ppp0上已经获取到了ipv6地址,但是lan口br10上是没有的。
给内网设备也分配对应的IPv6地址使用Prefix delegation(前缀代理),简称PD。
向上级路由发送PD请求,可以获取一个小于等于64长度的网段,然后就可以给内网分配可以使用的ipv6地址
通过wide-dhcpv6-client申请PD
安装:apt install -y wide-dhcpv6-client
然后在配置文件/etc/wide-dhcpv6/dhcp6c.conf中添加:
1 | interface ppp0 { |
ppp0就是pppoe创建的wan口br10则是前面创建的lan口
配置完成后重启服务生效:systemctl restart wide-dhcpv6-client,此时就可以看到br10口上配置了ipv6地址
通过dnsmasq给下级分配IPV6地址
下级网络设备,本文组网情况下的路由器设备此时还无法获取IPV6
此时需要向下级设备发送RA,使用SLAAC来分配ipv6地址,这里使用dnsmasq服务完成
安装:apt install -y dnsmasq
然后在配置文件/etc/wide-dhcpv6/dhcp6c.conf中添加:
1 | enable-ra |
br10是前面创建的lan口
ipv6的DNS这里配置的是阿里的DNS
这里只使用dnsmasq的RA功能,其他比如dns功能均不使用
配置完成后重启服务生效:systemctl restart dnsmasq
打开防火墙
在网络上裸奔是很危险的,这里使用Ubuntu自带的防火墙管理工具UFW
基础的ufw配置放通端口这里不讨论,网络上资料一堆,初次使用前先去看一看
这里列举相关的配置:
- 修改默认转发策略
在配置文件中/etc/default/ufw修改DEFAULT_FORWARD_POLICY参数为ACCEPT - 放通使用的端口
比如ssh的22端口ufw allow 22
DNS和DHCP相关的端口(53,67和ipv6-icmp)等,在UFW中默认都是放通的,所以不需要额外配置
接着打开防火墙即可
1 | # 打开防火墙 |
路由器配置
- 软路由上没有配置ipv4的DHCP服务,所以路由器接入后获取不到IP地址
- 软路由配置了ipv6的DHCP服务,所以路由器接入后可以获取到IPV6地址
上网方式
上网方式配置成固定IP,然后设置和软路由相同网段的ip即可(如果你觉得这句话和本文开始的内容冲突,说明你没有理解)
举例:
1 | IP地址:192.168.2.5 # 新的ip地址,设置路由器WAN口的地址 |
如果路由器支持自动选择WAN口的功能,最好关掉,在这种配置下最好关闭,选择固定WAN口
LAN口和ipv4的DHCP
设置模式为手动,然后设置路由器的LAN口ip和子网掩码
设置开启ipv4的DHCP服务器,以便给连接路由器的设备分配地址
这里注意本文开头所说,网段不要设置成和软路由相同的网段!
ipv6设置
因为软路由上存在ipv6的DHCP,所以路由器上的ipv6地址获取选择成自动即可
一些小问题
运营商断网后是否会重试
运营商网络断开后,pppd会进行重试操作,每隔1分钟重试一次,一共10次,之后会退出
pppd退出后需要再次执行pon dsl-provider打开
开机等待网络服务耗时长
开机系统服务默认等待网络,这个过程耗时非常久!
可以修改相关服务文件添加超时时间
编辑/usr/lib/systemd/system/systemd-networkd-wait-online.service文件
在[Service]段落最后添加一行TimeoutStartSec=2s
让其等待2s后就超时通过即可,下次重启速度就会好很多!

ipv6地址租期过期后不会自动续租
当前的解决方法是用脚本定时检查br10口上的ipv6地址是否还在
如果过期不在了,则重启服务再次获取:systemctl restart wide-dhcpv6-client
后面如果有更好的方式再更新








