我的另类软路由方案——Alpine Linux改造

2021-12-02 15:57:34 109点赞 254收藏 78评论

创作立场声明:不为别的,只为分享自己的一些经验收获

起因

现在说到软路由,好像大家第一个想到的就是 OpenWRT,OpenWRT 的确是很好用,但好奇心作祟,既然 OpenWRT 是一款 Linux 发行版,那么如果使用别的 Linux 发行版是不是也能获得相同的功能?答案当然是肯定的,由于使用过不少 Linux 发行版,思考这个问题的时候第一个想到的发行版就是 Alpine Linux。那么就用 Alpine Linux 搭建一个软路由吧,记录一下过程,帮大家填坑。

什么是Alpine Linux

Alpine Linux 是一个由社区开发的基于 musl 和 BusyBox 的 Linux 操作系统,该操作系统以安全为理念,面向 x86 路由器、防火墙、虚拟专用网、IP电话盒及服务器而设计。现在常见于容器化技术,作为基础镜像被广泛使用。

Alpine LinuxAlpine Linux

系统的安装过程我就不写了,很简单,按照屏幕提示进行操作就可以了,如果还有不明白的地方可以参考官方的 wiki

软路由配置

以下的配置对于大部分 Linux 发行版同样适用,最大的差异可能只是不同的发行版的配置文件位置和语法上存在一些不同,这次同样是在 J4125 小主机的虚拟机上进行的配置

动态 IP 上网

  • 配置网卡
    软路由一般都需要两个网卡(单臂路由这样的情况暂时不考虑),那么先分配两个网卡给 Alpine,之后就是把一个设置成 WAN 口,一个设置成 LAN 口,主要的配置文件是 /etc/network/interface,打开之后可以看到这样的配置信息,网口的信息主要取决于安装时候是否对网卡进行了初始化,我在安装的过程中只启用一张网卡,所以现在只能看到 eth0 的配置信息,那么就将 eth0 作为 WAN 口吧,一般的上网模式主要有三种,动态 IP 上网,固定 IP 上网,或者拨号上网,既然系统已经通过 DHCP 自动获取到了 IP,那么就先以动态 IP 为例吧,直接套用初始的 DHCP 配置,然后把 eth1 作为 LAN 口,直接将 LAN 口的 IP 设置成 192.168.1.1,子网掩码等信息如下图所示:
    初始设置初始设置
    添加LAN口信息添加LAN口信息
    保存退出之后使用 service networking restart 命令重启网络,网卡的配置就生效了
    网卡信息网卡信息

  • 启用 DHCP 和 DNS
    家庭环境中实际的带机量并不是很多,那么 DHCP 和 DNS 的功能并不需要太复杂,直接使用 dnsmasq 进行配置即可,安装也很简单,apk add dnsmasq 就可以了,默认的配置文件是 /etc/dnsmasq.conf,但是为了方便管理,建议将功能分割成两个不同的配置文件,此时就可以在 dnsmasq 默认的配置文件目录 /etc/dnsmasq.d/ 下分别创建两个配置文件,分别是 dhcp.confdns.conf ,顾名思义,这两个配置文件分别控制系统的 DHCP 和 DNS 功能:

    dhcp.conf
    响应网卡
    interface=eth1
    bind-interfaces
    地址分配范围
    dhcp-range=192.168.1.100,192.168.1.200,8h
    网关地址
    dhcp-option=3,192.168.1.1
    dns地址
    dhcp-option=6,192.168.1.1
    最大可分配数量
    dhcp-lease-max=64
    记录地址分配情况
    dhcp-leasefile=/etc/dnsmasq.lease

    dns.conf
    监听地址,可以监听多个,用逗号分隔
    listen-address=192.168.1.1,127.0.0.1
    向上查询的服务器地址
    server=114.114.114.114
    server=8.8.8.8
    同时向 dns 服务器发起查询
    all-servers
    忽略本地 dns 设置
    no-resolv
    也不要检测 /etc/resolv.conf 的变化
    no-poll
    只响应完整域名查询
    domain-needed
    缓存的查询数量
    cache-size=2048
    重启后清空缓存
    clear-on-reload

    dnsmasqdnsmasq
    配置完成之后记得使用 dnsmasq -test 测试一下是否有问题,没有问题的话就可以将 dnsmasq 添加到启动项了 rc-update add dnsmasq
    测试测试

  • 防火墙规则
    Apline 上常用的防火墙配置工具主要是 iptables 和 nftables ,这次就以 iptables 为例,系统默认没有安装,安装直接执行 apk add iptables,初始状态系统是没有防火墙规则的,可以按照需求进行添加,本次的目的主要是实现一个软路由的功能,那么需要执行的命令如下:

    清空所有现有规则
    iptables -F
    iptables -X
    iptables -t nat -F
    iptables -t nat -X
    iptables -t mangle -F
    iptables -t mangle -X

    开放 ssh 端口并允许 LAN 口的所有连接
    iptables -A INPUT -i eth0 -p tcp —dport 22 -j ACCEPT
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -i eth1 -j ACCEPT
    iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT

    转发
    iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT
    iptables -A FORWARD -i eth0 -d 192.168.1.0/24 -j ACCEPT

    地址伪装,如果固定 IP的 话可以使用 iptables -t nat -A POSTROUTING -o eth0 -j SNAT —to-source xxx.xxx.xxx.xxx 效率会更加高一点
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    设置默认的规则
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT

    之后需要将这些规则固化,使用 service iptables save 进行保存,并使用 rc-update add iptables 命令将 iptbales 设置成开机自启动;
    iptables规则iptables规则

  • 开启转发
    /etc/sysctl.d 目录下创建 route.conf,文件名随意,写入 net.ipv4.ip_forward=1 ,执行 sysctl -p /etc/sysctl.d/route.conf 使其生效;
    开启转发开启转发

  • 重启系统
    重启系统,使配置生效。

