家用宽带的IPv6配置

 

记录下自家宽带IPv6的配置过程,介绍家庭网关,OpenWrt路由器及防火墙的配置方法、IPv6的一些应用还有DDNS,LuCI的HTTPS访问

记录下自家宽带IPv6的配置过程,介绍家庭网关,OpenWrt路由器及防火墙的配置方法、IPv6的一些应用还有DDNS,LuCI的HTTPS访问

不枉我每次回家都要检查宽带是否能接入IPv6,在2019年的暑假的一番倒腾下,终于家里也可以用IPv6了,之前一直在教育网(CERNET2)IPv6环境中,也熟悉了一些配置和使用方法,但是终究没有体验到IPv6的很多特性:

  • ISP向本地路由分配PD地址
  • 本地路由向下级设备分配公网IPv6地址
  • 本地路由可以对IPv6防火墙做相对全面的管理

现状

就现在的情况而言,首先就是大量的路由器本身就不支持IPv6,尽管工信部于4月发文《关于开展2019年IPv6网络就绪专项行动的通知》,但路由器厂商并没有多少动静,据我所知:

  • 华硕网件,linksys之类的高端路由器很早就支持IPv6了
  • 华为和TPlink,小米的部分路由器又陆续有固件的推送,也实现了原生IPv6的支持
  • 部分路由器可以通过刷机等方式获得IPv6支持

在网络运营商一侧,即光线入户到家庭网关(俗称光猫,做调制解调器),也有两种情况

  • 部分地区的运营商还没有向家庭网关推送IPv6的配置,进而导致无法接入IPv6网络
  • 运营商一侧已经提供了可用的IPv6网络,仅仅是没有推送配置的话,是可以自己动手设置下

另外现在新开通的宽带附带的调制解调器与路由器一体的家庭网关普遍可以不用路由器也实现IPv6的接入,主要就是使用光猫拨号获取IPv6地址,如果考虑到家庭网关的无线性能(一般都不太好),大多数用户会另外购置一台路由器

  • 路由器仅作AP(也就是不开启DHCP),需要路由器支持AP模式
  • 路由器作为DHCP客户端,同时作为向下的DHCP服务器,这需要路由器支持IPv6

更具体一点的信息可以参考工信部下属的单位发布的家庭路由器设备IPv6支持度如何,文中也列出了几款常见的路由器对IPv6配置所需的特性的支持情况

准备工作

因为折腾过三家运营商的宽带,以下都是按照经验来写的,需要些网络常识

判断当前的网络拓扑情况

这一步关系到如何连接到家庭网关,首先是查看当前的直连的路由器的WAN口IP,如果是192开头的IP地址的话那么家庭网关就是拨号设备,那么可以按照WAN口的IP打开家庭网关的界面

如果是10开头的IP地址或者路由器的联网方式是PPPoE的话,那么家庭网关就只充当调制解调器,连接方式的话就相对复杂些:

  • 如果家庭网关开启了无线功能的话,连接该WiFi,按照IP打开管理界面

  • 使用网线直连家庭网关,修改有线网卡IP为手动,并设置到网关的同一网段下,按照IP打开管理界面

调制解调器设置

查看/修改调制解调器的宽带方面的设置,一般是需要以超级用户(管理员)登陆的,用户名和密码可以用路由器的型号到网络上搜索,也可以尝试问运营商客服,这一步人称“光猫破解”或者“光猫改桥接”

2023年之后,通用的管理员密码在部分省区不再适用

试过有效的管理员密码:

移动: 用户名:CMCCAdmin 密码:aDm8H%MdA

电信的:管理用户名:telecomadmin ,密码:admintelecom 或者 nE7jA%5m

联通的稍微复杂些,按照型号找吧

比如家里用过的HG8120C的管理员密码是要开启telnet之后,从系统文件中解密出来的,密码可能适用于湖南联通:账号CUAdmin,密码CUAdmin#HGU (网上见到的大多人密码是CUAdmin,管理员账户需要在路由器IP/cu.html才能被登陆)

