Recent Articles / Archives

Linux 掛載 Freebsd UFS 分割區

今日想將一台 Freebsd 的主機硬碟掛載到 Linux 下,原本以為很簡單,但用 mount 指令出現錯誤,即是指定了 filesystem 類型也一樣。

google 了一下,發現原來只可以掛載成 read only,假設 ufs 分割區為 /dev/sdc1,以下是在 Ubuntu 下掛載 UFS 分割區的方法:

sudo mkdir /mnt/ufsdisk
sudo mount -t ufs -r -o ufstype=ufs2 /dev/sdc1 /mnt/ufsdisk
August 3, 2010 · Linux / BSD 筆記 · No Comments Yet

Linux: 將檔案的 Tabs 字元用空白取代

在 Linux 下有一個工具 “expand”,它可以將檔案內所有 tabs 字元轉換為空白字元, 用法如下:

expand input.file > output.file
expand data.txt > output.txt
expand -t 2 data.txt > output.txt

上面第三行的參數 -t 是定義用多少個空白字元取代 tabs。而另一個工具 “unexpand” 則與 “expand” 剛剛相反, 是將空間字元轉換為 tabs 字元。

March 11, 2010 · Linux / BSD 筆記 · No Comments Yet

Ubuntu - Firefox 的 Flash 亂碼問題

在 Google 找了一下,應該是 /etc/fonts/conf.d/49-sansserif.conf 出問題,只要將檔案移除或移到其他地方就可以:

sudo mv /etc/fonts/conf.d/49-sansserif.conf /etc/fonts/conf.d/49-sansserif.conf.bak

輸入以上指令後,只要重新啟動 Firefox,就可以看到問題解決了。

March 5, 2010 · Linux / BSD 筆記 · Comments (1)

vi 方向鍵及 backspace 的問題

在 Ubuntu 上面有時編輯一些設定檔時會直接用 vi 來做,但預設安裝 Ubuntu 後用 vi 開啟檔案,會發覺方向鍵及 backspace 鍵不能使用,解法方法是在家目錄建立 .vimrc 檔案,然後加入以下內容:

set nocompatible
set backspace=2

儲存檔案後離開,下次使用 vi 開啟檔案就可以使用方向鍵及 backspace 了。

March 5, 2010 · Linux / BSD 筆記 · No Comments Yet

Linux: 操作包含特殊字元的檔案

在 Unix 或 Linux 下很多特殊字元也是指令的一部份,例如空格 (” “)、問號 (”?”) 及橫線 (”-”) 等。所以如果檔案名稱包含了一些特殊字元,在操作上便會出現錯誤,例如:

# touch -foo.txt
touch: invalid option — ‘o’
Try `touch –help’ for more information.
# touch –foo.txt
touch: unrecognized option ‘–foo.txt’
Try `touch –help’ for more information.

上面輸入了兩行指令,分別用 touch 建立檔案 “-foo.txt” 及 “–foo.txt”,但同樣發生錯誤。要解決這個問題,只要在指令後面加上兩個橫線 “–” 即可,例如:

# touch — –foo.txt
# touch — -foo.txt

而這個方法同樣可以在其他檔案操作指令使用,例如 cp, mv, rm, rmdir。

以下是 cp 及 mv 的用法:

cp - - ‘-foo.txt’ /path/to/dest
mv - - ‘-foo.txt’ /path/to/dest

February 22, 2010 · Linux / BSD 筆記 · No Comments Yet


執行 sudo 時電郵通知

sudo 提供了簡單的方法追蹤執行紀錄,其中一項就是當透過 sudo 執行 指令時發送電郵到指定電郵地址,方法如下:

1. 開啟 sudo 的設定檔:
visudo

2. 加入下面兩行:

mailto “admin@localhost”
mail_always on

mailto 後面是設定發送電郵通知的地址。
mail_always 預設是 off,開啟後會在每次執行 sudo 後發出電郵通知。

February 19, 2010 · Linux / BSD 筆記 · No Comments Yet

Iptables 限制每個 ip 連線數

如果在 Linux 下要限制每個 ip 的連線數,可以透過 iptables 實現。詳細指令語法如下:

/sbin/iptables -A INPUT -p tcp –syn –dport 22 -m connlimit –connlimit-above 3 -j REJECT
限制每個 ip 只可以有 3 個 ssh 連線 (預設 ssh 使用 port 22)。

/sbin/iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 20 -j REJECT –reject-with tcp-reset
只接受每個 ip 20 個 http 連線 (httpd.conf 裡面的 MaxClients 預設是 60)。
要留意的是,這個設定可能會把 proxy servers 阻隔,因為每個 proxy servers 可能會建立大量的連線。

