Move to Linode

在使用了20天Scriptogr.am後我表示對這個服務感到很失望。於是開始著手將博客搬到Linode上,以下是前者給我留下的深刻印象:

基於以上這些原因我把博客搬到了Linode, 現在用的是Linode 1GB (1GB RAM, 8 CPU, 24GB Storage, 2TB Transfer), 機房在Atlanta, GA, USA.

Linode
Linode home page

因為只是放一個靜態博客所以網站內容的遷移相對容易,下面是我配置VPS過程中作的筆記。

系統選擇的是Ubuntu 12.04 LTS 32 bit, 因為我本地用的是Mac所以就用Terminal ssh到我的服務器,Windows上可以用putty.

升級系統

aptitude update
aptitude upgrade

時間設置

為服務器校準時區

dpkg-reconfigure tzdata

按步驟設置完後可以輸入date來確認。

設置hostname

服務器最初的名字就是localhost, 這個名字可以隨意更改,方法很簡單,我寫的是r2d2,不要問我為什麼。

echo "r2d2" > /etc/hostname
hostname -F /etc/hostname

改完之後名字不會直接顯示在命令行裡,不過可以輸入hostname來確認是否更改成功。如果更改成功,新的hostname的會在下次登陸服務器時顯示。

編輯hosts文件

cd/etc目錄下,用nano或者vim來編輯hosts文件

127.0.0.1          localhost
127.0.1.1 r2d2
your server ip example.com

這樣以後登陸服務器就可以直接輸入ssh example.com

添加用戶

因為root用戶的權限很大,可以在服務器上讀/寫/執行任何文件。所以從安全方面考慮建議另建一個普通權限的帳號來用作day-to-day帳號。

adduser foo
# 這裡可以用任何名稱

把新添加的用戶部署到sudoers用戶組中

usermod -a -G sudo foo

以後如果需要執行root權限的命令時只要在命令前加上sudo就可以執行。

設置SSH密匙

每次登陸SSH都要輸入密碼有點麻煩,其實只要在自己的電腦上生成一個SSH key後就可以省去每次輸入密碼的這個步驟。

SSH key需要在本地端生成,所以先exitVPS. 在terminal裡輸入

ssh-keygen -t rsa -C "foo@example.com"
# 這裡用你自己的email地址

保存在默認路徑下就好。在Mac裡可以把密碼保存在keychain裡以免重複輸入,所以建議使用複雜一點的密碼來加密ssh key.

新生成的ssh key分public和private兩部分,把private那一個留在本地電腦上,public那個上傳至服務器,這樣服務器就會允許含有private key的那台電腦直接訪問服務器。

scp ~/.ssh/id_rsa.pub foo@example.com:
# 用戶名和服務器地址請自行更改

登陸VPS, 輸入以下命令:

mkdir .ssh
mv id_rsa.pub .ssh/authorized_keys
chown -R foo:foo .ssh
# 把foo改為你自己的用戶名
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

完成以後exit然後輸入

ssh foo@example

就可以直接登陸了。

禁用root和修改SSH端口

添加完新用戶後需要禁止root用戶登陸服務器,原因是Ubuntu服務器都會有一個root用戶可以通過端口22來登陸服務器,於是一些針對服務器的攻擊就是通過反覆嘗試的方式來暴力破解root用戶的密碼。禁用root登陸以及修改SSH端口可以有效的防止這種攻擊的威脅。現在來編輯sshd_config文件。

sudo nano /etc/ssh/sshd_config

找到Port設置為0-1024之間任何一個數字,關於為什麼端口號碼要 <1024 可以看 Stackexchange 上的詳細討論。找到PermitRootLogin yes 改為 no 保存修改然後重啓ssh

sudo service ssh restart

再次登陸的時候需要用到剛才新修改的端口號和新建的用戶名。

ssh foo@example.com -p xxxx
# xxxx是修改後的端口號

安裝配置Nginx

關於Apache和Nginx的選擇我不在這裡做過多討論,選擇Nginx是因為它在處理靜態文件時的表現較優。

安裝:

sudo aptitude install nginx
sudo service nginx start

這個時候你打開你的網站應該就可以看到Welcome的字樣了。說明Nginx已經開始正常工作了。

配置

Nginx的配置對於n00b來說真的很蛋疼,nginx.conf我沒有做過多的更改,只是配置了gzip

gzip  on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_types text/plain text/html text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

網站conf文件的配置我比較偷懶直接修改了/etc/nginx/sites-available/裡的default文件

server  {
        listen       80;
        server_name  localhost;

location / { root /var/local/example.com/; index index.html; autoindex on; }

location /post/ { alias /var/local/example.com/post/; index index.html; autoindex on; }

error_page 500 502 503 504 /50x.html; location = /50x.html {

配置完之後 sudo service nginx restart.

安全設置

安裝 Fail2Ban 來禁掉一些嘗試字典攻擊ssh(反覆嘗試登陸)的IP地址。安裝:

sudo aptitude install fail2ban

配置,需要將[ssh-ddos]裡的 enable 設置為 true , port 改為前面修改的端口地址。也將[ssh]裡面的 port 也改為修改後的端口地址。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

改完之後保存重啓Fail2Ban

sudo service fail2ban restart

安裝防火牆

iptables是Linux系統中的核心防火牆。通過建立rules file可以限制一些未經允許的網絡訪問。

sudo iptables -L
sudo nano /etc/iptables.firewall.rules
xxxx 修改為前面設置的端口號

把下面的規則添加到新建的firewall.rules中,該文件允許了HTTP (80), HTTP (443) SSH xxxx 這幾個端口的訪問。

*filter

# Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allow ports for testing
-A INPUT -p tcp --dport 8080:8090 -j ACCEPT

# Allow ports for MOSH (mobile shell)
-A INPUT -p udp --dport 60000:61000 -j ACCEPT

# Allow SSH connections# The -dport number should be the same port number you set in sshd_config
-A INPUT -p tcp -m state --state NEW --dport xxxx -j ACCEPT

# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

激活新的防火牆規則:

sudo iptables-restore < /etc/iptables.firewall.rules

查看防火牆的部署:

sudo iptables -L

另外如果我們需要防火牆規則在開機時自動激活還需要新建一個腳本:

sudo nano /etc/network/if-pre-up.d/firewall

寫入以下代碼:

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.firewall.rules

更改腳本權限:

sudo chmod +x /etc/network/if-pre-up.d/firewall

自動reboot服務器

VPS有時會出現內存耗盡的問題,這時就需要重啓服務器。在/etc/sysctl.conf中加入下面兩行代碼就可以讓服務器在內存耗盡的時候自動reboot

vm.panic_on_oom=1
kernel.panic=10

這樣服務器就會在開始panic 10秒後自動重啓。

sudo命令記錄

我裝了一個MTA服務sendmail來把所有使用過的sudo命令自動發送到我的郵箱裡。同時在郵箱裡設置了一個filter來過濾這些郵件,只在需要查看時訪問。

sudo nano /etc/sudoers.d/my_sudoers

在文件中添加

Defaults    mail_always
Defaults mailto="foo@example.com"
# 替換為你自己的郵箱

替文件設置權限

sudo chmod 0440 /etc/sudoers.d/my_sudoers

安裝sendmail:

sudo aptitude install sendmail

也許有點多餘,不過這樣就有了sudo命令的使用日誌。

Linode rocks!

博客搬來Linode後速度有了顯著的提升。如果你看了這篇日誌後也考慮開始使用Linode, 歡迎使用我的購買鏈接

Happy hacking >_