参考的教程貌似适用于华为的产品: 破解电信光猫华为HG8120C

对于联通有人还整理了密码 分享一下联通各地HGU光猫默认密码

  • 河北 内蒙古 浙江 cuadmin
  • 重庆 cqunicom
  • 北京 123qweasdzxc
  • 海南 cu@HNunicom
  • 黑龙江 8MCU@HLJ
  • 湖南 CUAdmin#HGU
  • 青海 qhuniadmin
  • 辽宁 lnadmin
  • 河南 江苏 广东 天津 新疆 吉林 福建 宁夏 陕西 山东 山西 上海 CUAdmin

登陆之后到图示选项卡的界面如上,在做进一步的修改之前有个小问题需要留意,就是宽带拨号的账号和密码,为了避免之后换路由器导致账号丢失,建议还是记下来,另外为了避免关键的参数丢失,备份下光猫的设置也是必要的

如果弄丢了的话通过运营商的手机APP,用业务预留的手机号可以找回

至于对于查看网页上这种显示*号的密码,可以使用Chrome的检查功能,找到密码所在的位置,修改某处的password为text

界面上需要注意的是IP协议版本和连接模式两项,默认情况下一般是IPv4,连接模式为路由,既然是要添加IPv6支持,协议部分当然要修改为IPv4/IPv6了,而连接模式就要看个人的倾向了

网上的教程大多数都是改的桥接,因为要使用路由器拨号和分配地址来获得更多的自主权

如果是打算使用家庭网关作为IPv6的路由器使用的话就把连接模式设置为路由就好了,可能在地址获取方式上要勾选一个PD(获取IPv6地址前缀),方便路由向下级设备分配地址

之后一般要重启设备,重新连接网络

路由器的设置

如果改了桥接的话,路由器输入宽带拨号的账号和密码,等一段时间或者重启之后就可以连接上网络了,如果路由器本身有IPv6支持,且能看到公网的IPv6地址(下面的WAN IP),那么已经路由器的WAN侧完成了配置

一般情况

下图就是家里的一台华为路由器成功接入IPv6网络的情况,可以看到前缀(IPv6-PD)最后有个/60(实践证明前缀小于等于64都是可以的),这意味着路由器拿到了地址段(IPv6 PD),可以向下级设备分配公网地址(LAN侧)

另外,如果是官方版本的OpenWrt的话,默认设置拨号之后的网络状态如下图,下级设备就可以使用IPv6了(原生比起教育网简直方便太多)

这里还是要提一下,如果是已经安装过一些软件的OpenWrt的话(包括部分非官方编译的版本),可能会受到一些软件的干扰导致IPv6无法正常使用,最常见的就是默认设置下的多拨软件mwan3,测试IPv6是否可用时最好在启动项中将其关闭

之后可以用下级设备打开IPv6测试检查是否成功接入,以及使用东北大学网络测速测试IPv6的上下行的速度如何

特殊情况

相信大多数人通过前面简单的设置就可以接入IPv6网络了,但是在网络上提问的一些情况我也遇到过,这里可以简单的总结下,需要说明的是,不同的情况往往对应不同的方法,解决问题是需要一定的网络基础去判断和处理的

如果感兴趣可以参考博客另外的两篇文章,对 IPv6基础,接入认证,路由器上的转发 有一个较为全面的分析:

下面由易到难的列出几种情况:

64位PD

这是最晚才发现的奇葩情况,实际处理和上面一般情况是一致的,默认设置即可;尽管没有少于64位,但依旧是原生,这刷新了之前的认识

无PD