Skip proxy server IP 1.2.3.4 from this kind of limitations:

/sbin/iptables -A INPUT -p tcp –syn –dport 80 -d ! 1.2.3.4 -m connlimit –connlimit-above 20 -j REJECT –reject-with tcp-reset
這句的作用跟上面語法一樣,只是把已知的 proxy server (1.2.3.4) 給開通,避免阻隔 proxy servers 的連線。

In this example, limit the parallel http requests to 20 per class C sized network (24 bit netmask)

/sbin/iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 20 –connlimit-mask 24 -j REJECT –reject-with tcp-reset
這個是限制同一個 class C 網絡同時建立 20 個連線。

如果想把在指定時間內建立過多連線的 ip 阻隔,這便要編輯 iptables 的 shell script。
以下例子會阻隔在 100 秒內建立多於 10 個 http 連線的 ip

#!/bin/bash
IPT=/sbin/iptables
# Max connection in seconds
SECONDS=100
# Max connections per IP
BLOCKCOUNT=10
# ….
# ..
# default action can be DROP or REJECT
DACTION=”DROP”
$IPT -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –set
$IPT -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –update –seconds ${SECONDS} –hitcount ${BLOCKCOUNT} -j ${DACTION}
# ….
# ..

要儲存 iptables 的修改可以查看 iptables-save 的 man page,在 redhat 下是用以下指令:
service iptables save

February 18, 2010 · Linux / BSD 筆記 · No Comments Yet

ProFTPd 登入援慢問題

在安裝 ProFTPd 後,會發覺登入時非常援慢,但只要登入成功後,速度就會變得很暢順。

造成這個問題的原因是 ProFTPd 預設在登入時會做「反查」的動作,解決方法是將 ProFTPd 設定為不做「反查」。方法如下:

1. 開啟 proftpd.conf,一般上檔案位置會是 /etc/proftpd.conf 或 /usr/local/etc/proftpd.conf

2. 加入以下兩行:

UseReverseDNS off
IdentLookups off

3. 重新啟動 ProFTPd。

February 10, 2010 · Linux / BSD 筆記 · No Comments Yet

Linux 系統管理電子書

The Free Technology Academy (FTA) 釋出一本免費電子書 “The GNU/Linux operating system“,內容主要圍繞系統管理,例如如何安裝及設定多種不同的伺服器及優化系統等。

官方網站介紹:

The GNU/Linux systems have reached an important level of maturity, allowing to integrate them in almost any kind of work environment, from a desktop PC to the sever facilities of a big company.

In the module called “The GNU/Linux operating system”, the main contents are related with system administration. This book is the main documentation for the module.

書本資料:

* Authors: Remo Suppi Boldrito, Josep Jorba Esteve
* Coordinator: Josep Jorba Esteve
* Licenses: GNU Free Documentation License, Creative Commons Attribute ShareAlike License
* Information: 545 Pages; 18.8 Mb
* Download PDF version

February 9, 2010 · Linux / BSD 筆記 · No Comments Yet

netstat 檢查不尋常連線

netstat 是一個十分好用的網絡管理工具,而其中一個用途是查看不尋常連線,例如當一個 IP 發送大量連線到伺服器,那麼伺服器很大機會是否遭受 DoS 或 DDoS 攻擊。

以下是一些實用的 netstat 語法,可以檢查主機的連線數量:

netstat -na
顯示主機上所有已建立的連線。

netstat -an | grep :80 | sort
顯示所有 port 80 的連線,並把結果排序。

netstat -n -p|grep SYN_REC | wc -l
列出主機上有多少個 SYNC_REC,一般上這個數字應該相當低。

netstat -n -p | grep SYN_REC | sort -u
同樣是列出 SYNC_REC,但不只列出數字,而是將每個 SYNC_REC 的連線列出。

netstat -n -p | grep SYN_REC | awk ‘{print $5}’ | awk -F: ‘{print $1}’
列出發送 SYNC_REC 的所有 ip 地址。

netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
計算每一個 ip 在主機上建立的連線數量。

netstat -anp |grep ‘tcp\|udp’ | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
列出從 TCP 或 UDP 連線到主機的 ip 的數量。

netstat -ntu | grep ESTAB | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr
列出每個 ip 建立的 ESTABLISHED 連線數量。

netstat -plan|grep :80|awk {’print $5′}|cut -d: -f 1|sort|uniq -c|sort -nk 1
列出每個 ip 建立的 port 80 連線數量。

