Buộc địa chỉ từ khi postfix chuyển tiếp qua smtp


28

Tôi đang cố gắng nhận báo cáo qua email từ các phiên bản AWS EC2 của chúng tôi. Chúng tôi đang sử dụng Exchange Online (một phần của Dịch vụ trực tuyến của Microsoft). Tôi đã thiết lập một tài khoản người dùng dành riêng cho chuyển tiếp SMTP và tôi đã thiết lập Postfix để đáp ứng tất cả các yêu cầu để chuyển tiếp thư qua máy chủ này. Tuy nhiên, máy chủ SMTP của Exchange Online sẽ từ chối thư trừ khi địa chỉ Từ khớp chính xác với địa chỉ xác thực (thông báo lỗi là 550 5.7.1 Client does not have permissions to send as this sender).

Với cấu hình cẩn thận, tôi có thể thiết lập các dịch vụ của mình để gửi với tư cách là người dùng này. Nhưng tôi không phải là một người hâm mộ cẩn thận - tôi muốn có hậu tố buộc vấn đề này. Có cách nào để làm việc này không?

Câu trả lời:


38

Đây là cách thực sự làm điều đó trong postfix.

Cấu hình này thay đổi địa chỉ người gửi từ cả lưu lượng thư cục bộ và chuyển tiếp thư SMTP:

/etc/postfix/main.cf:

sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps =  regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check

Viết lại địa chỉ phong bì từ email có nguồn gốc từ chính máy chủ

/ etc / postfix / sender_canonical_maps:

/.+/    newsender@address.com

Viết lại từ địa chỉ trong e-mail chuyển tiếp SMTP

/ etc / postfix / header_check:

/From:.*/ REPLACE From: newsender@address.com

Điều đó rất hữu ích nếu bạn sử dụng máy chủ smtp chuyển tiếp cục bộ, được sử dụng bởi tất cả các đa chức năng và một số ứng dụng.

Nếu bạn sử dụng máy chủ Office 365 SMTP, mọi thư có địa chỉ người gửi khác với email từ chính người dùng được xác thực sẽ bị từ chối. Các cấu hình trên ngăn chặn điều này.


Cảm ơn! Điều này trông giống như những gì tôi đang tìm kiếm. Thật không may, quyền truy cập của tôi vào Office 365 là hai công việc trước đây. Ai đó có thể xác nhận nếu điều này làm việc cho họ?
John Whitlock

1
Tôi có thể. Tôi đang sử dụng cái này với văn phòng 365.
Jasper

1
Khi sử dụng sender_canonical_mapspostfix không thể lưu thư bị từ chối vào bộ đệm cục bộ và thay vào đó cố gắng gửi nó qua chuyển tiếp vô hạn
lưu vực

2
@Jasper FYI Tôi thấy điều này dễ dàng hơn để thay đổi các cấu hình trên postconf -e sender_canonical_classes=envelope_sender,header_sender postconf -e sender_canonical_maps=regexp:/etc/postfix/sender_canonical_maps postconf -e smtp_header_checks=regexp:/etc/postfix/header_check
Jacob Evans

đã có một vấn đề tương tự, sender_canonical_groupes = phong_sender đã cứu ngày của tôi!
Stephan Richter

13

Bảng chung tùy chọn chỉ định ánh xạ địa chỉ áp dụng khi thư được gửi (gửi) từ máy chủ.

Điều này ngược lại với ánh xạ chuẩn , áp dụng khi máy chủ nhận được thư.

(Lưu ý: cả hai địa chỉ TỪ và TO đều được khớp để thay thế cho bất kỳ bảng chung và chính tắc nào.)

Sử dụng bảng chuẩn khi thư được nhận bởi máy chủ đã được giải thích là các câu trả lời khác.

Bạn có thể viết lại TỪ địa chỉ khi thư được gửi từ máy chủ bằng cách sử dụng smtp_generic_maps.

Theo tài liệu postfix :

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    user@localdomain.local      account@isp.example.com
    @localdomain.local          wholedomain@isp.example.com

Sau đó làm:

sudo postmap /etc/postfix/generic
sudo /etc/init.d/postfix reload

Tài liệu tham khảo:


1
Điều này hoạt động nhưng làm thế nào tôi cũng có thể thay đổi tên TỪ?
Joanna Mikalai

Kinh nghiệm của tôi với các bản đồ chung là nó sẽ xác định cả hai địa chỉ TỪ và ĐẾN, sử dụng bản đồ chính tắc để buộc chỉ địa chỉ TỪ như OP yêu cầu
doz87

Có thể thay đổi địa chỉ thư của người gửi và khớp địa chỉ người gửi bằng regex không?
WM

@ doz87 cả TỪ và ĐẾN sẽ được khớp bởi cả hai bản đồ chính tắc và chung. Tôi đã cập nhật câu trả lời của mình để giải thích sự khác biệt giữa hai bản đồ.
Jocelyn

@WM có, bạn có thể sử dụng regrec. Tôi chưa bao giờ thử nó nhưng có lẽ bạn sẽ phải thay đổi hash:thành regexp:main.cf và sử dụng các dòng như /foo.*@localdomain.local/ account@example.comtrong bản đồ chung. Điều này được giải thích trong trang man: postfix.org/generic.5.html
Jocelyn

7

Cập nhật: Theo lời khuyên của một người bạn CNTT, tôi đang chạy postfix trên tất cả các máy chủ của mình, thay vì tạo một máy chủ thư trên đám mây. Đây là giải pháp của tôi cho đến nay:

/etc/postfix/main.cf

