在Ubuntu 16.04上安裝Postfix+Dovecot+SquirrelMail以及相關設置

Postfix:Postfix是一個免費的開源軟件應用程序,可用作郵件傳輸代理(MTA),用於路由和傳遞電子郵件。提供SMTP服務接收與傳送郵件。

DoveCot: 主要提供POP3與IMAP服務,可提供遠端client連線到郵件伺服器。Dovecot是一個開源MDA(郵件傳遞代理),負責向服務器上的本地收件人郵箱發送電子郵件。Dovecot實現了IMAP(Internet消息訪問協議)和POP3(郵局協議),因此仍然是通過(郵件用戶代理)MUA(如Squirrelmail,Ms Outlook,Thunderbird或Roundcube)訪問電子郵件的不錯選擇。

SquirrelMail:是一套提供網頁電子郵件(WebMail)服務。

1. 安裝網頁伺服器(Apache2 + php + letsEncrypt SSL)

$ sudo apt-get update
$ sudo apt-get install apache2
$ sudo apt-get install php libapache2-mod-php
$ sudo apt-get install software-properties-common python-software-properties
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-apache
$ sudo certbot --apache -d example.com 

安裝letsencrypt SSL 系統將提示您輸入電子郵件地址以進行緊急SSL續訂和緊急通知。 輸入地址,然後按Enter鍵。
接下來,按A並按Enter鍵以同意條款和條件。
如果您想與Electronic Frontier分享您的電子郵件,請按Y並按Enter鍵,否則按N並按Enter鍵。
在SSL安裝結束時,系統會詢問您是否要重定向流量,只需為沒有重定向選擇1並按Enter鍵

你最後應該得到一個祝賀信息:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2018-11-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

2. 安裝Postfix

$ sudo apt-get install postfix

執行此安裝指令後,會出現下面畫面,按下TAB到OK,然後按下enter繼續:

下面畫面選擇Internet Site:

下面畫面輸入電子郵件所在的網域:

3. 設定Postfix:

我們將對postfix配置文件進行一些更改。 我們將備份原始文件並創建一個新的配置文件,而不是編輯文件/etc/postfix/main.cf:

$ sudo mv /etc/postfix/main.cf /etc/postfix/main.cf.bk
$ sudo nano /etc/postfix/main.cf

下面是設定的範例:

smtpd_banner = $myhostname ESMTP $mail_name
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no
readme_directory = no

#SMTP CONFIGURATION
smtp_use_tls=yes
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# SMTPD CONFIGURATIONS
# SMTPD AUTHENTICATION

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth


# SMPTD TLS

smtpd_use_tls=yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

smtpd_tls_cert_file=/etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/example.com/privkey.pem

myhostname = mail.example.com
myorigin = /etc/mailname
mydestination =  localhost.$mydomain, localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

此設定並未採用virtual mailbox,若此伺服器提供多個mail server服務,則需採用virtual mailbox。

4. 安裝與設定Dovebot:

接下來,我們將安裝Dovecot以及IMAP,POP和LTMPD所需的所有軟件包。 後者使用本地郵件傳輸協議(LMTP)將電子郵件傳遞到本地收件箱。

當電子郵件發送到我們的服務器時,Postfix會將其傳遞給Dovecot以進行本地傳遞。 此外,我們的電子郵件客戶端SquirrelMail將通過Dovecot通過IMAP協議從本地存儲中檢索電子郵件。

$ sudo apt-get install dovecot-core dovecot-imapd dovecot-pop3d

啟用 IMAP / POP3 登入
修改 /etc/dovecot/conf.d/10-auth.conf,我們的SSL將採用letsencrypt的SSL證書,他是免費又好用的SSL。

一般使用者的發送 Email 的流程,不是 Webmail 就是用 SMTP。這裡 SMTP 清晰一點是 SMTP Submission,即是 MUA 透過 MSA 委托 MTA 代為傳送郵件 (Relay)。而 SMTP Submission 當然需要有登入設定,不然肯定會成為 Spam Mail 的 Open Relay了。現在的 Postfix 預設設定已經不允許 Open Relay,所以必需先設定登入機制才能外部使用。