这种情况相对来说比较难分析,因为上级认证方式未知,只能通过设置来猜测,家用宽带(包括移动运营商)一般采用的是SLAAC,即通过NDP消息完成IPv6配置,如果只用NDP自然就没有PD了

  • SLAAC + 前64位认证,常见于移动运营商,通过观察手机的IPv6地址推测,每次连接上的地址前64位都不同,同时在部分宽带也存在
  • 华为的路由器无线桥接手机的热点可以向下级设备分配地址
  • OpenWrt路由器的IPv6设置需要设置为中继模式

  • SLAAC + 128位认证,这个就是“万恶”的校园网了,家用宽带应该是遇不到的(遇到了可以投诉了)
    • 华为的路由器的IPv6无法向下分配
    • OpenWrt主要就是用IPv6 NAT

另外还存在使用DHCPv6的情况,如校园网和IPv6二级路由,中继或者放行DHCPv6即可

应用方面

IPv6最直接的应用在于公网地址和接入IPv6网络的资源

  • 设备能够获得全局的IPv6地址,免去外网访问内网设备时需要的端口转发,内网穿透之类的繁杂操作,轻松搭建服务器

就在我设置完成家庭网关和路由器之后,发现下级设备的端口并无法从外网访问,比如说使用手机的iperf3客户端无法连接PC上的iperf3服务器

  • 方便设备之间的点对点连接,尤其是对使用PT的用户而言

PT经常需要打开防火墙的端口便于通信,而普通路由器对IPv6防火墙的方面设定暂时还是空白的,基本上都是默认采取保守的配置,这样一来PT的连接性依然不太好

另外就是上传带宽经过测试,IPv6和IPv4一样是下载/上传的带宽不对等,例如我家的100M的下载对应只有20M的上传,但是使用IPv6做文件传输就不需要经过腾讯或者百度云的服务器,大大节约了资源,具体的工具可以就用UT,可以参考一下: 利用uTorrent在ipv6下传文件

  • 更方便的访问一些资源

除了一些PT限定了使用IPv6访问之外,还是有些不错的资源只能由IPv6访问的,比如说IPTV:网络电视测试在电信的IPv6下就可以访问

随着现在IPv6的普及,教育的PT站大多数都关闭了运营商IPv6的访问,到目前为止,我接触到的只有北洋园PT的访问是开放的(需要使用教育网邮箱在IPv6网络下注册)

以上基本上都是基于IPv6能够使得设备获得公网IP的,可以感知的应用,但是这里面有个阻碍的因素就是防火墙

防火墙设置

因为设备几乎都暴露在公网上,对安全性的考量使得默认的防火墙策略非常的保守,一般的家用路由的IPv6防火墙默认不可配置,但是考虑到设备的连接性,防火墙需要做必要的取舍

下面主要是介绍下OpenWrt下的IPv6防火墙的配置情况,因为不复杂,所以可以直接在LuCI界面上配置,需要注意的是,这里配置好只能保证在本地路由这一级有效,例如教育网的IPv6在上级路由就是禁止了传入连接,不管本地路由如何配置都无法改变这一点,但是就我家的移动宽带来看,获取PD之后,可以通过设置防火墙实现内网设备的外网访问

内网设备的外网访问

在非官方的OpenWrt的软件中,我发现开启Flow offloading可能会影响到外网访问内网设备(一般包含在luci-app-turboacc中),调试时建议关闭

在OpenWrt的LuCI界面的 Network->Firewall->Traffic Rules 一栏可以看到各种防火墙的规则,可以看到OpenWrt是默认允许外网Ping内网的(Allow-ICMPv6-Forward)

因为是处理传入连接,所以这里只用到了Input链和Forward链,为了方便开关,建议为每个需求单独建一条防火墙规则

对18.06及之前的系统:

  • 在Open ports on router(打开路由器端口)默认添加的是Input链的规则,针对的是路由器本机
  • 在New forward rule(新建转发规则)默认添加的是Forward链的规则,针对的是路由器的下属设备

填好规则名称,点击添加之后才是进一步设置限制条件,设置规则是尽可能只开放需要使用的端口,避免内网设备完全暴露在公网中

IPv6 NAT下的情形

NAT下内网设备就没有公网IP了,所以只能使用端口转发,看起来多此一举,然而某些不易察觉的需求,比如挂PT,还是有一定的影响的,尤其是某一次在PT发了个种,出现了没有上传的情况,所以我在网上搜索了下,找到了篇博客文章:

IPv6 NAT后配置端口转发

主要的代码如下:

ip6tables -t nat -I PREROUTING -p udp --dport 49461 -j DNAT --to [2fff::17c]:49461
ip6tables -t nat -I PREROUTING -p tcp --dport 49461 -j DNAT --to [2fff::17c]:49461
ip6tables -I INPUT -p udp --dport 49461 -j ACCEPT
ip6tables -I INPUT -p tcp --dport 49461 -j ACCEPT

其中49461需要替换为UT的监听端口,最后的IP替换为UT客户端的IP

主路由和二级路由互通

和上面的类似,不同的在于只需要开启Forward的规则就可以了,因为只是一二级路由的互通,所以建议限制下IP段,针对PD会变动的情况,建议使用局域网的IPv6地址:由一级路由分配的ULA地址,另外就是要保证下级路由的路由表的PD条目和主路由对的上

IPv6 DDNS

虽然说IPv6方便了点对点连接,但是普通家庭用户的IP地址(或者PD)依然是经常变化的,比如说重新拨号或者定期的被换IP,所以一个域名和DDNS还是需要的,好在实现成本不高,阿里或腾讯DNSPod第一年几块钱的域名送DDNS;本节最后有介绍免费的dynv6(免费,但是在国内使用出现过DNS污染的现象,会导致莫名其妙的问题),个人认为在IPv6 DDNS方面更好用

为了方便管理,我体验了下阿里云和腾讯云(DNSPod)的域名服务,就解析速度而言,在我所在的教育网和移动下DNSPoD更快,默认提供的服务貌似阿里云更好一些,每次更新有邮件提示。

路由器的DDNS

安装luci-app-ddns之后,选定IPv6就可以使用IPv6 DDNS功能,之后选择相应的供应商(DDNS Service provider)设置就好了,但是没有阿里云和腾讯云,可以找到了Sensec写的[分享]适用于OpenWRT/LEDE自带DDNS功能的阿里云脚本,完美嵌入,尽管有一段时间没有更新了,Github上也有issue说失效了,但是我实测还是可以正常使用的

建议找有人维护的仓库,如在lean的LEDE仓库的package/lean路径下就有阿里云和DNSPod的DDNS脚本:ddns-scripts_aliyun和ddns-scripts_dnspod,如果需要预编译好的IPK文件直接安装的话,可以到Achenwithaheart的LEDE软件源下载(脚本文件无所谓CPU架构)

需要注意的有

  • 在Advance Setting选项卡中选择的IP address source [IPv6]选Interface为获得IPv6地址的接口,如果没有使用IPv6 NAT的话,选Interface为br-lan是相对方便的,一方面是只有一个地址(也就是LAN的IPv6的起始地址),不会泄露信息(对pppoe还好,OpenWrt拨号的mac一般是随机生成的),另外是方便看PD前缀

  • 有关阿里云DDNS的教程是比较多的,DNSPod教程我看到都过期了,在使用DNSPod的DDNS时,有两个供应商可选:dnspod.cn和dnspod.com,查看脚本内容可知二者的API不同,我是国内的解析服务,只能选前者,其中username和password为DNSPod安全设置->账号管理->密钥管理的ID和Token,初次使用需要自行创建

  • 出于安全起见,加密传输是必要的,勾选Use HTTP Secure,即在DDNS供应商通信中开启HTTPS

下级设备的DDNS

