Повесить exim на один из 2 внешних интерфейсов

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
psj
ефрейтор
Сообщения: 66
Зарегистрирован: 2007-10-29 13:44:50

Повесить exim на один из 2 внешних интерфейсов

Непрочитанное сообщение psj » 2008-03-26 10:28:37

Ну вот собственно поподробнее.
Есть локальная сеть и 2 интернет канала. На шлюзе установлен файрвол pf. Необходимо принимать и отправлять почту по одному из каналов. Причем этот канал НЕ ЯВЛЯЕТСЯ шлюзом по умолчанию.
Роутер:
[ root@rt.daycom.ru / ] # uname -a [ 12:57 ]
FreeBSD rt.daycom.ru 6.3-STABLE FreeBSD 6.3-STABLE #4: Thu Jan 31 09:15:57 MSK 2008 psj@rt.daycom.ru:/usr/obj/usr/src/sys/rt i386
Интерфейсы:
[ root@rt.daycom.ru / ] # ifconfig [ 12:57 ]
vr0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=8<VLAN_MTU>
inet 17.106.95.90 netmask 0xfffffff8 broadcast 17.106.95.95
inet 17.106.95.91 netmask 0xfffffff8 broadcast 17.106.95.95
ether 00:19:5b:83:60:e0
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vr1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=8<VLAN_MTU>
inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
inet 10.0.0.2 netmask 0xffffff00 broadcast 10.0.0.255
ether 00:1c:f0:0b:b0:e9
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vr2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=8<VLAN_MTU>
inet 192.168.1.2 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:19:21:56:a4:61
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500
pfsync0: flags=0<> mtu 2020
syncpeer: 224.0.0.240 maxupd: 128
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x6
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33208
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.1 --> 192.168.2.2 netmask 0xffffffff
Opened by PID 1273
Интерфей vr2 - является шлюзом по умолчанию.
rc.conf:
[ root@rt.daycom.ru / ] # cat /etc/rc.conf [ 12:58 ]
font8x16="cp866b-8x16"
font8x14="cp866-8x14"
font8x8="cp866-8x8"
keymap="ru.koi8-r.shift"
keyrate="fast"
mousechar_start="3"
scrnmap="koi8-r2cp866"
#=============================================================================
hostname="rt.daycom.ru"
ifconfig_vr0="inet 17.106.95.90 netmask 255.255.255.248"
ifconfig_vr0_alias0="inet 17.106.95.91 netmask 255.255.255.248"
ifconfig_vr1="inet 192.168.0.2 netmask 255.255.255.0"
ifconfig_vr1_alias0="inet 10.0.0.2 netmask 255.255.255.0"
ifconfig_vr2="inet 192.168.1.2 netmask 255.255.255.0"
defaultrouter="192.168.1.1"
#=============================================================================
pf_enable="YES" # Включить PF (Подгрузить модуль, если требуется)
pf_rules="/etc/pf.conf" # Откуда подгружать правила для pf
pf_flags="" # дополнительные флаги для управляющей программы pfctl(8)
pflog_enable="YES" # запуск pflogd(8) (система журналирования)
pflog_logfile="/var/log/pflog" # где pflogd должен хранить журнал
pflog_flags="" # дополнительные флаги для pflogd
#=============================================================================
# Синхронизация времени
ntpdate_enable="YES"
ntpdate_flags="ntp.psn.ru"
ntpd_enable="YES"
ntpd_flags=" -c /etc/ntp.conf -l /var/log/ntpd.log -p /var/run/ntpd.pid"
#=============================================================================
gateway_enable="YES"

sshd_enable="YES"

mysql_enable="YES"

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
#=============================================================================
# DNS
named_enable="YES"
named_flage="-u bind -g bind"

dhcpd_enable="YES"
dhcpd_conf="/usr/local/etc/dhcpd.conf"
dhcpd_ifaces="vr1" # на каком интерфейсе крутится DHCP

