警告
这篇文章是洒家刚接触云计算时写的,内容已经过时,仅供怀旧。
但是说起来,这种瞎折腾、走弯路的过程也是一种乐趣。
近期洒家买了个阿里云云服务器 ECS 玩玩,虽然国内的服务器网速快,但是毕竟在天朝,有的地方玩得也是有些不爽。以下是洒家这两天折腾的记录。
域名¶
洒家只是想搞一个自己用的服务器,因此只需在 Freenom 注册一个免费域名,填上自己服务器的 IP 即可。
绕过备案¶
洒家弄好之后,用域名访问,出现了喜闻乐见的温馨提示:
备案?备个屁!
由于众所周知的原因,天朝的网站需要备案,但是过程极其繁琐。如果不备案,通过域名访问就会出现有一定概率干扰正常访问。
不管为了自由或者省事,想绕过备案干扰访问的话,可以:
- HTTP 服务监听其他的端口。目前来看好像只过滤 80 端口。缺点就是影响 URL 的美观,因此不选择这个方案。
- 用 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
)
- 向
webmaster@example.com
等邮箱地址发一封邮件 - 下载一个
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
关掉 postfix
、devecot
服务,启动命令,还是收不到,于是洒家凭感觉改成:
sudo python -m smtpd -n -c DebuggingServer 0.0.0.0:25
发送邮件,验证码瞬间出现在终端上。
。。。。。。
十多个配置文件瞎折腾一晚上,竟然不敌一条命令。
心疼运维。
可见对于只是接收一封邮件这种小事就不要挑战杂乱无章的各种配置文件了。
继续申请证书¶
下面只需要粘贴一份 CSR 即可。用 openssl
的命令,或者 StartSSL 提供的工具生成:
程序会得到一个私钥,保存好备用。把 CSR 粘贴到网站上,即可下载证书。
安装证书¶
激活 Apache
的 SSL 模块,配置 /etc/apache2/mods-enabled/ssl.conf
。(略)
继续搞配置文件,以 Apache
为例,编辑 /etc/apache2/sites-enabled/000-default.conf
SSLCertificateChainFile
中继证书SSLCertificateFile
服务器证书SSLCertificateKeyFile
私钥文件
配置完上传私钥和证书,重启 HTTP
服务。
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
)。
缓解方法:
/robots.txt
防止有道德的爬虫
SSH
尝试弱口令的:屏蔽某些 IP
Visual Attacker¶
为了方便地查看,洒家造了个轮子 Visual Attacker(前端使用百度 Echarts)
洒家写了 4 个功能:
- HTTP 访问(按 IP 地址记次数)
- HTTP 访问(按地理位置记次数)
- 成功远程登录(按 IP 地址记次数)
- 失败远程登录(按 IP 地址记次数)
实现不难,此处洒家就不贴代码了。
autoBanIp¶
2016 年 9 月 16 日 Update
洒家看着攻击者心痒痒,写了个自动 ban ssh 弱口令的脚本:
等几天看看效果如何。
2016-9-20 Update
自动封 IP 脚本还是有效果的,活捉一只中国上海的攻击者。
还有一些国外的攻击者,今天每个 IP 只尝试 3 次。为了不干扰洒家自己的正常使用,必须写更复杂的规则才能处理。
2016 年 10 月 7 日 Update
最近了解到,有个更完备的程序叫 Fail2ban。有了这个就不用重复制造轮子了。
自动 ban HTTP 访问的 IP¶
2016 年 10 月 7 日 Update
各位小朋友乱开扫描器是不好的行为。洒家又造了个轮子:
这个脚本的原理和上文提到的禁止 SSH 爆破的脚本相同,都是利用 inotify
监控日志文件,发生变动的时候读取、分析日志,屏蔽 IP。
绑定多个域名¶
2016-9-19 Update
洒家前几天收到阿里云邮件,免费送 .top
域名,就搞了一个玩玩。万网规定:
2016 年 7 月 18 日 8 点起,
.com/.net
域名注册成功后必须进行域名实名认证,否则域名会处于Serverhold
状态,无法正常使用。
似乎并不影响 .top
域名,反正洒家做完也能正常解析。
瞎填了一通信息模板,申请了一个域名,然后加了几个子域名。洒家又申请了一张证书,搞到服务器上。
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
随时随地想翻就翻。感觉洒家的手机翻墙瞬间方便了很多。
2017 年 8 月 11 日更新
爽了没多久,收到一封邮件:
吓得我赶紧把服务给停了。
总结¶
经过洒家一番折腾,挂上很多实验的网站,加上 favicon.ico
,最后弄出个花花绿绿的手机页面。