除了给本机做DDNS之外,下级设备也有DDNS的需求,有人直接用Hotplug机制和脚本做了OPENWRT在路由器上实现网内各设备的IPV6 ddns(支持阿里云)

按照上面的想法,用luci-app-ddns中的Script自定义需要DDNS的IP的地址,只需要最后的Script的输出是IPv6地址即可

#!/bin/sh
prefix=$(/sbin/ifstatus wan_6 | jsonfilter -e '$["ipv6-prefix"][0]["address"]' | sed 's/.$//' )
suffix=160:f904:caf5:438a
Address=$prefix$suffix
echo $Address

长远一点来看,应对MAC地址随机化,在DDNS的时候固定后缀也就不方便了,所以这里可以通过主机名来确定设备的MAC,进而得到设备的地址

#!/bin/sh
Host_name=MX15
prefix=$(/sbin/ifstatus wan_6 | jsonfilter -e '$["ipv6-prefix"][0]["address"]' | sed 's/.$//' )
MAC=$(cat /tmp/dhcp.leases | grep $Host_name | awk '{print $5}' | sed 's/^...//') 
Address=$(ip -6 neighbor | grep $MAC | grep $prefix | awk 'NR==1{print $1}')
echo $Address

Dynv6的使用

在用了几年的阿里和腾讯的DDNS之后,还是发现域名每年都换不太方便(域名第一年虽然便宜,但是家用的域名续费不划算),域名一换,所有的网站的证书也要换,每年投入的时间成本偏高了,所以切换到免费的Dynv6,申请很简单:注册,在主页上填一个字段和邮件即可获得:填写的字段.dynv6.net的三级域名,比在国内购买的二级域名长一点

Dynv6的IPv6 DDNS的使用逻辑与阿里和腾讯的DDNS服务稍有不同,主要是:

dynv6 combines your MAC addresses or Host IDs with your dynamic IPv6 prefix: 2001:1234::/64 + 00:80:41:ae:fd:7e = 2001:1234::280:41ff:feae:fd7e

它是将前缀和设备的MAC地址组合起来,得到完整的IPv6地址,这么说可能有点抽象,如果对应到家用IPv6场景就是如下操作:

  1. 在路由器上配置DDNS,这里推荐将DDNS服务提供商选择为自定义,填写URL为https://dynv6.com/api/update?hostname=[DOMAIN]&token=[PASSWORD]&ipv6=[IP]/64,在luci-app-ddns中选择的接口为br-lan,这样一来DDNS会向Dynv6更新路由器获取到的IPv6的前缀,填写完key等基本信息后,启动DNS服务

  2. 首次更新成功后应该能在Dynv6网站对应的域名页面看到更新的IPv6前缀,到这一步如果网络和防火墙畅通,已经可以通过域名访问路由器了,接下来可以考虑给下层设备添加解析记录

  3. 在Dynv6的官网添加AAAA解析记录,填写记录名,以及需要域名访问的下层设备的网卡的MAC地址,由于48位mac地址可以被转换成EUI-64的IPv6后缀,这样下层设备的域名的一条IPv6的解析记录就被注册了

  4. 检查解析记录是否能被查询到

    # 检查是否能在本地DNS服务器被查询到
    nslookup YourDomain
    # 检查是否能在DNS污染相对较少的DNS服务器查询到
    nslookup YourDomain 223.5.5.5
    # 应该是生效最快的DNS服务器
    nslookup YourDomain ns1.dynv6.com
    

优缺点

优点:

  • 路由器上只需要运行一个DDNS更新的服务,随设备的增多,只需要在官网增加MAC地址,配置量几乎不变

缺点:

  • DNS污染问题,这个是最影响使用的,解决办法因为要针对所有需要访问域名的终端设备设置DNS服务器/DNS转发,成本较高
  • MAC地址

域名访问使用HTTPS加密

既然在外网使用的域名访问,还是开启HTTPS会相对安全(想象下未加密访问LuCI时,路由器的密码明文在网路上传输是有多危险)

