折腾阿里云笔记

警告

这篇文章是洒家刚接触云计算时写的,内容已经过时,仅供怀旧。

但是说起来,这种瞎折腾、走弯路的过程也是一种乐趣。

近期洒家买了个阿里云云服务器 ECS 玩玩,虽然国内的服务器网速快,但是毕竟在天朝,有的地方玩得也是有些不爽。以下是洒家这两天折腾的记录。

域名

洒家只是想搞一个自己用的服务器,因此只需在 Freenom 注册一个免费域名,填上自己服务器的 IP 即可。

freenom

绕过备案

洒家弄好之后,用域名访问,出现了喜闻乐见的温馨提示:

该网站暂时无法访问
该网站暂时无法访问

备案?备个屁!

由于众所周知的原因,天朝的网站需要备案,但是过程极其繁琐。如果不备案,通过域名访问就会出现有一定概率干扰正常访问。

不管为了自由或者省事,想绕过备案干扰访问的话,可以:

  1. HTTP 服务监听其他的端口。目前来看好像只过滤 80 端口。缺点就是影响 URL 的美观,因此不选择这个方案。
  2. 用 HTTPS,加密流量就不会被搞(如果过滤发生在“中间人”位置)

另外不知道能不能从原理上干掉过滤。

搞一个 HTTPS 证书

仍然为了免费,洒家选择了 StartSSL

参考这篇教程,内容有点过时,但是过程基本一致:https://www.oschina.net/translate/switch-to-https-now-for-free?cmp

然而洒家做完了之后点击原文发现了 2016 年的更新:https://konklone.com/post/switch-to-https-now-for-free,原作者现在已经不推荐使用 StartSSL,转而推荐 SSLMate 等。各位看官可以考虑一下。