Postfix 使用模組化的設計,各部分都是分開的。換句話說您可以使用很多不同的登入插件,SASL (Simple Authentication and Security Layer) 就提供 Postfix 和 登入插件間的溝通。

Postfix 目前支援 Cyrus 和 Dovecot 的 SASL 實作。本部分是為了將 SMTP 的 MSA 登入驗證整合到 Dovecot。
啟用 SMTP Submission Port 587
目前很多 ISP 封鎖了 Port 25 的連線,所以要改用協議中定義的 Port 587 來收件。修改 /etc/postfix/master.cf,把這一行 Uncomment 就好了。

submission inet n       -       -       -       -       smtpd

Dovecot SASL / Postfix 整合
啟用 Dovecot 內建的 SASL,修改 /etc/dovecot/conf.d/10-master.conf
Uncomment “#Postfix smtp-auth” 下面一段,並加入 user 及 group。

service auth {
  # auth_socket_path points to this userdb socket by default. It's typically
  # used by dovecot-lda, doveadm, possibly imap process, etc. Its default
  # permissions make it readable only by root, but you may need to relax these
  # permissions. Users that have access to this socket are able to get a list
  # of all usernames and get results of everyone's userdb lookups.
  unix_listener auth-userdb {
    #mode = 0600
    #user =
    #group =
  }
 
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postdrop
  }
 
  # Auth process is run as this user.
  #user = $default_internal_user
}

Dovecot 建議只在 SMTP Submission (Port 587) 啟用 SASL 驗證,
原因是當 Dovecot SASL 不可用時,也不至於連收信都失敗。
我們就按指引完成:

修改 /etc/postfix/master.cf,把之前指定在 main.cf 的設定都搬過來,並指定 SASL Socket Path

submission inet n       -       -       -       -       smtpd
 -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,reject_authenticated_sender_login_mismatch
 -o smtpd_sasl_local_domain=$myhostname
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_sasl_security_options=noanonymous
 -o smtpd_sasl_type=dovecot
 -o smtpd_sasl_path=private/auth
 -o broken_sasl_auth_clients=yes

這個 master.cf 的格式 非常嚴格:
= 前後都不能有空格
-o 前面必需有空格
每項 Option 的 Value 必不能有空格
不能換行,smtpd_recipient_restrictions 要用逗號隔開
修改完成用 Telnet 測試:

telnet 127.0.0.1 587

如果有出現 220 Response 的話,恭喜中獎了

220 server.tiger-workshop-mail.com ESMTP Postfix

若沒有,則查看/var/log/mail.log,看看問題在哪裡。
若成功了,執行ehlo local就會看到下面的敘述:

telnet localhost 587
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.dubugroup.com ESMTP Postfix (Ubuntu)
ehlo localhost
250-mail.dubugroup.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN
250-AUTH=PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

若看到下面兩個,代表可以驗證成功了!!

250-AUTH PLAIN
250-AUTH=PLAIN

透過外部 SMTP 發送成功了,Email 當然還帶有前面設定過的 SPF 和 DKIM。

到了這裏,只要設定 Dovecot 的 User,
SMTP、IMAP、POP3 都會使用同一個 Username & Password,
而且收信地址也會跟 Username 一樣,實在太美好了…

Ubuntu 其實有提供一個 Package “dovecot-postfix” 整合套件,直接完成以上的東西。
這跟 Windows 下的 XAMPP 和手動安裝 Apache, MySQL, PHP 然後手動整合一樣,
手動設定會學到比較多原理,Debug 比較容易吧。

最後安裝SquirrelMail網頁郵件:
接下來我們可以配置SquirrelMail客戶端。 該應用程序是通過SMTP和IMAP協議發送和接收電子郵件的理想選擇,可以在任何瀏覽器上運行。

要安裝該軟件,請運行以下命令:

$ sudo apt-get install squirrelmail

