近期灑家買了個阿里雲雲服務器ECS玩玩,雖然國內的服務器網速快,但是畢竟在天朝,有的地方玩得也是有些不爽。以下是灑家這兩天折騰的記錄。
域名
灑家只是搞一個自己用的服務器,因此只需一個免費域名: http://www.freenom.com/ ,用Freenom DNS Server 填上自己的IP即可。
繞過備案
灑家弄好之后,用域名訪問,出現了喜聞樂見的溫馨提示:
尊敬的用戶,您好
很抱歉,該網站暫時無法訪問,可能由以下原因導致:
原因一:未備案或未接入;根據《非經營性互聯網信息服務備案管理辦法》,網站需要完成備案或接入。請登錄代備案管理系統進行操作。
原因二:網站內容與備案信息不符或備案信息不准確;根據《非經營性互聯網信息服務備案管理辦法》,網站內容需要與備案信息一致,且備案信息需真實有效。建議網站管理員盡快修改網站信息。
工信部備案查詢點此進入,購買雲計算產品可領取優惠券
備案?備個屁!
由於眾所周知的原因,天朝的網站需要備案,但是過程極其繁瑣。如果不備案,通過域名訪問就會出現有一定概率干擾正常訪問。
不管為了自由或者省事,想繞過備案干擾訪問的話,可以(不知道能不能從原理上干掉過濾):
1. HTTP服務器監聽其他的端口。目前來看好像只過濾80端口。
缺點:影響美觀
2. 用HTTPS,加密流量就不會被搞(如果過濾發生在“中間人”位置)
搞一個HTTPS證書
仍然為了免費,灑家選擇了 https://startssl.com/
參考這篇教程,內容有點過時,但是過程基本一致: http://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協議?隨便一搜(https://muffinresearch.co.uk/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協議,也有其他的一些工具。
官方的工具: https://certbot.eff.org/
以Ubuntu 16.04 為例,安裝:
$ sudo apt-get install python-letsencrypt-apache
使用:
$ sudo letsencrypt --apache
另外灑家用的版本並不能識別/etc/apache2/sites-enabled/里面一個文件多個Virtual Host的情況,所以灑家把它們分成了多個文件,一個文件一個ServerName,就可以識別了。
網絡上的爬蟲和惡意攻擊者
灑家查看日志發現,網絡上有很多亂七八糟的爬蟲和惡意的攻擊者(弱口令攻擊SSH)。
下圖:遠程登錄SSH失敗的:
下圖:網站上線就受到了來自世界各地的HTTP訪問
緩解方法:
/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 http://www.fail2ban.org/wiki/index.php/Main_Page 。有了這個就不用重復制造輪子了。
綁定多個域名
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 服務即可訪問。
總結
經過灑家一番折騰,掛上很多實驗的網站,加上favicon.ico,最后弄出個花花綠綠的手機頁面。
代理服務器
有時候灑家用手機不方便科學上網,一台代理配上自己搞的代理自動配置(英語:Proxy auto-config,簡稱PAC)是極好的。
灑家使用了某敵對勢力做的某知名軟件的Linux版,監聽0.0.0.0
隨時隨地想翻就翻。感覺灑家的手機翻牆瞬間方便了很多。
自動ban HTTP訪問的IP
2016年10月7日 Update
各位小朋友亂開掃描器是不好的行為。灑家又造了個輪子:
這個腳本的原理和上文提到的禁止ssh爆破的腳本相同,都是利用inotify監控日志文件,發生變動的時候讀取、分析日志,屏蔽IP。