NAME、CNAME 格式
总体而言, 早期 DNS 协议是个比较简单的协议。受限于 UDP 大小和数据量, 基于 UDP 的 DNS 协议限制了包大小,并且采用二进制编码方式力求减少数据量占用。
二进制编码方式相比文本方式(例如HTTP、SIP、SMTP等)最明显的缺点就是不直观,再用一些技巧减少数据量,DNS 协议在定义、实现方面总显得有些弯弯绕绕。
比如 NAME、CNAME 等结构的编码。
本文记录了这些古怪的编码方式,方便以后查找,并帮助后续的开发者不会被代码给绕晕。作为我个人来说,还是尽快忘记这些吧。
方式一:纯压缩编码方式
这种方式应用很普遍,以“0xc0”标记开始,加上一个字节的 offset,进行消息包内的寻址即可。如下图所示:
其中, 0x0c 就是偏移量。
方式二:直接编码方式
这种方式比较直接,占用数据量也相对大一些,将域名完整信息存在数据包中。如下图所示:
需要说明的是:并不是直接将所有字符存进去就 OK 了。对于域名数据,以“.”符号分割成几个单元,每个单元数据采用 “length + value” 方式进行编码,最后以0x00结束编码。以上述数据为例:
08 6e 73 69 6e 61 69 6d 67 04 67 73 6c 62 08 73 69 6e 61 65 64 67 65 03 63 6f 6d 00
比如,第一个 0x08,说明后面的“nsinaimg”(即 6e 73 69 6e 61 69 6d 67)长度;然后是 0x04,说明后面的“gslb”(即67 73 6c 62)长度……其他单元类推。
方式三: 混合编码方式
这种方式其实就是综合了上述两种方式。以直接编码方式开始,然后以压缩(偏移)编码方式结尾。如下图所示:
对图中的数据码流描述如下:
03 6b 6c 6e 04 67 72 69 64 c0 38
0x03 描述了“kln”(即 6b 6c 6e)的长度,0x04 描述了“grid”(即 67 72 69 64)的长度,而域名的后续部分,通过“c0 38”编码可以知道:需要偏移0x38字节获取。
小升初报名
今天(2020-05-15)上深圳南山教育局网站(这里),给老大报名小升初。毕竟是小孩人生中的一件大事,全程很紧张,生怕某项细节填错了,每项都仔细审核两遍,汗流浃背。
上午九点报名,到下去三点左右基本搞完了…… 中间出现的问题无非就是:网站打不开了、502网关错误了、Nginx 崩溃了等等。
作为一名 IT 行业人士,我非常冷静,并表示理解。自己辛苦点,无非就是隔几分钟去 refresh 一下,并按照惯例祈祷上帝、佛祖、真主、以及各路神仙保佑。
总体上还顺利吧,感谢!
2020-05-18 更新:这两天晚上又上去看看审核结果,看是否需要补充材料。速度非常快,网站也很稳定。这说明前两天实在太多家长急急忙忙地冲进去报名了(包括我自己)。家长们的情绪可以理解,毕竟现在孩子的事是头等大事,心里都想赶紧办妥了,以免夜长梦多。
红枣枸杞蒸滑鸡
貌似不是很复杂,感觉可以试试。
SSH 配置证书登录
SSHd 配置采取了一些安全措施,比如:修改端口、禁止 root 远程登录(这里)、启动 fail2ban 防止恶意登录(这里),等等。目前看这些措施基本满足了日常的维护管理需求。
通常还会采取证书登录方式,禁止密码鉴权登录。不过以往考虑到密码方式更方便,因此没有动力去修改。时间就这么过去了……
最近登录服务器检查日志, 惊讶地发现 fail2ban 每日的日志居然有十几M之多,全是各类奇葩以各种方式尝试登录 SSH。虽然 fail2ban 工作得很好,但是万一出现了 bug 呢? 万一哪个变态就是锲而不舍、经年累月地尝试登录呢?应该下狠手,让老铁们彻底绝望,因此决定禁止密码方式登录,要求采用证书登录。
配置不复杂,涉及客户端生成证书密钥,以及将公钥上传到服务器等。主要参考 Linode 的两篇配置文档(这里和这里)。 以下是详细步骤:
生成证书
客户端也是 Linux 系统,因此相当简单:
ssh-keygen -b 4096
该命令在当前用户的 .ssh 目录下创建了两个文件: id_rsa 以及 id_rsa.pub 。
其中 “id_rsa.pub” 是当前用户的公钥文件,将其上传到服务器上,然后添加进 ~/.ssh/authorized_keys 文件中:
cat id_rsa.pub >> ~/.ssh/authorized_keys
添加完成后,服务器上的 id_rsa.pub 文件不用再保留,删除即可。要注意,authorized_keys 文件应该设置为别人不允许访问,确保足够的安全性。例如设置文件权限为600:
chmod 600 authorized_keys
当 SSH 客户端登录时, SSHd 默认读取该用户的 authorized_keys 信息进行证书鉴权。
修改 /etc/ssh/sshd_config 文件
PasswordAuthentication no
然后重启 sshd 即可:
sudo systemctl restart sshd
之后,客户端如果采用密码鉴权方式登录,或者粗暴破解,将被无情拒绝。
如果有多个客户端需要登录服务器,则需要各自生成证书,并将公钥上传到服务器,并添加到 authorized_keys 文件中即可。
Cloudflare 返回的DNS结果
最近查一个客户遇到的 SIP 呼叫问题,发现在检查 DNS 记录时有问题,没有正确获取 DNS 记录。切换了几个 DNS 服务器测试,只有 Cloudflare DNS 服务器(1.1.1.x 系列) 返回的DNS记录会触发问题。
这并不是说 Cloudflare 的DNS记录有错误,而是我们自己实现的 DNS 库没有考虑到该记录的不同寻常之处。Cloudflare 的返回结果确实有点与众不同。
下图是Google DNS 以及 Ali DNS 返回的DNS结果,请注意其中的 Name 字段的内容(0xC0 0x0C)
很明显,这种DNS结果采用了 compress 方式,通过 offset 来获取真正的Name。图中的 0x0C 实际就是偏移量,指向了包中的另一处地址。Compress 方式最直接的好处就是节省了包大小。
而 Cloudflare 的 DNS 结果如下图所示,直接将域名包含在 Name 中,以 0x03 标注开始,以 0x00 表示字符串结束。不再需要偏移指向其他地址。
这种方法的好处是够直接,不再需要跳转获取真实的域名信息。当然坏处是增加了数据包的大小。
我们测试了网络上大部分的 DNS 服务器,目前仅发现 Cloudflare 采取了这种方式,其他服务器都是采用 compress 方式。
站在“人”的体验角度,似乎 Cloudflare 更合理一些。但是要注意,compress 方式更符合计算机的处理,毕竟前面的 Queries 部分已经解析过 Name 了,没必要再解析一次。另一方面,直接 offset 寻址,也远远快于再一次通过判断0x00来解析Name 字符串。
因此我个人认为 Cloudflare 的处理方式,即拖慢了速度,又增加了数据包消耗。当然,以目前计算机的处理能力以及网络速度,这些都是浮云。我们的解决方式也是淡定地接受这个结果,并修改 DNS 库进行适配即可。
在本次查问题中,测试了网上公布的香港 DNS 服务器,全部拒绝了来自大陆 IP 地址的 DNS 请求,真有意思。
做馒头、肉包子
包含两个部分:(1)和面 (2)做肉馅。其中,对做馒头而言,只需要关注“和面”这部分即可。
与传统的中餐描述方式类似,没有精确描述各种食材的用量,只会描述诸如“一勺”、“少许”等模糊字眼,默认是我自己家的普通勺子,或者我自己认为的“少许”,毕竟佛曰“不可说”。
和面(做馒头)
(1) 40度左右的温水一小碗,加5克酵母,一勺白糖,发酵大约10分钟。发酵成功时,小碗内应该明显看到发酵起来的泡沫。
(2)面粉8大勺(可能有500克或者更多),少量、多次倒入上述发酵水,用筷子不停搅拌面粉。如果喜欢的话,此时也可以加入新鲜牛奶,尤其是喜欢奶香馒头的话。最终面粉应该搅拌成絮状、小块状。
(3)揉面大约十分钟。表面光滑、不粘手即可。
(4)盖保鲜膜,密封发酵到两倍大小,时间大约是一个半小时,或者两个小时。
(5)发酵后重新揉面排气,大约10~20分钟,其中分批加入少许干面粉,这样的口味会更有嚼劲。
(6)切成小块,放入锅中(铺湿纱布干纱布),盖盖子,二次发酵大约20分钟。
(7)冷水上锅,大火15分钟(如果是肉包,则是20分钟),关火焖3~5分钟后再揭盖。
肉馅
(1)制姜葱水: 大葱一段,切丝;生姜一块,去皮切丝;少许花椒;放入小碗,倒入开水浸泡,直到开水变凉,去除这些材料,只留姜葱水即可。
(2)两根小葱,洗净后切葱花,备用。
(3)五花肉(或者前腿肉)切小块,搅碎成肉馅。
(4)肉馅入盆,加入上述葱花、加入一个鸡蛋(可以有蛋黄)、适量生抽、蚝油、五香粉(或者十三香)、盐、胡椒粉,顺时钟方向搅拌。中间分批次加入少许生姜水(如果是饺子馅,不用加水),注意始终同一个方向搅拌。
(5)最后加入适量香油,继续顺时钟方向搅拌。肉馅略显粘稠即可。
(7) 如果希望吃白菜猪肉馅,则按照1:1比例配置白菜(比如500克猪肉,加500克白菜),白菜之前应该切碎,放适量盐,然后保鲜膜腌制大约10分钟,用纱布包住白菜碎,将水挤掉。将去水后的白菜馅和肉馅混合,同样顺时钟方向搅拌即可。
巴菲特2020年致股东的信
升级 windows 10
目前日常使用的是一台老旧的Thinkpad T430,运行 windows 7 (专业版),以前也收到过windows提示升级 win10。一来没有时间, 二来一直工作很好, 因此完全没有升级的想法。
这个春节由于流行肺炎的原因,基本上就呆在家里了,极度无聊。想到windows 7已经结束生命周期,上网搜了搜,似乎微软仍然保留了免费升级的通道, 干脆就升级windows 10算了 。
从微软的网站下载 media creation tool,选择升级现有电脑,过程非常简单顺滑。个人配置也完全平滑的升级到新的系统,基本上除了点击next,就没什么可以做了。不得不说, 在工程兼容性方面,微软简直做到了极致!
平时常用的软件都没有问题,非常顺利。新系统与win7有些差异,略感怪异,尤其是那个磁贴(谁设计这货的?),实在太不好用,而且老是出意外,希望以后能逐步适应。
2020-01-28更新: 不知道是什么原因, 笔记本的风扇一直转,时大时小,以前windows 7时没有这种现象。看了任务管理器,CPU和内存占用都非常小,真是奇怪。
2020桌面
程序员的恶俗仪式感,每年来一篇。