照著指示依序安裝後即可。
接下來,我們將把SquirrelMail路徑添加到Apache的默認虛擬主機文件中,該文件啟用了LetsEncrypt的加密SSL證書。

$ sudo nano /etc/apache2/sites-enabled/000-default-le-ssl.conf

在ServerName後面加上Alias設置,Alias /mail /usr/share/squirrelmail

<VirtualHost *:443>
... 
ServerName example.com
Alias /mail /usr/share/squirrelmail
...
</VirtualHost>

接著設置SquirrelMail就很簡單了

$domain = 'example.com';
$imapServerAddress = 'example.com';
$imapPort=993;  
$smtpPort=465; 
$smtp_auth_mech='login';
$use_imap_tls='true';
$use_smpt_tls='true';

修改/etc/access

用來允許或拒絕RELAY的網域,可參考 這裡。設定後,執行下面的指令才可轉換為access.db

 postmap hash:/etc/postfix/access

設定別名(Alias)

作為群組發信的很重要的應用,例如:[email protected],這個sales是個團隊,將發送到sales可轉發給其他特定的人員,其詳細說明可參考這裡。執行下面的指令才可轉換aliases.db

postalias hash:/etc/aliases

 

MongoDB 3.4 Sharding 觀念、安裝、與配置

Sharding 為 MongoDB 所擁有的一種資料分散處理架構,簡單的說就是將資料分片 (Shard) 儲存到不同的機器中,最常應用在大數據的案例上。在海量資料的儲存情境上,垂直擴充架構是無法滿足的,必須透過水平擴充來實現。

MongoDB Sharded Cluster 基本的架構示意如下:

在這樣的機制下,儲存進 Collection 的資料會被盡可能平均地分散到每一個 Shard 上,每一個 Shard 都是由獨立的 mongod 實體或者 Replica Set 所構成 (想了解 Replica Set 可以看看之前的文章)。上圖我們也可以看到,Sharding 機制本身是不負責備份的,在產品上線的環境中,強烈建議使用 Replica Set 來搭建 MongoDB Sharded Cluster。在這個架構中,假設我們有 1TB 的資料,可以透過 Sharding 機制將資料切分為四個 Shard,每一個 Shard 負責儲存 256G,應該很好理解。

MongoDB Sharded Cluster 運作機制

那麼 MongoDB Sharded Cluster 是如何運作的呢?我們先看看下面的架構圖:

當使用者或應用程式 (Driver) 要操作 MongoDB Sharded Cluster 時,是透過 mongos 來進行連接,mongos 扮演 Router 的角色,Router 通常由多個實體組成,可以將 Loading 分散處理,保持高可用性 (HA)。對於應用程式來說,並不需要瞭解 MongoDB Sharding 怎麼運作的,他們看到的只是一個資料庫,所以使用上基本不會有太大的差別。如下所示:

之前提到,雖然每一個 Shard 都是由一個 mongod 或 Replica Set 構成,但如果沒有透過 mongos (Router) 進行連線操作,而直接對 Shard 進行連線,那麼你看到 Collection 的資料就不會是完整的集合,而只是單一個 Shard 的資料。那麼 Cluster 是如何分配資料呢,這裡有一個很重要的角色,就是 Config Server。

Config Server

Config Server 是 MongoDB Sharding 架構中相當重要的一個角色,它存放了資料的 Metadata,包括透過 Shard Key 計算出來的索引,用來記錄每一個資料存放的 Shard 位置,好讓 Router 可以正確的 Query 資料,如果沒有這些索引,那麼每一個用來存放資料的 mongod 實體,就「純粹」只是獨立存放分散的資料,無法協同工作。Config Server 聽起來很重要對吧!?因此 Config Server 部署時必須要多台機器,在新版 3.2 之後也可以用 Replica Set 架設 Config Server。

為了將資料分散儲存,就必須找一個方法來管理 Index,我們必須將 Document 某一個欄位定義為 Shard Key,然後透過 range based partitioning 或 hash based partitioning 其中一中方式將資料分配到 chunks 中 (每一個 Chunks 預設的大小為 64MB),最後才將 Chunks 分散到不同的 Shard 上。接下來我們先看看兩種不同的 Partitioning 機制:

