幫 Dovecot 手動加上 Logrotate

安裝了收信套件 dovecot,記錄檔案在 /var/log/dovecot.log,但卻發現這個記錄檔案異常的大,原來 LogRotate 沒有把這個檔案做處理,所以任由它增大下去,所以只好手動幫 dovecot 寫一個 Logrotate 的腳本。

先到 /etc/logrotate.d 目錄底下

# cd /etc/logrotate.d
# touch dovecot
# nano dovecot

然後編輯這個檔案,寫上

/var/log/dovecot*.log {
  weekly
  missingok
  copytruncate
  rotate 7
  compress
  notifempty
  sharedscripts
  postrotate
  if [ -f /var/run/dovecot/master.pid ]; then \
    /etc/init.d/dovecot reload > /dev/null 2>&1 || true ; \
  fi;
  endscript
}

存檔,這樣系統就可以自動每週幫 /var/log/dovecot.log Logrotate 一次了。如果要測試一次,可以手動讓 logrotate 執行一次

# logrotate -vf /etc/logrotate.conf

這樣就可以知道這個腳本是否有正確運行。

/proc/sys/net目錄解說

所有的TCP/IP的參數都位於/proc/sys/net虛擬目錄下(請注意,對/proc/sys/net目錄下內容的修改都是臨時的,任何修改在系統重啟後都會丟失)。

參數(路徑) 描述 默認值 優化值
/proc/sys/net/core/rmem_default 默認的TCP資料接收窗口大小(位元組)。 229376 256960
/proc/sys/net/core/rmem_max 最大的TCP資料接收窗口(位元組)。 131071 513920
/proc/sys/net/core/wmem_default 默認的TCP資料發送窗口大小(位元組)。 229376 256960
/proc/sys/net/core/wmem_max 最大的TCP資料發送窗口(位元組)。 131071 513920
/proc/sys/net/core/netdev_max_backlog 在每個網路接口接收資料包的速率比核心處理這些包的速率快時,允許送到隊列的資料包的最大數目。 1000 2000
/proc/sys/net/core/somaxconn 定義了系統中每一個通訊埠最大的監聽隊列的長度,這是個全局的參數。 128 2048
/proc/sys/net/core/optmem_max 表示每個套接字所允許的最大緩衝區的大小。 20480 81920
/proc/sys/net/ipv4/tcp_mem 確定TCP緩衝區應該如何反映記憶體使用,每個值的單位都是記憶體頁(通常是4KB)。第一個值是記憶體使用的下限;第二個值是記憶體壓力模式開始對緩衝區使用應用壓力的上限;第三個值是記憶體使用的上限。在這個層次上可以將封包丟棄,從而減少對記憶體的使用。對於較大的BDP可以增大這些值(注意,其單位是記憶體頁而不是位元組)。 94011 125351 188022 131072 262144 524288
/proc/sys/net/ipv4/tcp_rmem 為自動調優定義socket使用的記憶體。第一個值是為socket接收緩衝區分配的最少位元組數;第二個值是默認值(該值會被rmem_default覆蓋),緩衝區在系統負載不重的情況下可以增長到這個值;第三個值是接收緩衝區空間的最大位元組數(該值會被rmem_max覆蓋)。 4096 87380 4011232 8760 256960 4088000
/proc/sys/net/ipv4/tcp_wmem 為自動調優定義socket使用的記憶體。第一個值是為socket發送緩衝區分配的最少位元組數;第二個值是默認值(該值會被wmem_default覆蓋),緩衝區在系統負載不重的情況下可以增長到這個值;第三個值是發送緩衝區空間的最大位元組數(該值會被wmem_max覆蓋)。 4096 16384 4011232 8760 256960 4088000
/proc/sys/net/ipv4/tcp_keepalive_time TCP發送keepalive探測消息的間隔時間(秒),用於確認TCP連接是否有效。 7200 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 探測消息未獲得響應時,重發該消息的間隔時間(秒)。 75 30
/proc/sys/net/ipv4/tcp_keepalive_probes 在認定TCP連接失效之前,最多發送多少個keepalive探測消息。 9 3
/proc/sys/net/ipv4/tcp_sack 啟用有選擇的回應(1表示啟用),通過有選擇地回應亂序接收到的封包來提高性能,讓發送者只發送丟失的封包段,(對於廣域網通信來說)這個選項應該啟用,但是會增加對CPU的佔用。 1 1
/proc/sys/net/ipv4/tcp_fack 啟用轉發回應,可以進行有選擇回應(SACK)從而減少擁塞情況的發生,這個選項也應該啟用。 1 1
/proc/sys/net/ipv4/tcp_timestamps TCP時間戳(會在TCP包頭增加12個位元組),以一種比重發超時更精確的方法(參考RFC 1323)來啟用對RTT 的計算,為實現更好的性能應該啟用這個選項。 1 1
/proc/sys/net/ipv4/tcp_window_scaling 啟用RFC 1323定義的window scaling,要支持超過64KB的TCP窗口,必須啟用該值(1表示啟用),TCP窗口最大至1GB,TCP連接雙方都啟用時才生效。 1 1
/proc/sys/net/ipv4/tcp_syncookies 表示是否打開TCP同步標籤(syncookie),核心必須打開了CONFIG_SYN_COOKIES項進行編譯,同步標籤可以防止一個套接字在有過多試圖連接到達時引起過載。 1 1
/proc/sys/net/ipv4/tcp_tw_reuse 表示是否允許將處於TIME_WAIT狀態的socket(TIME_WAIT的通訊埠)用於新的TCP連接 。 0 1
/proc/sys/net/ipv4/tcp_tw_recycle 能夠更快地回收TIME_WAIT套接字。 0 1
/proc/sys/net/ipv4/tcp_fin_timeout 對於本端斷開的socket連接,TCP保持在FIN_WAIT_2狀態的時間(秒)。對方可能會斷開連接或一直不結束連接或不可預料的行程死亡。 60 30
/proc/sys/net/ipv4/ip_local_port_range 表示TCP/UDP協議允許使用的本地通訊埠號 32768 61000 1024 65000
/proc/sys/net/ipv4/tcp_max_syn_backlog 對於還未獲得對方確認的連接請求,可保存在隊列中的最大數目。如果伺服器經常出現過載,可以嘗試增加這個數字。 2048 2048
/proc/sys/net/ipv4/tcp_low_latency 允許TCP/IP緩衝區適應在高吞吐量情況下低延時的情況,這個選項應該禁用。 0
/proc/sys/net/ipv4/tcp_westwood 啟用發送者端的擁塞控制算法,它可以維護對吞吐量的評估,並試圖對頻寬的整體利用情況進行優化,對於WAN 通信來說應該啟用這個選項。 0
/proc/sys/net/ipv4/tcp_bic 為快速長距離網路啟用Binary Increase Congestion,這樣可以更好地利用以GB速度進行操作的鏈接,對於WAN通信應該啟用這個選項。 1