exim_enable="YES"
spamd_enable="YES"
spamd_flags="-u spamd -H /var/spool/spamd"
sendmail_enable="NONE"
courier_authdaemond_enable="YES"
courier_imap_imapd_enable="YES"
courier_imap_pop3d_enable="YES"

apache22_enable="YES"
apache22_http_accept_enable="YES"

openvpn_enable="YES" # YES or NO
openvpn_if="tun" # driver(s) to load, set to "tun", "tap" or "tun tap"
openvpn_configfile="/usr/local/etc/openvpn/server.conf" # --config file
openvpn_dir="/usr/local/etc/openvpn" # --cd directory

squid_enable="YES"

rpcbind_enable="YES"
nfs_server_enable="YES"
nfs_client_enable="YES"
Ну и самое главное - вот такой файрвол:
[ root@rt.daycom.ru / ] # cat /etc/pf.conf [ 13:02 ]
#Внешние и внутренний интерфейсы.
#
ext_if_a = "vr0" #первый провайдер
ext_if_b = "vr2" #второй провайдер
int_if = "vr1" #локалка
int_if_vpn = "tun0" # vpn
if_lo = "lo"

#Шлюзы для каналов.
#
ext_gw_a = "17.106.95.89" #для первого провайдера
ext_gw_b = "192.168.1.1" #для второго провайдера
net = "192.168.0.0/24" #локалка
#TCP/UDP сервисы, обслуживаемые маршрутизатором, то к чему имеется доступ на внешних интерфейсах
#
tcp_svc = "domain, auth, http, ntp, ssh" #как пример, что то нужно вписать иначе будет биг ошибка
udp_svc = "domain, ntp, ssh" #аналогично, 1194 - vpn
udp_vpn = "1194"
# Из интернета на почтовый сервер
tcp_mail ="smtp, pop3"
# закрытые порты из внутренней сети в интернет
tcp_block_int ="smtp"

mail_server ="17.106.95.91"
router ="17.106.95.90"

#Создаем таблицу доверенных smtp-севреров
table <my_smtp> { $mail_server, 194.67.23.111, 195.161.174.129}

set skip on lo0

# нормализация трафика
scrub in

#Натим, важный момент, именно тут определяется кого куда пускать
#Синтаксис ната, грубо говоря, таков: nat on _интерфейс_ from _откуда_ to _куда_ -> _интерфейс_или_ип_адрес
#
nat on $ext_if_b from {$net} -> ($ext_if_b:0)
# Пробрасываем порты из внутренней сети на SQUID
#
rdr pass on $int_if proto tcp to port http -> 127.0.0.1 port 3128
#Разрешаем сети ходить в интернет, всё остальное блокируем
#
block in on { $ext_if_a $ext_if_b }
block return-rst in on { $ext_if_a $ext_if_b } proto tcp
pass out on { $ext_if_a $ext_if_b } keep state

#Блокируем все исходящие smtp-запросы на сервера которых нет в списке
block in log quick on $int_if proto { tcp, udp } from $net to !<my_smtp> port { $tcp_block_int }

