家庭网络改造(二)——旁路由openWRT
旁路由openWRT
使用玩客云盒子刷入openWRT。
背板加热后可打开
抽出主板,按照型号短接触点刷入即可
新版玩客云短接储存旁边,RX口左上方空电阻位即可,先USB连接至电脑,螺丝刀短接同时上电,软件识别即可。
烧录过一次再进刷机模式可插入USB,按住reset键再通电,烧录到3%松开即可。
刷写软件使用USB_Burning_Tool
软件包使用更新 2023.07.08 OPENWRT高内核直刷 玩客云ws1608/赚钱宝三代和赚钱宝2代WS1508-迅雷玩客云、京东云等各种云设备-恩山无线论坛 (right.com.cn)的OPENWRT高内核直刷包,直接刷入openWRT系统。
选择清楚所有,点击开始,等待完成即可。
烧录完后要点击停止,然后断开电源和usb。
刷完,第一次使用先连接电脑进后台配置ip,网卡灯亮一个是正常的,正常会给电脑分配一个ip,默认旁路由模式,后台IP是192.168.1.250 密码lanlan
如果你的路由网段是192.168.1.XXX的,直接连到你的内网也可以,网口默认设置的静态IP,不是动态获取的,有些路由器后台是看不到的,后台IP是192.168.1.250 密码lanlan。
设备连接
光纤入户----->光猫(光电信号转换)----->路由器(PPPoe拨号上网,以及无线网络)< ----- >旁路由
手动指定方案
- 为旁路由配置和主路由同网段的静态 IP 地址,同时将旁路由的网关和 DNS 指向主路由,子网掩码与主路由保持一致。
- 旁路由关闭 DHCP 服务。
- 在主路由防火墙开启 SYN-flood 防御的情况下,关闭旁路由防火墙的 SYN-flood 防御(可选)。
- 在需要接入旁路由的终端设备中,将网关和 DNS 配置为旁路由 IP 地址,配置同网段的 IP 地址和与主路由相同的子网掩码。
配置LAN口:
- 在OpenWrt后台,进入“网络” -> “接口”。
- 找到“LAN”接口,点击“编辑”。
- 设置“协议”为“静态地址”,并输入一个静态IP地址
192.168.2.1
。 - 关闭“DHCP 服务器”选项,因为我们将使用主路由器的DHCP服务。
传输协议:修改为 静态地址
IPv4地址:修改为 你的主路由同IP段内任意一个未使用的地址 (如你的主路由地址为192.168.2.1,那这里的地址就可以修改为除了192.168.2.1以外的任意一个未在局域网内被使用的192.168.2.X的地址,比如192.168.2.30)(重点提示:这里修改的地址必须要与你的主路由地址在同一网段!并且在局域网内没有其他设备正在使用的地址,这个地址将作为N1的地址,也是登录N1后台的唯一地址)
IPv4子网掩码:无特殊需求保持默认的255.255.255.0即可
IPv4网关:修改为 你的主路由IP地址 (这个地址一定要设置,否则无法上网!)
IPv4广播:默认留空即可 (小白不懂的话不要修改)
使用自定义的DNS服务器:修改为你的主路由IP地址,然后点击右边的加号!一定要点后面的加号,否则无效,切记! 如下图所示
(重点提示:修改这里的DNS地址之后一定要点旁边的加号,这里的地址建议修改为你的主路由IP即可,填其他公共DNS地址可能会导致异常,小白切记~)
IPv6分配长度:如无特殊需求选择默认的64即可,如果你没有IPv6地址请选择禁用IPv6分配提示和IPv6后缀:默认留空即可
配置WAN口:
- 配置同LAN口
设置接口LAN如下
LAN和WAN绑定,具体操作是取消桥接,再设置 WAN 和 LAN 共用同一个网卡(如 eth0 )。这个操作其实和 MASQUERADE 规则的效果类似,因为绑定后经过 WAN 的流量必然会被 SNAT 。
远程管理页面
为了能够在远程管理到软路由,我们需要将其开放到公网上(危险操作),在主路由上设置旁路由为DMZ主机,使其暴露在公网上的IP指向旁路由。
在软路由中更改控制页面的端口为8000,公网访问时候运营商会拦截80端口。
然后在防火墙中添加来自wan口目标为设备
端口为8000
的规则
这样就能够通过公网ip+端口连接至软路由了,公网ip会变所以,可以后续实现DDNS绑定域名。
不过当在内网中试图访问域名时,会遇到无法访问的问题,原因如下:当向路由器DNS查询域名对应的ip时(软路由的DNS服务指向主路由),①以主路由为DNS查询时,其路由表记录的公网ip就是它本身所有返回192.168.2.1,但是是通过设置软路由为DMZ主机暴露在公网,服务也在软路由上(192.168.2.30),故这种情况下无法访问。正常情况,为8000端口设置端口转发至软路由即可解决,因为此问题就出现在DMZ主机使外网流量(公网IP)流向了软路由,而其本身认为此域名表示的IP就是它本身,而在内网返回了自身的IP地址,导致找不到服务②以软路由为DNS查询域名,不在其结构内,返回为其公网IP。③可开启手机流量,可正常访问服务(此处无对应图)。
防火墙
- 入站 IPv4, 协议 UDP - Allow-DHCP-Renew
- 允许从WAN接收UDP协议的数据包,目的端口为68,这是DHCP(动态主机配置协议)服务器使用的端口,用于IP地址的自动分配和更新。
- 入站 IPv4, 协议 ICMP - Allow-Ping
- 允许从WAN接收ICMP(互联网控制报文协议)数据包,通常用于ping命令,检查网络连通性。
- 入站 IPv4, 协议 IGMP - Allow-IGMP
- 允许从WAN接收IGMP(互联网组管理协议)数据包,用于多播流量的管理。
- 入站 IPv6, 协议 UDP - Allow-DHCPV6
- 允许从WAN接收IPv6的UDP数据包,目的端口为546,这是DHCPv6(IPv6的动态主机配置协议)使用的端口。
- 入站 IPv6, 协议 ICMP - Allow-MLD
- 允许从WAN接收IPv6的ICMP数据包,MLD(多播侦听发现)用于IPv6网络中的多播成员管理。
- 入站 IPv6, 协议 ICMP - Allow-ICMPv6-Input
- 允许从WAN接收IPv6的ICMP数据包,用于IPv6网络的诊断和控制。
- 转发 IPv6, 协议 ICMP - Allow-ICMPv6-Forward
- 允许转发从WAN接收的IPv6 ICMP数据包到所有区域,这通常用于路由器之间的通信。
- 转发 IPv4 and IPv6, 协议 IPSEC-ESP - Allow-IPSec-ESP
- 允许转发通过WAN接收的IPSEC(互联网协议安全)ESP(封装安全有效载荷)数据包到LAN,用于VPN连接。
- 转发 IPv4 and IPv6, 协议 UDP - Allow-ISAKMP
- 允许转发从WAN接收的UDP数据包,端口500,这是ISAKMP(互联网安全协议/密钥交换)使用的端口,用于设置VPN连接的安全参数。
将软路由设置为DMZ主机并暴露在公网时,需要格外注意安全性。
- 考虑部署入侵检测系统来监控可疑活动并及时响应。
- 关闭所有不需要的网络服务,例如远程登录服务(如SSH),除非你需要从公网远程登录。
- 配置防火墙规则以限制访问特定服务和端口,只允许信任的IP地址或网络访问敏感服务。
- 确保所有账户使用强密码,并定期更换密码。
SSH连接
自定义端口并设置较强密码,因为如果旁路由被入侵,内网安全将不复存在。
DDNS
因为现在运营商分配的都是动态公网,为了保证我们能够时刻通过外网访问,我们需要绑定域名。不同系统所带软件包可能不同。故此次采用脚本实现DDNS公网IP到域名。
1 |
|
要获取 Cloudflare API所需的 <zone_id>, <record_id>, <api_key>,
-
登录Cloudflare账户:
- 首先,登录到Cloudflare账户。
-
获取<your_domain>:
- 这个是你在Cloudflare上已经注册的域名。只需查看Cloudflare dashboard即可找到。
-
获取<api_key>:
- 在Cloudflare dashboard中,导航到 “My Profile” 或 “账户配置文件” 页面。
- 在 “API Tokens” 栏目下找到 “Global API Key”。
- 点击 “View” 来查看你的API Key喵,可能需要输入密码。
- 复制这个API Key,这就是你需要用的<api_key>。
-
获取<zone_id>域名标识符:
- <zone_id>是你的域名在Cloudflare上的一个唯一标识符。
- 在Cloudflare dashboard中选择你的域名。
- 在域名概览页面的右下角,你应该能看到Zone ID。
- 复制这个Zone ID,这就是<zone_id>。
-
获取<record_id>解析记录标识符:
- <record_id>是特定DNS记录的唯一标识符。
- 在Cloudflare dashboard中,导航到你的域名的"DNS"页面。
- 如果你已经有了你想更新的A记录,点击对应记录的"编辑"按钮。
- 通常,记录ID不会直接显示,你可能需要通过API调用来获取。
- 使用 Cloudflare API 以GET方式请求所有DNS记录,然后从中找到对应的记录和它的ID,API调用的形式如下:
curl -X GET “https://api.cloudflare.com/client/v4/zones/<zone_id>/dns_records?type=A&name=<your_subdomain.your_domain>”
-H “Content-Type:application/json”
-H “X-Auth-Email:”
-H “X-Auth-Key:<api_key>” - 在返回的数据中找到所需A记录的<record_id>。
例如要获取<record_id>,则可以新建一个解析。
可以使用Apifox或Postman获取 <record_id>
-
打开Apifox或Postman:
-
创建一个新请求:
-
设置请求类型为GET。
-
请求地址(URL)设置为Cloudflare API的DNS记录列出接口,格式如下:
https://api.cloudflare.com/client/v4/zones/<zone_id>/dns_records确保将 <zone_id> 替换为你域名的Zone ID。
-
-
添加请求头:
- 需要两个头(Headers)字段:
- X-Auth-Email: 填入你的Cloudflare账户的邮箱地址。
- X-Auth-Key: 填入你的Cloudflare Global API Key。
- Content-Type 头为 application/json
- 需要两个头(Headers)字段:
-
发送请求:
- 点击“发送”(Send)按钮发送请求。
- 这会获取到你在Cloudflare Zone下所有的DNS记录。
-
查找特定DNS记录:
- 新建的记录即为第一个。
- 查看返回的数据(响应体)。
- 在JSON响应中找到你想更新的记录的条目。这通常是一个A记录,具体取决于你想要更新的子域(例如example.your_domain.com)。
- 在这个记录的具体条目中找到
id
字段。这个id
就是你要找的DNS记录的 <record_id> 。
-
记录 <record_id>:
- 复制这个
id
值,并且在你的DDNS脚本或相关设置中使用它来更新DNS记录。
- 复制这个
将脚本对应内容填好后可测试一下是否正常。然后就可以上传至openWRT并设置定时任务。
上传或者写入
1 | cd /etc |
进入openWRT设置计划任务
1 | */5 * * * * sh /etc/ddns/ddns.sh |
这个计划任务(cron job)的设置意味着每5分钟执行一次指定的脚本 /etc/ddns/ddns.sh
1 | logread | grep cron |
最后检测有关cron计划任务的日志,即可看到是否成功运行。
名词解释
- 路由:将数据从源地址传输到目的地址的行为。可以看出,这个行为抽象涵盖了两个动作,一是找到地址、二是转发数据。可以类比为网购时快递公司将商品从卖家发送给买家的过程。
- 路由表:可以简单理解为路由过程中的地址关联信息的合集,也就是现实中发货地址和收货地址的映射关系。
- 路由器:本文中指家用的、具备路由功能的实体网络设备,其本身并不一定需要真的承担或只承担路由功能,可以抽象理解为就是一台普通的电脑或服务器。当然,它也可以是一个容器实例、一个虚拟机。对应到现实中就是快递公司。
- 接口:这里特指网络接口,指两个网络设备或协议层的连接点。现实中连接路由器时,wan/lan 不同的网线插槽其实就可以理解为接口。只不过接口并不一定是物理实体,所以我们才会在 OpenWrt 的接口设置里看到甚至新增许多物理设备上所没有的接口。
- 网关:这里特指网络中的网关,负责执行数据转发的某个抽象设备。这里可能容易与路由器的功能混淆,毕竟路由器如果用来做路由似乎也是在做转发的工作。实际上这是由于术语的历史使用缺少规范导致的边界不够清晰,可以粗略理解为承担路由功能的路由器就是网关,但网关不一定是只能由路由器担任。
- IP:本身指 IP 协议,本文为方便也可能将其作为 IP 地址的简称,且默认为 IPv4 。本节所有的名词其实都是基于 IP 协议运作的,而 IP 地址即上文各类「地址」的实际值。可以理解为你用于发送和接收快递的门牌号。
- DHCP:IP 地址的管理和分配协议,本文中不单单指协议本身,还指负责执行该协议的设备。可以理解为给你分配门牌号的物业,只不过这个门牌号是动态变化的。
- DNS:上文说到数据的传输需要源地址和目的地址,而这个地址就是 IP 地址。但由于 IP 地址难以记忆,所以才会有了可以作为 IP 地址别名的域名,而 DNS 就是负责进行域名和 IP 地址映射转换的系统。本文中 DNS 也指代负责运行该系统的设备。
- NAT:出于各种考虑,局域网与因特网的 IP 地址是隔离的,NAT 可以理解为内外网 IP 地址转换的流程。类比网购,相当于快递公司把快递送到附近快递站,快递站的快递员再把货物送到你家门口的流程。
- SNAT:NAT 的一种,本质上是在修改网络包的源地址,目的是可以强制网络包返回时经过期望的地址。可以理解为支付宝的作用,即钱虽然表面上是点对点转账的,但经过支付宝后,支付宝就要求相关转账信息的回执必须由它中转一次再告知转账发起人。
图来自一文带你搞懂旁路由的原理与配置 - 奇妙的 Linux 世界 (hi-linux.com)侵权删。
插件
- 使用交叉编译环境
你可以在一台性能更强的计算机上为你的路由器交叉编译软件。以下是基本步骤:
-
安装交叉编译工具链:
- 在你的计算机上安装 OpenWRT 的交叉编译工具链。这通常包括一个针对你路由器架构的 GCC 编译器。
-
获取源代码:将
luci-app-pushbot
的源代码克隆到你的计算机上:1
git clone https://github.com/zzsj0928/luci-app-pushbot.git
-
配置编译环境:进入源代码目录,并使用交叉编译工具链配置编译环境:
1
2cd luci-app-pushbot
make menuconfig -
编译软件:使用交叉编译工具链编译软件:
1
make
-
传输文件:
- 将编译生成的文件(通常是
.ipk
文件)传输到你的路由器上。
- 将编译生成的文件(通常是
-
安装软件:在路由器上使用
opkg
命令安装传输过来的.ipk
文件:1
2opkg update
opkg install /path/to/your/compiled/package.ipk
Armbian
烧录过程相同
armbian的固件可以从下面的仓库下载hzyitc/armbian-onecloud: Armbian for onecloud. 玩客云用armbian (github.com)
- 一定要选择后面带burn的固件
- 使用的固件Armbian-unofficial_24.5.0-trunk_Onecloud_bullseye_current_6.6.21.burn
- 不要使用简化包,会缺少macvlan内核
- 烧录要选择擦除所有
更改时区:由于当前固件默认时区非东八区,需要修改。
1 | # 显示时区 |
更换国内软件源(如果能正常更新软件,可不必换)
1 | #换Debian源 |
1 |
|
安装1panel
由于1panel运维面板可以自动安装docker,无需额外安装。
1 | curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh |
安装docker(没有成功可直接安装docker)
1 | apt install docker.io |
2.安装CasaOS
注意当剩余空间小于4gb时,他会询问是否安装,选1 yes
默认端口是80
1 | curl -fsSL https://get.casaos.io | sudo bash |
安装过程大概要半个小时,具体速度取决于网络情况,等安装好了之后,你就可以在浏览器里输入之前的ip地址,然后创建casaos的账号和密码,创建好了之后,你就进入到了casaos了
可以在应用商店里添加额外软件源
1 | #树莓派2、玩客云等 armv7 设备专用源 |
OpenWrt
安装openwrt大多教程都是直接拉去现成的镜像,那些镜像大多要么无法更新软件包,要么插件版本很低或者无法运行什么的。
不过这里还是推荐几个镜像
1 | jyhking/onecloud:1.1 |
正式开始的教程
1)打开网卡混杂模式
1 | ip link set eth0 promisc on |
ip link set eth0 promisc on
命令将 eth0
网络接口设置为混杂模式(promiscuous mode)。在混杂模式下,网络接口会接收所有经过它的网络流量,而不仅仅是发往它的流量。这通常用于网络监控和分析工具,例如网络嗅探器。
2)创建OpenWrt网络(自行替换网段,网关)
1 | docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 macnet |
docker network create
命令创建了一个新的 Docker 网络,使用了 macvlan
驱动。macvlan
网络允许您将容器连接到物理网络,就像它们是网络上的独立主机一样。您为这个网络指定了以下参数:
-d macvlan
:指定网络驱动为macvlan
。--subnet=192.168.1.0/24
:指定网络的子网掩码为192.168.1.0/24
。--gateway=192.168.1.1
:指定网络的网关地址为192.168.1.1
。-o parent=eth0
:指定父接口为eth0
,这是混杂模式下配置的物理网络接口。macnet
:是新创建的 Docker 网络的名称。- 确保您选择的子网地址没有被路由器、交换机或其他网络设备使用。如果网关地址已被占用,容器将无法正常通信。
1 | 当您创建一个用于 OpenWrt 的 Docker 网络时,您实际上是在为 OpenWrt 容器创建一个虚拟子网。这个虚拟子网允许 OpenWrt 容器像一个独立的网络设备一样工作,拥有自己的 IP 地址和网络配置。 |
执行这些命令后,Docker 会返回一个网络 ID(例如 92d33e4340e7acfb38b78009ac98100b9847a98a7744fd33bea3873bc22738ae
),您可以使用这个 ID 来引用这个网络或进一步配置。
3)下载镜像包至root
1 | wget https://dl.openwrt.ai/releases/targets/meson/meson8b/openwrt-02.01.2024-meson-meson8b-thunder-onecloud-rootfs.tar.gz |
(这是使用openwrt.ai的固件,如果想用最新版,可以自行替换链接,截止到今日为止,最新版本是2024年3月30号的,也可以自行在官网上下载好上传到root目录)
(提示,如果想直接定制固件,可以赞助作者,当然,下载默认固件也可以自己通过软件包安装)
[注意,2024年3月30号的固件使用之后,会导致宿主机无限重启,只能重新刷机,原因未知]
4)生成镜像
1 | docker import openwrt-02.01.2024-meson-meson8b-thunder-onecloud-rootfs.tar.gz onecloud/openwrt |
5)安装并启动容器
1 | docker run --restart always --name openwrt -d --network macnet --privileged onecloud/openwrt /sbin/init |
启动后可能遇到docker卡住的问题,断电重启即可。
ip冲突可重设容器ip
1 | docker stop openwrt &&docker rm openwrt &&docker run --restart always --name openwrt -d --network macnet --ip 192.168.1.30 --privileged openwrtback:20240902 /sbin/init |
6)修改默认IP
①直接通过终端修改
1 | #进入容器 |
[此固件默认IP为10.0.0.1 ]
- 若设置为与当前网络同一网段,可直接访问设置的ipaddr,若不同网段可更改电脑网段再访问
- 默认为设置的openwrt ip地址+80端口
- 账号密码都为root
初始配置:
完成配置:
检查网络接口的状态:
1 | ifstatus lan |
查看路由表,确保网关和DNS正确配置:
1 | route |
使用ping
命令测试网络连接:
1 | ping -c 4 8.8.8.8 # 测试到Google DNS的连接 |
以下是dokcer 修改的一些命令 以防参数设置错误
查看所有容器
docker ps -a
设置不自动启动
docker container update --restart=no [容器ID]
停止容器
docker stop [容器ID]
删除容器
docker rm [容器ID]查看所有镜像
docker images
镜像docker rmi [镜像ID]
重要操作前备份:
1 | docker commit openwrt openwrt_back:tag |
配置UFW防火墙
1、更新软件包
1 | sudo apt update |
2、安装 UFW
1 | sudo apt install ufw |
3、如果你在远程位置连接你的服务器,在启用 UFW 防火墙之前,你必须显式允许进来的 SSH 连接。否则,你将永远都无法连接到机器上。
1 | sudo ufw allow 22/tcp |
如果 SSH 运行在非标准端口,你需要将上述命令中的 22 端口替换为对应的 SSH 端口。
4、放开 1Panel 系统端口。
1 | sudo ufw allow ****/tcp |
上述命令中的 **** 端口需要替换为安装 1Panel 系统时自定义的端口。
5、启动 UFW
1 | sudo ufw enable |
之后便可以用1panel可视化管理防火墙。