# output of hostname -f - mail from local users appears to come from here
myhostname = domU-01-02-03-04-05-06.compute-1.internal
# Local delivery - include all 127.0.0.1 aliases from /etc/hosts
mydestination = $myhostname, $mydomain, rest_of_entries_from_hosts
# Needed for address translation to work
myorigin = $mydomain

# Talking to MS Online
# :submission = port 587
relayhost = [smtp.mail.microsoftonline.com]:submission
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options =   # Yes, leave empty
smtp_tls_security_level = encrypt
smtp_generic_maps = hash:/etc/postfix/generic

# Enable if you need debugging, but it does leak credentials to the log
#debug_peer_level = 2
#debug_peer_list = smtp.mail.microsoftonline.com

# Only listen on the local interfaces (not the public)
inet_interfaces = localhost

# I left out a bunch of CentOS defaults.  postconf -n is your friend.
# These are included
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

/etc/postfix/sasl_passwd

# Run postmap /etc/postfix/sasl_passwd after editing
# Also, chown root:root; chmod 600
smtp.mail.microsoftonline.com relayer@hosteddomain.com:YourP@ssw0rd

/etc/postfix/generic

# Run postmap /etc/postfix/generic
# I've seen local mail come from either source
# output of dnsdomainname
@compute-1.internal relayer@hosteddomain.com
# output of hostname -f
@domU-01-02-03-04-05-06.compute-1.internal relayer@hosteddomain.com

/etc/aliases

# Run newaliases after changing
# Lot of stuff here. Mostly, just make sure the graph points to root, such as
mailer-daemon:  postmaster
postmaster:     root

# And the important part - your email or distribution group
root:           awsadmins@hosteddomain.com

/etc/passwd

# Sometimes it helps to expand the name, so email comes from 'root at aws host 5'
#  rather than just 'root'
# Was
#root:x:0:0:root:/root:/bin/bash
# Is
root:x:0:0:root on aws host 5:/root:/bin/bash

Những điều tôi hạnh phúc về:

  • Rất nhiều thư được gửi đến root, và một dòng trong aliaschỉ thị ai nhận được nó.
  • Tất cả thư từ người dùng cục bộ được dịch đến từ đó relayer@hosteddomain.com, do đó, nó được gửi qua máy chủ SMTP trực tuyến của MS.
  • postfix có tài liệu tốt hơn nhiều so với sendmail.

Những điều tôi không hài lòng về:

  • Thay đổi tùy chỉnh được yêu cầu cho mỗi máy chủ lưu trữ và một số bước. Tôi đã viết một kịch bản bash để giúp đỡ.
  • Thủ passwdthuật tên không phải lúc nào cũng hoạt động và có thể khó tìm ra máy chủ mà thư đến từ đâu.
  • Mỗi thư được gửi sẽ đưa ra ba cảnh báo trong nhật ký:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list(Máy chủ SMTP gửi AUTHdanh sách null trước STARTTLS, nhưng AUTH LOGINsau).
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (Có một số tùy chọn cấu hình xung quanh certs, nhưng tôi không chắc liệu chuyển phát thư có bị hỏng khi chứng nhận được gia hạn không)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (Giống như số 2)

Cảm ơn cộng đồng serverfault đã chia sẻ ý kiến ​​mạnh mẽ về máy chủ thư.


4

Bạn có thể sử dụng smtpd_sender_login_maps để chỉ định danh sách bản đồ: địa chỉ người gửi - người dùng.

Thí dụ:

smtpd_sender_login_maps = 
    hash:/etc/postfix/login-map 

/ etc / postfix / login-map:

mail1@domain    userlogin
mail2@domain    userlogin, otheruser@example.com

Nó không hoạt động để gửi, nó sẽ hoạt động để chuyển tiếp theo cùng một cách.


Là mục đích để viết lại từ địa chỉ tại thời gian xếp hàng? Ấn tượng của tôi là smtpd_sender_login_maps được sử dụng để từ chối người gửi (như một phần của smtpd_sender_restrictions), không để dịch thông tin đăng nhập vào địa chỉ email. Với vị trí này, echo "This is a test" | /usr/sbin/sendmail test@example.comvẫn xếp hàng (và cuối cùng là chuyển tiếp) thư đến từuser@domU-DE-AD-BE-EF-00-01.compute-1.internal
John Whitlock

Xấu của tôi, bằng cách nào đó tôi hiểu bạn làm ủy quyền cho postfix của bạn. Trong trường hợp như vậy, smtpd_sender_login_maps sẽ giới hạn những gì người dùng có thể sử dụng những gì người gửi thêm.
lụa

Điều này có thể trở thành một phần của giải pháp cuối cùng của tôi. Tôi có thể từ chối tất cả trừ một địa chỉ người gửi ở mặt trước và thông báo cho người quản lý bưu điện về bất kỳ sự từ chối nào ở mặt trước, để cho tôi biết khi nào dịch vụ chưa được định cấu hình chính xác. Tôi đang xem smtp_generic_maps, để xem liệu tôi có thể sử dụng chúng để sửa đổi tất cả các tài khoản cục bộ thành Địa chỉ Một từ. Nhưng, tôi cần đọc lại các tài liệu postfix để hiểu cách xác định tài khoản cục bộ - AWS DNS không phù hợp với trực giác của tôi.
John Whitlock

0

Tôi sử dụng ánh xạ chuẩn để viết lại địa chỉ từ địa chỉ, chẳng hạn như viết lại root @ app01 thành no-reply@example.com.


3
Chào mừng bạn đến với Lỗi Máy chủ! Chúng tôi thực sự thích rằng câu trả lời chứa nội dung không phải con trỏ đến nội dung. Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
user9517 hỗ trợ GoFundMonica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.