#Исходящие пакеты в канал, соответствующий адресу источника. Здесь и начинается policy
#
pass out route-to ($ext_if_a $ext_gw_a) from ($ext_if_a) to !(self:network) keep state
pass out route-to ($ext_if_b $ext_gw_b) from ($ext_if_b) to !(self:network) keep state
# Пускаем vpn на роутер
#
pass out on $ext_if_b reply-to ($ext_if_a $ext_gw_a) inet proto udp from $router port { $udp_vpn } to any keep state
pass out on $ext_if_b route-to ($ext_if_a $ext_gw_a) inet proto udp from $router port { $udp_vpn } to any keep state
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) inet proto udp from any to $router port { $udp_vpn } keep state
#А вот policy для входящих пакетов на внешние интерфейсы
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto udp to $router port { $udp_svc } keep state
pass in on $ext_if_a proto udp from ($ext_if_a:network) to $router port { $udp_svc } keep state
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto tcp to port { $tcp_svc } flags S/SA keep state
pass in on $ext_if_a proto tcp from ($ext_if_a:network) to port { $tcp_svc } flags S/SA keep state
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto icmp to $router keep state
pass in on $ext_if_a route-to ($ext_if_a $ext_gw_a) proto icmp to $router keep state
pass in on $ext_if_a proto icmp from ($ext_if_a:network) to $router keep state
# Пускаем почту на почтовый сервер
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto tcp to $mail_server port { $tcp_mail } flags S/SA keep state
pass in on $ext_if_a proto tcp from ($ext_if_a:network) to $mail_server port { $tcp_mail } flags S/SA keep state
#
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) proto udp to port { $udp_svc } keep state
pass in on $ext_if_b proto udp from ($ext_if_b:network) to port { $udp_svc } keep state
#
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) proto tcp to port { $tcp_svc } flags S/SA keep state
pass in on $ext_if_b proto tcp from ($ext_if_b:network) to port { $tcp_svc } flags S/SA keep state
# Выпускаем почту с нашего сервера в инет
#
pass out on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto tcp from $mail_server to any port { $tcp_mail } flags S/SA
pass out on $ext_if_a route-to ($ext_if_a $ext_gw_a) proto tcp from $mail_server to any port { $tcp_mail } flags S/SA
pass out on $ext_if_b reply-to ($ext_if_a $ext_gw_a) proto tcp from $mail_server to any port { $tcp_mail } flags S/SA
pass out on $ext_if_b route-to ($ext_if_a $ext_gw_a) proto tcp from $mail_server to any port { $tcp_mail } flags S/SA
# По внутреннему интерфейсу и vpn пропускаем всё и везде
#
pass on $int_if all keep state
pass on $int_if_vpn all keep state
Вроде как всё правильно - НО:
проблема следующая. Интерфейс А имеет статический ip, а B динамически выдается провом и находится за натом прова. Внешний адрес ната практически постоянно банится mail серверами партнеров. Необходимо ВСЮ почту пустить через статический адрес. Из вне почта приходит по статическому адресу, а вот отправляется с динамического :twisted:

И еще - не могу снаружи пропинговать свой mail сервер
В правильно заданном вопросе 80% ответа

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
psj
ефрейтор
Сообщения: 66
Зарегистрирован: 2007-10-29 13:44:50

Re: Повесить exim на один из 2 внешних интерфейсов

Непрочитанное сообщение psj » 2008-03-26 16:33:43

Спасибо, вопрос снят!
В правильно заданном вопросе 80% ответа

Alexys
проходил мимо
Сообщения: 1
Зарегистрирован: 2007-09-18 15:21:01

Re: Повесить exim на один из 2 внешних интерфейсов

Непрочитанное сообщение Alexys » 2008-04-11 14:42:41

А можно поитересоваться, в какой части вопрос снят? У меня ситуация примерно такая же: есть оптика с выделенным ip и адсл с динамическим, надо отправлять/принимать почту по статическому адресу при defaultrouter на адсл.
FreeBSD 6.2, IPFW, в качестве MTA думается Exim

Аватара пользователя
freeman
лейтенант
Сообщения: 734
Зарегистрирован: 2007-03-18 5:13:25

Re: Повесить exim на один из 2 внешних интерфейсов

Непрочитанное сообщение freeman » 2008-04-12 13:37:35