基本流程大概就是注册,安装两个客户端证书,然后选择 Web Server SSL/TLS Certificate。为了验证网站所有权,有两种方式:(假如你的域名为 example.com

  1. webmaster@example.com 等邮箱地址发一封邮件
  2. 下载一个 example.com.html 放到网站根目录,StartSSL 会发出请求验证你的控制权

显然 2 更简单,然而由于上述备案的干扰,洒家尝试了很多遍都无法正常验证通过(似乎是 100% 失败的节奏)。无奈开始搭邮件服务器。

搭邮件服务器

由于毫无经验,瞎 JB 折腾一晚上 Postfix + dovecot + mysql,总是收不到邮件,总是被退信。一筹莫展之际,洒家考虑到目的只是接收一封邮件,想到有没有轻量级的程序实现了 SMTP 协议?随便一搜,在 Fake SMTP server with Python 这篇文章里找到一条命令:

sudo python -m smtpd -n -c DebuggingServer localhost:25

关掉 postfixdevecot 服务,启动命令,还是收不到,于是洒家凭感觉改成:

sudo python -m smtpd -n -c DebuggingServer 0.0.0.0:25

发送邮件,验证码瞬间出现在终端上。

。。。。。。

十多个配置文件瞎折腾一晚上,竟然不敌一条命令。

心疼运维。

可见对于只是接收一封邮件这种小事就不要挑战杂乱无章的各种配置文件了。

继续申请证书

下面只需要粘贴一份 CSR 即可。用 openssl 的命令,或者 StartSSL 提供的工具生成:

StartCom Tool
StartCom Tool

程序会得到一个私钥,保存好备用。把 CSR 粘贴到网站上,即可下载证书。

certs

安装证书

激活 Apache 的 SSL 模块,配置 /etc/apache2/mods-enabled/ssl.conf。(略)

继续搞配置文件,以 Apache 为例,编辑 /etc/apache2/sites-enabled/000-default.conf

Apache config

配置完上传私钥和证书,重启 HTTP 服务。

aliyun-vps-trail-6.png
HTTPS 访问效果

Let's Encrypt 更推荐的免费证书

2017 年 2 月 22 日更新

由于谷歌已经不信任沃通的证书,洒家今日在 StartCom 上申请的证书直接验证失败。折腾了两天浏览器才发现是证书本身的问题,只好另请高明使用 Let's Encrypt 的证书。

Let's Encrypt 的玩法非常简单,只需使用基于 ACME 协议的工具,有官方推荐的工具 Certbot,也有其他的一些工具。

此处使用 Certbot 工具,以 Ubuntu 16.04 为例,安装:

sudo apt-get install python-letsencrypt-apache

运行:

sudo letsencrypt --apache

另外洒家用的版本并不能识别 /etc/apache2/sites-enabled/ 里面一个文件多个 Virtual Host 的情况,所以洒家把它们分成了多个文件,一个文件一个 ServerName,就可以识别了。

网络上的爬虫和恶意攻击者

洒家查看日志发现,网络上有很多乱七八糟的爬虫和恶意的攻击者(弱口令攻击 SSH)。

aliyun-vps-trail-7.png
远程登录 SSH 失败统计
aliyun-vps-trail-8.png
网站上线就受到了来自世界各地的 HTTP 访问

缓解方法:

/robots.txt 防止有道德的爬虫

robots.txt

SSH 尝试弱口令的:屏蔽某些 IP

Visual Attacker

为了方便地查看,洒家造了个轮子 Visual Attacker(前端使用百度 Echarts)

Visual Attacker

洒家写了 4 个功能:

实现不难,此处洒家就不贴代码了。

autoBanIp

2016 年 9 月 16 日 Update

洒家看着攻击者心痒痒,写了个自动 ban ssh 弱口令的脚本:

auto ban IP

等几天看看效果如何。

2016-9-20 Update

自动封 IP 脚本还是有效果的,活捉一只中国上海的攻击者。

auto ban IP

auto ban IP

还有一些国外的攻击者,今天每个 IP 只尝试 3 次。为了不干扰洒家自己的正常使用,必须写更复杂的规则才能处理。

auto ban IP

2016 年 10 月 7 日 Update

最近了解到,有个更完备的程序叫 Fail2ban。有了这个就不用重复制造轮子了。

自动 ban HTTP 访问的 IP

2016 年 10 月 7 日 Update

各位小朋友乱开扫描器是不好的行为。洒家又造了个轮子:

auto ban http

这个脚本的原理和上文提到的禁止 SSH 爆破的脚本相同,都是利用 inotify 监控日志文件,发生变动的时候读取、分析日志,屏蔽 IP。

绑定多个域名

2016-9-19 Update

洒家前几天收到阿里云邮件,免费送 .top 域名,就搞了一个玩玩。万网规定:

2016 年 7 月 18 日 8 点起,.com/.net 域名注册成功后必须进行域名实名认证,否则域名会处于 Serverhold 状态,无法正常使用。

似乎并不影响 .top 域名,反正洒家做完也能正常解析。

.top domain

瞎填了一通信息模板,申请了一个域名,然后加了几个子域名。洒家又申请了一张证书,搞到服务器上。

Apache 设置,以 Ubuntu 为例,只需要设置 /etc/apache2/sites-enabled/000-default.conf,增加:

<VirtualHost *:443>
    ServerName MyDomain.top
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateChainFile /path/to/chain.crt
    SSLCertificateFile /path/to/top.crt
    SSLCertificateKeyFile /path/to/top.key
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

然后重启 apache2 服务即可访问。

搭建代理服务器

有时候洒家用手机不方便科学上网,一台代理配上自己搞的代理自动配置(英语:Proxy auto-config,简称 PAC)是极好的。

洒家使用了某敌对势力做的某知名软件的 Linux 版,监听 0.0.0.0

Phone PAC

随时随地想翻就翻。感觉洒家的手机翻墙瞬间方便了很多。

Phone FQ Google

2017 年 8 月 11 日更新

爽了没多久,收到一封邮件:

FQ service banned
违规信息整改通知

吓得我赶紧把服务给停了。

总结

经过洒家一番折腾,挂上很多实验的网站,加上 favicon.ico,最后弄出个花花绿绿的手机页面。

Phone icon


Advertisements

Comments

License

Creative Commons License

本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议CC BY-NC-ND 4.0)进行许可。

This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License (CC BY-NC-ND 4.0).