February 9, 2010 · Linux / BSD 筆記 · No Comments Yet


Linux/FreeBSD 不能辨認新安裝程式

如果在 Linux 或 FreeBSD 透過自行編譯安裝程式,系統不會立即辨認到新的程式,即是不可以只輸入程式的檔案名稱,要鍵入程式的絕對路徑才可以執行。

這個問題是因為系統為了改善效能,會將存放程式的目錄加入快取。如果想更新快取,可以執行以下指令:

# hash -r

如果是 CSH 的話,便要輸入:
# rehash

September 7, 2009 · Linux / BSD 筆記 · No Comments Yet

FreeBSD 新增/更改用戶密碼 Shell Script

在 FreeBSD 下可以用以下非互動方法新增用戶或修改用戶密碼:

新增使用者: (使用者名稱為 new_user,密碼為 new_pass)

# echo topSecrete | pw add user vivek -h 0

更改現有使用者密碼:

# echo newPassword | pw mod user user_name -h 0

只要用以上指令,便可以編寫新增及更改用戶密碼的 shell script。

編寫只給特定用戶執行的 shell script

在編寫了一些 shell script 並打算只給予特定用戶執行,可以先取得用戶的 user id,或者直接用 whoami 指令檢查使用者名稱,例如:

if [ $(whoami) = "samtang" ]
then
   # 執行程式碼
else
   echo "You cannot run this script."
   exit 0
fi

如果在另一個情況下,不容許特定用戶執行,可以這樣寫:

if [ $(whoami) = "root" ]
then
   echo "You cannot run this script."
   exit 1
fi

Apache 防止 DDoS 攻擊

DDoS (distributed denial-of-service) 及 DoS (denial-of-service) 在網路上十分常見,而 DoS 攻擊所傳送的請求跟正常的請求一樣,分別在於每秒鐘發出大量請求到伺服器,使伺服器的負載增加,最常見的情況是伺服器暫停服務。

而 mod_evasive 則是一個預防 Apache 遭受 DDos 攻擊的模組,可以防止同一個 IP 對相同 URI 發出的大量請求,可設定的選項有:

– 限制同一個 IP 在一定秒數內請求一個頁面或檔案的次數。
– 限制同一個 IP 一秒內只可發出 50 個請求。
– 設定被禁止的 IP 封鎖時間。

以下是 mod_evasive 的安裝方法:

1. 先將原來的 httpd.conf 備份起來。

2. 到 http://www.zdziarski.com/projects/mod_evasive/ 下載 mod_evasive。

3. 在指令模式解壓及編譯 mod_evasive:

tar zxvf mod_evasive_1.10.1.tar.gz
cd mod_evasive/
apxs -cia mod_evasive20.c

以上的 apxs 會放在 Apache 的 bin 目錄內;如果 Apache 版本是 1.3 的話,指令要改為:

apxs -cia mod_evasive.c

安裝好 mod_evasive 後,便要修改 httpd.conf 內容。

4. 開啟 httpd.conf,加入以內容:

DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
DOSBlockingPeriod 600

DOSHashTableSize — 這是佔用記憶體的大小,如果伺服器比較繁忙,這個數值要設定大一點。
DOSPageCount — 同一 IP 在一個時段內可以存取同一頁面的次數,超過會被禁止。
DOSSiteCount — 同一 IP 在一個網站內可以佔用多少 Object,超過會禁止。
DOSPageInterval — DOSPageCount 內的時段設定。
DOSSiteInterval — DOSSiteCount 的時間設定,以秒為單位。
DOSBlockingPeriod — 當發現疑似攻擊後,使用者會收到 403 Forbidden,這是設定封鎖的時間,以秒為單位。

5. 最後重新啟動 Apache 即可。

March 4, 2009 · Linux / BSD 筆記 · No Comments Yet

提高 Apache 的 MaxClients 選項

如果碰到網頁伺服器突然變慢,然後網頁服務停止,在 apache 的 error log 找到以下語句:

[error] server reached MaxClients setting, consider raising the MaxClients setting

那麼就是 Apache 超過最大連線數,如果是 Apache 2.0 的話便不用重新編譯,只要開啟 httpd.conf 修改 MaxClients 選項。


StartServers 10
MinSpareServers 10
MaxSpareServers 15
MaxClients 200
MaxRequestsPerChild 10000

完成後重新啟動 Apache 即可。

February 27, 2009 · Linux / BSD 筆記 · Comments (1)


  Next Page »