部分域名商如阿里云和DNSPod会提供域名的免费证书,想要省事的话可以去尝试(DNSPod可以申请并下载到一年有效期的单域名证书)

这里分别介绍:

  • OpenWrt的LuCI下申请域名证书与开启HTTPS访问
  • 命令行下Let’s encrypt的单一域名证书(60天)和通配符证书(90天)申请的方法
  • acme.sh与cerbot两种命令行工具申请证书

luci-app-acme申请证书

使用luci-app-acme的主要优点:

  • 免去在命令行模式下操作
  • 能够用定时任务完成证书的自动更新
  • 能自动配置好LuCI即uhttpd的证书(至少源码这么写的)
  • 可以申请通配符证书的,甚至可以一次申请多个
  • 使用添加DNS解析记录的方式对域名归属认证,和上面的DDNS差不多

没有看到相关的教程,之前我一直没搞清楚怎么用,后来发现是LuCI设置的一个普遍问题,即list需要在设置完成后再新建,最后才能保存应用

准备工作

  • luci-app-acme:LuCI界面,使用的是acme.sh自动dns模式(acme应用作为依赖被安装)
  • acme-dnsapi:dns的API函数库,支持阿里云ddns以及DNSPod
  • luci-app-uhttpd:LuCI使用的web服务器uhttpd的app
  • luci-ssl-openssl:用的openssl作为luci加密访问的后端,可选luci-ssl
  • 根据后面的ACME如何使用DNS API,如阿里云,在阿里云AK控制台添加一套Secret key(需要手机验证码)

如果是自编译的话,acme-dnsapi不是依赖,记得单独选下

另外安装luci-app-acme之后会添加计划任务,执行每天一次的检查(证书只有到有效期前一个月才能更新,除非强制),如果是初次使用计划任务的话,记得在LuCI的 系统 -> 启动项 界面重启下cron,否则不会自动运行

配置

细节参考acme.sh/wiki/dnsapi,在LuCI上需要配置的主要是以下部分:

  • 输入用于申请证书的邮箱地址(如果是敏感的域名的话,建议隐藏自己的私人邮箱)
  • 在Domain部分,假如你拥有github.io的域名,可以填写*.github.io申请通配符证书(不懂的话建议了解下域名与子域名)
  • DNS API部分,如果用的阿里云填写dns_ali,DNSPod填写dns_dp(这是dnspod.cn,如果是dnspod.com的话写dns_dpi)
  • 在Credentials填写环境变量格式的Key和Secret,如阿里云域名是一项填写Ali_Key='XXXXX',新增一项填写Ali_Secret='XXXXX'

另外以上两个都是list,也就是本节开始提到坑:需要多添加一个空项目才能成功保存;省事的话,可以直接勾选Use for uhttpd,免去之后配置证书(但是端口还是要自己开的,见后文)

之后保存并应用就可以去LuCI的 状态 -> 系统日志 搜索acme(对应命令行的logread命令的输出),查看进度,如果没看到相关的输出,可以尝试在命令行手动重启acme:service acme restart

acme生成证书一般来说有以下几步,可以依此来检查哪一步出现了错误:

  1. 生成私钥;使用自动dns方式,向dns服务商请求新增一条特殊的解析记录
  2. 反复查询该解析记录,直到解析记录生效,即证明该域名归属
  3. 生成证书,保存于指定目录(默认/etc/acme),应用证书到uhttpd(如果勾选了的话)

使用acme.sh申请的证书文件有:

  • 两个信息体为base64编码的:域名的key和证书cer
  • 有证书请求文件csr,两个config文件,ca.cer
  • 包含ca.cer和域名证书的fullchain.cer

开启HTTPS访问

uhttpd监听

LuCI的话可以安装luci-app-uhttpd,在网页端配置监听端口