固定 IP 上网

  • 网卡配置
    固定 IP 相比于动态 IP 而言,最大的差异主要是 WAN 口的 IP 配置,由 DHCP 变成了确切的 IP 地址,此处对比一下我注释掉的配置信息就知道了;
    固定IP固定IP

  • DNS 配置
    此处的配置主要是为了解决 DNS 解析问题,直接在 /etc/resolv.conf 文件中添加 nameserver 172.16.1.1 即可,DNS 服务器可以自行选择,我直接使用了我的路由器的地址;

其他的配置和动态 IP 完全一样,我就不做赘述了。

拨号上网

相比于动态 IP 和固定 IP,拨号上网就要稍微复杂一点了,Alpine 上使用 ppp-pppoe 作为拨号工具,需要对其进行一些设置才能使用,参照官方的文档

  • 安装组件
    apk add ppp-pppoe, 系统会自动将需要使用的组件全部安装上;

  • 启用内核支持模块
    modprobe pppoe,如果没有问题的话可以通过 lsmod |grep pppoe 查看是否已经加载成功,为了能够在开机的时候就将模块加载上,执行 echo "pppoe" > /etc/modules-load.d/pppoe.conf 添加进开机加载列表,这个文件名也是可以随意设置的;
    pppoepppoe

  • 配置文件
    需要修改的配置文件主要有三个:
    首先需要在 /etc/ppp/peers/ 目录下创建一个文件,文件名可以任意,但必须记住,后续会用到,因为我使用的是电信的网络,那就直接叫做 chinanet 好了,写入如下内容:

    /etc/ppp/peers/chinanet
    拨号的账号,一般都是固话号码
    user “xxxxxx”
    plugin rp-pppoe.so
    指定拨号的网卡
    eth0
    不需要指定IP地址
    noipdefault
    使用运营商提供的DNS服务器,如果想要手动设置,那么就不要添加这一条,直接在/etc/resolv.conf中添加自己的DNS服务器即可
    usepeerdns
    自动配置路由和网关
    defaultroute
    断线重连
    persist
    不需要远程认证,这个不用管
    noauth

    pppoe配置pppoe配置

    拨号上网一般都是有密码的,那么密码在哪里添加呢?一般情况下是在 /etc/ppp/chap-secrets 文件中,写上用户名和密码就可以了,记得加上双引号;

    /etc/ppp/chap-secrets
    “username” * “password”

    pppoe密码pppoe密码

    最后就是修改一下网卡配置了,拨号上网会生成一个虚拟网卡承载拨号获取到的 IP,那么配置文件如图所示:
    网卡配置网卡配置

    这个部分的 chinanet 对应 /etc/ppp/peers/chinanet,使用什么文件名就在此时使用对应的参数

  • 防火墙配置修改
    相比于动态 IP 和 固定 IP,防火墙规则只需要将原来规则中的 eth0 替换成 ppp0 即可,其他的配置和动态 IP 完全一样,注意一下网卡名称就好了;

  • 重启系统
    重启系统之后,系统应该就会自动拨号成功,获取到 IP了。

简单测试

重启系统后就可以进行简单的测试了,两个网口都插上网线,看看 LAN 口连接的设备能不能正常的获取到网址,如果配置没有错误的话就可以当成一台软路由来进行使用了。

拨号成功拨号成功

笔记本获取IP笔记本获取IP

笔记本查询外网IP笔记本查询外网IP

总结

Alpine Linux 配置成软路由的过程大致上就是这样的,功能虽然简单,但 Linux 本身就是一个自由度很高的系统,只要你稍加扩展,很多大家都懂的功能都可以实现,这里就不展开说明了,有兴趣的朋友可以去研究一下。

