PowerDNS 上 CAA 记录返回 SERVFAIL 的问题

Posted on Sun 20 August 2017 in Ops

起因

之前搭了一个 IPSec 的 VPN,为了避免需要在客户端导入根证书,使用了 Let's Enrypt 来签署免费证书。这样客户端不用导入自签名的根证书就能正常地认证,用起来很舒服。

今天早上起来发现 VPN 登录不了了,看了一下日志,发现是因为证书过期了,上服务器更新证书,certbot 报 "SERVFAIL looking up CAA for example.com",之前 certbot 也报过类似的错误,但是其实是其他错误导致的,不过这次经过反复尝试,以及用 dig 测试:

dig -t TYPE257 example.com

发现我的 PowerDNS 确实是返回了一个 SERVFAIL。

调查

首先我的 PowerDNS 其实很久没动了,为啥之前可以正常地签证书、更新证书呢 …


Continue reading

带cookie的CORS

Posted on Sun 12 March 2017 in Frontend

关于

不得不说,这其实是一个非常悲惨的故事,作为自己25岁生日的礼物,稍微惨了一点。

最近一时兴起,用Vue.js写了一个很简单的前端项目,也算是希望能在离校之前给自己的学校留下一点东西。

起因

之前一切都很顺利,加feature,修bug,都没什么太大的困难,直到开始着手解决认证问题。

受限于各方面的限制,我写的前端所服务的后台服务是不能直接在校外访问的,然而不管是在校生还是已毕业校友都有在校外访问的需要,因此折中一下,这个服务需要认证才能访问。 认证是怎么做的呢?是一个比较传统的方案:先重定向到一个集中认证服务,登录完之后返回后台服务所在的域名,通过后台服务与认证服务交互,确认用户的登录情况,记录用户的身份,设置session,之后用cookie来识别用户的登录情况。

这部分其实与我的前端App没什么关系,因为不管是认证服务还是后台服务都是已经写好在运行的,我只要在访问后台服务的时候捕捉错误信息,正常跳转到认证服务,等待后台服务把用户重定向回来就行,因此与我来说看上去并没有什么关系。

然而问题在于,运行环境的服务器不由我管理,我也不愿意在运行环境下调试,因此我在自己的VPS和域名下部署了一套staging环境用于线上测试,自己开发则在本机用localhost开发,拜托运行的老师在nginx里加了CORS的HTTP headers,一切挺顺利,看上去也很合理,然而在折腾cookie的时候却出了问题。

兴起

虽然没有什么必须要用 …


Continue reading

一个非常轻量级的HTTP上传工具

Posted on Sat 14 January 2017 in Ops

起因

最近项目需要,需要提供一个http的接口,让用户可以通过浏览器上传文件。本来是一件很简单的事情,不需要认证,也不需要支持断点续传,只要能够上传就可以了, 以为肯定用nginx就能支持。然而一番调研下来发现这一件事情并没有想象中那么简单,不过庆幸的是,最终我还是用nginx+一个简单的Python脚本搞定了这件事情。

主要参考了这篇博客, 里面提到的其他解决方案包括一些三方扩展,然而添加扩展需要重新编译打包nginx,不到万不得已我还是不太愿意。

最后一个解决方案是用nginx_http_core_module里的client_body_in_file_only。 下面的方案就是围绕这个选项实现一个轻量的上传工具。

背景

根据这篇博客里的说法,如果不设置这个特性,nginx会把用户请求整个存到硬盘,再将这个文件传给后端,后端再根据自己实现的逻辑解析这个文件,得到想要的东西。 对于上传任务,后端一般会从body中解析出文件,分别存储到硬盘,再放回结果给nginx。

需要注意到,这里有两个问题:

  1. 我想要的上传器是十分简单的,既不需要验证,也不需要一个请求上传多个文件,因此实际上整个body就是一个文件,如果我把body从文件里读出来,再写到另一个硬盘, 那么客户端会很奇怪地发现,为什么我发完最后一段数据之后服务器就没响应了?实际上服务器在做一个非常傻的重io操作。
  2. 既然我想实现一个简单的上传器,如果要我去实现一个非常复杂的后端,解析用户请求,考虑异步操作,依赖三方库 …

Continue reading

让你的nginx网站得到A+

Posted on Sat 31 December 2016 in Ops

起因

最近用 github 的 student pack 领了 namecheap 的一年免费域名,并且把博客迁移到了新的域名下。

最初是想直接用 github.io CNAME一下,然而问题在于就没有 https 了。忍了一个月,实在是忍无可忍,自己找了台VPS自己跑。正好服务器也一直空着,没跑什么东西。