需要说明的是:

  • 对浏览器而言,默认HTTPS网页访问的是443端口,如果443端口被运营商封了的话就换一个
  • [::]和0.0.0.0分别是IPv6和IPv4的本网络中的所有主机,配置服务器端口经常用到

安装证书

如果要手动安装证书的话,需要在luci-app-uhttpd填上证书和key的路径,也就是HTTPS Certificate和HTTPS Private Key ,后面还跟一个(DER Encoded),实际上面acme申请的证书也没问题,luci-app-acme自动设置是fullchain.cer和key

在acme.sh官方教程使用 域名.cer 文件作为证书与luci-app-acme有点不一样,参考附录的证书格式说明,对Let’s Encrypt这样中型证书机构来说,应该要用包含了机构证书的fullchain.cer

对于acme自动三个月申请一次的通配符证书不太方便的问题,~~DNSPod可以免费申请单个域名一年有效期的证书~~(2024年4月后已经无法申请到免费的1年期的证书)

放行端口

依然在 Network->Firewall->Traffic Rules 中设置,参考上面的防火墙设置,放行必要的端口即可

需要注意的是此时再使用IP直接进行访问时,会提示不安全

  • 在可以HTTPS访问时使用HTTP访问提示不安全是浏览器的一种安全策略,而证书依赖于域名(此时是不是HTTPS访问就不清楚了)
  • 内网也完全可以使用域名进行访问(在有网络的前提下,解析到公网IP)
  • 可选添加本地DNS解析,即修改OpenWrt路由器的Hosts:/etc/host,添加一条内网IP到域名的解析记录

另外,需要特别说明的是,部分浏览器如Chrome,默认状态下访问LuCI时,会先访问HTTP再重定向至HTTPS,故需要同时开放80和443端口,详见后文可能的问题的“拒绝了我们的连接请求”

做完这一步应该就可以用域名访问了

可能的问题

这一段就是遇到什么写什么:

拒绝了我们的连接请求

源于Chrome的报错:

拒绝了我们的连接请求。

请试试以下办法: 检查网络连接 检查代理服务器和防火墙 被运营商封掉了80或者443端口

直接想到的一种情况就是运营商封了80,443端口,还好我这里的移动宽带没有这个问题,一般改端口即可,或者使用端口转发,如群晖NAS默认HTTP端口就是5000,一般也是建议使用不常用的端口,高位端口好一点

这里主要说明另外一种情况:缘起于我收紧了防火墙设置,只开放了443端口,导致Chrome访问时有报错,但是Safari是正常的,发现,Chrome默认访问的居然是HTTP而非HTTPS,导致如果想要访问LuCI就需要指定HTTPS协议,80和443端口同时开放时就没有这个问题,于是我就查了下这个问题,找到了为什么我们说关闭Port80不利于安全?,其中提到

保持80端口开放的主要原因之一是要继续将通信从HTTP重定向至HTTPS

也就是说HTTP的80端口主要用于重定向,我做了一个简单的实验,模拟80或者443端口不能使用的情景:

  • HTTP监听8080,防火墙只开放8080和443,Chrome使用8080访问,之后重定向至域名的HTTPS
  • HTTPS监听8443,HTTP监听8080,Chrome使用8080访问,访问的是HTTP域名的8080

以上均未设置uhttpd重定向所有HTTP至HTTPS,如果设置的话都无法只用HTTP访问到LuCI,综上的结论就是:

  • 默认状态下Chrome会先访问域名的80端口,之后再跳转至HTTPS
  • 在浏览器地址栏指定HTTPS协议和端口总是可以访问LuCI的(HTTPS端口开放的前提下)
  • 如果更改了HTTP监听端口,访问时使用HTTP端口可以重定向至443端口的HTTPS访问

至于Chrome什么时候会用HTTPS,什么时候会用HTTP这个我暂时还弄不清楚,之前在刷机之后(未设置HTTPS端口)就遇到过默认使用HTTPS导致的LuCI无法打开的问题

