Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Общий по Linux (http://forum.oszone.net/forumdisplay.php?f=9)
-   -   iptables для почтового сервера (http://forum.oszone.net/showthread.php?t=355898)

YDen 21-11-2024 03:34 3033395

iptables для почтового сервера
 
Добрый всем. Плиз подскажите. Поднимаю на debian 12 почтовик mailcow. Debian стоит на ВМ Proxmox. Порты с роутера проброшены. Вопрос по iptables.
Этот скрипт будет оптимален для настройки iptables для работы почтового сервера?

Код:

#!/bin/bash
IPTABLES="/sbin/iptables"
 
#######################################################################################################
# Настройки
#######################################################################################################
#                            !!! НЕОБХОДИМО ИЗМЕНИТЬ НА СОБСТВЕННЫЕ !!!
 
IF_OUT="ens18"                  # Имя интерфейса подключенного к интернет
 
#######################################################################################################
IF_LO="lo"
ADDR_LO="127.0.0.1"
LOOPBACK="127.0.0.0/8"
 
sysctl -w net.ipv4.ip_forward=1    # Настройка ядра, для разрешения на продвижение пакетов
sysctl -w net.ipv4.ip_dynaddr=1    # Позволяет выполнять корректно MASQUERADE при динамическом изменении ip адреса
 
modprobe ip_nat_ftp                # Для правильной работы активного режима FTP
 
#######################################################################################################
# Сброс и установка правил по умолчанию
#######################################################################################################
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
 
$IPTABLES -P INPUT      DROP    # По умолчанию блокирует входящий трафик
$IPTABLES -P FORWARD    DROP    # По умолчанию блокирует проходящий трафик
$IPTABLES -P OUTPUT    ACCEPT  # По умолчанию разрешает исходящий трафик
 
#######################################################################################################
# Создание цепочек правил
#######################################################################################################
# Базовая проверка пакетов - невалидные пакты (common-check)
        $IPTABLES -N common-check
        $IPTABLES -F common-check
        $IPTABLES -A common-check -m state --state INVALID -j DROP
        $IPTABLES -A common-check -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
        $IPTABLES -A common-check -p tcp ! --syn -m state --state NEW -j DROP
        $IPTABLES -A common-check -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
        $IPTABLES -A common-check -p tcp --tcp-flags ALL ALL -j DROP
        $IPTABLES -A common-check -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
        $IPTABLES -A common-check -p tcp --tcp-flags ALL NONE -j DROP
        $IPTABLES -A common-check -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
        $IPTABLES -A common-check -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# Обработка входящих icmp запросов (icmp-in)
        $IPTABLES -N icmp-in
        $IPTABLES -F icmp-in
        $IPTABLES -A icmp-in -m state --state NEW -p icmp --icmp-type echo-request -j ACCEPT
        $IPTABLES -A icmp-in -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT
        $IPTABLES -A icmp-in -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT
# Разрешает уже установленные соединения (statefull)
        $IPTABLES -N statefull
        $IPTABLES -F statefull
        $IPTABLES -A statefull -m state --state ESTABLISHED,RELATED -j ACCEPT
 
#################################################################################################
# Задание правил для входящего трафика
#################################################################################################
        ## Проверяем пакеты (!первое правило в цепочке)
$IPTABLES -A INPUT -j common-check
        ## Разрешаем icmp запросы к серверу (ping)
$IPTABLES -A INPUT -j icmp-in
        ## Разрешаем SSH (!из интернета)
$IPTABLES -A INPUT -p tcp --dport 22 -i $IF_OUT -j ACCEPT
        #Разрешаем обращение к почтовым портам

Denis Yu, [20.11.2024 23:13]
iptables -A INPUT -p tcp -m multiport --dports 25,110,143,80,443,465,587,993,995,11211 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 25,110,143,80,443,465,587,993,995,11211 -j ACCEPT

        ## Разрешаем локальный интрефейс
$IPTABLES -A INPUT -i $IF_LO -d $LOOPBACK -j ACCEPT
        ## Разрешаем установленные соединения (!последнее правило в цепочке)
$IPTABLES -A INPUT -j statefull
 
#################################################################################################
# Задание правил для исходящего трафика
#################################################################################################
# По умолчанию исходящий трафик разрешен
        ## Проверяем пакеты (!первое правило в цепочке)
$IPTABLES -A OUTPUT -j common-check
 
#################################################################################################
# Задание правил для продвижения пакетов
#################################################################################################
        ## Проверяем пакеты (!первое правило в цепочке)
$IPTABLES -A FORWARD -j common-check
       
        ## Разрешаем установленные соединения (!последнее правило в цепочке)
$IPTABLES -A FORWARD -j statefull
##################################################################################################

iptables-save > /etc/iptables/rules.v4

echo done!

Благодарю

sonny362 21-11-2024 04:19 3033396

YDen, вносить команды sysctl в этот скрипт особого смысла нет: они выполняются один раз при базовой настройке системы. Но и вреда тоже нет.
Второе: я обычно порт SSH меняю с 22 на что-нибудь другое. Так меньше долбятся.
Ну и стилистика: если вы вместо multiport разнесёте правила на "строка-порт" вы а) получите гибкость; б) сможете на каждую строку написать комментарий. Иначе через полгода вы будете смотреть на этот скрипт и мучительно вспоминать - что зачем.
P.S. Честно говоря, в строке "iptables -A OUTPUT" особого смысла не вижу. Или у вас на сервере ещё какая-то прикладуха, кроме почтового сервера, которой вы явно ходите запретить доступ?

