IPTables правила для Asterisk AMI

Допустим по умолчанию «iptables -P INPUT ACCEPT» для всех соединений (а если DROP, что очень желательно, то тогда все DROP правила ниже не используем, выполняем только ACCEPT).

Так как Asterisk AMI обычно работает по TCP порту 5038, то чтобы открыть его выполним:

Читать далее «IPTables правила для Asterisk AMI»

Установка и использование ipset

ipset — инструмент состоящий из модуля ядра, библиотек и утилиты, позволяющий организовать список сетей, IP или MAC адресов и т.д., который очень удобно использовать например с IPTables.

Команда установки в Ubuntu:

Читать далее «Установка и использование ipset»

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

Допустим INPUT по умолчанию DROP, приведу примеры IPTables правил для FreeRADIUS:

iptables -A INPUT -p udp --dport 1812 -j ACCEPT
iptables -A INPUT -p udp --dport 1813 -j ACCEPT

Читать далее «IPTables правила для FreeRADIUS»

Блокировка социальных сетей используя iptables

Однажды на одном из NAT серверов мне понадобилось заблокировать некоторые сайты.

Если сайты находятся на нескольких IP адресах, то необходимо узнать эти диапазоны IP адресов, например поищем VKontakte на bgp.he.net, вот к примеру список подсетей для одной из AS принадлежащей ВКонтакте «http://bgp.he.net/AS47541#_prefixes».

Когда сети или хосты известны, добавим в iptables правила для них, например:

/sbin/iptables -A FORWARD -s 87.240.128.0/18 -j DROP
/sbin/iptables -A FORWARD -s 95.142.192.0/20 -j DROP

Таким образом, мы запретим прохождение трафика этих сетей через сервер.

Смотрите также мои статьи:
Блокировка социальных сетей на Cisco
Запрет социальных сетей на маршрутизаторах Mikrotik

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

Допустим на сервере по умолчанию INPUT DROP и установлен DNS сервер, теперь приведу пример IPTables правил чтобы к DNS серверу могли обращайся клиенты.

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

sudo iptables -A INPUT -i eth0 -p udp --dport 53 -m state --state ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 53 -m state --state ESTABLISHED -j ACCEPT

Читать далее «IPTables правила для DNS»

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

Допустим на сервере по умолчанию INPUT DROP, теперь приведу пример простого правила разрешающего DHCP запросы к серверу, этого будет достаточно чтобы клиенты получили IP от сервера (где em1 — сетевой интерфейс на котором запущен DHCP сервер):

iptables -I INPUT -p udp -i em1 --dport 67 -j ACCEPT

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

iptables -D INPUT -p udp -i em1 --dport 67 -j ACCEPT

Ограничить доступ по IP строго не получится, так как клиенты не имеющие IP адреса обычно шлют широковещательный запрос от IP адреса 0.0.0.0 на 255.255.255.255, а продлевают уже по unicast со своего полученного IP.

Приведу пример ограничения по IP (где 192.168.5.1 — IP на котором запущен DHCP сервер, а 172.17.0.0/16 — сеть клиентов с которой разрешено продлевать аренду IP):

iptables -t filter -A INPUT -i em1 -p udp -s 0.0.0.0 --sport 68 -d 255.255.255.255 --dport 67 -j ACCEPT
iptables -t filter -A INPUT -i em1 -p udp -s 0.0.0.0 --sport 68 -d 192.168.5.1 --dport 67 -j ACCEPT
iptables -t filter -A INPUT -i em1 -p udp -s 172.17.0.0/16 --sport 68 -d 192.168.5.1 --dport 67 -j ACCEPT

Смотрите также мои статьи:
Настройка IPTables
IPTables правила для TFTP

Решение ошибки «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