之前折腾了一下SSL的相关配置,正好趁机总结一下。

安装部署

服务器用的是 archlinux,安装nginx和certbot的方式如下:

~> sudo pacman -Syu
~> sudo pacman -S nginx-mainline certbot-nginx

nginx 配置

将 nginx 配置的 server block 改成如下内容:

server {
    listen      80 default_server;
    listen      [::]:80 …

Continue reading

异步Python学习笔记

Posted on Thu 08 December 2016 in Python

About

一般来说说到Python都会说这是一种十分低效的语言,慢等等,然而之前用Gevent做了一个restful,发现其实性能还不错。

其实Python很慢这一点当然是不错的,不适合直接用来作复杂算法的实现。但是当我们需要实现Web服务器等软件时, 性能的瓶颈实际并不在CPU上,多数时间我们都在等待IO,如果IO需要1s,这个时候你用Python实现一段代码运行需要0.01s, 和你用C实现一段代码运行需要0.0001s有什么可感知的区别吗?

所以最重要的是如何地让用户请求不阻塞,充分地让IO跑满。最早人们通过多进程来解决这个问题,后来发现进程实在是太笨重, 转而使用线程来解决这个问题,但是线程切换对于大量短时io依然过重。所以最后人们转而开始强调并发,不再强调并行, 也就是所谓的异步。 这就是为什么Python这样的有GIL存在的, 串行执行的语言,在web开发上依然能有一席之地的原因。所以要用Python高效的实现服务,良好地异步是必不可少的。

Python 3.4 新加了asyncio,一直很感兴趣,但是也没时间去深入研究。

最近在实验室需要做一个FTP,pyftpdlib是一个十分优秀的FTP服务器实现, 其本身的实现是基于异步的,同时也支持线程和进程模型。当然考虑到性能问题,最后肯定需要采用异步模型。 但是在这里我遇到了一个问题,pyftpdlib本身有自己的异步IO loop,如果强行上gevent的monkey_patch有可能导致各种奇怪的bug?

基于这个考虑 …


Continue reading

基于libvirt kvm macvtap的虚拟化解决方案

Posted on Thu 24 November 2016 in Ops

前言

这其实是很早以前折腾的东西,但是感觉网上的资料不是很清楚,现在补一下,以免以后想不起来。

macvlan 与 macvtap

其实之所以会用macvtap来做网络端口复用是因为libvirt默认用了它,后来折腾的过程中看了代码,理解了原理, 才明白它相比于以前的bridge方案确实有一些优势,如果虚拟机的流量确实很大,可以用这套方案,来减少物理机的CPU和 网卡的压力。

macvtap与macvlan实际上是内核里面的两个特性,用于在物理网卡后面接一些虚拟端口,复用物理端口,但是利用了网卡 的一个较新的特性,所以从性能上来说比纯虚拟交换性能更高,属于一种半虚拟化方案。

macvlan实际上和虚拟机并不是紧耦合的,你也可以在自己的机器上开一个macvlan做试验:

~> sudo ip link add link eno1 type macvlan

注意把eno1替换成你的物理端口名

好了,你现在有一个macvlan0了,你可以试试

~> sudo ip link set macvlan0 up
~> sudo dhcpcd macvlan0

如果你的网络里有slaac或dhcp6,那么你应该能顺利地拿到IPv6地址。如果你的网络里有dhcp,那么你应该能顺利地拿到IPv4 …


Continue reading

多媒体学习小记

Posted on Mon 31 October 2016 in Multimedia

起因

实验室最近想要对视频站点的重编码和重采样进行逆向分析,保证水印信息能够在这个过程中存活。本来我觉得这是一个很容易的工作, 毕竟我们有ffprobe可以直接用,感觉ffprobe再diff一下就可以了。然而问题在于,之前虽然上过流媒体课,也折腾过nginx-rtmp-module, 但是对于视频流的很多更细节的实现,所以借着这个机会,想更深入地对多媒体的编码存储进行一下更深入 地学习。

概念

Aspect Ratio

在ffprobe的输出里一般会看到display_aspect_ratio和sample_aspect_ratio,而且数字上比较奇怪。

这里有一个浅显简单的解释,简单说来就是:

$$ Frame Aspect Ratio = Storage Aspect Ratio $$
$$ Sample Aspect Ratio = Pixel Aspect Ratio $$

画面上实际显示的高宽比是Display Aspect Ratio,计算公式如下:

$$ Display Aspect Ratio = Frame Aspect Ratio \times Sample Aspect Ratio $$

tbr tbn tbc …


Continue reading

用nginx-rtmp-module直播写代码

Posted on Fri 28 October 2016 in Multimedia

前言

前段时间用nginx-rtmp-module搭了一个直播系统,测试的时候用来直播了一下桌面,感觉评价还不错,应邀写个简单的教程。

服务器

安装

服务器端我用的是nginx-rtmp-module,操作系统用的是CentOS 7,部署其实很简单, 它主页上就有教程

当然为了系统比较干净,推荐还是简单打个包,CentOS的话我推荐从nginx的官方源下载 源码包,在configure的参数上加一条--add-module=/path/to/nginx-rtmp-module即可。

如果是archlinux的话可以考虑用aur的里的包

基本配置

nginx的基本配置可以参考如下:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

rtmp …

Continue reading

不活跃的openssh连接被“冻结”的问题

Posted on Fri 21 October 2016 in Ops

起因

最近做的两个项目都是跑在CentOS上的,前者是CentOS 6,现在用的是CentOS 7。一个让人 非常恼火的问题是,调试或者看日志的时候,如果开了一个ssh连接,然后另开个窗口,去 跑个ansible或者是改下代码什么的,时间稍微长一点,切回来的时候就会发现ssh连接被 “冻结”了:敲键盘没有回显,同时连接也不会中断。最初我以为这是CentOS设置的某个安全 特性,避免连接被劫持之类的。但是时间长了之后觉得这个特性实在是有点烦,于是我准备 disable这个“特性”。

解决

简单地说,在笔记本上的ssh配置(如果是linux,在~/.ssh/config)上加上如下配置即可

Host *
    TCPKeepAlive yes
    ServerAliveInterval 15
    ServerAliveCountMax 3

解释

就像之前说的,我最初以为是CentOS上有某种玄学安全特性,所以我把服务器上的 /etc/ssh/sshd_config取到本地看了一遍,然而并没有 …


Continue reading

archlinux上用systemd-networkd与hostapd配置无线ap

Posted on Sat 08 October 2016 in Ops

环境

这套配置我现在运行在了两个地方,一个是我家里的minipc上,当软路由用,另一个则是我实验室的 PC,因为实验室的公共Wifi效果实在不能让人满意,决定自己在PC上插两个USB无线网卡当无线路由器用。

环境上用的都是Archlinux。

这是minipc上的无线网卡:

~> lsusb
Bus 002 Device 002: ID 148f:5572 Ralink Technology, Corp. RT5572 Wireless Adapter

~> lspci
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller(rev 06)

这是实验室PC上的无线网卡:

~> lsusb
Bus 003 Device 002 …

Continue reading

使用libvirt和preseed自动部署运行于KVM上的Debian虚拟机

Posted on Sat 08 October 2016 in Ops

前言

有一年多没有写东西了,期间还是做了不少事情,但是因为博(zi)客(ji)有(te)点(bie)丑(lan), 什么都没有写。很多东西花了很多时间去学和折腾,回头要用到的时候又需要重新去 翻文档,实在是浪费时间,于是决定把博客续上。

之所以会需要装虚拟机,是因为TUNA最近又招了不少萌新,萌新们可能需要一台UNIX的设备来瞎折腾, 另外协会内部偶尔需要交换slide或者活动视频,大鹰主席又觉得通过“网盘”交换文件实在太羞耻, 因为我之前折腾过一下KVM,因而让我部署一台Debian的虚拟机。

本来是一件简单的重复劳动,但是基于以下理由:

  1. 萌新可能把机器弄坏或者机器需要搬家
  2. 以后会长可能会让我装第二个机器
  3. 好久没折腾了感觉皮子有点紧~~

决定用ansible自动安装。整个过程花了大概两天左右,其实ansible和libvirt都还算好,文档挺齐全 的,而且实现上bug不多,但是preseed的文档少而且比较乱,经常遇到文档和实际情况不符合的情况。

环境

宿主机是一个Debian jessie,上面跑了各种各样的其他服务,包括且不限于docker、nginx、 私有的ldap服务等。

虚拟机依然是一个Debian jessie …


Continue reading

在三星Galaxy S4上chroot方式安装Archlinux Arm

Posted on Sun 05 April 2015 in Android

前言

入手 Galaxy S4 已经几个月了,我手里这款是 I9508,也就是移动3G定制版,除了制式以外其他 硬件和 I9505(也就是 Galaxy S4 国际版)是一样的。因此搭了 I9505 的东风,装上了 cm12, 作者最近还编译了 cm12.1, 等 Xposed 可以用到 Android 5.1 之后就可以装上了。

硬件

进入正题,首先看一下硬件的情况:

(notebook)$ adb shell df
Filesystem               Size     Used     Free   Blksize
/dev                   905.5M    48.0K   905.5M …

Continue reading