iT邦幫忙

0

Postfix - Relay access denied

翻了一下 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上
所以想請問我是不是還漏了什麼設定?
或是有哪些選項的設定有錯?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

6
逮丸逮丸
iT邦大師 1 級 ‧ 2011-07-07 07:30:56
最佳解答

要做 mail gateway,
相對於 sendmail 的功能是 mailertable
PostFix 相對應的功能是 transport
設定內容的說明應參考 transport(5)

&lt;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]

另外再補充說明

  1. 這台機器同時也是NAT主機, 所以它會有兩個網路介面
  2. 我們的對外服務主機 (如Web, dns, mail), 僅於網路卡設定區網IP, 然後透過 iptables 的轉址功能, 做真實IP與區網IP的對應

所以不曉得在這樣的機制下
/etc/postfix/transport 的設定方式是否會有不同?

另外再補上其他設定檔內容:

  1. main.cf

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

  1. /etc/postfix/relay_recipients
    員工一@敝公司網域.com.tw OK
    員工二@敝公司網域.com.tw OK
    員工三@敝公司網域.com.tw OK
    員工四@敝公司網域.com.tw OK
    ........
    員工某@敝公司網域.com.tw OK

  2. /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 裡的帳號。

如果改成這樣呢

  1. main.cf

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

alias_maps = hash:/etc/postfix/aliases

relay_recipient_map = hash:/etc/postfix/relay_recipients

content_filter =

  1. /etc/postfix/transport

敝公司網域.com.tw smtp:[Mail Server區網IP]
.敝公司網域.com.tw smtp:[Mail Server區網IP]
主機名稱.敝公司網域.com.tw local:
localhost.敝公司網域.com.tw local:

  1. /etc/postfix/aliases 不設定
  2. /etc/postfix/relay_recipients 不設定

hsw1976提到:
mydestination

mydestination裡不應要有 敝公司網域.com.tw,
否則會檢查本機裡有面有 敝公司網域.com.tw 的帳號。
假設你這臺轉信主機的名稱為 mx.敝公司網域.com.tw
後端信件主機為 ms.敝公司網域.com.tw 的話。

&lt;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大的意思是
除了

&lt;pre class="c" name="code">
mydestination=mx.敝公司網域.com.tw,localhost
relay_domain=敝公司網域.com.tw

的設定必須注意之外, 下列兩個設定

&lt;pre class="c" name="code">
aliases = hash:/etc/postfix/aliases
relay_recipients = hash:/etc/postfix/relay_recipients

只要選用其中一種即可?
這個清單若要手動維護, 以目前的狀況來看是不會太麻煩 (變動頻率不高)
另外想請教的是:

  1. 一堆送往不存在帳號的信件的部份, 是否有地方可以設定成不退信?
  2. 做LDAP的用意, 是為了要和後端Mail Server的郵件帳號同步嗎?

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提到:

  1. 一堆送往不存在帳號的信件的部份, 是否有地方可以設定成不退信?
  2. 做LDAP的用意, 是為了要和後端Mail Server的郵件帳號同步嗎?
  1. 如果在mx上有帳號列表檢查的話,對方主機一送出不存在帳號的收信者時,
    mx就直接拒絕,「退信」這信件,是對方主機去產生、處理。
    如果mx收了後,往ms後送,那就會是ms本身產生「退信」這信件,
    產生這「退信」動作 好像 無法設成不退信,
    最多比較可能的是,
    「去把退信做刪除的動作」:檢查標題有退信的特徵,予以discard掉。
    但要避免刪掉 「外部退回來的信」,免得使用者永遠不知自己寄到外面寄不成。
    這個細節是要再研究確認。
  1. 做LDAP的用意, 是為了要和後端Mail Server的郵件帳號同步嗎?

不只,而是讓單位內所有需要用到同樣帳密的機器或服務,
帳密都單一而集中而同步,而不需多處手動維護帳密的麻煩。

所以如果我希望的郵件接收傳遞路徑是:

Internet

mx.敝公司網域.com.tw (也就是這台兼作NAT,以及郵件過濾的轉信伺服器)

郵件伺服器 (員工的郵件帳號和信箱就在這裡)

員工的郵件信箱

員工的Mail Client

那麼設定檔應該是像這樣子嗎?

  1. main.cf

myhostname = 主機名稱.敝公司網域.com.tw

mydomain = 敝公司網域.com.tw

mydestination = 主機名稱.敝公司網域.com.tw
mynetworks = 區網網段一/24, 區網網段二/24, 127.0.0.0/8
relay_domain = 敝公司網域.com.tw
transport_maps = hash:/etc/postfix/transport

alias_maps = hash:/etc/postfix/aliases

relay_recipient_map = hash:/etc/postfix/relay_recipients

content_filter =

  1. /etc/postfix/transport

敝公司網域.com.tw smtp:[Mail Server區網IP]
.敝公司網域.com.tw smtp:[Mail Server區網IP]
主機名稱.敝公司網域.com.tw local:
localhost.敝公司網域.com.tw local:

  1. /etc/postfix/aliases 不設定

員工一: 員工一@敝公司網域.com.tw
員工二: 員工二@敝公司網域.com.tw
員工三: 員工三@敝公司網域.com.tw
......
員工某: 員工某@敝公司網域.com.tw

  1. /etc/postfix/relay_recipients 不設定

員工一@敝公司網域.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送。

  1. transport
    基本上,應是
    敝公司網域.com.tw smtp:[Mail Server區網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?
需要再確認一下。

我要發表回答

立即登入回答