У меня есть почтовый сервер Postfix, работающий на хосте с несколькими сетевыми адаптерами, один из которых является виртуальным устройством tun0. Мне нужен этот почтовый сервер, чтобы принимать соединения на любом адаптере и отправлять электронную почту только на виртуальном устройстве tun.
У меня есть конфигурация, в соответствии с ответом на этот вопрос, который определяет smtp_bind_address = 10.20.30.40, где 10.20.30.40 - это адрес, связанный с устройством tun0. Этот сервер-сервер не поддерживает IPV6.
В течение многих лет это работало идеально - до тех пор, пока однажды устройство tun0 не умерло - и Postfix отправил электронное письмо через сетевое устройство по умолчанию, eth0 (10.0.0,1), а не tun0.
Это ожидаемое поведение? Могу ли я изменить настройки, чтобы Postfix всегда отправлял электронную почту только через tun0 (10.20.30.40) - оставляя сообщения в очереди, если tun0 недоступен?
Если это актуально, это на Ubuntu 16.04.2 LTS с Postfix версии 3.1.0-3. tun0 реализован с использованием OpenVPN версии 2.3.10-1ubuntu2.1
- Отредактируйте, чтобы добавить дополнительные детали -
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.1 0.0.0.0 UG 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.20.30.40 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
На этом сервере работает несколько служб, из которых Postfix только одна. Только электронная почта должна быть маршрутизирована через 10.20.30.40 - все остальные службы должны быть маршрутизированы через шлюз по умолчанию.
Что происходит, так это то, что postfix будет использовать настроенный smtp_bind_address
первый. В вашем случае это статический ip, привязанный к tun0. Когда он заработает, он отключится через tun0. Если tun0 не работает, то клиент bind
не удастся заставить postfix вернуться к поведению по умолчанию, не привязывая конечную точку tcp клиента, и поэтому он будет использовать маршрут по умолчанию, который подключен к eth0.
Казалось бы, postfix не обеспечивает подходящего переопределения для отказа smtp_bind_address.
Итак, ответ - просто заблокировать исходящую электронную почту на порту 25 интерфейса eth0 с помощью правила таблиц IP. Это приведет к тому, что вся электронная почта будет стоять в очереди на некоторое время, прежде чем произойдет сбой или пока не вернется tun0.
Что-то вроде следующего должно работать:
iptables -A OUTPUT -i eth0 -p tcp --dport 25 -j DROP
Это предотвратит отправку всей электронной почты через порт 25 через eth0 и ее отправку непосредственно с вашего сервера (без маршрутизации). Он не будет блокировать почтовый трафик, отправляемый через tun0.
Давненько мне не приходилось возиться с postfix. Но я думаю, вам следует использовать реле смарт-хоста.
Интеллектуальный хост - это тип агента передачи сообщений электронной почты, который позволяет серверу SMTP направлять электронную почту на промежуточный почтовый сервер, а не напрямую на сервер получателя.
Ретранслятором будет почтовый сервер, соответствующий SPF-записи отправителя в вашем почтовом домене. Ваш интернет-провайдер должен быть в состоянии действовать для вас как ретранслятор электронной почты смарт-хоста.
По памяти это может быть так же просто, как установить параметр в /etc/postfix/main.cf
например relayhost = mx1.mydomain.com:587
Тогда вам не нужно будет заботиться о том, с какого интерфейса отправляется почта.
Судя по тому, что я смог собрать и протестировать в лаборатории, похоже, что это работает так, как задумано. smtp_bind_address переключится на другой inet_interface, если он недоступен.
Возможно, вы могли бы настроить другой экземпляр Postfix, который имеет только один inet_interface из 10.20.30.40
, а исходящий postmap / relay к этому? Возможно, тогда вы сможете получать через несколько адаптеров и принудительно отправлять по одному IP-адресу.