Range Based Sharding

這種方式就是將 Document Shard Key 欄位的值,以線性的方式進行分群,透過 Range 範圍進行切割,相近的值理所當然會被分到同一個 Chunk 中,Chunk 分配的情況會直接受到 Range 的影響(比如某一段 Range 出現頻率高,Chunk 資料就比較大)。用這種方法我們必須考慮 Shard Key 的範圍,如下所示:

Hash Based Sharding

這種方法顧名思義就是透過「雜湊函式」將我們指定的 Shard Key 欄位進行雜湊,這樣的方式資料比較容易分散到每個 Shard 中,如果資料量足夠豐富,佔用空間的分配也會比較平均。如下:

比較一下兩種方法,Range Based 實際在 Query 時,Router 可以很輕易地判斷資料的位置,然後正確地派送運算到所屬的 Shard 上。但如果要查詢的資料片段大小差異過高,且又分散在不同的 Shard 上,查詢必定會「等待」其他 Shard 處理的情況產生。來看看 Hash Based,Shard Key 透過 Hash 計算後,很容易分散在不同的 Chunk,資料分散性佳,擴充也比較容易。但是在 Query 時就必須要經過比較多的 Shard 計算,才能由 Router 返回最後的結果。兩種方法各有利弊,可以依照實際的應用情況選用。那如果想要自行實作資料分散的邏輯呢?MongoDB 當然也是支援的,就是透過 Tag 這個功能,但我沒有研究,所以就無從介紹了。有興趣可以看看官方 Tag Aware Sharding 相關介紹。

開始建置:

由於 Shard 本身沒有備援機制,因此 MongoDB 的 Shard 必須建置在 Replica Set 上,Replica Set 建置方式請參考「MongoDB Replica Set 高可用性架構搭建」這一篇文章。假設您已經建立好 Replica Set,那麼就可以繼續接著開始建置 Shard。

我們規劃原來做的mongsh1~mongsh3三台伺服器,都拿來做shard server與config server,另外mongsh1/mongsh2拿來當router。

建置 Config Server

一開始我們先建立 Config Server,在 MongoDB Sharding Cluster 架構中,Config Server 必須有三個實體以上,強烈建議部署在不同的機器上,因為 Metadata 實在太重要了。下面的範例其實是與 Replica Set 一起部署,實際上分開會比較好。慣例上我們會先透過 /etc/hosts 管理我們的主機資訊 (用 DNS 也是可以),假設要安裝 Config Server 的 Hostname 為 mong-cfg1 ~ mong-cfg3

vi /etc/hosts
10.21.1.45 mongsh1
10.21.1.46 mongsh2
10.21.1.44 mongsh3

10.21.1.45 mong-cfg1
10.21.1.46 mong-cfg2
10.21.1.44 mong-cfg3

10.21.1.45 mong-router1
10.21.1.46 mong-router2

接著建立 Config Server 要存放的 DB File Directory,命令如下:

mkdir -p /home/mongodb-cfg
sudo chown -R mongodb:mongodb /home/mongodb-cfg

三台伺服器都要做。

然後建立 MongoDB Config Server 需要的設定檔,之後再透過 mongod 來載入啟用,因為我們測試環境的 Config Server 與 Replica Set 都在其實同一台機器(正式環境建議分開或分散比較好),Port 與 PID 都要不同,Port 隔開可以方便我們部署在不同機器,然而透過不同的設定檔也會比較好進行管理。大致上的 Port 分配如下:

  • Replica Set:27019 Port
  • Config Server:27018 Port
  • Mongo Router (mongos):27017 Port

編輯 Config Server 設定檔內容如下:

vi /etc/mongod-cfgserv.conf
storage:
  dbPath: /home/mongodb-cfg
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod-cfgserv.log
sharding:
   clusterRole: configsvr
net:
  port: 27018
  bindIp: 0.0.0.0
processManagement:
  fork: true
  pidFilePath: /var/run/mongod-cfgserv.pid

