如何在单个服务器上为多个IP绑定不同的发送域
第一步
通过iptables的SNAT规则设置172.66.1.0/24, 172.66.2.0/24, ..., 172.66.255.0/24这些内部网络的IP网段的出口IP。
示例
shell
iptables -t nat -D POSTROUTING -s 172.66.2.0/24 -j SNAT --to-source YOUR_SERVER_IP
第二步
添加新的网络到docker-compose.yml中,并给postfix服务配置多个静态IP。
示例
yaml
services:
postfix-billionmail:
networks:
billionmail-network:
ipv4_address: 172.66.1.100
aliases:
- postfix
billionmail-network-2:
ipv4_address: 172.66.2.100
aliases:
- postfix-2
networks:
billionmail-network:
driver: bridge
driver_opts:
com.docker.network.bridge.name: br-billionmail
ipam:
driver: default
config:
- subnet: 172.66.1.0/24
billionmail-network-2:
driver: bridge
driver_opts:
com.docker.network.bridge.name: br-billionmail-2
ipam:
driver: default
config:
- subnet: 172.66.2.0/24
第三步
配置Postfix的main.cf和master.cf,增加新的SMTP服务并绑定发送域名和静态IP,不要忘了设置默认的静态IP。
示例
ini
# main.cf
smtp_bind_address = 172.66.1.100
ini
# master.cf
# Added configurations to the tail of file.
smtp1 unix - - n - - smtp
-o smtp_bind_address=172.66.2.100
-o smtp_helo_name=mail.example.com
# ...
第四步
配置sender_dependent_default_transport_maps到main.cf中,并编写规则。注意规则编写格式!
示例
ini
# main.cf
sender_dependent_default_transport_maps = hash:/etc/postfix/conf/sender_transport
ini
# sender_transport
# @example.com smtp_server_name:
@example.com smtp1:
shell
# Don't forget execute postmap in postfix container
postmap /etc/postfix/conf/sender_transport
大功告成
接下来你只需要重启一下Postfix容器,让所有配置生效即可。
需要注意的事情
这个配置只是临时生效
如果执行了 docker compose down
和 docker compose up -d
后网络容器发生重建,iptables的规则优先级会发生变化,这时候配置可能会失效,
所以建议在更新或者重建docker-compose后重新添加一遍iptables规则。不要忘记删除掉原来的规则!!!