展开 收起
78评论

  • 精彩
  • 最新
  • 看懂了,如果说op是个精装房,那这个就是毛坯房,小白就别尝试了

    校验提示文案

    提交
    可能连毛坯都不算,钢筋才刚扎好,是用水泥还是用砖头都由用户自己决定

    校验提示文案

    提交
    请问这个系统的pppoe可以设置像op里的access contrator的选项吗

    校验提示文案

    提交
    收起所有回复
  • 在这里炫技是没有意义的

    校验提示文案

    提交
    没有炫技啊,其实操作很简单,鸟哥的私房菜看完基本都会了

    校验提示文案

    提交
    對,謝謝分享。思路很好,內容也很詳細。不明為什麼某些人會說炫技,很無語。

    校验提示文案

    提交
    还有5条回复
    收起所有回复
  • 这个系统的优势在哪里啊?用debian估计更稳定

    校验提示文案

    提交
    相对于Debian而言安装更快,稳定性差不多,本身就是设计用来做路由器和防火墙什么的基础系统

    校验提示文案

    提交
    收起所有回复
  • 先不说界面友好层度。实测速度,效能怎么样?这都没优势谁折腾?

    校验提示文案

    提交
    性能和openwrt类似

    校验提示文案

    提交
    收起所有回复
  • 看到命令行就头疼。

    校验提示文案

    提交
    一开始我也头疼,可是用惯了反而觉得用鼠标慢

    校验提示文案

    提交
    收起所有回复
  • 很多网络设备其实都是定制版的linux。

    校验提示文案

    提交
    现阶段应该unix,VxWorks占比也很高,一些专业的网络设备公司还会自研专用系统

    校验提示文案

    提交
    收起所有回复
  • iptable过时了,nftable了解下。再者桌面和路由用同一个发行版比较省力,不然要记两个不同的体系很容易搞糊涂的。如果不是用openwrt那样的路由专精系统,我还不如直接上archlinux省事,至少这体系我熟阿

    校验提示文案

    提交
    nftables很快上线

    校验提示文案

    提交
    收起所有回复
  • 唉,好折腾的感觉

    校验提示文案

    提交
    爱好使然,就喜欢瞎折腾, [呲牙]

    校验提示文案

    提交
    收起所有回复
  • 挺好的。很纯粹的软路由

    校验提示文案

    提交
    感谢你的支持 [期待]

    校验提示文案

    提交
    收起所有回复
  • 那直接linux不也挺好的

    校验提示文案

    提交
    功能要求不多的真可以考虑一下,配置完基本不用管,我已稳定使用四五年了

    校验提示文案

    提交
    收起所有回复
  • 他家防火墙有个awall配置工具。其实这货更方便是在pve虚拟机里跑lxc,5-6m一个虚拟机…开一堆占用几十m……

    校验提示文案

    提交
    所以docker容器很多把它作为基础镜像构建

    校验提示文案

    提交
    收起所有回复
  • 适合折腾学习,我也docker了一个ubuntu:focal,配置成FQ网关,学习完还是继续用 OpenWrt

    校验提示文案

    提交
    我已经弃用openwrt三四年了,一直都是用这种方案搞富强

    校验提示文案

    提交
    收起所有回复
  • 其实没卵用

    校验提示文案

    提交
    每个人需求不同,分享给用得到的人

    校验提示文案

    提交
    收起所有回复
  • 最近正好也在弄Linux路由,如果能写下单网卡旁路由模式最好了

    校验提示文案

    提交
    旁路模式是打算用来富强吗?

    校验提示文案

    提交
    收起所有回复
  • 软路由的目的不是丰富的插件吗?

    校验提示文案

    提交
    都能实现,只不过有些东西不好讲

    校验提示文案

    提交
    收起所有回复
  • 如果软路由单纯就配置个上网又有什么意义

    校验提示文案

    提交
    这不是不能明说的功能不好在平台上发嘛

    校验提示文案

    提交
    收起所有回复
  • 学习了,有的盒子op没有无线网卡驱动,在有驱动的armbian上改造一下,有新的作用 [献花]

    校验提示文案

    提交
    是的,现在很多开发板在没有openwrt适配的情况下可以这样操作

    校验提示文案

    提交
    收起所有回复
  • 确实不是适合小白,精神可嘉!

    校验提示文案

    提交
    学习一下也不吃亏呀

    校验提示文案

    提交
    收起所有回复
  • 这些命令在哪里学都是通用吗

    校验提示文案

    提交
    除了apk命令之外其它Linux都可以套用,apk是alpine上的包管理命令,debian系是apt,redhat系是dnf,arch是pacman等

    校验提示文案

    提交
    好的收藏备用了,哪天docker个照着弄

    校验提示文案

    提交
    收起所有回复
  • 我看了,这不就是普通linux手动搭建路由器的过程么?包括dhcp,dns,iptables路由策略等等,这么做意义何在?机器成本先不说,弄这个目的是什么?不求最好,只求最麻烦?

    校验提示文案

    提交
    每个人对于自己需求的定义是不一样的,虽说麻烦,但也不差,有个备份方案总比只依赖一种方案强那么点

    校验提示文案

    提交
    收起所有回复
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
254
扫一下,分享更方便,购买更轻松