上面的設定檔先不開啟認證模式,官方規定在 Production 環境最少要配置三台以上的 Config Server。透過以下 mongod 命令分別在「mong-cfg1, mong-cfg2, mong-cfg3」三台機器各別透過 mongod 指令來啟用 Config Server。

sudo mongod -f /etc/mongod-cfgserv.conf

啟動後我們也可以在 /var/log/mongodb/mongod-cfgserv.log 看到 log 資訊。

建置 MongoDB Router

再來就是建置 MongoDB Sharding Router。首先建立 mongos 要載入的設定檔,基本上跟上面 Config Server 使用的 mongod 差不多。我們這裡測試用的 Router 是跟 Config Server 放在一起,實際上可分開存放會更好。

這裡,我們就都不設定認證模式,若有意設置,可參考這篇文章

設定檔內容如下:

sudo vi /etc/mongod-router.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod-router.log
sharding:
  configDB: mong-cfg1:27018,mong-cfg2:27018,mongodb-cfg-3:27018
net:
  port: 27017
  bindIp: 0.0.0.0 
processManagement:
  fork: true
  pidFilePath: /var/run/mongodb-router.pid

我們可以看到上述的設定檔有指定 Config Server 的位置,好讓 Router 啟動時可以讀取 Config Server 中的 Metadata。也需要配置到另外一台伺服器mong-router2

如同上述的設定檔,先不用啟用認證來執行 mongos,主要是為了要先在 Config Server 中建立 User 好讓後續整個認證流程可以順利串起來,這裡通常大家都會遇到最多問題,很多人最後乾脆關閉認證來配置 Sharding,這樣其實很危險,不建議關閉認證。此外由於應用程式大多是透過 27017 Port 進行連線,所以要提供連線的 Router Bind 直接啟動在標準 MongoDB Port 這樣應用程式就不用修改囉。

先啟用其中一台的 MongoDB Sharding Router,等透過 Mongo Router 設定好 Config Server 之後再啟動所有的 Rouer 即可。注意這裡是用 mongos 命令來啟動喔,如下:

sudo mongos -f /etc/mongod-router.conf

配置自動啟動config與router服務:
於10.21.1.45與10.21.1.46兩台伺服器

vi /etc/rc.local
mongod -f /etc/mongod-cfgserv.conf
mongos -f /etc/mongod-router.conf

於10.21.1.44則配置如下

vi /etc/rc.local
mongod -f /etc/mongod-cfgserv.conf

建立 Sharding Cluster

接著我們透過認證模式進入 Mongo Router 來設定 Sharding,因為後端的 Monogd 是採用Replica Set 認證模式,所以配置 Sharding 的動作一定要透過同一把 Key 啟動,才能把服務整個串起來。以下透過我們建立好的管理者帳密登入 Mongo Router 來進行配置:

mongo mongodb-router1
mongos>sh.addShard("bes/mongodb-a1:27019,mongodb-a2:27019,mongodb-a3:27019")

加入後,再檢查一下狀態:

mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("59b4e7b564bf31ba36e4615c")
}
  shards:
	{  "_id" : "bes",  "host" : "bes/mongsh1:27019,mongsh2:27019,mongsh3:27019",  "state" : 1 }
  active mongoses:
	"3.4.8" : 2
 autosplit:
	Currently enabled: yes
  balancer:
	Currently enabled:  yes
	Currently running:  no
		Balancer lock taken at Sun Sep 10 2017 20:27:09 GMT+0800 (CST) by ConfigServer:Balancer
	Failed balancer rounds in last 5 attempts:  5
	Last reported error:  Cannot accept sharding commands if not started with --shardsvr
	Time of Reported error:  Wed Sep 13 2017 11:18:59 GMT+0800 (CST)
	Migration Results for the last 24 hours: 
		No recent migrations
  databases:
	{  "_id" : "teammerge12",  "primary" : "bes",  "partitioned" : true }

mongos> 

