Прозрачное перенаправление почты через iptables

    Заголовок можно продолжить:… или плавный перевод почты на другой сервер.
    Недавно встала задача — реализовать возможность использования почтового сервера, не имеющего прямого выхода в интернет. Причем работать он должен вместо старого, который работает, естественно под другим IP-адресом.

    Принципиальный момент — почта изначально хранилась на шлюзе. Настройку iptables будем производить на шлюзе, iptables на почтовом сервере настраивать не нужно.

    Исходные данные:
    сервер — CentOS 5
    192.168.0.3 — ай-пи почтового сервера
    192.168.0.1 — внутренний ай-пи адрес бывшего почтового сервера/шлюза
    199.199.199.199 — ай-пи адрес бывшего почтового сервера/шлюза

    eth0 — локальный интерфейс на шлюзе
    eth1 — внешний интерфейс на шлюзе

    Настройка сетевого интерфейса на почтовом сервере:
    ip-адрес: 192.168.0.3
    маска: 255.255.255.0
    шлюз: 192.168.0.1

    Перенаправлять будем IMAP (143 порт), SMTP (25 порт).

    Перейдем непосредственно к реализации:

    1. Прием почты

    1.1.1
    # Все то, что пришло на внутренний интерфейс по почтовым портам — перенаправляем
    iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.0.3 --dport 25 -j DNAT --to-destination 192.168.0.3:25
    iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.0.3 --dport 143 -j DNAT --to-destination 192.168.0.3:143
    


    1.1.2
    # Все то, что пришло на внешний интерфейс по почтовым портам — перенаправляем
    iptables -t nat -A PREROUTING -i eth1 -p tcp -d 199.199.199.199 --dport 143 -j DNAT --to-destination 192.168.0.3:143
    iptables -t nat -A PREROUTING -i eth1 -p tcp -d 199.199.199.199 --dport 25 -j DNAT --to-destination 192.168.0.3:25
    


    1.2
    # Меняем исходный IP-адрес клиента на IP-адрес шлюза.
    # Очень важно делать SNAT только для компьютеров в локальной сети, иначе RBL проверки при приеме почты работать не будут,
    # так как вообще все будет приниматься с одного IP-адреса. Это плохо еще и тем, что нельзя ввести ограничение на количество
    # соединений с одного IP-адреса.
    iptables -t nat -A POSTROUTING -o eth0 -p tcp -s 192.168.0.0/24 -d 192.168.0.3 --dport 25 -j SNAT --to-source 192.168.0.1
    iptables -t nat -A POSTROUTING -o eth0 -p tcp -s 192.168.0.0/24 -d 192.168.0.3 --dport 143 -j SNAT --to-source 192.168.0.1
    


    1.3
    # Разрешаем проброс портов после перенаправления портов на шлюзе
    iptables -A FORWARD -p tcp -d 192.168.0.3 --dport 143 -j ACCEPT
    iptables -A FORWARD -p tcp -d 192.168.0.3 --dport 25 -j ACCEPT
    


    2. Отправка почты

    2.1
    # Разрешаем отправку почты с почтового сервера
    iptables -A FORWARD -s 192.168.0.3 -j ACCEPT
    


    2.2
    # В интернет отправляем пакеты, естественно, только с одного IP-адреса
    iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 199.199.199.199
    


    Не забываем об обязательном условии
    /etc/sysctl.conf:
    net.ipv4.ip_forward = 1

    Напоследок, подробная схема работы iptables.
    image

    Дополнение.
    Естественным желанием является унификация доменных имен для настройки почтовых клиентов.
    Так чтобы настройка почтового клиента вне офиса не отличалась от настройки внутри офиса.
    Тем более что в новой версии Thunderbird (преимущественно которой мы пользуемся) появился мастер автоматического определения SMTP, POP, IMAP серверов для настраиваемой учетной записи.

    Ориентироваться будем на общепринятые имена:
    imap.mydomain.ru
    smtp.mydomain.ru
    mx запись для домена

    Нам нужно настроить записи для домена 2 раза — для самого домена в админке доменного имени и в DNS в локальной сети.

    Рассмотрим настройку записей на DNS-сервере в локальной сети.
    В named.conf добавляем:

    view "internal"
    {
            match-clients           { localnets; };
            match-destinations      { localnets; };
    
    ....
    
            zone    "mydomain.ru" IN {
                type master;
                file "master/mydomain.ru";
                allow-update { 127.0.0.1; 192.168.0.1; };
            };
    
    
    };
    


    Создаем master/mydomain.ru:
    $ORIGIN .
    $TTL 259200     ; 3 days
    mydomain.ru        IN SOA  ns.mydomain.ru. root.mydomain.ru. (
                                    23840      ; serial
                                    10800      ; refresh (3 hours)
                                    900        ; retry (15 minutes)
                                    604800     ; expire (1 week)
                                    86400      ; minimum (1 day)
                                    )
    
                            NS      ns.mydomain.ru.
    
    $ORIGIN mydomain.ru.
    @       IN MX 10                mail.mydomain.ru.
    ns                       A       192.168.0.1
    mail                    A        192.168.0.3
    imap                   CNAME    mail
    smtp                   CNAME    mail
    


    Проверяем при помощи nslookup. Всё!
    Поделиться публикацией

    Комментарии 10

    • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
        0
        А откуда схемка? Имхо, она не совсем правильная. Пакет может прийти из сети А и предназначаться «for the firewall» (например для squid), а потом уйти в сеть В, чего не возможно согласно этой иллюстрации. Тут схема хоть и менее красивая, но идиалогически правильная.
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          возможно. у меня была другая задача, решить вопрос в рамках принципа бритвы Оккамы.
            0
            ИМХО, все вы правильно сделали, используя средства, которые будут сходу понятны любому квалифицированному специалисту.
            • НЛО прилетело и опубликовало эту надпись здесь
                0
                В защиту приведенного способа могу сказать, что в любом случае при использовании xinetd вам всё равно придется фаервол при помощи iptables, кроме того наверняка при больших объемах решение с iptables наверняка надежней.
                • НЛО прилетело и опубликовало эту надпись здесь

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое