在 OpenWrt 上配置 Nginx 实现公网 https 访问管理后台

前言

发现目前 iStoreOs 用的固件内核版本是 5.x (OpenWrt 版本 22.x),而且,防火墙不支持 IPv4 的端口转发( 找到了一个可以在线编译 openwrt 固件的网站,尝鲜新一点的内核和一些功能:

Kwrt【OpenWrt】软路由固件下载与在线定制编译

正好有 R2S 的编译选项,不仅可以选择自己需要编译的插件(常用的,dddd),而且固件采用的是较新的6.6.75 内核分支,于是刷了一个尝鲜

Kwrt网站截图

固件编译选好了需要的软件包,以及默认开启 ipv6 后 我选了 Nginx 作为后台的服务,为了以后反向代理一些内网服务的便利 很省心~

准备工作

编译很快,1~2 分钟就编译好了,用 rufus 刷写固件到 SDK 中,插入 R2S 启动! 网络的拓扑还是没有改变如下所示

网络拓扑

有了之前的开启 IPv6 的经验,完成了下面的四步走:

  1. OpenWrt开启IPv6
  2. DDNS-GO配置好动态域名
  3. ACME申请https证书
  4. Nginx配置修改ACME生成证书路径

前三步没有遇到什么问题,来到第四步,需要注意配置方法如下 首先用 uci 命令,检查一下 Nginx 配置信息:

UCI(Unified Configuration Interface,统一配置接口)是 OpenWrt 系统中用于管理设备配置的核心工具和框架。它通过标准化的方式统一管理系统中的各种配置(如网络、防火墙、无线等),简化了配置文件的修改和管理流程。UCI 的设计目标是提供一种简单、一致的接口,使用户和开发者无需直接编辑复杂的配置文件,而是通过命令行工具或 API 进行配置。

因为没有 nginx 的管理入口,所以接下大部分的内容,都是通过命令行来完成

查看和默认证书和密钥路径相关的配置

# 查看 nginx 所有的配置信息
uci show nginx
# 或者直接查看 _lan 相关的配置
uci show nginx._lan
# 输出
……skip……
nginx._lan.uci_manage_ssl='self-signed' # 自动管理自签名证书(关键修改项)
nginx._lan.ssl_certificate='/etc/nginx/conf.d/_lan.crt' # 自签证书
nginx._lan.ssl_certificate_key='/etc/nginx/conf.d/_lan.key' # 自签密钥
……skip……

自签名证书不是我需要的,我需要把 ACME 申请的证书和私钥文件路径,和 Nginx 默认读取的证书和密钥文件,进行软连接

Nginx 配置证书这里,先把默认生成的自签名证书 _lan.crt_lan.key 重命名为 _lan.crt.bak_lan.key.bak(也可以删除,删除前建议保留,我习惯改名字备份)

ACME 生成的证书路径,可以通过 ACME 的插件来查看

证书密钥路径查看

# 备份原来的自签名证书和密钥文件
mv _lan.crt _lan.crt.bak
mv _lan.key _lan.key.bak

# 注意!ACME 的路径需要根据自己的证书所在路径修改,不可照搬
# 软链接证书和密钥文件
ln -sf /etc/ssl/acme/你的域名.fullchain.crt /etc/nginx/conf.d/_lan.crt
# 软链接私钥文件
ln -sf /etc/ssl/acme/你的域名.key /etc/nginx/conf.d/_lan.key

接着,通过 uci 命令删除 nginx 的相关配置,取消 自动管理自签名证书 这一项

# uci 命令删除 `自动管理自签名证书`
uci delete nginx._lan.uci_manage_ssl
# 或者取消,命令如下
uci set nginx._lan.uci_manage_ssl='none'
# 提交更改
uci commit nginx

重启 Nginx

/etc/init.d/nginx reload

不出意外,还是出意外了

遇到的问题

打开测试 ipv6 tcping 的站点,正常 Ping 通我的域名,但是手机打开网站后傻眼了

403 Forbidden ?!! 403 Forbidden

一开始以为是防火墙的问题,检查了几遍,确认没有问题,如下所示: 防火墙配置信息

解决办法

查了一些资料和论坛,还有 Ai,定位到问题应该是在 Nginx 这边,对于网段的放行规则文件造成的

防火墙我不打算直接放开,为了安全考虑,所以防火墙只进行了上面的端口转发配置

解决办法也挺简单,修改 Nginx 配置文件 /etc/nginx/restrict_locally 文件,这里配置了允许访问的网段信息,内容如下所示

        allow ::1;
        allow 2400::/12;
        allow fc00::/7;
        allow fec0::/10;
        allow fe80::/10;
        allow 127.0.0.0/8;
        allow 10.0.0.0/8;
        allow 172.16.0.0/12;
        allow 192.168.0.0/16;
        allow 169.254.0.0/16;
        deny all;

第二行的 allow 2400::/12; 地址,是我新增的,意思是允许 亚太地区 的 IPv6 网段访问 保存退出,运行 :

/etc/init.d/nginx reload

成功!终于能够通过公网 ipv6 走 Nginx 访问到路由器的后台了~

碎碎念

周末半天又花在这儿了

AI 还提了一个建议,建议安装一个防止恶意扫描暴力登录,可以用来自动封锁恶意 IP 的程序 搜索了一下软件库,安装一下,试试能不能检测到一些恶意的请求

Fail2Ban 是一个入侵检测系统框架,它可以保护电脑服务器免受蛮力攻击。以 Python 程式设计语言编写,并能够在类 Unix 系统上运行,这些系统具有本地安装的封包控制系统或防火墙的界面,例如 IptablesTCP Wrapper 工具等。需要注意的是 Fail2Ban 能够降低错误认证尝试的速度,但是它不能消除弱认证带来的风险,而只是服务器防止暴力攻击的安全手段之一。

fail2ban

参考

常见的 Ipv6 的网段地地址

地址段地区
240e::/20:中国电信
2409:8000::/20:中国移动
2408:8000::/20:中国联通
2400::/12:亚太地区常用
2600::/12:北美地区常用
  1. x86 openwrt 公网 https 无法访问报错 403 Forbidden 【nginx】
  2. kwrt 在线编译 OpenWrt 固件
  3. 使用Fail2Ban防火墙工具