YDen 21-11-2024 04:35 3033398

Цитата:

Цитата sonny362
Ну и стилистика: если вы вместо multiport разнесёте правила на "строка-порт" »

Благодарю за консультацию.
Вы имеете ввиду сделать так, заместо мультипорта?
# pop3
$IPTABLES -A INPUT -p tcp --dport 25 -i $IF_OUT -j ACCEPT
# smtp
$IPTABLES -A INPUT -p tcp --dport 110 -i $IF_OUT -j ACCEPT

YDen 21-11-2024 05:08 3033400

Делаю:
sudo nano /etc/network/if-pre-up.d/fw.sh
sudo chmod +x /etc/network/if-pre-up.d/fw.sh
sudo /etc/network/if-pre-up.d/fw.sh

Получаю:
line 101: /etc/iptables/rules.v4: No such file or directory

Куда тогда сохранить в дебиане?

sonny362 21-11-2024 06:37 3033403

Цитата:

Цитата YDen
# pop3
$IPTABLES -A INPUT -p tcp --dport 25 -i $IF_OUT -j ACCEPT
# smtp
$IPTABLES -A INPUT -p tcp --dport 110 -i $IF_OUT -j ACCEPT »

Да, я это и имел в виду.

Цитата:

Цитата YDen
sudo nano /etc/network/if-pre-up.d/fw.sh
sudo chmod +x /etc/network/if-pre-up.d/fw.sh
sudo /etc/network/if-pre-up.d/fw.sh »

Что-то не понял. Вы свой скрипт пускали?
Он а) создаёт все нужные правила в запущенном файерволле б) создаёт файл /etc/iptables/rules.v4.
У вас должен быть файл /etc/network/if-pre-up.d/iptables с содержимым
#!/bin/sh
/sbin/iptables-restore < /etc/iptables/rules.v4

На всех моих дебиановских серверах так.

YDen 21-11-2024 07:06 3033405

Цитата:

Цитата sonny362
Что-то не понял. Вы свой скрипт пускали?
Он а) создаёт все нужные правила в запущенном файерволле б) создаёт файл /etc/iptables/rules.v4.
У вас должен быть файл /etc/network/if-pre-up.d/iptables с содержимым
#!/bin/sh
/sbin/iptables-restore < /etc/iptables/rules.v4
На всех моих дебиановских серверах так. »

Разобрался. Пакет iptables-persistent не был установлен.

Вопрос: запускаю скрипт с правилами iptables вручную: sudo /etc/network/if-pre-up.d/fw.sh
Как сделать, чтобы он после перезагрузки запускался?

На убунте раз так делал, но блин не могу вспомнить как и найти свои шпаргалки.

благодарю

sonny362 21-11-2024 15:54 3033431

YDen, можно через rc.local

MakaBooka 23-11-2024 15:16 3033509

Цитата:

Цитата sonny362
я обычно порт SSH меняю с 22 на что-нибудь другое. Так меньше долбятся. »

...а на 22 порт надо вешать endlessh, пусть долбятся.


Время: 10:44.

Время: 10:44.
© OSzone.net 2001-