實務的配置上,我們會部署多台 Router 來平衡應用程式端的查詢,在應用程式中也可以指定這一群「Router」作為 Server。到這裡 MongoDB Sharding Cluster 就算是被置完成囉,實際的使用上還需要指定 Collection Shard Key 來分配 Chunk 到不同的 Shard 上,這裡請自行參考 MongoDB 官方的 Shard Key 使用介紹。

南懷瑾:我在峨眉山閉關的經驗(重要的成就法門!)

1172516_610299175659201_478697180_o佛法是非常科學的實證,因此,大家應各走各的路,個人選定一門深入,至死不變。有人修念佛三昧,那還是依此修,有人持大悲咒習慣還是持大悲咒,有人念六字大明咒達到一心不亂,則還是念六字大明咒;或修六妙門、白骨觀,種種法門都可以,但是,大家不要變來變去。有人如果有其他信仰禱告,一樣的可以各走各的路線,選定一門。或者有人說:「我什麼法門都用不上路」,那你就用觀世音法門。

我現在講話的聲音與外面車水馬龍的聲音,大家都聽到了,但不要注意聽它;現在鞭炮聲也聽到了。鞭炮放過就清凈了,本來清凈的。這是最粗淺的觀音法門,馬上可以體會。不管是念佛也好,走任何修行法門,慢慢寧靜迴轉來可以聽到自己身體內部的聲音,不需做任何功夫。身體內部本來是有聲音的,為什麼大家聽不見?如果從事科學研究,人體血液的流動,心臟的跳動,身體內部音聲的震動,卻比一顆原子彈爆炸的聲音還大。老子說:「大音希聲」。宇宙運行的聲音很大,可是人們自己習慣了,反而聽不見。銀河系統聲音最大,我們人類也聽不見。連我們身體內部的音聲也是一樣聽不見。

什麼時候你才聽見呢?當人睡下去靠在枕頭上,還沒有睡著以前,你用手把兩耳朦起來,像包餃子把耳朵合攏起來,此時就聽到心臟血液流動聲音很大。搭乘飛機時的噪音或在戰場上炮彈爆炸的巨聲,拿手朦起耳朵,同樣比較容易與外界音聲隔離;那時,內在音聲就很大。但是,修持觀音法門的人,在靜態之時,可以聽到自己內在的音聲;即使在最熱鬧的地方,還是可以聽到自己內在的音聲。修持到此地步,身體上的轉化,可以到達相當的情況。慢慢聽自己內部的音聲靜下去,血液流動、心臟跳動的音聲都靜下去,靜到什麼程度呢?連身體內部的音聲都清凈了,那時會出現一種非常奇妙的音聲。順便告訴你們,當年我在四川峨眉山頂上閉關時候的經驗。

每當夜深人靜的時候,在峨眉山頂上,冰天雪地中,夜裡起來靜坐,萬籟俱寂,飛鳥亦無,清凈境界,如身游太虛中,安心自在,就像神仙境界一般非常舒適。而且常聽到虛空中天樂之音,非常美妙。因而想到莊子所謂「天籟之音」。莊子形容冷冷然、清雅悠美渾厚的音聲,那真是聞所未聞的天音。依我的經驗,現在雖在吵鬧的都市中,心靈一靜,天籟的梵音仍然可以聽到,與嘈雜的音聲毫不相礙。所以懇切希望諸位依此修觀世音法門,一定會有所成就

現在引用《楞嚴經》觀音圓通法門這一段經文,再加以說明。

【爾時觀世音菩薩,即從座起,頂禮佛足,而白佛言。世尊。憶念我昔無數恆河沙劫,於時有佛出現於世,名觀世音。我於彼佛發菩提心。彼佛教我從聞思修,入三摩地。初於聞中,入流亡所。所入既寂。動靜二相瞭然不生。如是漸增。聞所聞盡。盡聞不住。覺所覺空。空覺極圓。空所空滅。生滅既滅。寂滅現前。忽然超越世出世間。十方圓明。獲二殊勝。一者,上合十方諸佛本妙覺心,與佛如來同一慈力。二者,下合十方一切六道眾生,與諸眾生同一悲仰。】

