Почему iptables получает двойные правила?

У меня есть сервер под управлением Ubuntu 12.04.

Пару перезагрузок я начал замечать, что правила iptables удваиваются при перезагрузке.

Это то, что я получаю после перезагрузки (с добавлением разрывов строк):

$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-apache-overflows
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh

-A INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 1.2.3.4/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --dport 53 -m hashlimit --hashlimit-above 20/sec --hashlimit-burst 100 --hashlimit-mode srcip --hashlimit-name DNS --hashlimit-htable-expire 1 --hashlimit-srcmask 28 -j DROP

-A INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 1.2.3.4/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --dport 53 -m hashlimit --hashlimit-above 20/sec --hashlimit-burst 100 --hashlimit-mode srcip --hashlimit-name DNS --hashlimit-htable-expire 1 --hashlimit-srcmask 28 -j DROP

-A fail2ban-apache-overflows -j RETURN
-A fail2ban-ssh -j RETURN

Четыре правила, которые применяются дважды, должны быть загружены из if-pre-up.d:

$ cat /etc/network/if-pre-up.d/iptablesload
#!/bin/bash

# Flush iptables
/sbin/iptables -F

#MySQL locally
/sbin/iptables -A INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
# Mysql access allowed from work
/sbin/iptables -A INPUT -s 1.2.3.4/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m tcp --dport 3306 -j REJECT --reject-with icmp-port-unreachable

# Rate limit on DNS requests
/sbin/iptables -A INPUT -p udp -m udp --dport 53 -m hashlimit --hashlimit-above 20/sec --hashlimit-burst 100 --hashlimit-mode srcip --hashlimit-name DNS --hashlimit-htable-expire 1 --hashlimit-srcmask 28 -j DROP

exit 0

Я попытался добавить этот сценарий очистки, чтобы убедиться, что все сбрасывается, когда сервер отключается:

$ cat /etc/network/if-post-down.d/iptablesunload
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t nat -F
/sbin/iptables -t nat -X
/sbin/iptables -t mangle -F
/sbin/iptables -t mangle -X
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

Но это не имеет значения.

Повторное применение всего очищает беспорядок:

$ sudo /etc/network/if-post-down.d/iptablesunload; sudo /etc/network/if-pre-up.d/iptablesload; sudo service fail2ban restart; sudo iptables -S
Stopping firewall and allowing everyone...
 * Restarting authentication failure monitor fail2ban                                                                                           [ OK ]
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-apache-overflows
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 1.2.3.4/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --dport 53 -m hashlimit --hashlimit-above 20/sec --hashlimit-burst 100 --hashlimit-mode srcip --hashlimit-name DNS --hashlimit-htable-expire 1 --hashlimit-srcmask 28 -j DROP
-A fail2ban-apache-overflows -j RETURN
-A fail2ban-ssh -j RETURN

Я добавил эхо в iptablesload, чтобы отслеживать, когда запускается скрипт:

echo "$PPID: `ps -ocommand= -p $PPID`" > /tmp/loading_iptables.`date +%F_%H:%M:%S.%N`

После перезагрузки Теперь я могу убедиться, что скрипт выполняется несколько раз:

$ ls /tmp/
loading_iptables.2014-06-30_09:58:06.732185289
loading_iptables.2014-06-30_09:58:06.766291579
$ cat /tmp/*
729: run-parts /etc/network/if-pre-up.d
782: run-parts /etc/network/if-pre-up.d

Затем возникает два вопроса:

  1. , почему скрипт запускается дважды?
  2. почему iptables -F не очищает правила между казнями?
1
задан 30 June 2014 в 12:08

1 ответ

Ваше правило, вероятно, выполняется для одного сетевого устройства И устройства закольцовывания.

Для исключения устройства закольцовывания добавляют это к верхней части сценария чуть ниже хижины, которая проверяет, что текущее запускаемое устройство не является обратной петлей "lo":

[ "$IFACE" != "lo" ] || exit 0

Или гарантировать правило работает только за указанным устройством (например, eth0):

[ "$IFACE" == "eth0" ] || exit 0
1
ответ дан 30 June 2014 в 12:08

Другие вопросы по тегам:

Похожие вопросы: