2011年12月26日 星期一

安裝 openwebmail

安裝前先更新清單
$sudo apt-get update


安裝收信套件 Dovecot
$sudo apt-get install dovecot-pop3d

$sudo apt-get install dovecot-imapd

openwebmail 應該只支援 POP3,但是我這裡還是將 IMAP 也裝起來


安裝寄信套件 Postfix
$sudo apt-get install postfix

安裝中會進行設定
 這裡要選擇監視的介面,選擇第 2 項,從網路來的郵件我都接收

 這裡要輸入你的主機的網域名稱

剩下的暫時都使用預設



libmd5-perlowm 這 2 個套件檔案放進系統內,因為這 2 個套件已經不在 Ubuntu 的更新清單中了,所以要自行另外去尋找

安裝 libmd5-perl ( 此為 openwebmail 必要套件 )
$sudo  dpkg libmd5-perl_2.03-1_all.deb

安裝 openwebmail
$sudo  dpkg owm2.53-2.deb

openwebmail 安裝過程會告訴你還少了幾個檔案,這時再用下列指令
$sudo apt-get -f install

系統會自動從網路清單下載缺少的套件

重新開機後輸入 : http://192.1681.10/openwebmail
便可以看見安裝成功的畫面

郵件登入網址 : http://192.168.1.10/cgi-bin/openwebmail/openwebmail.pl

但網址實在是太長了,所以我們要進行更名

修改網址
$sudo nano /etc/apache2/httpd.conf

ScriptAlias /webmail    /usr/lib/cgi-bin/openwebmail/openwebmail.pl

重新啟動 apache
$sudo /etc/init.d/apache2 restart

之後只要輸入 : http://192.1681.10/webmail  就可以進入登入畫面了

Apache 拒絕連線、認證

拒絕連線
$sudo nano /etc/apache2/httpd.conf
                     :
                     :
<Limit GET POST OPTIONS>
       Order allow,deny
       Allow from all
       Deny from 192.168.10.10           --阻擋此 IP 的連線
</Limit>


Apache 認證 ( 需輸入帳號密碼 )
在家目錄的 www 之下建立 .htaccess
$nano .htaccess

AuthName         "Protect by .htaccess"
AuthType           Basic
AuthUserFile  /home/student/apache.passwd        --紀錄帳號密碼的地方
Require  valid-user

$chmod +x .htaccess

執行
$htpasswd -c ~/apache.passwd student

然後輸入 2 次密碼

~/apache.passwd : 紀錄帳號密碼的地方
student : 網頁登入的帳號

到網頁連線 http://192.168.1.10/~student/ 時,就會要求輸入剛剛設定的帳號密碼

Apache 相關設定

指令 ( 檢視相關設定 )
$/usr/sbin/apache2 -V

/etc/apache2/apache2.conf          --紀錄 apache 設定檔的位置

檢視 apache 相關設定檔的設定
$nano /etc/apache2/apache2.conf

Include /etc/apache2/httpd.conf          --主要設定檔

Include /etc/apache2/sites-enabled/      --只給目錄的話它會將目錄下的設定檔全部都讀取


更改預設首頁位置
$sudo nano /etc/apache2/sites-enabled/000-default

/var/www                --設定預設首頁的目錄位置


Apache 的模組功能
$ls /etc/apache2/mods-available/          --這裡放置的是 apache 裡能使用的全部模組

$ls /etc/apache2/mods-available/          --這裡放置的是啟動中的模組

.conf  --設定檔
.load  --模組檔

要啟動模組功能,只要從 mods-available 下,將要啟動的功能的 2 個檔案複製到 mods-available之下就可以啟動了

或是使用指令
$sudo a2enmod userdir       --增加 userdir 這模組

$sudo a2dismod userdir       --刪除 userdir 這模組

製作程式 (網頁看IP、user)

建立檔案
$nano mkhome.sh


echo "<html><head></head><body>" > /var/www/index.html