在 CubieTruck 上如何增加 Apache 和 MySQL 連結數目

這台 CubieTruck 剛安裝完 Ubuntu 之後才發現,即便 Ubuntu 伺服器版本,Apache 預設最大連結數目只有 100 個, 資料庫 MySQL 只有 50 個。換言之,只能支援最多 50 個人同時可以同時查詢 MySQL。老實說,我不知道這台 CubieTruck 的能耐倒底到哪裡,同時50個人查詢會不會造成問題,我只是覺得有點少,所以打算把這個數目增加到 100 個。

Apache 的設定在 /etc/apache2/apache2.conf 檔案裡面

# nano /etc/apache2/apache2.conf

修改這一行

MaxKeepAliveRequests 100

MySQL 的設定在 /etc/mysql/my.cnf 檔案裡面

# nano /etc/mysql/my.cnf

然後找到這一行改為

max_connections = 100

然後重啟兩個服務即可

# service apache2 restart
# service mysql restart

這些數值僅供參考,作為一台伺服器,同時提供 200 人服務應該是沒有什麼問題才是。

如何縮短網路連結關閉時間

我們使用 netstat 指令觀看網路連結時候,常常會看到一堆 TIME_WAIT 的 socket 等待被關閉,而這些 socket 必須等待一段時間後才會被釋放重新被使用,底下是一張 TCP 完整的機制圖(state machine)。

1

一般而言,網路 socket 關閉時比建立時還要複雜很多,原因很多,其中一個是等待 keepalive 再次送訊息來,但是事實上很多時候 socket 是可以被關閉了,所以會有很多 TIME_WAIT 的 socket 殘留在系統中,這一篇我們來說說怎麼修改這些時間,縮短時間,好讓這些 socket 被釋放讓系統可以重新使用。

在 Linux 裡面,這些參數都不是寫死在系統裡面,相反的而是在 /proc/sys/net/ipv4 虛擬檔案目錄裡面,在 /etc/sysctl.conf 裡面可以有其對應的數值,只要修改這個數值,socket 結束的等待時間就可以被改變了。

