利用ssh端口轉發實現郵件轉發

服務器上架設了wiki,需要根據頁面修改情況向各個watch其界面的用戶提交郵件報告。而該服務器位於BSO後面,級別是restrictive,即:服務器不能發起任何向外部的連接。解決此問題可以有兩種方案,一種是降低BSO級別,帶來的問題是需要做大量的patch工作,手續流程比較麻煩。二是利用一些tip進行。這裏使用了ssh的隧道技術

1. smtp服務
wiki本身有發送郵件的功能,需要調用PHP的mail()函數,此函數是PHP默認支持的,需要OS有sendmail binary文件,並提供smtp功能。
在rhel中,默認安裝sendmail作爲郵件服務器,可以通過開啓sendmail服務即可使用smtp服務(在以前的red hat版本中,smtp是不需要sendmail支持的,不過現在的OS中,必須開啓sendmail服務?)。smtp服務端口是25。可以通過下述方法來進行測試:
#mail [email protected]
Subject: hello from the server
this is the body of the e-mail.
.
Cc:
其中Subject是標題,之後是郵件正文,用“.”結束正文編寫。最後是抄送地址。
如果smtp功能正常,你可以在你的郵箱裏面收到自己的郵件。

2. ssh隧道
ssh可以建立隧道,進行ip包轉發功能。詳細參見man ssh。其中需要注意的需亞打開OS中ip轉發功能(?)。兩個比較重要的隧道建立命令是:

ssh -C -f -N -g -R remote_port:local:port user@remotehost
可以將遠端服務器一個端口remote_port綁定到本地端口port,其中-C是進行數據壓縮,-f是後臺操作,只有當提示用戶名密碼的時候才轉向前臺。-N是不執行遠端命令,在只是端口轉發時這條命令很有用處。-g 是允許遠端主機連接本地轉發端口。-R表明是將遠端主機端口映射到本地端口。如果是-L,則是將本地端口映射到遠端主機端口。

ssh -L 。。。。。。。。這個命令網上很多,大家可以參考其他地方。

兩個命令主要的不同就是:-L參數用於將本地端口轉發到遠端主機,而-R是將遠端主機端口轉發到本地。


注意事項:
1. ssh隧道應該在sendmail服務之前啓動,提前監聽25端口。這時服務器上sendmail會提示綁定socket失敗,不用理會,如果被他綁定了你就不能幹活了。
2. 需要指定sendmail的realy host,修改/etc/mail/sendmail.cf 和 /etc/mail/submit.cf,其中DS字段加入自己的域名。這樣sendmail不會自己亂找relay host。
3. 在/etc/sysconfig/sendmail裏面可以指定sendmail爲daemon狀態,這裏應該daemon狀態,否則php不會調用sendmail。

由於我們的主機位於BSO之後,只能接受連接,因此我在自己的thinkcentre上建立到服務器上的隧道,將服務器的端口25轉發到本地端口25。遠端主機和本地都開啓25端口及smtp服務,這樣服務器中一旦apache發送郵件,則該郵件通過遠端25端口轉發到本地25端口,然後由本地smtp服務進行轉發,從此繞開防火牆限制。

NOTEs:
某些情況下,比如其中一端機器出現異常,需要重啓雙方sendmail服務。這時會在轉接方出現25端口無法綁定的錯誤。這是由於server方25端口被上一個ssh隧道佔用的問題。
解決的方法是重啓server方sshd服務,然後停止server sendmail服務,在轉接方重新建立ssh轉接,server和本地重啓sendmail服務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章