翻了一下 Log 檔
發現 relay access denied 的狀況有兩種
第一種:
Transcript of session follows.
Out: 220 轉信主機.敝公司網域.com.tw ESMTP Postfix
In: HELO 23.subnet125-162-50.speedy.telkom.net.id
Out: 250 轉信主機.敝公司網域.com.tw
In: MAIL FROM: <meicarrie@yahoo.com.au>
Out: 250 2.1.0 Ok
In: RCPT TO: <不存在的帳號@敝公司網域.com.tw>
Out: 554 5.7.1 <不存在的帳號@敝公司網域.com.tw>: Relay access denied
In: QUIT
Out: 221 2.0.0 Bye
第二種:
Out: 220 轉信主機.公司網域.com.tw ESMTP Postfix
In: EHLO mail-ww0-f41.google.com
Out: 250-轉信主機.公司網域.com.tw
Out: 250-PIPELINING
Out: 250-SIZE 10240000
Out: 250-VRFY
Out: 250-ETRN
Out: 250-ENHANCEDSTATUSCODES
Out: 250-8BITMIME
Out: 250 DSN
In: MAIL FROM:<客戶或廠商的郵件帳號>
Out: 250 2.1.0 Ok
In: RCPT TO:<公司員工@敝公司網域.com.tw>
Out: 554 5.7.1 <公司員工@敝公司網域.com.tw>: Relay access denied
In: QUIT
Out: 221 2.0.0 Bye
註: 此台機器我打算拿來當做Mail Gateway (外加Anti-Spam)
若從訊息來解讀
第一種很好理解, 就是 try 帳號而已
第二種就不曉得是什麼情形了
收件人明明就是確實存在且合法的帳號
而且還是已經加入 /etc/postfix/relay_recipients
postmap /etc/postfix/relay_recipients 也有執行
但卻還是 Relay access denied
這個訊息代表這台機器沒把信轉送到真正的Mail Server上
所以想請問我是不是還漏了什麼設定?
或是有哪些選項的設定有錯?
要做 mail gateway,
相對於 sendmail 的功能是 mailertable。
PostFix 相對應的功能是 transport,
設定內容的說明應參考 transport(5)
<pre class="c" name="code">敝公司網域.com.tw smtp:[真正的Mail Server的IP]
當然要執行一下 postmap /etc/postfix/transport。
感謝這位大大的回覆
另外跟您說聲抱歉
之前寫發問內容的時候忘了提
/etc/postfix/transport 這個檔案也是有設定的
只是不曉得正確性如何
當然 postmap /etc/postfix/transport 也是有執行
/etc/postfix/transport 目前的設定值為:
敝公司網域.com.tw smtp:[Mail Server的區網IP]
另外再補充說明
所以不曉得在這樣的機制下
/etc/postfix/transport 的設定方式是否會有不同?
另外再補上其他設定檔內容:
myhostname = 主機名稱.敝公司網域.com.tw
mydomain = 敝公司網域.com.tw
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 區網網段一, 區網網段二, 127.0.0.0/8
inet_interfaces = all
proxy_interfaces = 這台Mail Gateway SMTP使用的真實IP
local_recipient_maps =
relay_recipient_maps = hash:/etc/postfix/relay_recipients
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
/etc/postfix/relay_recipients
員工一@敝公司網域.com.tw OK
員工二@敝公司網域.com.tw OK
員工三@敝公司網域.com.tw OK
員工四@敝公司網域.com.tw OK
........
員工某@敝公司網域.com.tw OK
/etc/postfix/transport
敝公司網域.com.tw smtp:[郵件主機區網IP]:25
覺得是這個參數的問題:
hsw1976提到:
relay_recipients
這是做為允不允許收信者字樣為何的設定。
並不決定 敝公司網域.com.tw 裡有什麼帳號,
假設你內部 mail server 名稱為: ms.敝公司網域.com.tw
那你在轉信這台設
/etc/postfix/aliases
員工某@ms.敝公司網域.com.tw
更正統的做法應是用 relay_domain
relay_domains = 敝公司網域.com.tw
這樣就不用aliases的做法。
應是以上這兩種的情況下,
那 transport 才會發揮功能吧!
hsw1976提到:
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, localhost
如果用 relay_domains 的話,
就不該把 敝公司網域.com.tw 放在 mydestination 裡,
這是會檢查本機是否有該帳號存在,包括 aliases 裡的帳號。
如果改成這樣呢
myhostname = 主機名稱.敝公司網域.com.tw
mydomain = 敝公司網域.com.tw
mynetworks = 區網網段一/24, 區網網段二/24, 127.0.0.0/8
relay_domain = $mydestination, 敝公司網域.com.tw
transport_maps = hash:/etc/postfix/transport
敝公司網域.com.tw smtp:[Mail Server區網IP]
.敝公司網域.com.tw smtp:[Mail Server區網IP]
主機名稱.敝公司網域.com.tw local:
localhost.敝公司網域.com.tw local:
hsw1976提到:
mydestination
mydestination裡不應要有 敝公司網域.com.tw,
否則會檢查本機裡有面有 敝公司網域.com.tw 的帳號。
假設你這臺轉信主機的名稱為 mx.敝公司網域.com.tw
後端信件主機為 ms.敝公司網域.com.tw 的話。
<pre class="c" name="code">mydestination=mx.敝公司網域.com.tw,localhost
relay_domain=敝公司網域.com.tw
這樣才不會把要給 mx.敝公司網域.com.tw 的信,
都往 ms 後送。
什麼時候會有給 mx.敝公司網域.com.tw 的信?
大概是給 ms 給不成時,
又送不回寄件者的時候…
另外要注意的是圾垃信的問題:
由於 mx 上面沒有後面真正mail主機帳號的名單,
如果只用 real_domain 來設的話,
往往會接受那一堆不存在的帳號的信往後送,
所以 relay_recipients 就要定義與後端 mail 主機同樣的帳號,
才能夠馬上確認這是否有效的收信帳號。
如果用 aliases 的話,
就不需用 relay_recipients 的功能。
以上兩者必須手動去增減,
不然會與後端 mail server 的帳號不一致,
這是如果要避免垃圾信的麻煩所在。
如果不在意一堆送往不存在帳號信件的話,
就不用為這設定煩惱。
如果要避免垃圾信try帳號,
又不想手動更新的話,
就得考慮用 LDAP 來做單一帳號的管理。
所以twtw大的意思是
除了
<pre class="c" name="code">
mydestination=mx.敝公司網域.com.tw,localhost
relay_domain=敝公司網域.com.tw
的設定必須注意之外, 下列兩個設定
<pre class="c" name="code">
aliases = hash:/etc/postfix/aliases
relay_recipients = hash:/etc/postfix/relay_recipients
只要選用其中一種即可?
這個清單若要手動維護, 以目前的狀況來看是不會太麻煩 (變動頻率不高)
另外想請教的是:
hsw1976提到:
只要選用其中一種即可?
不是。
如果mx 這台機器裡定義 mydestination=敝公司網域.com.tw,localhost
postfix就一定會在mx這台找有無該帳號,
如果維護在 aliases裡,就剛好也直接擋掉不在在帳號的信。
(看了上面aliases的寫法不對,
應是像 員工一:員工一@ms.敝公司網域.com.tw 而往後送)
(另外未提到,也可設 virtual_alias_domains, virtual_alias_maps,
來定義後送的帳號信件,也可擋掉不存在帳號的問題)
如果mx 這台機器裡定義 mydestination=mx.敝公司網域.com.tw,localhost
意思算是 本機沒有 敝公司網域.com.tw 帳號,
也不會接收 xxx@敝公司網域.com.tw 的信件,
所以就要在 relay_domains 定義說,會幫忙 接收、轉寄 任何給 xxx@敝公司網域.com.tw 的信件,
但這種收法,會把一堆 後端也不存在的帳號的信,也接受、再後送,
才知道有沒有帳號,這時就一堆退信要給mx自己消化掉。
這就是利用 relay_recipients 維護帳號名單而避免被try帳號,
而直接就回應的方式。
hsw1976提到:
- 一堆送往不存在帳號的信件的部份, 是否有地方可以設定成不退信?
- 做LDAP的用意, 是為了要和後端Mail Server的郵件帳號同步嗎?
- 做LDAP的用意, 是為了要和後端Mail Server的郵件帳號同步嗎?
不只,而是讓單位內所有需要用到同樣帳密的機器或服務,
帳密都單一而集中而同步,而不需多處手動維護帳密的麻煩。
所以如果我希望的郵件接收傳遞路徑是:
Internet
↓
mx.敝公司網域.com.tw (也就是這台兼作NAT,以及郵件過濾的轉信伺服器)
↓
郵件伺服器 (員工的郵件帳號和信箱就在這裡)
↓
員工的郵件信箱
↓
員工的Mail Client
那麼設定檔應該是像這樣子嗎?
mydestination = 主機名稱.敝公司網域.com.tw
mynetworks = 區網網段一/24, 區網網段二/24, 127.0.0.0/8
relay_domain = 敝公司網域.com.tw
transport_maps = hash:/etc/postfix/transport
敝公司網域.com.tw smtp:[Mail Server區網IP]
.敝公司網域.com.tw smtp:[Mail Server區網IP]
主機名稱.敝公司網域.com.tw local:
localhost.敝公司網域.com.tw local:
員工一: 員工一@敝公司網域.com.tw
員工二: 員工二@敝公司網域.com.tw
員工三: 員工三@敝公司網域.com.tw
......
員工某: 員工某@敝公司網域.com.tw
員工一@敝公司網域.com.tw OK
員工二@敝公司網域.com.tw OK
員工三@敝公司網域.com.tw OK
......
員工某@敝公司網域.com.tw OK
1.基本上是的。
myhostname mydomain 這兩個應還是要定義,
只是不要加到 mydestination 裡。
mydestination 應是指本機要「收的信」,
也就是有定義什麼信箱到什麼地方,
例如:本機帳號、aliases、virtual 等設定,
有定義什麼收哪些帳號。
(當然 virtual 若無一一指明的話,
等於是 * 任何都接受,後送才會知有無帳號的問題)
如果定義 real_domain 的話,
假設你裡面設 cnn.com 的話,
任何送信經過該機器,
看到收件者是 cnn.com 就直接接受,
再查dns怎麼送到cnn.com。
一般不會這麼設,
而是設只設 敝公司網域.com.tw,
接受後,預設是會再查dns看要送到何處,
其實會查到又要送回這個的MX,
也就是自己的IP,
這就會有問題,
所以才要定義 transport,
敝公司網域.com.tw smtp:[Mail Server區網IP]
才會往後送,
而不會又往自己的IP送。
.敝公司網域.com.tw smtp:[Mail Server區網IP]
這一筆不該加入,
不然連 主機名稱.敝公司網域.com.tw 也被算在內。
主機名稱.敝公司網域.com.tw local:
如果 mydestination 已有 主機名稱.敝公司網域.com.tw,
就不需要這筆。
localhost.敝公司網域.com.tw local:
該設定好 /etc/hosts 檔,
應讓 postfix 轉信的header,
出現的是 主機名稱.敝公司網域.com.tw,
而不是 localhost.敝公司網域.com.tw 的字樣出去;
這樣就不需要這一筆。
hsw1976提到:
relay_recipients
用real_domain是不用一個一個定義什麼帳號就可整個domain代轉,
但也無條件地轉送try不存在帳號的信件。
如果從這圖:
看不出 relay_domain、relay_recipients 處理依據的邏輯,
要測試 relay_domain relay_recipients 這兩個是否可各自獨立設定?
或者 relay_recipients 的生效是一定要 relay_domain?
需要再確認一下。