echo "<pre>" >> /var/www/index.html

/home/student/ipconfig.sh >> /var/www/index.html

/home/student/ug.sh >> /var/www/index.html

echo "</pre>" >> /var/www/index.html

echo "</body></html>" >> /var/www/index.html


修改權限
$chmod +x mkhome.sh




執行程式
$./mkhome.sh

開啟瀏覽器,並輸入首頁網址

http://192.168.1.10

就可以看見執行程式的結果輸出到網頁



備註:在student家目錄下必須要有 ipconfig.sh 、 ug.sh 此執行檔才會生效

檢視使用者名單

建立檔案
$nano ug.sh
   
            u=$( cat /etc/passwd | cut -d ':' -f1 )
            g=$( cat /etc/group | cut -d ':' -f1 )

            echo '[ user ]'
            echo $u

            echo '[ group ]'
            echo $g

增加執行權限
$chmod +x ug.sh

執行檔案
$./ug.sh

撰寫程式 產生10名使用者

建立使用者名單 users.txt

 $touch users.txt

 $nano users.txt

把10名使用者及密碼寫上(可自行設定)

a001:student
a002:student
a003:student
a004:student
a005:student
a006:student
a007:student
a008:student
a009:student
a010:student


編寫自動產生使用者的程式,名字為 useradd.sh

$touch useradd.sh

$chmod +x useradd.sh

$nano useradd.sh

編寫程式如下:

