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

一个非常轻量级的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

基于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

不活跃的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