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 需要在本地端生成,所以先 exit VPS. 在 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, 歡迎使用我的購買鏈接

have fun >_