毛毛的梦 - 网络 https://www.maodream.com/tag/%E7%BD%91%E7%BB%9C/ 全方位视奸·睡似了吗? 重生版 https://www.maodream.com/archives/255/ 2025-02-03T14:30:00+08:00 Project Sleepy网址: https://maao.cc/project-sleepy/ 在2024年的夏天,因为中考后的假期太闲,我又算是个比较爱睡觉(小睡)的人,所以基本上每天都处在睡着->醒来->睡着->醒来的循环中。有时候朋友们会找我帮忙,大部分都是发信息留言,很多时候我回复得不太及时。而直接打电话又显得有些唐突(实际上我觉得在大部分情况下打电话才是最好的沟通方式),所以我就抱着写着玩的心态 写了一个能让各位知道我睡没睡着的网页,分享给了我的朋友们,并且做成视频发在了B站上。令我意想不到的是,这个项目受到了极大的关注,B站视频收获了近 8 万播放,博客文章的阅读量达到了 1.4 万次。但是在每天反复的操作中,我逐渐体会到了最初的项目存在的问题:使用原来的更新状态的方式并没有想象中的那么方便,由于我比较懒,上学后基本没再更新过状态。我心里其实一直有个想法是将家里的智能家居的状态也分享出来,大家可以更全面地「视奸」我。我希望使用虚拟的智能家居设备作为开关来更新睡眠的状态,于是我决定开启一个全新的项目。写了近一个月,项目基本完工了。网址: https://maao.cc/project-sleepy/现在还在测试阶段,新项目的信息更加全面,包含了我家中所有智能家居的状态,例如灯的开关、音响播放的内容、环境光的明暗和温湿度等,以及我电脑上正在运行的程序。上个项目获得广泛关注之后,有人说看我就像看电子宠物,这回算是真彻底变成电子宠物了。这个项目不仅能让朋友们更方便地知道如何联系我好,还能让大家一起监督我大晚上有没有开着灯熬夜。(当然我还是觉得打电话好)Project Sleepy 也是我做过的最认真的开源项目,开源在 GitHub: https://github.com/maoawa/project-sleepy这个项目的扩展 Sleepy Helper 也开源在 GitHub: https://github.com/maoawa/sleepy-helper(可能打不开,打不开不用管)我真的有非常用心的写各种配置和说明文档,并且让希望复刻这个项目的人方便修改。目前功能已经基本完善了,我也想不到还能再添加什么。如果各位有什么建议或者意见,亦或者是发现了神秘小bug,欢迎留言或者联系我喵!顺祝新年快乐!(虽然有点晚) 配置AWS亚马逊云EC2服务器的IPv6网络 https://www.maodream.com/archives/211/ 2024-10-26T20:25:00+08:00   AWS (Amazon Web Services, 亚马逊云服务)是 Amazon 旗下全球领先的云计算平台,许多个人和组织都在使用由 AWS 提供的服务,我个人就有在使用 AWS 的 EC2 服务器。但是 EC2 默认只会被分配 IPv4 地址,而不会被分配 IPv6 地址,也就是说 EC2 默认并不能通过 IPv6 访问 Internet。不过我们可以给 EC2 手动分配一个甚至多个 IPv6 地址来解决这个问题。{dotted startColor="#ff6c6c" endColor="#1989fa"/}  首先登入 AWS 控制台,打开希望启用 IPv6 的实例,转到实例绑定的 VPC  展开 VPC 的 Actions (操作) 菜单,点击 Edit CIDRs (编辑CIDR)  点击 IPv6 CIDRs 中的 Add new IPv6 CIDR (添加新的IPv6 CIDR),在弹出的选项卡中选择 Amazon-provided IPv6 CIDR block (由Amazon提供的IPv6 CIDR块),然后点击 Select CIDR (选择CIDR)  这样,VPC 就有了一个由 Amazon 提供的 IPv6 CIDR 块,如图{dotted startColor="#ff6c6c" endColor="#1989fa"/}  VPC 有了 IPv6 CIDR 块后,我们还要给 Subnet (子网) 分配 CIDR。回到希望启用 IPv6 的实例的控制台,转到实例绑定的 Subnet (子网)  展开 Subnet 的 Actions (操作) 菜单,点击 Edit IPv6 CIDRs (编辑IPv6 CIDR)  在 Subnet CIDR block (子网CIDR块) 中,点击 Add IPv6 CIDR (添加IPv6 CIDR)  点击Save (保存),这样 Subnet 就有了 CIDR 块  随后,需要给实例分配 IPv6 地址。再次回到希望启用 IPv6 的实例的控制台,展开实例的 Actions (操作) 菜单,展开 Networking (网络),点击 Manage IP addresses (管理IP地址)  展开网络适配器,如图  点击 IPv6 addresses (IPv6 地址) 中的 Assign new IP address (分配新IP地址)。可以选择自己指定一个 IPv6 地址,指定的地址需要在 Subnet 分配到的 IPv6 CIDR 中,也可以让 AWS 来 Auto-assign (自动分配)。随后点击页面底部的 Save (保存)  弹出选项卡二次确认,提示将会分配一个新的 IP 地址,这正是我们想要的。点击 Confirm (确认)  随后就会自动跳转回到实例的控制台,我们已经可以在这里看到实例已经被分配到了一个 IPv6 地址  最后一步是在路由表中新增一条规则,允许 EC2 正常通过 IPv6 与广域网通讯。转到 VPC 控制台,打开左侧的 Route tables (路由表),选中与之前的 VPC 关联的 Route tables,展开 Actions (操作) 菜单,点击 Edit routes (编辑路由)  点击 Add route (添加路由),Destination (目的地) 中键入 ::/0 (全部IPv6),Target (目标) 选择 Internet Gateway (互联网网关),在 Target 的输入框中输入互联网网关的 ID (以 igw- 开头,一般点击输入框,列出的列表中的就是),然后点击网页右下方的 Save changes (确认更改){dotted startColor="#ff6c6c" endColor="#1989fa"/}  至此,我们就已经成功为 EC2 服务器分配了一个可用的 IPv6 地址。值得注意的是,分配IPv6 地址后可能需要更新一下安全组策略,确保需要的 IPv6 入站流量被允许通过。现在可以试试连接至 EC2,测试 IPv6 的连通性。  执行 curl -6 my.ip-addr.is后,返回如下结果  CONGRATULATIONS! 现在这台 EC2 就已经能使用 IPv6 网络了,这篇教程至此圆满结束。  之前提到的 my.ip-addr.is 是我的好朋友 zkn 提供的一个服务,可以通过 curl 请求这个地址来获取自己机器当前的公网 IP 地址,具体用法如下:curl my.ip-addr.is # 获取默认的 IP 协议版本的信息 curl -4 my.ip-addr.is # 仅获取 IPv4 信息 curl -6 my.ip-addr.is # 仅获取 IPv6 信息   ip-addr.is 是一个非常实用的工具站,可以查询自己的 IP 地址、IP 地址信息、域名与 ASN 的 WHOIS 信息、查询 rDNS 解析,国家顶级域名列表。网站界面干净简洁无广告,域名简单直接,便于记忆,使用方便,现在在我心里已经取代 DNSCHECKER,成为了我的首选工具。 给常联系页面加了个英文 https://www.maodream.com/archives/129/ 2024-01-13T23:53:00+08:00   因为自己有时候可能会和一些外国友人交流,所以挺早之前就想给自己的常联系页面加一个英语,但是一直没去行动。我认识一个来自埃及的朋友,之前经常和他一起打游戏啥的,但是三个多月前,他突然就没任何动静了。我问了很久,他也没回复。终于半个月前(这半个月没怎么上线),他回复了我:  这次经历教会了我们,好朋友之间还是要留下足够多的联系方式。刚好最近不是很忙,就抽出时间给我的联系页加了一个英文的选项:( https://maao.cc/global )  我选择是将中文和英文分成两个单独的子目录,访问网站首页时,自动检测用户的语言,跳转到对应的语言目录。实现起来非常简单,只需要15行代码(不完全遵守规范的话,还可以更少):<!DOCTYPE html> <html> <head> <title>maao.cc</title> <script> var userLang = navigator.language || navigator.userLanguage; if (userLang === 'zh-CN') { window.location.href = '/cn'; } else { window.location.href = '/global'; } </script> </head> </html>  这样,访问首页就会自动判断,将用户引导至合适的语言。当用户的语言是 zh-CN (简体中文)时,就自动跳转到https://maao.cc/cn 是其他语言时,就跳转到https://maao.cc/global  当然,如果识别出错或者只是想看看另一种语言的页面的话,我也做了一个区域选择器(Region Selector 有点模仿任天堂官网那意思): https://maao.cc/regionselector 因为一般来说大部分简体中文访问者不会打开这个页面,所以在这里我是把英文放在第一个。  同时,我也将常联系站(maao.cc)的境外流量接入了上一篇文章提到的Amazon CloudFront(详见 本站的境外网络访问优化记录 - 毛毛的梦 ),现在全球连接速度都嘎嘎快 本站的境外网络访问优化记录 https://www.maodream.com/archives/104/ 2023-12-16T21:39:00+08:00   毛毛的梦是我的一个个人博客网站,由于我是中国人,网站主要访客在中国大陆,所以网站服务器也自然是在国内。同时为了提升国内各地区访问者的体验,我使用了阿里云的DCDN全站加速服务,通过分布在各地的缓存服务器来加快连接速度,减轻源服务器压力,同时还能在一定程度上避免网络攻击。经过优化后,大陆地区的访问速度确实快多了,但是由于阿里云全站加速服务是按流量收费的,而境外的流量费和大陆的不一致,境外要比大陆贵得多(如图)  一般来说境外的攻击比国内要更多,再加上成本原因,最终还是选择只加速大陆地区。设置只加速大陆地区后,境外访问者将会被解析到位于上海的服务器,并且算作国内流量。这样的好处是能大大降低成本,但同时坏处也显而易见,境外地区的访问者就不会有非常优秀的体验。   虽然我网站的境外访客不算多,但是也并不是完全没有。为了照顾到他们的体验,我还是决定使用境外CDN服务。但阿里云的肯定不行,主要原因还是攻击多并且流量费太贵。不过好在我的域名使用阿里云的DNS云解析服务,可以通过简单的配置来实现让不同地区的访问者被解析到不同的服务器。这意味着我可以让国内的访问者使用阿里云的全站加速服务,而让境外的访问者被引导至另一个服务商。  接下来就是寻找一个合适的境外CDN服务提供商。我首先想到的是Akamai,作为全球最大、历史最久的的分布式计算平台之一,Akamai有着非常不错的口碑,并且一直为IBM、Adobe等大公司提供稳定的服务。然而经过我的一些了解,Akamai主要方向似乎是帮助团队和公司,对个人开发者并不是非常友好。  我又去找了亚马逊AWS(Amazon Web Services),亚马逊有CDN业务,他们叫做Amazon CloudFront。Amazon CloudFront有永久免费套餐,每月有1TB的免费出站流量,这对于我这样一个小站来说是完完全全足够了的。  我先注册了AWS账号,选择Amazon CloudFront免费套餐,AWS要求我提供银行卡信息来绑定自动扣款。我刚好有一张中信银行的Visa白金借记卡(持卡人是我本人,因为是借记卡,所以未成年人也可以办),但是激活的时候,柜台的工作人员和我说因为国家反诈要求,这种新办的外币卡需要等待一段时间才能完全可用。我之前也尝试过绑定Paypal和Apple Pay,但是都失败了,说明在解锁之前确实不行。不过我还是抱着试一试的心态,填入了我的银行卡信息:  到了下一步,似乎是通过验证了?接下来要求我验证我的手机号:  验证通过后,到了选择支持计划的页面,我可以选择支付一笔费用升级到更高级的支持计划,会有专业人员来帮助我解决我的问题。但是对于我这种个人开发者,还是选择自食其力:  点击完成注册后,提示我成功激活了我的AWS账户:  看来这张还没有解锁的卡也能通过验证(我还尝试过使用这张卡开通Cloudflare for Saas,也成功了)  进入Amazon CloudFront控制台,点击“创建 CloudFront 分配”  先将我的DIgicert SSL安全证书导入到美国东部(弗吉尼亚北部)区域(us-east-1)  创建完CloudFront分配后,我得到了CNAME解析域名。接下来登录到阿里云云解析DNS配置页面,点击添加记录,主机记录填写www,解析请求来源选择境外(即向除中国内地以外的其他国家和地区,返回设置的记录值),记录值填入刚得到的分配域名:  稍等片刻,使用工具检测解析,确认解析设置生效:  接下来,请求我「身在境外的朋友」帮忙打开我的网站,看看是否有效:  提示网站使用了不受支持的协议,看来是某个地方配置有问题。我搜索了一下,发现似乎并没有人和我遇到同样的错误。于是我便开始了漫长的摸索...  后来我通过搜索,找到了亚马逊云服务官方在知乎发布的一篇文章:《 技术干货 | 手把手教你排查 Amazon CloudFront 常见配置问题 》,在这篇文章里,提到了一个问题:“中国区 CloudFront 直接访问CloudFront 生成的 url,返回 403”,在这里给出的原因是:“中国区访问 CF 分发的时候,只能用客户自己的已经备过案的域名访问,不可以用 http://xxx.cloudfront.cn 的域名访问”:  这段话看得我云里雾里,我百思不得其解,经过了一段时间的“头脑风暴”后,我得出了这样一个结论:上文提到的CloudFront分配给我的域名“d342janx8v6j2q.cloudfront.net”,是相当于分配给我的一个子域名... 我作为国际AWS用户,可以使用这个域名来建立网站,并让访客用这个域名来访问我的网站。我注意到,点击分配域名旁的复制按钮,复制下来的是“https://d342janx8v6j2q.cloudfront.net”,而不是“d342janx8v6j2q.cloudfront.net”:  如果这个域名只是用于CNAME解析,那么不应该将https前缀也复制进来。并且,直接访问“https://d342janx8v6j2q.cloudfront.net”,能显示出403页面。这说明这个“分配域名”不止是用于CNAME解析。于是我尝试知乎原文的解决方法,将www.maodream.com添加进“备用域名”:  应用更改后,果然能连接上了:  于是我将AWS控制台切换到了英文,发现“分配域名”的原文是“Distribution domain name”:  这里的“Distribution”翻译到中文确实是“分配”,但是Distribution是CloudFront里的一个概念,有点像是“实例”,如果直接翻译成分配,很容易让人理解成是分配的域名。看来AWS的翻译质量还是不咋地,索性直接留在英文界面。  虽然现在网站是能连接上了,但并没有显示出正常的网页,而是得到了一个来自CloudFront的403错误,大意是CloudFront的边缘服务器无法连接到源站。这就麻烦了,因为可能引起这种问题的原因有很多。我搜索了一下,似乎还是没有人遇到同样的问题,看来又得自己慢慢摸索了...  我尝试多刷新几次,然后去查看源服务器上的网站日志,发现根本没有新记录。这说明CloudFront的服务器与我的服务器根本就没有建立连接,于是去看源站配置。源站域名这个地方,因为不能填IP地址,我就填的www.maodream.com(我以为是回源host)。但是我又突然想起来,它不能填IP地址,但是可以填CNAME解析的域名啊。  于是我把绑定我源服务器IP的域名填了进去,保存。等一段时间生效后,再次打开网站,居然就稀里糊涂地成功了:  后来我才意识到,这里不是回源host,填写的是源站信息,而不是源站域名(当时中文界面,这里叫做“源域”,解释是“选择 AWS 源,或者输入源的域名。”,看来这翻译质量是真不咋地)。而且,我的www.maodream.com这个域名在海外是解析到CloudFront的,相当于CloudFront自己把自己当源服务器访问,那肯定是有问题的。  现在,本站境外加速服务就由Amazon CloudFront提供,成功实现了国内和境外“一片绿”的美好景象:  境外区域也得到加速后,来自全球的访问者就都能得到一个好的访问体验了。那这次境外网络访问优化就算圆满成功了!! 本站已支持IPv6访问 https://www.maodream.com/archives/102/ 2023-12-09T17:52:00+08:00 何为IPv6?  IPv6(Internet Protocol Version 6),也被称为IPng(IP Next Generation),也就是下一代IP协议。  IPv6是当前主流IP协议IPv4的升级版本。(来自 知乎 ){dotted startColor="#ff6c6c" endColor="#1989fa"/}  经过一段时间的努力,现在已经成功让以下网站支持IPv4&IPv6和IPv6-Only网络访问:   - www.maodream.com | 检测    - paimon.org.cn | 检测    - api.maao.cc | 检测    - maao.cc | 检测    - mao.maao.cc | 检测   以下网站可以检查自己网络是否支持IPv6:   - test-ipv6.com    - testipv6.cn    - ipw.cn 准备做一个文章更新自动短信推送 https://www.maodream.com/archives/53/ 2023-11-15T21:00:00+08:00 导言  这两天生病在家,刚好闲着没事干,准备整个自动推送文章更新。推送方式上,考虑到访问我的网站的用户大多用的是手机,虽然邮件的推送成本极低,但是转化率不高。而且手机短信通知要比邮件方便一些,也有着不错的转化率,所以决定先开发短信推送,邮件推送先搁着。{dotted startColor="#ff6c6c" endColor="#1989fa"/}  现在的想法是用阿里云的短信发送接口。前端写一个页面,输入接收推送的手机号,发送验证码申请提交到后端,通过某种加密方式鉴权,鉴权通过后后端请求阿里云API发送短信。前端再输入收到的验证码,验证通过后把手机号写入数据库。  验证码短信的内容想好了,是:{alert type="info"}  【毛毛的梦】验证码:6位验证码。您正在申请订阅文章更新通知。{/alert}  等到每次文章一更新,就去阿里云发短信给数据库里所有的手机号。消息内容目前定下来是:{alert type="info"}  【毛毛的梦】新文章更新,标题:标题。链接:链接{/alert}  现在只是新建了个计划,开发也处于新建文件夹阶段,给自己定的完成时间是三周以内,慢慢写吧。{dotted startColor="#ff6c6c" endColor="#1989fa"/}2023.11.17 9:26更新:  模板全部审核通过了,就等着开发了2023.11.16 10:47更新:  目前进展:Python后端接口已完成2023.11.16 9:18更新:  通知消息模板人工咨询工单回复了,说建议我在申请备注中提供一个完整的不带变量的模版示例,我只能说...瞎吗...2023.11.15 23:05更新:  修改过后的验证码消息模板过了,但是通知消息模板还是没过,审核意见是什么“根据您提供的链接https://www.maodream.com/archives/,核实功能内容太少,无法判断实际内容  我的archives目录下是文章,我只是用这个链接合成一下,他不会把archives当做一个实际页面了吧...2023.11.15 22:36更新:  验证码消息模板也没过,本来想用“您正在申请订阅「毛毛的梦」文章更新通知。”的,但是阿里云提示不能使用特殊符号,只能作罢。说实话有点小可惜,我觉得「直角引号」还挺好看的。  也想吐槽一下阿里云,为什么不直接禁止输入特殊符号,还要靠人工审核才提示,有点浪费时间...2023.11.15 22:17更新:  短信通知的消息模板没通过审核,阿里云说是title变量的内容不明确,可我觉得原本写的“新文章:标题”挺明确的啊。没办法,只能修改成“新文章更新,标题:标题。” 由maomao提供的IP查询API接口 https://www.maodream.com/archives/11/ 2023-10-22T12:20:00+08:00 导言  我在家里有一台服务器,并且向电信申请了公网IP,请求提出后大约一周多就通过了。只可惜家庭宽带的公网IP是动态的,大约每周会变一次,专线有固定的IP,但价格高到吓人(十几万一年)。我就用家里的服务器当个nas顺便开个mc服务器用来和朋友们联机。根本没必要用到专线,于是就将就动态公网用着。可是IP每周变一次,自己修改又不及时又麻烦,于是我选择了一种叫DDNS的技术(参考: 简述DDNS和DNS区别_dns和ddns_gray.zhao的博客-CSDN博客 )。因为我不想买任何第三方的DDNS服务,于是决定自己动手,去网上找了个现成的py脚本: 【精选】阿里云上实现DDNS公网解析_阿里云ddns-CSDN博客 又因为要用到查询IP的接口,所以又自己搭建了一个。{dotted startColor="#ff6c6c" endColor="#1989fa"/}接口信息接口地址: https://api.maao.cc/ip 返回格式: text/plain 请求方式: GET{alert type="warning"}警告:由于个人能力终究还是有限,无法保证API接口100%的可用性。如果您和我一样,使用IP接口来进行DDNS,我强烈建议设置备用IP查询接口。我不对任何由于API不可用造成的损失负责,但会尽力保证API的可用性。{/alert}{dotted startColor="#ff6c6c" endColor="#1989fa"/}请求示例请求地址: https://api.maao.cc/ip 返回结果: