Решение ошибки «Another app is currently holding the xtables lock»

Недавно заметил на одном сервере с биллинговой системой ABillS, что при массовом выполнении скрипта /etc/ppp/ip-up возникает ошибка:

Another app is currently holding the xtables lock. Perhaps you want to use the -w option?

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

IPTABLES="/sbin/iptables"
EXIST=`${IPTABLES} -t nat -L PREROUTING -v | grep "${IFNAME} ";  ${IPTABLES} -L -v | grep DROP | grep "${IFNAME} "`

Для поднятия 3000 сессий, уходило более 30 минут и часть правил могла вовсе не добавится или не удалится скриптом.
По умолчанию если используется ключ -L то iptables резолвит IP адреса и пытается отобразить вместо них DNS имена, что занимает много времени, и чтобы это не происходило, нужно добавить еще ключ -n, а также на всякий случай я добавил ключ -w 20, который заставит отложить выполнение новых правил до 20 секунд если iptables уже занят выполнение другой команды:

IPTABLES="/sbin/iptables"
IPTABLES_WAIT="-w 20"
EXIST=`${IPTABLES} $IPTABLES_WAIT -t nat -n -L PREROUTING -v | grep "${IFNAME} ";  ${IPTABLES} $IPTABLES_WAIT -n -L -v | grep DROP | grep "${IFNAME} "`

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

iptables -n -L -t nat -v | grep DNAT | wc -l

И сверил с количеством сессий, правил явно было меньше, поэтому пришлось очистить все правила и перезапустить сессии чтобы скрипт /etc/ppp/ip-up отработал правильно, на этот раз при 3000 сессиях он сделал свою работу менее чем за минуту.
Замечу что в скриптах /etc/ppp/ лучше не использовать правила iptables.

IPTables правила для веб-сервера

Чтобы открыть порт веб-сервера в IPTables выполним команду:

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Если используется HTTPS, то выполним также:

iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Чтобы открыть доступ только конкретной сети, например 192.168.0.0/24:

sudo iptables -A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT

Можно также ограничить доступ по IP конфигурацией самого веб сервера, например как я описывал для Apache2 в этой статье — Контроль доступа Apache2.

Чтобы установить лимит подключений на порт 80:

iptables -A INPUT -p tcp --dport 80 -m limit --limit 50/second -j ACCEPT

Чтобы удалить правило укажем ту же команду, заменив -A на -D, например:

sudo iptables -D INPUT -p tcp -m tcp --dport 80 -j ACCEPT

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

sudo iptables -nvL

Смотрите также:
Настройка IPTables

IPTables правила для SSH

Чтобы открыть доступ к SSH серверу в IPTables необходимо добавить правило:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Чтобы открыть доступ только конкретной сети, например 192.168.0.0/24:

sudo iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT

Можно также ограничить доступ по IP конфигурацией самого SSH.

Чтобы удалить правило укажем ту же команду, заменив -A на -D, например:

sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT

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

sudo iptables -nvL

Смотри также:
Установка и настройка SSH
Настройка IPTables

IPTables правила для Iperf

Посмотрим текущие правила IPTables:

iptables -nvL

Чтобы открыть порт серверу Iperf добавим правило:

sudo iptables -A INPUT -p tcp --dport 5001 -j ACCEPT

Чтобы открыть порт конкретному IP или сети:

sudo iptables -A INPUT -s 192.168.5.11/32 -p tcp --dport 5001 -j ACCEPT

Смотри также мои статьи:
Настройка IPTables
Тестируем пропускную способности сети с помошью Iperf

IPTables правила для ntopng

Первым делом посмотрим текущие правила IPTables:

iptables -nvL

Чтобы открыть порт ntopng добавим правило:

sudo iptables -A INPUT -m tcp -p tcp --dport 3000 -j ACCEPT

Чтобы открыть порт ntopng только для конкретной сети или IP:

sudo iptables -A INPUT -m tcp -p tcp --dport 3000 -s 10.0.0.0/24 -j ACCEPT

Смотри также мои статьи:
Настройка IPTables
Установка и настройка ntopng

IPTables правила для nprobe

Первым делом посмотрим текущие правила IPTables:

iptables -nvL

Чтобы nprobe мог принимать NetFlow данные, откроем ему порт:

