Skip to content

如何在单个服务器上为多个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 downdocker compose up -d 后网络容器发生重建,iptables的规则优先级会发生变化,这时候配置可能会失效,

所以建议在更新或者重建docker-compose后重新添加一遍iptables规则。不要忘记删除掉原来的规则!!!

Released under the AGPLv3 License