二十五位菩薩,一一起來報告心得,現在輪到觀世音菩薩起立自述。先向佛頂禮,然後向佛報告說:「我現在回想過去無量數劫以前,那時有一位觀世音佛出現世間,我就在佛前發起求證自性正覺的菩提心。觀世音佛就教我;從聞、思、修(聞聲、思惟、修證)三個階段去修持,證入如來的正定三昧,(三昧就是三摩地音聲縮短的翻譯)。我從聞思修入三摩地。」他說:我一上坐,耳根清凈自然聽到外界一切音聲,乃至呼吸的聲音,對於這些音聲不討厭它,也不用心去聽它,第六意識不起分別,慢慢靜下來,自然聽到自己內在生理血液循環流動的音聲,再靜下來,忘記了所聽的聲音,就入與能聞的自性之流,忘去所聞的聲音之相。「入流亡所」,忘掉所聽的音聲,乃至於念佛的音聲都沒有了,內在的聲音也沒有了,外面的聲音也沒有,完全清凈到極點,再由這了無所聞的寂滅中進修,有聲與無聲動靜兩種境象,都瞭然無礙,卻一念不生。

我們耳朵聽到有聲音是動相,注意聽到「沒有聽到的」叫做靜相,動相與靜相都是生滅相對法,道不在動相與靜相上,所謂「動靜二相瞭然不生」。聲音來聽見動相,聲音沒有了聽到靜相;有時當我們很靜的時候,忽然又來聲音,馬上又聽到動相,動靜只是現象的不同。我們能聽動相與能聽靜相的,不在聲音本身,更不在內不在外,不在中間,無所不在,而心理卻明明白白,沒有動過。動來知道動,靜來知道靜,能知道動與靜這個沒有動過,生而不生,用而不用。如此再加以精進,能聞與所聞的作用功能,都渙然冰釋凈盡!能聽聲音的本題功能,以及所聞聲音的作用,不管動與靜,都渙然釋然,「盡聞不住」,你甚至於覺得超越跳出宇宙觀念的範圍,如此,再進一步就可以徹底明心見性,與形而上的道體渾合為一。

「覺,所覺,空;空,覺,極圓;空,所空,滅;生滅既滅,寂滅現前。」我們聽聲音後面還有能感覺到自己在聽的,那個覺性與所覺的聲音,能覺與所覺都空掉了,空的境界與自己大徹大悟的境界都沒有了,能所雙亡,盡聞無相的境界也無所住,空與覺性就渾然一體,至極於圓明之境。

「空,所空,滅」,能空與所空的現象也沒有;「生滅寂滅」,自然就滅盡生滅的作用;於是絕對真空的寂滅自性就當下現前。空去能生能滅的,達到渾然一體圓明道體,所以到此時,呼吸也停了。(呼吸法是練氣修脈的方法,它本身是生滅法。凡是生滅法都是現象,不是道體。在此告訴你們一個重要道理,我們念頭思想先動,還是呼吸氣先動?念頭動了氣就動了。一個人如果念頭完全不動,呼吸自然停止;呼吸停止的時候,身體本能也就完全充電貫滿。所以練氣功修九節佛風種種呼吸往來的修法是很笨的事,不能完全充電;真正充電的時候,念頭完全不動,不呼也不吸,就充電了。)

那麼,你把握觀音法門,慢慢向內聽聲音,達到一念不生,身體氣脈自然起變化,定力也增加了。因念頭完全靜止,呼吸不往不來,自然腿就容易打通。坐著舒服極了,不想下座,動也不想動了,坐上七天七夜又有何困難?到此時,形而上的道體自然完全呈現了,突然超越世間出世間所有的境界。十方世界立即洞徹圓明,(十方代表整個空虛宇宙)豈止是天人合一,完全圓滿清凈一體了。