sudo iptables -A INPUT -p udp --dport 2055 -j ACCEPT

Чтобы nprobe мог принимать NetFlow данные только от конкретной сети или IP:

sudo iptables -A INPUT -s 10.0.0.0/24 -p udp --dport 2055 -j ACCEPT

Смотри также мои статьи:
Настройка IPTables
Установка и настройка nprobe

IPTables правила для MySQL

Если в iptables блокируются все входящие соединения (INPUT DROP) и чтобы открыть внешний доступ к MySQL необходимо добавить правила:

iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT

Чтобы открыть доступ только конкретной сети, например 10.0.0.0/24:

iptables -A INPUT -s 10.0.0.0/24 -p tcp -m tcp --dport 3306 -j ACCEPT

Чтобы удалить правило укажем ту же команду, заменив -A на -D, например:

iptables -D INPUT -p tcp -m tcp --dport 3306 -j ACCEPT

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

sudo iptables -nvL

Замечу, для того чтобы открыть внешний доступ, также нужно в конфигурационном файле my.cnf закомментировать строку «bind-address = 127.0.0.1».

Если по умолчанию INPUT ACCEPT, то сначала укажем с каких IP разрешен доступ, а только последним правилом заблокируем всем остальным:

/sbin/iptables -A INPUT -s 127.0.0.1 -p tcp --destination-port 3306 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -s 192.168.1.5 -p tcp --destination-port 3306 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP

Например используя nmap можно проверить локально и внешне фильтруется ли доступ:

nmap -p 3306 localhost
nmap -p 3306 192.168.1.5

Смотри также:
Настройка IPTables
Другие мои статьи о MySQL

IPTables правила для NTP и SNTP

Чтобы открыть доступ NTP клиенту и серверу в IPTables необходимо добавить правила:

sudo iptables -A OUTPUT -p udp -m udp -m multiport --dports 123 -m state --state NEW -j ACCEPT
sudo iptables -A INPUT -m state --state NEW -p udp --dport 123 -j ACCEPT

Чтобы открыть доступ только конкретной сети, например 10.0.0.0/24:

sudo iptables -A OUTPUT -p udp -m udp -m multiport --dports 123 -m state --state NEW -j ACCEPT
sudo iptables -A INPUT -s 10.0.0.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

Чтобы удалить правило укажем ту же команду, заменив -A на -D, например:

sudo iptables -D OUTPUT -p udp -m udp -m multiport --dports 123 -m state --state NEW -j ACCEPT
sudo iptables -D INPUT -m state --state NEW -p udp --dport 123 -j ACCEPT

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

sudo iptables -nvL

Смотри также:
Настройка IPTables
Настройка NTP клиента и сервера в Linux

IPTables правила для FTP сервера

Чтобы открыть доступ к FTP серверу в IPTables необходимо добавить правила:

sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 1024:1030 -j ACCEPT

Чтобы открыть доступ только конкретной сети, например 192.168.1.0/24:

sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 21 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 1024:1030 -j ACCEPT

Чтобы удалить правило укажем ту же команду, заменив -A на -D, например:

sudo iptables -D INPUT -p tcp --dport 21 -j ACCEPT
sudo iptables -D OUTPUT -p tcp --sport 20 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 1024:1030 -j ACCEPT

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

sudo iptables -nvL

1024-1030 — пример портов для пассивного режима, указываются в конфигурации FTP сервера, например для ProFTPd указываются в файле /etc/proftpd/proftpd.conf так:

PassivePorts 1024 1030

Смотри также мои статьи:
Настройка IPTables
Активный и пассивный режим работы FTP
Установка и настройка Pure-FTPd в Ubuntu
Установка и настройка ProFTPd в Ubuntu

IPTables правила для TFTP

Чтобы открыть порт TFTP в IPTables выполним правило:

sudo iptables -A INPUT -p udp --dport 69 -j ACCEPT

Чтобы открыть порт TFTP только для конкретной сети, выполним правило:

sudo iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 69 -j ACCEPT

Чтобы удалить правило укажем ту же команду, заменив -A на -D, например:

sudo iptables -D INPUT -p udp -s 192.168.1.0/24 --dport 69 -j ACCEPT

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

sudo iptables -nvL

Смотри также мои статьи:
Настройка IPTables
Установка и настройка TFTP сервера в Ubuntu