某种DNS解析错误

然而某些情况下(如负责解析二级路由内网IP的是一级路由,二级路由下的设备通过域名访问),OpenWrt路由下的设备不能解析指向内网IP段的域名,在Network->DHCP and DNS页面内的Rebind protection是默认开启的,其作用在于避免本地设备受到DNS相关的攻击,故路由器会将上游路由的对RFC1918域(0.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16,即内网IP段)的响应包扔掉

解决方法:在Rebind protection下的Domain whitelist,添加需用访问的内网域名即可

设备有多个IPv6地址

  • IPv6地址有多种的分配方式:DHCP和SLAAC
  • 某些设备上还开启了隐私扩展,比如说在Win10使用ipconfig命令就可以看到有个临时IPv6地址,作为对外发起连接的默认IP
  • 已经过期的IPv6地址,但是这些地址已经无法发出连接到外网

一般只要有有效的地址存在就不会影响访问网站之类基本操作,但是也可能会遇到有地址,但是不能通过上级设备认证的情况,常见于校园网以及路由器的IPv6中继模式

管理下级设备的地址

DHCPv6分配的地址可以在首页的Active DHCPv6 Leases看到,对应的命令cat /tmp/hosts/odhcpd或者ubus call dhcp ipv6leases,然后对于Android不支持DHCPv6,可以在LuCI界面的Status->Routes的IPv6 Neighbours一栏可以看到当前下级设备的IPv6地址,这个相对比较全(应该是基于NDP),对应的命令ip -6 neighbor,所以在前缀变化的情况下,可以通过以上两个列表来确定设备的地址(选一个能用的就可以了),这里可以用IPv4的Host Name关联的MAC地址,之后用NDP找到对应设备的IPv6地址,代码在前文的脚本中

参考:IPV6 泄露MAC地址 解决方案,隐私扩展和MAC地址随机化其实都是加强隐私保护

添加证书设置开启HTTPS访问后无法打开网页

检查证书文件的权限和对于Web应用的UID

这个在使用供应商的证书 对比 通过ACME申请的Let’s Ecrypt证书发现的差异,因为ps -ef | grep -i qbit可以看到实际使用证书的程序的UID是abc而不是root,acme在使用root权限执行申请到的证书key对abc用户是不可读的

   root       255     1  0 18:26 ?        00:00:00 s6-supervise qbittorrent
   abc        333   255  1 19:15 ?        00:00:00 /usr/bin/qbittorrent-nox --webui-port=8081

可能需要修改证书的key的权限为所有人可读

   chmod +044 keyfilepath

附录

命令行acme.sh

最开始没搞清楚luci-app-acme怎么用,所以用了命令行的方法,其实也就是acme.sh,和上面的方法后端一致,现在也支持通配符证书申请而且和单一域名的没有什么差别

如果后续开放端口之后还是无法使用安全的证书的https访问,可以安装luci-app-uhttpd,检查uhttpd是否监听了443端口,之后在LuCI界面重置证书并重新安装证书

命令行Cerbot

如果下属的设备多的话,使用通配符证书是比较省时间的,我申请的依然是Let’s Encrypt的通配符证书,根据Let’s Encrypt 终于支持通配符证书了申请完之后会得到pem格式的证书

HTTPS证书格式

关于证书格式

可以通过openssl校验证书信息:

openssl x509 -in  cert1.pem -noout -text 

如果把证书安装到OpenWrt的路由器中,会遇到一个问题:uhttpd上写的支持DER格式的证书(也有可能之前老版本只支持DER),此处需要转换证书的格式,这里使用openssl:

openssl x509 -in cert1.pem -outform der -out wrt.cer 
openssl x509 -in privkey1.pem -outform der -out privkey1.der

之后再把两个文件拷贝到路由器内,修改uhttpd的设置,指定证书和私钥路径就可以了