[ ! -f users.txt ] && echo "file not found" && exit 1
 
 
s=$(cat users.txt)
 
 
for  us  in $s
do
    uname=${us%%:*}
 
 
    upasswd=${us##*:}
 
 
    useradd -m -s /bin/bash $uname
    echo "$uname:$upasswd" | chpasswd

    mkdir  /home/$uname/www
    chown "$uname:$uname" /home/$uname/www

    echo "$uname home" >  /home/$uname/www/index.html
    chown "$uname:$uname"  /home/$uname/www/index.html
 
done


執行程式
$sudo ./useradd.sh

Apache 建置各使用者網頁

啟動 Apache 模組功能
$sudo a2enmod userdir

a2 : apache2
en : enable
mod : module


修改 xml 設定檔
$sudo nano /etc/apache2/httpd.conf

由於檔案時空的,所以貼上以下內容

UserDir www   

<Directory /home/*/www>
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec


    # If GET is used it will also restrict HEAD requests. The TRACE method cannot be limited.
    <Limit GET POST OPTIONS>
        Order allow,deny
        Allow from all
    </Limit>


    <LimitExcept GET POST OPTIONS>
        Order deny,allow
        Deny from all
    </LimitExcept>
</Directory>

UserDir www                         --表示網頁目錄是在各使用者家目錄的 www 之下

<Directory /home/*/www>     --將設定使用在 home 下的"所有目錄"下的 www


重新啟動 apache2 才會套用設定
$sudo /etc/init.d/apache2 restart

在使用者家目錄下建立網頁,以 student 這使用者為例 :

$cd /home/student                   --切換目錄
    
$mkdir www                             --建立 www 目錄

$nano /www/index.html           --新增首頁並加入內容

內容輸入 : This is a test for student

連線測試,例如主機 IP 為 192.168.1.10,開啟瀏覽器在網址輸入 :
http://192.168.1.10/~student/

有看見剛剛輸入的文字就成功了

設定 DNS

bind9 設定檔位置
$sudo nano /etc/bind/named.conf 

這裡是告訴你 bind9 的設定檔放置的位置



新增 DNS
$sudo nano /etc/bind/named.conf.local

在下面空白處
zone "obf" {                                           --zone 宣告資料庫,obf 為網域名稱
                type master;                          -- 設定為 master ( Primary )
                file "/etc/bind/db.obf";            --儲存 obf 資料的位置
};


設定 obf 資料
$sudo nano /etc/bind/db.obf         --剛剛設定儲存資料的地方

; BIND data file for local loopback interface

$TTL    1800                                                                          --1800 為 cache 存活時間(秒)
@    IN    SOA     dnsserver.obf.    admin.mail.obf.  (              --SOA為管理者資訊,第一段是
                           1            ; Serial                                               主機名稱,第二段是信箱
                           604800          ; Refresh
                           86400            ; Retry
                           2419200        ; Expire
                           604800  )       ; Negative Cache TTL
;
@              IN             NS            dnsserver.obf.      --@代表本機,這裡 NS 是主機名稱+網域
dnsserver      IN         A          192.168.1.10            --前為主機名稱,後面 A 為 主機 IP


重新啟動 DNS
$sudo /etc/init.d/bind9 restart

安裝、檢視 DNS

安裝 DNS
$sudo apt-get install bind9

安裝完畢後
$netstat -an

會看見 udp 53tcp 53 這兩個 port 已經開啟


檢視 DNS
$nslookup
>server

檢視我們的 DNS server 是哪台

詢問 DNS
$nslookup
>set type=soa                --資料的型態
>edu.tw.                          --向 DNS 詢問 edu.tw. 的資料


檢視 Cache  ( DNS 暫存檔 )
$sudo rndc dumpdb -cache                           --將 cache 輸出至檔案
$nl /var/cache/bind/named_dump.db            --檢視輸出檔

裡面可以看到電腦名稱、資料存活時間、型態、IP或網址


清除 cache
$sudo rndc flush

當重新設定完 DNS 後,舊的資料還存留在 cache 中,所以要清除 cache ,讓資料重新抓取

Port Number ( 埠號碼 )

這裡寫一些常用的 Port Number

port   description

 20   : FTP
 21   : FTP
 22   : SSH
 23   : telnet
 25   : SMTP ( 寄 e-mail )
 53   : DNS
 80   : HTTP
110  : POP3 ( 收 e-mail )
443  : HTTPS

2011年12月13日 星期二

檢視檔案內容相關指令 nl、cat、grep...

這裡存放一些用來可以檢視檔案內容的命令

echo
$echo hello                   --在螢幕上顯示 hello

echo 這個指令是將之後的字串顯示在螢幕上,所以並沒有辦法直接看見檔案的內容,不過在編輯檔案時,在檔案裡加上 echo hello 的話,執行檔案時畫面上就會直接顯示出 hello 這個字

nl
$nl abc                       --顯示內容並加上行號

$nl -b a -n rz abc       --以6位數顯示行號如 : 000001、000002

參數:
-b :指定行號指定的方式,主要有兩種:

           -b a :表示不論是否為空行,也同樣列出行號
           -b t  :如果有空行,空的那一行不要列出行號

-n :列出行號表示的方法,主要有三種:

          -n ln :行號在螢幕的最左方顯示
          -n rn :行號在自己欄位的最右方顯示,且不加 0
          -n rz :行號在自己欄位的最右方顯示,且加 0

cat
$cat abc                         --顯示 abc 這個檔案的內容

$cat -n abc                     --顯示出來的內容會加上行號

head
$head -n 10 /var/log/syslog             --只顯示檔案的頭 10 行

$head -n -100 /var/log/syslog          --檔案的後 100 行都不顯示

netstat -an | head -n 10                   --進階用法,顯示 port | 並只顯示前10行

tail
$tail /var/log/messages                   --從檔案的末端開始顯示內容 ( 預設顯示 10 行 )

$tail -n 30 /var/log/messages          --從檔案的末端開始顯示 30 行的內容

grep
$grep 'test' abc                   --將 abc 這個文件裡有 test 這個字的整行顯示出來

$grep 'test' aa bb cc           --從 aa、bb、cc 這三個檔案裡將有 test 這個字的整行顯示出來

基本參數
-i :忽略大小寫的不同,所以大小寫視為相同
-n :順便輸出行號
-v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行
--color=auto : 將找到的關鍵字部分加上顏色的顯示
進階用法
-A :後面可加數字,為 after 的意思,除了列出該行外,後續的 n 行也列出來
-B :後面可加數字,為 befer 的意思,除了列出該行外,前面的 n 行也列出來
--color=auto 可將正確的那個擷取資料列出顏色
 
$ifconfig -a | grep -A1 eth0       --抓取 eth0 那行並將後面一行也顯示出來 

cut
$cat abc | cut -d -f ':' 2,3          --顯示 abc 的內容並以 : 號為分界只抓取第二段及第三段


-d :後面接分隔字元。與 -f 一起使用
-f :依據 -d 的分隔字元將一段訊息分割成為數段,用 -f 取出第幾段的意思
-c :以字元 (characters) 的單位取出固定字元區間

變數處裡
${  }          --專門用在處理變數上

$user = a01 : a02 : a03
$echo ${user#*:}             --從左至右尋找第一個 : 字號並刪除 : 字前面的字元 ( * 為萬用字元 )
a02 : a03                        --顯示結果

$user = a01 : a02 : a03

$echo ${user##*:}           --從左至右尋找最後一個 : 字號並刪除 : 字前面的字元
a03                                 --顯示結果

$user = a01 : a02 : a03
$echo ${user%:*}            --從右至左尋找第一個 : 字號並刪除 : 字後面的字元 ( * 為萬用字元 )
a01 : a02                         --顯示結果

$user = a01 : a02 : a03
$echo ${user%%:*}         --從右至左尋找最後一個 : 字號並刪除 : 字後面的字元
a01                                  --顯示結果

範例 : 
$name = $(cat /etc/passwd | grep student)      --顯示帳號檔案並只抓取有 student 的行列放進
                                                                             name 這個變數中
$() : 是變數中用來處理命令的方式

$n1 = ${name%%:*}     --從 name 變數中從右至左尋找最後一個 : 字號並刪除 : 字後面的字

$echo $n1                    --顯示 n1 裡的內容
student                         --顯示結果,這行只剩下 student ,其他的都被刪除了

遠端登入 SSH

下載 SSH
$sudo apt-get update
$sudo apt-get install ssh

一般 Ubuntu 剛裝好時服務預設都是關閉的,所以要安裝 SSH 的相關套件才行,連線及被連線的主機都要有安裝 SSH 才能正常連線

SSH 連線
$ssh student@192.168.1.10

student : 對方的使用者帳號

192.168.1.10 : 對方主機的 IP

目標IP轉換 DNAT

NAT (Network Address Translation) ,是一種在IP封包在通過路由器時,重新設定 IP 來源或 IP 目的地的技術,通常使用在有多台主機,但是卻只有一、兩個公有 IP 的私有網路中

跟 SNAT 相反,SNAT 是內部要連接到外部是做轉換,而 DNAT 則是外部要連接要內部的私有 IP 時做轉換

SNAT ( 目的地 IP 轉換 )
iptables -t nat -A POSTROUTING -p tcp -i eth0 --dport 8080 -j DNAT --to 192.168.1.10:80

--dport 8080 : 當使用 8080 這個 port 進來時

--to 192.168.1.10:80 : 引導到此 IP


這行指令時指,當有人連線到這台主機的 8080 這個 port 時,會經由 DNAT 轉送到 192.168.1.10:80 這個地方去

來源IP轉換 SNAT

NAT (Network Address Translation) ,是一種在IP封包在通過路由器時,重新設定 IP 來源或 IP 目的地的技術,通常使用在有多台主機,但是卻只有一、兩個公有 IP 的私有網路中

SNAT ( 來源IP轉換 ) 
$sudo nano /etc/rc.local            -- Ubuntu 的防火牆

列表的最下面 ~~ exit 0 的上面,中間空白處加上下列指令


動態轉換
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

-o eth0 : 這裡設定的是要對外連線的網路卡,也就是使用公有 IP 的網路卡

MASQUERADE : IP偽裝

使用這指令的話,不管內部的私有網路設定的IP是哪種,通通都會經過 NAT 轉換



指定來源 IP 轉換
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

iptables -t nat -A POSTROUTING -s 192.168.1.1 -o eth0 -j MASQUERADE

iptables -t nat -A POSTROUTING -s 192.168.1.1-192.168.1.10 -o eth0 -j MASQUERADE

-s 192.168.1.0/24 : 指定要轉換的來源 IP

使用這指令的話,只有來源是 192.168.1.0/24 的 IP 會進行 NAT 的轉換,第二條跟第三條指令則是指定轉換的範圍 ( 2.3 尚未實驗過... )



指定轉換後的 IP
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.254

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.200-192.168.1.254

-j SNAT --to-source 192.168.1.254 : 指定轉換後的IP

使用第一個指令的話,所有的經過 NAT 的 IP 都會轉換成 192.168.1.254,第二個指令則是會隨機使用 200 ~ 254 之間的IP



指定來源 IP 及轉換後的 IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 192.168.1.254

同時應用上面的方式,指定來源 IP 的範圍及轉換後的 IP


NAT 中文 WIKI : 網路地址轉換
NAT 英文 WIKI : Network Address Translation

2011年12月12日 星期一

設定靜態路由

加入靜態路由
$sudo nano /etc/network/interfaces

在最下面加入
up route add -net 192.168.2.0/24 gw 192.168.2.254 dev eth0

192.168.2.0/24 : 前面這段為對方的網段

192.168.2.254 : 此IP為封包從這台主機出去後,下一台接收到此封包的主機的接收端的IP

eth0 : 從這台主機將封包傳遞出去的網路卡

啟動封包繞送

修改設定
$sudo nano /etc/sysctl.conf

尋找此行
#net.ipv4.ip_forward=1

然後將前面的 # 字去掉變成
net.ipv4.ip_forward=1

存檔離開

設定檔案執行不需加上路徑

檢視環境變數
$echo $PATH

接著會顯示一串的目錄,這些都是存放各種命令的目錄區,平常輸入命令時不需要加上路徑就是因為變數裡已經儲存了各命令的目錄,當輸入命令時,系統會從這些目錄中去搜尋指令並執行,所以我們要把存放我們自己程式或檔案的目錄加進變數裡,這樣執行檔案時就不需要再加上絕對路徑

將目錄加進變數
PATH=$PATH:/home/student

PATH :環境變數

$PATH : 將變數解開時,需要一個容器來承裝,所以前面加 $ 表示要將變數裡的資料展開

:/home/student : 中間的分號是要將後面的目錄區跟前面的目錄區分隔開來,要是沒加的話當字
                           串加入變數後,會跟原本內存的目錄路徑混在一起,有可能導致原本能使用的
                           命令無法使用

**注意** : 輸入此命令時要特別注意不要打錯字,要是不小心造成原本變數裡的路徑混亂的話,
                有可能造成原本能使用的指令如 : sudo 、 shutdown ... 之類的指令無法使用

新增、刪除多重目錄

$nano dir.sh

if [ -d ./test1 ] ; then                            --條件式,如果 test1 此目錄存在

      rm -r ./test1                                  --則刪除 test1

else                                                    --否則

      mkdir -p test1/test2/test3              --建立多重目錄

fi                                                        --條件式 if 的結尾

$chmod +x dir.sh
$./dir.sh

檢視網路設定

$nano ipconfig.sh                          --編輯檔案

ifconfig -a | grep -A1 eth0              --只檢視 eth0 的前段
ifconfig -a | grep -A1 eth1              --只檢視 eth1 的前段
netstat -rn                                      --檢視預設閘道
cat /etc/resolv.conf                        --檢視DNS

$chmod +x ipconfig.sh                  --修改權限為可執行檔
$./ipconfig.sh                                --執行檔案

安裝套件

線上安裝套件指令
$sudo apt-get install apache2

記得確定網路能正常連線