這時,獲得兩種特殊勝妙的功能:上合十方一切諸佛,本元自性的妙覺真心,與過去一切所有成就的聖賢諸佛,心心相印,同具有大慈大悲的能力;下合十方一切六道眾生(天、魔、人、畜生、餓鬼、地獄),與眾生的心慮同體。故與一切眾生同樣具有悲天憫人的行止,不分上下。所以說,觀世音菩薩大慈大悲,「觀音菩薩妙難酬,清凈莊嚴累劫修……千處祈求千處應,苦海常作度人舟。」

我常希望女性的道友們,尤其用功不上路,智慧不開、福報不具足,求求最同情女性的觀世音菩薩。男性也一樣。古代禪宗很多位祖師,就以專心稱念「南無大慈大悲救苦救難廣大靈感觀世音菩薩」而大徹大悟。有這些先輩作榜樣,我們更應效法學習觀世音耳根圓通的修法。佛當時教導弟子,一般聲聞眾也都是聽佛的聲音而入道、證果。因為東方娑婆世界眾生耳根最為靈利,一切修法皆靠耳根而傳導,不管禪宗、凈土、密宗任何法門,都離不開觀音法門。尤其初步靜坐,必需由此入手。佛經叫「預流向」,準備證果向此方修;修成功了就叫「預流果」。不由此修,想成就道果,無有是處。

摘抄自南師《定慧初修》

切不可把自己看得過重

【切不可把自己看得過重】

557305_426941384023235_2043203486_n

一只駱駝辛辛苦苦穿過了沙漠,一只蒼蠅趴在駱駝背上一點力氣也不花也過來了。

蒼蠅譏笑說:「駱駝,謝謝你辛苦把我駝過來。再見!」

駱駝看了一眼蒼蠅說:「你在我身上時我根本就不知道,你走了也沒必要跟我打招呼,你根本就沒有什麼重量,你別把自己看太重,你以為你是誰。」

英國文學家蕭伯納一日閑著無事同一個不認識的小女孩子玩耍談天,黃昏來臨時蕭伯納對小女孩說,回去告訴你媽媽,說是蕭伯納先生和你玩了一下午,沒想到小女孩子馬上就回敬了一句:「你也回去告訴你媽媽,就說瑪麗和你玩了一下午。」

後來,蕭伯納對他人講,人,切不可把自己看得過重。

著名表演藝術家英若誠曾講過一個故事。

他生長在一個大家庭中,每次吃飯都是幾十個人坐在大餐廳中一起吃,有次他突發奇想決定跟大家開個玩笑,吃飯前他把自己藏在飯廳內一個不被注意的櫃子中,想等到大家遍尋不著時再跳出來。

尷尬的是大家絲毫沒有注意到他的缺席,酒足飯飽大家離去,他才蔫蔫地走出來吃了些殘湯剩菜。從那以後他就告訴自己:永遠不要把自己看得太重要,否則就會大失所望。

蘇東坡年輕的時候是個傲氣十足的人。一日在田間小路上行走,忽然和一個村姑狹路相逢,村姑挑著一擔泥,兩個互不相讓。最後村姑提出她出一上聯,若蘇東坡能對上下聯她就甘心讓路。

村姑的上聯是:一擔重泥擋子路。

蘇東坡一聽這個上聯可生了得,一時竟想不出下聯。兩邊在水田裡插秧的農夫大聲笑。情急之下蘇東坡竟然大聲回應:兩旁夫子笑顏回。然後,蘇東坡脫下鞋襪為村姑讓了路。

事實上一個人的輕與重,貴與賤決不是自己能訂下標准的,平靜謙和,不事張揚才是最重的分量。

北京大學開學的日子,一個新生攔住了一個看門的大爺讓他照顧一下箱子。第二天才發現這個看門的大爺竟然是北京大學副校長,著名學者季羨林。這位學貫中西的學者竟然能夠如此看輕自己,也許正是他成為當代學人榜樣的原因之一。

不把自己看得太重其實是種修養,種風度,種高尚的境界,種達觀的處世姿態,是心態上的一種成熟,是心志上的一種淡泊。

用這種心態做人可以使自己更健康,更大度;用這種心態做事可以使生活更輕鬆,更踏實;用這種心態處世可以使社會更和諧。