# nano /etc/sysctl.conf

在檔案後面增加

net.ipv4.netfilter.ip_conntrack_generic_timeout = 120
net.ipv4.tcp_tw_recycle = 1 ; socket 可以重新被使用
net.ipv4.tcp_tw_reuse = 1 ; socket 可以重新被使用
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.tcp_keepalive_intvl = 30 ; 預設值是75,建議在15-30秒內
net.ipv4.tcp_keepalive_probes = 5 ; 預設值是9,建議可以試探5次即可。
net.ipv4.tcp_timestamps = 0 
net.ipv4.tcp_sack = 1 
net.ipv4.tcp_window_scaling = 1

這些數值都是可以修改的,是有關於 socket 的狀態時限的。修改完可以輸入下面命令立刻生效。重新開機後也會自動被載入。

# sysctl -p

注意:每個系統都有其獨特性,所以上面數值僅供參考。一般而言,我們當伺服器的話,當然希望無用的 socket 趕快結束重新可以被使用,相反的如果是當做桌機,這些數值就沒有那麼敏感了。

如何增大 Apache 上傳檔案大小限制

之前架設 ownCloud 時,雖然 ownCloud 已經把上傳檔案大小限制改為 512MB,但是有時候還是上傳不了,後來查了一下原來在 PHP5裡面是有限制的,必須修改一下,設定檔案在 /etc/php5/apache2/php.ini 裡面。

# nano /etc/php5/apache2/php.ini

找到下面兩行,改成你要的檔案大小,

upload_max_filesize = 512M ;預設值是 2M
post_max_size= 512M ;預設值是 2M

然後重新啟動 Apache2 服務即可。

# service apache2 restart

如何取消 CubieTruck IPv6 的功能

雖然去年已經正式啟動了 IPv6 的協議,但是這台 CubieTruck 我估計用到除役前,IPv6也還不會流行,所以索性把它給取消了,取消的方法很簡單,在 /etc/ 目錄下的 sysctl.conf 有一些設定

# nano /etc/sysctl.conf

在這個檔案後面增加

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.br0.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.wlan0.disable_ipv6 = 1

然後再命令中輸入

# sysctl -p

讓它立刻生效即可!然後在 /etc/modprobe.d 目錄下編輯 blacklist.conf 檔案

# nano /etc/modprobe.d/blacklist.conf

然後在檔案後面增加一行

blacklist ipv6

然後重新開機方能生效。如果要查看是否真的取消 IPv6功能,則可以在命令列輸入

# ip a | grep inet6

如果沒有任何輸出文字,那就代表你真的取消了 IPv6 的功能了。

CubieTruck簡易式阻擋DDoS防禦方式

DDoS是一種討厭的攻擊方式,駭客會在短時間內利用建立新連線方式阻擋他人連線的一種攻擊手法。這種攻擊手法相當難防禦,殊不見各大Server常常碰到此類型跳板式的DDoS攻擊,所以這裡用iptables做一個最簡易的防禦方式。

iptables -N WEB_SRV_DOS
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j WEB_SRV_DOS
iptables -A WEB_SRV_DOS -p tcp --syn -m multiport --dports 80,443 -m recent --rcheck --second 20 --hitcount 100 -j LOG --log-prefix "[Possible DOS Attack]"
iptables -A WEB_SRV_DOS -p tcp --syn -m multiport --dports 80,443 -m recent --rcheck --second 20 --hitcount 100 -j REJECT
iptables -A WEB_SRV_DOS -p tcp --syn -m multiport --dports 80,443 -m recent --set
iptables -A WEB_SRV_DOS -p tcp -m multiport --dports 80,443 -j ACCEPT

上面這段會把80/443(HTTP/HTTPS)Port新連線記錄下,最近20秒內如果想要建立連線超過100次,則會記錄下來並且丟棄封包進而阻擋DoS,因為  hitcount 超過 20,所以請參考這一篇文章來加大 xt_recent 的數值,以方便偵測。

如何限制CubieTruck對某個IP對HTTP Port只能有一定量的連線數目

CubieTruck是一台很小的伺服器,裡面的配備與資源相當陽春,所以經不起很多人同時連線,更遑論要阻擋DDoS了,所以我打算要用 iptables 來限制某個IP對HTTP/HTTPS Port只能有限定數量的連線,超過這個數目就丟棄封包不理會,算是一種最陽春的DDoS的阻擋了吧!

HTTP 80 Port,只要同一個IP超過10個連線就丟棄封包。

iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT

HTTPS 443 Port,只要同一個IP超過10個連線就丟棄封包。

