{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Копытов Иван: заметки с тегом внешний",
    "_rss_description": "Блог ленивого сисадмина",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/kini24.ru\/tags\/vneshniy\/",
    "feed_url": "https:\/\/kini24.ru\/tags\/vneshniy\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Копытов Иван",
            "url": "https:\/\/kini24.ru\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "259",
            "url": "https:\/\/kini24.ru\/all\/probros-portov-v-openwrt\/",
            "title": "Проброс портов в OpenWrt",
            "content_html": "<p>Мне никогда не нравилось, что в интерфейсе OpenWrt нельзя указать несколько портов при пробросе, можно указать только диапазон. А если мне нужно несколько, объединенных одним сервисом? Например, почта. Если указывать все порты, то получается, что на каждый из них нужно создавать свое правило. В итоге получается такая простыня правил, что ориентироваться в ней становится затруднительно.<br \/>\nПо сути, эта заметка — напоминание себе как нужно правильно прокинуть порты во внутреннюю сеть, используя iptables. И, заодно, там же сделаем так, чтобы из локальной сети можно было обращаться к своим серверам по доменному имени.<br \/>\nИдем  в раздел <i>Network<\/i> — <i>Firewall<\/i> и открываем вкладку <i>Custom rules<\/i>. Добавляем туда строку такого вида:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">iptables -t nat -A zone_wan_prerouting -p tcp -m multiport --dports 25,110,143,465,587,993,995,4190 -j DNAT --to-destination 192.168.1.100<\/code><\/pre><p>Здесь мы помещает в цепочку <i>zone_wan_prerouting<\/i> таблицы <i>nat<\/i> правило, указывающее, что сервисы, обращающиеся из внешней сети на перечисленные порты, должны перенаправляться на сервер с адресом 192.168.1.100. Параметр -р указывает протокол tcp, а параметр -m multiports позволяет указать не один порт, а несколько. Это правило позволит открыть порты для доступна извне, но при обращении к ним из локальной сети придется указывать «прямой» адрес 192.168.1.100. Если вписать свой внешний адрес (IP или DNS), то ничего не выйдет. Чтобы это стало возможным, нужно дописать еще две строки:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">iptables -t nat -A zone_lan_prerouting -d 95.170.188.45 -p tcp -m multiport --dports 25,110,143,465,587,993,995,4190 -j DNAT --to-destination 192.168.1.100\niptables -t nat -A zone_lan_postrouting -d 192.168.1.100 -p tcp -m multiport --dports 25,110,143,465,587,993,995,4190 -j MASQUERADE<\/code><\/pre><p>В первой строке мы говорим, что все обращения к внешнему адресу на указанные порты должны перенаправляться на локальный адрес 192.168.1.100. Во второй строке мы, если так можно выразиться, прячем, что обращаемся из локальной сети.<br \/>\nПосле нажатия кнопки <i>Save<\/i> содержимое поля <i>Custom Rules<\/i> будет сохранено на роутере в файле \/etc\/firewall.user. Для применения эти необходимо перезапустить файрволл:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">\/etc\/init.d\/firewall restart<\/code><\/pre><p>После этого почта станет доступной из внешней сети и из локальной, причем по доменному имени или внешнему IP-адресу.<\/p>\n<p><b>Обновление<\/b> Если оставить последнее правило в таком виде, то исходящий IP-адрес (адрес клиента) будет отображаться как адрес самого роутера в локальной сети: 192.168.1.1. Поэтому следует немного изменить правило, чтобы оно выглядело следующим образом:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">iptables -t nat -A zone_lan_postrouting -s 192.168.1.0\/24 -d 192.168.1.100 -p tcp -m multiport --dports 25,110,143,465,587,993,995,4190 -j MASQUERADE<\/code><\/pre><p>В этом случае внешние адреса останутся «настоящими», а все запросы из локальной сети будут отображаться как 192.168.1.1. На мой взгляд, это приемлемо.<\/p>\n",
            "date_published": "2022-12-25T12:48:29+07:00",
            "date_modified": "2023-01-18T12:11:20+07:00",
            "tags": [
                "firewall",
                "iptables",
                "openwrt",
                "внешний",
                "доступ",
                "локальная сеть",
                "перенаправление",
                "порт",
                "проброс",
                "роутер"
            ],
            "_date_published_rfc2822": "Sun, 25 Dec 2022 12:48:29 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "259",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "197",
            "url": "https:\/\/kini24.ru\/all\/vypolnenie-vneshnih-skriptov-v-sieve\/",
            "title": "Выполнение внешних скриптов в Sieve",
            "content_html": "<p>Понадобилось недавно каким-то образом запускать внешний скрипт по приходу определенного письма. Начал поиски как это сделать. В Postfix это можно сделать, используя файл aliases, но мне этот способ не подходил, потому что он подразумевает приход письма на определенный почтовый адрес. С Dovecot сильно не разбирался, но вот информацию по Sieve нашел. Немного времени спустя у меня был наполовину рабочий вариант. Наполовину потому, что выполняемая во внешнем скрипте команда напрочь отказалась принимать отправляемые ей данные. Пришлось немного подправить скрипт в самом Sieve, чтобы получить желаемый результат.<br \/>\nВсе оказалось очень просто. Для начала нужно включить доступ к плагину <i>vnd.dovecot.execute<\/i>. Для этого открываем файл с настройками Sieve \/<i>etc\/dovecot\/conf.d\/90-sieve.conf<\/i> и вносим следующие изменения:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">plugin {\n  sieve_extensions = +vnd.dovecot.execute\n  sieve_plugins = sieve_extprograms\n  sieve_execute_bin_dir = \/etc\/dovecot\/sieve\/execute\n}<\/code><\/pre><p>Все остальные параметры нам не нужны.<br \/>\nВ первой строчке включаем доступ к плагину для пользователей. Можно использовать параметр <i>sieve_global_extensions<\/i>, в таком случае плагин будет работать глобально. Но глобальный скрипт работает ТОЛЬКО если у пользователя нет своего файла скрипта Sieve. Пользователей на моем сервере очень мало, поэтому такой вариант мне не подходит.<br \/>\nВо второй строке мы разрешаем использование плагинов как таковых.<br \/>\nИ, наконец, в третьей строке указывает папку, в которой будут находиться эти самые внешние скрипты. Доступ к этой папке для Dovecot, конечно, нужно обеспечить. Подозреваю, что папку можно и не указывать, а в скрипте Sieve просто указать полный путь к запускаемой программе, но проверять лень.<br \/>\nТеперь остается только написать правило обработки входящих писем. Что-то вроде такого:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># rule:[Test rule]\nif allof (header :contains &quot;from&quot; &quot;test@example.com&quot;, header :contains &quot;subject&quot; &quot;Prikaz 66&quot;)\n{\n        execute &quot;test.sh&quot;;\n\tfileinto &quot;Trash&quot;;\n\tstop;\n}<\/code><\/pre><p>Получив письмо от отправителя <i>test@example.com<\/i> с темой <i>«Prikaz 66»<\/i> Sieve запустит на выполнение скрипт \/<i>etc\/dovecot\/sieve\/execute\/test.sh<\/i>, затем удалит письмо в корзину и завершит обработку писем.<br \/>\nЗнаю, что информации по этой теме в интернете достаточно. Но б<b>о<\/b>льшая часть из нее, как водится, на английском и содержит много воды. Хотелось сделать небольшую выдержку на более привычном русском языке.<\/p>\n",
            "date_published": "2018-06-05T14:59:52+07:00",
            "date_modified": "2018-06-05T14:59:34+07:00",
            "tags": [
                "dovecot",
                "sieve",
                "внешний",
                "запуск",
                "почта",
                "программа",
                "сервер",
                "скрипт"
            ],
            "_date_published_rfc2822": "Tue, 05 Jun 2018 14:59:52 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "197",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134)"
}