psj писал(а):Спасибо, вопрос снят!
Написал бы действительно что и как "снял", многим приходится такую же схему вводить. Как раз с Free и пр. BSD, PF и Exim.
Привязал в самом Exim к интерфейсу ?
P.S. А мне вот придётся для резервирования привязать к статике, а в случае падения чтоб переключалось на DSL, часто что то падать стал линк :(
Остатся должен только один ...

Аватара пользователя
psj
ефрейтор
Сообщения: 66
Зарегистрирован: 2007-10-29 13:44:50

Re: Повесить exim на один из 2 внешних интерфейсов

Непрочитанное сообщение psj » 2008-04-14 8:51:40

freeman писал(а):
psj писал(а):Спасибо, вопрос снят!
Написал бы действительно что и как "снял", многим приходится такую же схему вводить. Как раз с Free и пр. BSD, PF и Exim.
Привязал в самом Exim к интерфейсу ?
P.S. А мне вот придётся для резервирования привязать к статике, а в случае падения чтоб переключалось на DSL, часто что то падать стал линк :(
Прошу прощения, работы много было, не управляюсь.
Естественно основная проблема была в файрволе.
Итак - текущий файрвол с которым сейчас работаю:

Код: Выделить всё

[ root@rt.daycom.ru /root ] # cat /etc/pf.conf                                                                 [ 9:46 ]
#Внешние и внутренний интерфейсы.
#
ext_if_a        = "vr0" #первый провайдер
ext_if_b        = "vr2" #второй провайдер
int_if          = "vr1" #локалка
int_if_vpn      = "tun0" # vpn
if_lo           = "lo"

#Шлюзы для каналов.
#
ext_gw_a        = "17.106.95.89"       #для первого провайдера
ext_gw_b        = "192.168.1.1"         #для второго провайдера
net             = "192.168.0.0/24"      #локалка
#TCP/UDP сервисы, обслуживаемые маршрутизатором, то к чему имеется доступ на внешних интерфейсах
#
tcp_svc         = "domain, auth, http, ntp"     #что-то нужно вписать иначе будет биг ошибка :)
udp_svc         = "domain, ntp"                 #аналогично, 1194 - vpn
udp_vpn         = "1194"
# Из интернета на почтовый сервер
tcp_mail        ="smtp, pop3"
# закрытые порты из внутренней сети в интернет
tcp_block_int   ="smtp"

mail_server     ="17.106.95.91"
router          ="17.106.95.90"
www_server      ="17.106.95.90"

#Создаем таблицу доверенных smtp-севреров (1. внутр. IP, 2. внеш. IP, 3. smtp.mail.ru, 4. smtp.yandex.ru)
table <my_smtp> { $mail_server, 194.67.23.111, 195.161.174.129}

# Таблица адресов выходящих в инет через НАТ
#
table <my_nat> persist file "/etc/pf-allow-nat.conf"

# Начало
#
set skip on lo0

# нормализация трафика (иначе терминальный клиент через vpn не работает!!!)
scrub in

#Натим, важный момент, именно тут определяется кого куда пускать
#Синтаксис ната, грубо говоря, таков: nat on _интерфейс_ from _откуда_ to _куда_ -> _интерфейс_или_ип_адрес
#
nat on $ext_if_b from <my_nat> -> ($ext_if_b:0)
# Пробрасываем порты из внутренней сети на SQUID
#
rdr pass on $int_if proto tcp to !$www_server port http -> 127.0.0.1 port 3128
#
#Разрешаем сети ходить в интернет, всё остальное блокируем
#
block in on { $ext_if_a $ext_if_b }
block return-rst in on { $ext_if_a $ext_if_b } proto tcp
pass out on { $ext_if_a $ext_if_b } keep state

#Исходящие пакеты в канал, соответствующий адресу источника. Здесь и начинается policy
#
pass out route-to ($ext_if_a $ext_gw_a) from ($ext_if_a) to !(self:network) keep state
pass out route-to ($ext_if_b $ext_gw_b) from ($ext_if_b) to !(self:network) keep state
#
# Пускаем vpn на роутер
#
pass out on $ext_if_b reply-to ($ext_if_a $ext_gw_a) inet proto udp from $router port { $udp_vpn } to any keep state
pass out on $ext_if_b route-to ($ext_if_a $ext_gw_a) inet proto udp from $router port { $udp_vpn } to any keep state
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) inet proto udp from any to $router port { $udp_vpn }  keep state
#
#Блокируем все исходящие smtp-запросы которые к левым серверам
#
block in log quick on $int_if proto { tcp, udp } from $net to !<my_smtp> port { $tcp_block_int }
#
# Пускаем почту на почтовый сервер и выпускаем почту с нашего сервера в инет
#
pass out quick on $ext_if_b reply-to ($ext_if_a $ext_gw_a) proto {tcp, udp} from $mail_server port { smtp } to any port { smtp }
pass out quick on $ext_if_b route-to ($ext_if_a $ext_gw_a) proto {tcp, udp} from $mail_server port { smtp } to any port { smtp }
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto {tcp, udp} to $mail_server port { $tcp_mail } flags S/SA keep state
#
# Разрешаем пинговать роутер и почтовый сервер
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto icmp to {$router,$mail_server} keep state
#
#А вот policy для входящих пакетов на внешние интерфейсы
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto udp to $router port { $udp_svc } keep state
pass in on $ext_if_a proto udp from ($ext_if_a:network) to $router port { $udp_svc } keep state
#
pass in on $ext_if_a reply-to ($ext_if_a $ext_gw_a) proto tcp to port { $tcp_svc } flags S/SA keep state
pass in on $ext_if_a proto tcp from ($ext_if_a:network) to port { $tcp_svc } flags S/SA keep state
#
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) proto udp to port { $udp_svc } keep state
pass in on $ext_if_b proto udp from ($ext_if_b:network) to port { $udp_svc } keep state
#
pass in on $ext_if_b reply-to ($ext_if_b $ext_gw_b) proto tcp to port { $tcp_svc } flags S/SA keep state
pass in on $ext_if_b proto tcp from ($ext_if_b:network) to port { $tcp_svc } flags S/SA keep state

# По внутреннему интерфейсу и vpn пропускаем всё и везде
#
pass on $int_if all keep state
pass on $int_if_vpn all keep state
А в конфиге exim-a добавил интерфейс на которром висит exim:

Код: Выделить всё

# Доставка на удалённые хосты - по SMTP
remote_smtp:
    driver = smtp
    interface = 17.106.95.91
В правильно заданном вопросе 80% ответа

argo
проходил мимо
Сообщения: 3
Зарегистрирован: 2008-02-27 13:54:48

Re: Повесить exim на один из 2 внешних интерфейсов

Непрочитанное сообщение argo » 2008-04-16 14:28:00

Провел некоторые изыскания по этому вопросу, но результат отрицательный.
Есть 2 внешних канала "1", "2"
Есть шлюз по умолчанию "шлюз1" в канал 1
Есть pf
Задача отправлять всю почту с самого сервака не в шлюз по умолчанию
Что получилось. Из локалки без проблем. С самого сервака никак.
Может у кого-то есть идеи. Отправлял telnet-ом, postfix-ом

Аватара пользователя
psj
ефрейтор
Сообщения: 66
Зарегистрирован: 2007-10-29 13:44:50

Re: Повесить exim на один из 2 внешних интерфейсов

Непрочитанное сообщение psj » 2008-04-16 15:00:47

argo писал(а):Провел некоторые изыскания по этому вопросу, но результат отрицательный.
Есть 2 внешних канала "1", "2"
Есть шлюз по умолчанию "шлюз1" в канал 1
Есть pf
Задача отправлять всю почту с самого сервака не в шлюз по умолчанию
Что получилось. Из локалки без проблем. С самого сервака никак.
Может у кого-то есть идеи. Отправлял telnet-ом, postfix-ом
Посмотри предыдущий пост.
Работате так - из сети вся почта может уходить ТОЛЬКО через почтовый сервер, который находится на роутере или через определенные сервера. Вся остальная пересылка просто обрубается. С почтового сервера, который на роутере, почта уходит НЕ через шлюз по умолчанию.
В правильно заданном вопросе 80% ответа