iptables -I INPUT -p tcp --dport 443 -m connlimit --connlimit-above 10 -j REJECT

但如果你的 Apache 服務器掛載很多種引擎,例如 ownCloud私有雲,常用來上傳和下載檔案,那這個數字 10 要自己拿捏好,不要阻擋了自己合法連線而拖慢速度。

另外,還有一點必須考量的是,這個被限制的IP位址可能是某個Proxy Server的IP位址,意味著Proxy Server後面可能有很多的電腦在後面,那麼10個連線就有點太少了。

如何在 Ubuntu 系統下微調網路參數

現在台灣光纖到府(FTTH/FTTB)十分普遍,雙向100M也不是天方夜譚了,所以理論上在網路傳送上可以採用比較大的緩衝區來傳遞,但是 Ubuntu 的預設值是給普羅大眾使用的,一般人可能是用 ADSL,或是更慢的撥接上網,所以 Ubuntu 在傳送的預設值是 128KB。因為筆者的網路是光纖到府,所以我就微調一下這些數值為512KB,讓傳送可以快一點。 但是理論上必須根據你自己的網路頻寬去做調整,我這裡只是作個筆記,把我自己的設定值列出來而已,並不對裡面的數值作任何解釋,而且也許會對你的系統造成副作用。 這個參數檔案在 /etc/sysctl.conf 裡面,

# nano /etc/sysctl.conf

在這個檔案後面加入

net.core.rmem_default = 524288 # default is 163840 
net.core.rmem_max = 524288 # default is 131071
net.core.wmem_default = 524288 # default is 163840
net.core.wmem_max = 524288 # default is 131071
net.ipv4.tcp_wmem = 4096 87380 524288 # default is 4096 16384 4194304
net.ipv4.tcp_rmem = 4096 87380 524288 # default is 4096 87380 6165056

然後輸入

# sysctl -p

就可以立刻生效,如果要看是否有設定成功可以輸入

# sysctl -a | grep rmem

看看數值是否是自己設定的數值相符合。

如何在 Ubuntu 下使用 mod_evasive 防止 Apache HTTP的DDoS

DDoS是一種阻斷式攻擊,可以在短時間內透過大量的連線來妨礙其他人無法取得伺服器的服務,對於一個伺服器來說,這是一場夢靨。幸好,Apache2有一個 mod_evasive 套件可以幫你阻絕 DDoS,並且擁有大量的數值可以讓你微調。

首先我們可以透過 apt-get install 來安裝此套件。

# apt-get install libapache2-mod-evasive

安裝完之後在 /etc/apache2/mods-enabled 目錄下多出兩個檔案,evasive.confevasive.load檔案,尤其evasive.conf是可以微調這些選項的組態檔案,內容為:

選項 解釋
DOSHashTableSize 處理雜湊表的大小,越大所需記憶體越大,需根據網站流量狀況來設定,建議流量越大,此數值就需要越大。
DOSPageCount 在DOSPageInterval所設定的時間內,同一個來源 IP 位址 存取同一個頁面的最大存取次數。
DOSSiteCount 在DOSSiteInterval所設定的時間內,同一個來源 IP 位址可同時發出 HTTP 存取的最大次數。
DOSPageInterval 設定 DOSPageCount 的時間區段,以秒為單位。
DOSSiteInterval 設定 DOSSiteCount 的時間區段,以秒為單位。
DOSBlockingPeriod 當某一IP 位址違反上述的DOSPageCount/DOSPageInterval或DOSSiteCount/DOSSiteInterval,將被block的秒數。
DOSmailNotify 管理者的 Email 位址,當有某個IP位址被阻斷時,會寄發警告信至此信箱中。
DOSSystemCommand 當發現有疑似攻擊,立即自動執行的指令。
DOSLogdir mod_evasive 的記錄檔位置,如果沒設定此值,預設存放記錄 的目錄為 /tmp。當有疑似攻擊時,會在該目錄下新增一個 dos_[ip] 的檔案。

然後把 /etc/apache2/mods-enabled/evasive.conf檔案的#去除掉之後填上自己所需要的數值,然後重新啟動 apache2 服務即可。

# service apache2 restart

但是要注意,如果你自己也安裝 ownCloud 私有雲的話,很有可能系統 ownCloud 會在短時間內上傳或是下載小的檔案,這就有可能會被 mods-evasive誤認為是一種DDoS行為而拒絕服務,所以裡面的數值自己要拿捏好,不然可能自己的 ownCloud 這一類程式會運作不正常。