如今是 https 大行其道的年代,如果哪个服务还停留在 http 无异于luo奔。路由器亦是如此,当然一般情况下我们的路由器仅限于内网访问,此时 http 尚可。但是有些时候我们需要通过远程来访问路由器进行一些管理,这时如果还是走 http 的话就说不过去了。相信在信息化建设的今天应该绝大部分宽带用户都已经接入了 ipv6 网络(光猫或者路由没开启的不算),没有公网 ipv4 地址也不会影响我们实现远程访问。

飞尘用的是神机 K2P,刷的是自己编译的 padavan 固件,实现了一些好用的功能,此处省略一万字。。。

跑远了,先说下编译时有个选项应该要开启,个人没有试过不开有没有影响,如果哪位知道还请指正。

1
2
### Include HTTPS support. openssl ~1.2MB
CONFIG_FIRMWARE_INCLUDE_HTTPS=y

免费证书自然是从响当当的 Let’s Encrypt 获取了,不过不是直接的,而是借助 acme.sh 脚本来申请并自动更新。

可以到 acme 官方下载全套的脚本,体积略大,路由器空间够可以忽略,我个人搬运了一份删减版,因为我使用的 cloudflare 做解析,所以只保留了主脚本和 cloudflare 的 DNS API 脚本。如果你用其它的域名服务商,也可以参考。

将脚本所在文件夹整体上传到路由器

1
scp -r acme router:/tmp

然后 ssh 登录到路由器进行操作,xxx 要替换为实际的值(在 cloudflare 里获取), abc.com 替换为你要用的域名,reload.sh 的作用是更新证书后重启 httpd 服务

1
2
3
4
5
6
7
8
9
/tmp/acme/acme.sh --install --home /etc/storage/acme
mv /tmp/acme/reload.sh /etc/storage/acme
export CF_Token=xxx
export CF_Account_ID=xxx
export CF_Zone_ID=xxx
/etc/storage/acme/acme.sh --home /etc/storage/acme --set-default-ca --server letsencrypt
/etc/storage/acme/acme.sh --home /etc/storage/acme --issue --dns dns_cf --dnssleep 30 -d abc.com --keylength ec-256
/etc/storage/acme/acme.sh --home /etc/storage/acme --ecc --installcert -d abc.com --keypath /etc/uhttpd.key --fullchainpath /etc/uhttpd.crt --reloadcmd "/etc/storage/acme/reload.sh"
rm -rf /tmp/acme

正常的话证书就已经安装配置好了,这时可以通过局域网 ip 的方式访问路由,比如

1
https://192.168.1.1/

但是会遇到证书无效的问题,因为我们应该用域名来访问简单的做法是修改电脑的 hosts 文件,添加域名到路由器 ip 映射,浏览器可能会提示重定向。更好一点配置下路由器的 dnsmasq 即可

1
2
# 内部网络(LAN) -> DHCP服务器 -> 自定义配置文件 "dnsmasq.conf"
address=/abc.com/192.168.1.1

这时浏览器打开域名,就可以在 https 的保护下安全访问了

1
https://abc.com/

内网访问解决了,接下来需要实现公网访问,有两点:域名解析和配置防火墙

新建 ddns.sh 脚本

1
vi /etc/storage/ddns.sh

内容需根据自身情况修改

  • abc.com - 域名
  • Address 1: 2409 - 先查询一下获取到到 ipv6 第一段,运营商不同会有不同
  • Zone_ID
  • RECORD_ID - 先在 cloudflare 添加一条 AAAA 记录,再修改,看网络请求取得
  • TOKEN - 从 cloudflare 获取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh

sleep 5

current=$(nslookup abc.com 223.5.5.5 | grep "Address 1: 2409" | awk '{print $3}')

my=$(ip addr show ppp0 | grep inet6 | grep "temporary dynamic" | sed 's/\/.*//g' | awk '{print $2}')

if [ "$current" != "$my" ];then
curl -k -X PUT "https://api.cloudflare.com/client/v4/zones/Zone_ID/dns_records/RECORD_ID" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
--data '{"type":"AAAA","name":"abc.com","content":"'"$my"'","ttl":1,"proxied":false}'
fi

为脚本添加执行权限,本地可以先执行一下检查是否工作正常,看 cloudflare 返回结果有提示 success 就ok,不放心去 cloudflare 看下是记录否更新

1
chmod +x /etc/storage/ddns.sh

配置服务,自动更新 ip

1
2
# 系统管理 - 服务: 调度任务 (Crontab) 添加
*/30 * * * * /etc/storage/ddns.sh > /dev/null

添加防火墙规则,新建 iptables.sh 脚本

1
vi /etc/storage/iptables.sh

写入规则

1
2
3
# allow ipv6 connect
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
ip6tables -A OUTPUT -p tcp --sport 443 -j ACCEPT

配置启动脚本,自动应用防火墙规则

1
2
# 参数设置 - 脚本 - 在防火墙规则启动后执行:
/etc/storage/iptables.sh

等待一会域名生效后,可以用手机通过数据网络访问域名试试看,记得要 https 开头哦。