Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.
Хост, который связан с сетью TCP/IP, может иметь один или более аппаратных (физических) сетевых интерфейсов. Каждый из этих интерфейсов может быть сконфигурирован как один или несколько уже логических интерфейсов, с которыми, фактически, работает программа. Каждый из этих логических интерфейсов ассоциирован с IP-адресом. Кроме того, программное обеспечение TCP/IP поддерживает loopback-интерфейсы (127.0.0.1 в IPv4 и ::1 в IPv6), которые не используют какое-либо физическое устройство. Exim требует информацию об интерфейсах хоста для использования в трёх различных обстоятельствах:
Поведение exim по умолчанию, вероятно, будет подходящим в подавляющем большинстве случаев. Если у Вашего хоста лишь один интерфейс, Вы хотите, чтобы все его IP-адреса были обработаны одинаково, и используете стандартный SMTP-порт, то Вы не должны предпринимать каких-либо специальных действий. Остальная часть этой главы к Вам не относится.
В более сложных ситуациях может быть необходимо слушать только на определённых интерфейсах или на различных портах, а для этого есть много опций, которые можно использовать для влияния на поведение exim. Остальная часть этой главы описывает, как они работают.
Когда сообщение получено через TCP/IP, интерфейс и порт, которые фактически использовались, установлены в переменных $interface_address и $interface_port.
Когда слушающий демон запущен (путём опции командной строки -bd), интерфейсы и порты, на которых он слушает управляются следующими опциями:
local_interfaces = <; 127.0.0.1 ; \ 192.168.23.65 ; \ ::1 ; 3ffe:ffff:836f::fe86:a061 |
Есть два различных формата для задания порта с IP-адресом в local_interfaces:
local_interfaces = <; 192.168.23.65.1234 ; \ 3ffe:ffff:836f::fe86:a061.1234 |
local_interfaces = <; [192.168.23.65]:1234 ; \ [3ffe:ffff:836f::fe86:a061]:1234 |
Когда порт не задан, используется значение daemon_smtp_ports. Настройка по умолчанию содержит лишь один порт:
daemon_smtp_ports = smtp |
Если перечислено более одного порта, каждый интерфейс, для которого не определён его собственный порт, слушает на всех них. Порты, перечисленные в daemon_smtp_ports, могут быть идентифицированы по имени (определённому в /etc/services) или по номеру. Однако, когда порты даны с индивидуальными IP-адресами в local_interfaces, только номера (не имена) могут использоваться.
Адреса 0.0.0.0 и ::0 обрабатываются особенно. Они интерпретируются как все интерфейсы IPv4 и все интерфейсы IPv6, соответственно. В каждом случае exim говорит стеку TCP/IP слушать на всех интерфейсах IPvx вместо установки отдельных слушающих сокетов для каждого интерфейса. Значение local_interfaces по умолчанию:
local_interfaces = 0.0.0.0 |
local_interfaces = <; ::0 ; 0.0.0.0 |
Таким образом, по умолчанию exim слушает все доступные интерфейсы на SMTP-порте.
Опция командной строки -oX может быть использована для переопределения значений daemon_smtp_ports и/или local_interfaces для специфичаского случая демона. Другой способ сделать это состоял бы в использовании макроса и опции -D. Однако, -oX может использоваться лишь административными пользователями, тогда как модификация рабочей конфигурации использованием опции -D разрешена только, когда вызывающий root или пользователь exim.
Значение -oX задает список значений. По умолчанию разделитель двоеточие, но это может быть изменёно обычным способом, если требуется. Если есть элементы, не содержащие точек или двоеточий (то есть, не IP адреса), значение daemon_smtp_ports заменяется списком этих элементов. Если тут есть какие-то пункты, содержащие точки или двоеточия, значение local_interfaces заменяется этими элементами. Таким образом, например:
-oX 1225 |
-oX 192.168.34.5.1125 |
Exim поддерживает устаревший протокол SSMTP (также известный как SMTPS), который использовался прежде, чем для SMTP была стандартизована команда STARTTLS. Некоторые старый клиенты до сих пор используют этот протокол. Если опция tls_on_connect_ports установлена в список портов, подключение к этим портам должно использовать SSMTP. Обычное использование этой опции такое:
tls_on_connect_ports = 465 |
Предупреждение: Установка tls_on_connect_ports не вынуждает демона слушать перечисленные в ней порты. Вы всё равно должны задать daemon_smtp_ports, local_interfaces или -oX. Это так потому, что tls_on_connect_ports обращается к подключениям через inetd так же, как и к подключениям через демон)
Адреса IPv6 имеют области (scopes), и хост с многими аппаратными интерфейсами, в принцмпе, может иметь один и тот же локальный адрес IPv6 на различных интерфейсах. Таким образом, необходима дополнительная информация, кроме IP-адреса, чтобы различать индивидуальные интерфейсы. В некоторых случаях было принято соглашение об использовании символа процента, сопровождаемого чем-либо (часто именем интерфейса), приводя к адресам вроде такого:
fe80::202:b3ff:fe03:45c1%eth0 |
Для согласования этого использования символ процента, сопровождаемый произвольной строкой, разрешён в конце адреса IPv6. По умолчанию exim вызывает getaddrinfo(), чтобы преобразовать текстовый адрес IPv6 для фактического использования. Эта функция распознаёт соглашение процента в операционных системах, которые поддерживают его, и соответственно обрабатывают адрес. К сожалению, некоторые старые библиотеки имеют проблемы с getaddrinfo(). Если
IPV6_USE_INET_PTON=yes |
Иногда случается, что двоичный файл exim, собранный с поддержкой IPv6, запускается на хосте, ядро которого не знает о IPv6. Двоичный файл продолжает использовать IPv4, но это может вызывать пустую растрату ресурсов на поиск AAAA-записей и попыток коннекта к адресам IPv6, вызывающие задержки в доставке почты. Если Вы установите опцию disable_ipv6 в истину, даже когда двоичный файл exim поддерживает IPv6, IPv6 не активируется. AAAA-записи никогда не ищутся и любые адреса IPv6, перечисленные в local_interfaces, заданных для маршрутизатора manualroute и т. д., игнорируются. Eсли IP-литералы включены (доставка не по имени, а по IP), роутер ipliteral отказывается обрабатывать адреса IPv6.
C другой стороны, когда используется IPv6, могут быть моменты, когда Вы хотите отключить его для определённых хостов или доменов. Вы можете использовать опцию dns_ipv4_lookup для глобального подавления поиска AAAA-записей для указанных доменов и можете использовать общую опцию роутеров ignore_target_hosts для игнорирования адресов IPv6 в индивидуальном роутере.
Случай по умолчанию в среде IPv6 таков:
daemon_smtp_ports = smtp local_interfaces = <; ::0 ; 0.0.0.0 |
Этим определяется, слушать smtp-порт на всех интерфейсах IPv4 и IPv6. Могут использоваться один или два сокета, в зависимости от характеристик стека TCP/IP. Для задания прослушивания портов 25 и 26 на всех интерфейсах:
daemon_smtp_ports = 25 : 26 |
local_interfaces = <; ::0.25 ; ::0.26 0.0.0.0.25 ; 0.0.0.0.26 |
Для того, чтобы слушать на порту по умолчанию всех IPv4-интерфейсов и порту 26 только на кольцевом адресе:
local_interfaces = 0.0.0.0 : 127.0.0.1.26 |
Для того, чтобы слушать на порту по умолчанию только на специфических интерфейсах:
local_interfaces = 192.168.34.67 : 192.168.34.67 |
Предупреждение: Такая установка исключает прослушивание кольцевого интерфейса.
Опция local_interfaces также используется, когда exim необходимо определить, действительно ли IP-адрес относится к локальному хосту. Таким образом, все IP-адреса, на которых слушает демон, всегда обрабатываются как локальные.
Для этого использования номеров портов в local_interfaces игнорируются. Если встречается один из двух элементов 0.0.0.0 или ::1, exim получает полный список доступных интерфейсов от операционной системы и извлекает уместные (то есть, IPv4 или IPv6) адреса, чтобы использовать для проверки.
Некоторые системы устанавливают большое число виртуальных интерфейсов для обеспечения большого числа виртуальных серверов в сети. В этой ситуации Вы можете захотеть слушать лишь некоторые доступные интерфейсы для получения почты, но обрабатывать все локальные интерфейсы как местные при роутинге. Вы можете сделать это установкой extra_local_interfaces в список IP-адресов, возможно, включая подстановочное значение "все". Эти адреса распознаются как локальные, но не используются для прослушивания. Рассмотрите этот пример:
local_interfaces = <; 127.0.0.1 ; ::1 ; \ 192.168.53.235 ; \ 3ffe:2101:12:1:a00:20ff:fe86:a061 extra_local_interfaces = <; ::0 ; 0.0.0.0 |
В некотором количестве окружений имя локального хоста может быть в списке MX, но с IP-адресом, не назначенным ни одному местному интерфейсу. В других случаях может быть желательным обработать другие имена хостов, как будто они ссылаются на локальный хост. Оба этих случая могут быть обработаны установкой опции hosts_treat_as_local. Она содержит имена хостов, а не IP-адреса. Когда на хост ссылаются в процессе маршрутизации, через MX-запись или непосредственно, он обрабатывается как локальный хост, если его имя совпадает с hosts_treat_as_local, или если любой из его IP-адресов совпадает с local_interfaces (или с extra_local_interfaces).
Доставка к удалённому хосту обрабатывается smtp-транспортом. По умолчанию это позволяет системным функциям TCP/IP выбирать, какой интерфейс использовать (если их больше одного) при соединении с удалённым хостом. Однако, опцией interface может быть установлено, какой интерфейс использовать. Смотрите описание smtp-транспорта в разделе 30 для получения дополнительных деталей.