在 OpenWrt 上配置 Nginx 实现公网 https 访问管理后台
前言
发现目前 iStoreOs 用的固件内核版本是 5.x (OpenWrt 版本 22.x),而且,防火墙不支持 IPv4 的端口转发( 找到了一个可以在线编译 openwrt 固件的网站,尝鲜新一点的内核和一些功能:
正好有 R2S 的编译选项,不仅可以选择自己需要编译的插件(常用的,dddd),而且固件采用的是较新的6.6.75 内核分支,于是刷了一个尝鲜
固件编译选好了需要的软件包,以及默认开启 ipv6 后 我选了 Nginx 作为后台的服务,为了以后反向代理一些内网服务的便利 很省心~
准备工作
编译很快,1~2 分钟就编译好了,用 rufus 刷写固件到 SDK 中,插入 R2S 启动! 网络的拓扑还是没有改变如下所示
有了之前的开启 IPv6 的经验,完成了下面的四步走:
- OpenWrt开启IPv6
- DDNS-GO配置好动态域名
- ACME申请https证书
- 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 ?!!
一开始以为是防火墙的问题,检查了几遍,确认没有问题,如下所示:
解决办法
查了一些资料和论坛,还有 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
系统上运行,这些系统具有本地安装的封包控制系统或防火墙的界面,例如Iptables
或TCP Wrapper
工具等。需要注意的是Fail2Ban
能够降低错误认证尝试的速度,但是它不能消除弱认证带来的风险,而只是服务器防止暴力攻击的安全手段之一。
参考
常见的 Ipv6 的网段地地址
地址段 | 地区 |
---|---|
240e::/20: | 中国电信 |
2409:8000::/20: | 中国移动 |
2408:8000::/20: | 中国联通 |
2400::/12: | 亚太地区常用 |
2600::/12: | 北美地区常用 |