Ссылки:
|
https://ru.wikibooks.org/wiki/Iptables https://old.calculate-linux.org/main/ru/iptables https://wiki.dieg.info/iptables https://wiki.dieg.info/nat http://dragonflybsd.blogspot.com/2016/04/conntrack.html http://conntrack-tools.netfilter.org/manual.html http://sysadminblog.ru/linux/2012/05/22/primery-ispolzovaniya-iptables.html https://habr.com/ru/company/ruvds/blog/580648/ https://rtfm.co.ua/linux-iptables-rukovodstvo-chast-4-celi-dlya-pravil/ |
Таблицы и цепочки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
По умолчанию мы имеем три таблицы: FILTER, NAT, MANGLE По умолчанию мы имеем пять цепочек: PREROUTING, FORWARD, POSTROUTING, INPUT, OUTPUT filter: (DROP, LOG, ACCEPT, REJECT) -FORWARD - цепочка используется для фильтрацию пакетов, идущих транзитом через брандмауэр. -INPUT - через эту цепочку проходят пакеты, которые предназначены локальным приложениям(брандмауэр). -OUTPUT - используются для фильтрации исходящих пакетов, сгенерированных приложениями на самом брандмауэре. nat: (DNAT,SNAT) -PREROUTING - используется для внесения изменений на ходе брандмауэра. (dnat) -OUTPUT - предназначена для преобразования пакетов, созданных приложениями внутри брандмауэра, перед принятием решения о маршрутизации. -POSTROUTING - применяется для преобразования пакетов перед выдачей их во вне. (snat) mangle: (MARK,TOS,TTL) -PREROUTING - используется для внесения изменений в пакеты на входе брандмауэра. -POSTROUTING - применяется для изменения в пакеты перед выдачей их во вне. -INPUT - через эту цепочку проходят пакеты, которые предназначены локальным приложениям(брандмауэру). -FORWARD - используется для модификации заголовков пакетов, идущих транзитом через брандмауэр. -OUTPUT - для внесения изменений в заголовок пакетов, поступающих от приложений внутри брандмауэра. Порядок прохождения транзитных пакетов: mangle PREROUTING nat PREEOUTING mangle FORWARD filter FORWARD mangle POSTROUTING nat POSTROUTING Порядок прохождения пакетов предназначенных для приложения компьютера: mangle PREPOUTING nat PREROUTING mangle INPUT filter INPUT Порядок прохождения пакетов отправленные приложениями компьютера: mangle OUTPUT nat OUTPUT filter OUTPUT mangle POSTROUTING nat POSTROUTING NAT - NETWORK ADDRESS TRANSLATION RFC-1918 - документ по не маршрутизированным адресам SNAT - замена IP-адреса или порта источника (Например настройка доступа к интернету для ПК из локальной сети через маршрутизатор) DNAT - замена IP-адреса или порта назначения (Например доступ из интернета на ПК в локальной сети) MASQUERADE - разбирается сам что куда подменять (используется когда у вас нет постоянного внешнего IP, или получаете его по DHCP) REDIRECT - выполняет перенаправление пакетов и потоков на другой порт той же самой машины |
Настройка политики
|
!!! По умолчанию политика ACCEPT Отбрасываем все входящие подключения: !!! Рекомендуется для построения firewall, запрещено все кроме разрешённого iptables -P INPUT DROP Отбрасываем идущий трафик через нас: iptables -P FORWARD DROP Отбрасываем исходящий трафик: !!! обычно не используется iptables -P OUTPUT DROP |
IPTABLES основное:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
!!! если не указывать таблицу по умолчанию таблица FILTER. !!! L: Вывести список правил. !!! v: Отображение подробной информации. Этот ключ будет выводить имя интерфейса, параметры правил и маски TOS. !!! n: Не резолвить IP адреса, показывать в цифровом виде. Ускоряет вывод. !!! --line-numbers: показать номер правила в цепочке !!! Счетчики пакетов и байтов, также будут показаны в списке, с 'K' суффиксом, 'М' или 'G' в зависимости от необходимого множителя. Отображение состояния брандмауэра / Показать текущие правила (по умолчанию таблица FILTER): iptables -L -n -v Показать текущие правила с номером строки (по умолчанию таблица FILTER): iptables -n -L -v --line-numbers Показать таблицу Filter: iptables -L -n -v -t filter Показать таблицу NAT: iptables -n -t nat -L Показать таблицу MANGLE: iptables -n -t mangle -L Показать из таблицы FILTER цепочку INPUT iptables -L INPUT -n -v Показать из таблицы FILTER цепочку OUTPUT iptables -L OUTPUT -n -v --line-numbers |
Построение правил в iptables
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
iptables [-t table] command [match] [target/jump] command: -A - добавить правило в конец цепочки (APPEND) -D - удалить правило из цепочки (DELETE) -R - заменить одно правило другим (REPLACE) -I - вставить правило в указанное место в цепочке (INSERT) (по умолчанию вставляет в начало) -L - показать список правил (LIST) -F - очистить цепочку или таблицу (FLUSH) -Z - обнулить счетчики (ZERO) -N - создать цепочку пользователя (NEW) -X - удалить цепочку пользователя -P - установить политику по умолчанию (DROP, ACCEPT) Общие критерии match -p - протокол (-p tcp) -s - определяет IP-адрес источника (-s 10.0.0.1) -d - определяет IP-адрес назначения -i - определяет входящий интерфейс -o - определяет исходящий интерфейс (o eth0) -f - определяет фрагментыm фрагментированного пакета (!-f) !!! Символ "!" инвертирует значение параметра. |
Критерии:
|
TCP критерии: --sport - порт источника --dport - порт назначения (--dport 1024:65535) --tcp-flags - определение TCP-флагов --syn - запрос на соединение UDP критерии: --sport - порт источника --dport - порт назначения ICMP критерии: --icmp-type - определяет тип ICMP пакета (--icmp-type echo-request) |
Действия(-j):
|
ACCEPT - принять пакеты DROP - сбросить пакет REJECT - сбросить пакет с сообщение об ошибке RETURN - возвращает из цепочки LOG - помещает информацию в системный журна |
Терминальные и нетерминальные действия:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
Терминальными называются действия, которые прерывают прохождение пакета через текущую базовую цепочку. То есть если к пакету в рамках некоторого правила было применено терминальное действие, он уже не проверяется на соответствие всем следующим правилам в этой цепочке (и в тех цепочках, из которых она была вызвана, если это пользовательская цепочка). Терминальными являются все действия, специфичные для таблиц filter и nat. Из приведенных выше в этом разделе — ACCEPT, DROP, REJECT, NFQUEUE, QUEUE. Например: iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "IN HTTP: " Второе из приведенных правил (логирование) никогда не будет срабатывать, так как все пакеты, удовлетворяющие этому критерию (входящие TCP-пакеты на порт 80), будут пропущены по первому из этих правил, и до второго просто не дойдут. Нетерминальными, соответственно, являются действия, не прерывающие процесс прохождения пакета через цепочки. Нетерминальными являются действия, специфичные для таблицы mangle, а из перечисленных выше — LOG, ULOG и NFLOG. Например: iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "IN HTTP: " iptables -A INPUT -p tcp --dport 80 -j ACCEPT Теперь все входящие на TCP-порт 80 пакеты будут сначала заноситься в лог, и только потом пропускаться. Действие RETURN с точки зрения такой классификации занимает промежуточное положение — оно может прервать прохождение пакета через отдельную цепочку (или несколько цепочек, если для перехода в них использовалась опция -g, а не -j), но совсем не обязательно, чтобы это приводило к завершению обработки пакета в рамках текущей базовой цепочки. |
Удаление правил брандмауэра
|
!!! D: удалить одно или несколько правил из указанной цепочки Для отображения номера строки наряду с другой информацией по существующим правилам, введите: # iptables -L INPUT -n --line-numbers # iptables -L OUTPUT -n --line-numbers # iptables -L OUTPUT -n --line-numbers | less # iptables -L OUTPUT -n --line-numbers | grep 8.8.8.8 Вы получите список IP. Посмотрите на число слева, а вводите число, чтобы удалить его. Например, удаление линии номер 4, введите: # iptables -D INPUT 4 Или найти источник IP 202.54.1.1 и удалить из правила: # iptables -D INPUT -s 202.54.1.1 -j DROP |
Добавление правил брандмауэра
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
Чтобы вставить одно или несколько правил в указанной цепочке, как правило используется следующий синтаксис. Сначала узнать номер строки: # iptables -L INPUT -n --line-numbers Вывод например: Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED Чтобы вставить правило между 1 и 2, введите: # iptables -I INPUT 2 -s 8.8.8.8 -j DROP Для просмотра обновленных правил, введите: # iptables -L INPUT -n --line-numbers Вывод например: Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 DROP all -- 8.8.8.8 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED |
Блокировать весь трафик:
|
# iptables -P INPUT DROP # iptables -P OUTPUT DROP # iptables -P FORWARD DROP # iptables -L -v -n |
Блокировать только входящий трафик:
|
# iptables -P INPUT DROP # iptables -P FORWARD DROP # iptables -P OUTPUT ACCEPT |
Блокировка сетевых адресов локальной сети на внешнем интерфейсе
|
IP-спуфинг — атака заключающаяся в использовании в IP-пакетах, отправляемых жертве, в качестве обратного адреса IP-адрес хоста, которому она доверяет. Пакеты с немаршрутизируемыми адресами источника должны быть отвергнуты, используя следующий синтаксис: # iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP |
Диапазон адресов IPv4 для частных сетей (убедитесь, что они заблокированы на внешнем интерфейсе)
|
10.0.0.0/8 -j (A) 172.16.0.0/12 (B) 192.168.0.0/16 © 224.0.0.0/4 (MULTICAST D) 240.0.0.0/5 (E) 127.0.0.0/8 (LOOPBACK) |
Блокировка IP-адресов
|
Чтобы заблокировать IP адрес 1.2.3.4, введите: # iptables -A INPUT -s 1.2.3.4 -j DROP |
Блокировка входящие запросов на порт
|
Чтобы заблокировать все запросы на порт 80, введите: # iptables -A INPUT -p tcp --dport 80 -j DROP # iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP Чтобы заблокировать порт 80 только для IP-адреса 1.2.3.4, введите: # iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP # iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP |
Блокировка исходящего IP-адреса
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
Чтобы заблокировать исходящий трафик определенного хоста или домена, такого как sysadminblog.ru, введите: host -t a sysadminblog.ru Ответ будет: sysadminblog.ru has address 95.211.41.31 Запишите свой IP-адрес и введите следующую команду, чтобы блокировать весь исходящий трафик с 95.211.41.31: # iptables -A OUTPUT -d 95.211.41.31 -j DROP Можно использовать маски: # iptables -A OUTPUT -d 192.168.1.0/24 -j DROP # iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP Вы также можете использовать доменное имя, введите: # iptables -A OUTPUT -p tcp -d www.sysadminblog.ru -j DROP # iptables -A OUTPUT -p tcp -d sysadminblog.ru -j DROP Хотя в документации пишут, что использование доменного имени вместо IP не рекомендуется. |
Логирование и блокирование пакетов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
Введите следующую команду, чтобы логировать и блокировать IP-спуфинг на открытый интерфейс с именем eth1: # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: " # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP По умолчанию все логируется в файл /var/log/messages. Комментарий от akkerman: Так лучше не делать, в особенности для явно левого трафика. LOG можно вставлять только строго с -m limit, иначе любая DoS-атака будет во много раз эффективнее: фактически косвенным образом злоумышленник получает прямой путь интенсивного воздействия непосредственно на файловую систему сервера. Как делать правильнее, написано ниже Логирование и блокирование пакетов с ограниченным количеством записей журнала Параметр -m может ограничить количество записей в журнале созданных в единицу времени. Это используется для предотвращения флуда в файле журнала. Чтобы записывать не более 7 записей в 5 минут, введите: # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: " # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP Логировать все из цепочки undef: iptables -A undef_in -j LOG --log-level info --log-prefix "--- IN --- DROP " iptables -A undef_in -j DROP iptables -A undef_out -j LOG --log-level info --log-prefix " --- OUT --- DROP " iptables -A undef_out -j DROP iptables -A undef_fw -j LOG --log-level info --log-prefix "--- FW --- DROP " iptables -A undef_fw -j DROP |
Блокирование или разрешение трафика от Mac-адреса
|
Используйте следующий синтаксис: # iptables -A INPUT -m mac --mac-source 00:19:99:3C:AB:23 -j DROP ## *only accept traffic for TCP port # 8080 from mac 00:19:99:3C:AB:22 * ## # iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:19:99:3C:AB:22 -j ACCEPT |
Запретить или разрешить ICMP запросы для ping
|
Введите следующую команду, чтобы заблокировать ICMP запросы: # iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP Ping ответ также может быть ограничен определенными сетями или хостами: # iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT Следующий пример принимает только ограниченный тип ICMP запросов: ### ** assumed that default INPUT policy set to DROP ** ############# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT ## ** all our server to respond to pings ** ## iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT |
Ограничить число одновременных подключений к серверу для каждого клиента по IP
|
Вы можете использовать модуль connlimit, чтобы поставить такие ограничения. Для ограничения не больше 3 SSH соединений на хост, введите: # iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT Установить HTTP запросов до 20: # iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP Параметры в примере, --connlimit-above 3: Соответствует ли количество существующих соединений выше 3. --connlimit-mask 24: Группировать хосты по префиксу. Для IPv4, префиксы от 0 до 32. |
INPUT разрешаем
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
Разрешаем работу локальных приложений использующих loop интерфейс iptables -A INPUT -i lo -j ACCEPT Разрешаем все с хоста iptables -I INPUT -s 192.168.15.0/24 -j ACCEPT iptables -I INPUT -s 10.0.0.0/24 -j ACCEPT Разрешаем трафик для уже установленных соединений: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT Разрешаем доступ к ssh для сети: iptables -A INPUT -s 10.0.0.0/23 -p tcp -m tcp --dport 22 -j ACCEPT iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT Разрешаем порт 53 (DNS): iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT Разрешаем доступ к веб сервер http: iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT Разрешаем доступ на 80 порт только определенного адреса и интерфейса ppp0: iptables -A INPUT -p tcp -s 8.8.8.8 --dport 80 -i ppp0 -j ACCEPT Разрешаем NTP (сервер времени): iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT Разрешаем POP3 и IMAP: iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT Разрешаем samba \ шары: iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT Разрешаем доступ к веб сервер https: iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT Разрешаем udp/tcp 514 rsyslog: iptables -A INPUT -i eth0 -p udp --dport 514 -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 514 -j ACCEPT Разрешаем принт сервер cups / printing service udp/tcp port 631 for LAN users iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT Разрешаем соединение с PPTP-сервером для всех: iptables -A INPUT -p tcp --dport 1723 -j ACCEP Разрешаем прокси squid: iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT Разрешаем mysql / mariadb: iptables -I INPUT -p tcp --dport 3306 -j ACCEPT Разрешаем tcp 9102 на клиенте Bareos (обычно на клиенте с которого делает backup сервер bareos): iptables -A INPUT -p tcp --dport 9102 -j ACCEPT Разрешаем доступ к zabbix-agent с хоста: iptables -A INPUT -s 192.168.1.200/32 -p tcp -m tcp --dport 10050 -j ACCEPT Разрешаем доступ к ipa портам (ldap,https,ntp,bind): iptables -A -p tcp -m multiport --dports 53,80,88,389,443,464,663 -j ACCEPT iptables -A -p udp -m multiport --dports 53,88,123,464 -j ACCEPT Разрешаем доступ к ipa портам (ldap,https,ntp,bind) с определённой сети и определенного интерфейса: iptables -A -s 192.168.1.0/24 -p tcp -m multiport --dports 53,80,88,389,443,464,636 -i eth0 -j ACCEPT iptables -A -s 192.168.1.0/24 -p udp -m multiport --dports 53,88,123,464 -i eth0 -j ACCEPT Разрешаем протокол GRE для всех: iptables -A INPUT -p gre -j ACCEPT Включаем логирование для пакетов INVALID: iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "Strange:" Пример включения логирования на разрешающие правило: iptables -A INPUT -p tcp -m multiport --dports 22,53,8080,139,445 -j LOG --log-level INFO --log-prefix "New connection from ours: " iptables -A INPUT -p tcp -m multiport --dports 22,53,8080,139,445 -j ACCEPT |
INPUT drop
|
Отбрасываем подключения IP-атакующего\порт-бедалага: iptables -A INPUT -s IP-атакующего -p tcp --destination-port порт-бедалага -j DROP Ограничиваем максимальное число «полуоткрытых» соединений с одного IP к конкретному порту: iptables -I INPUT -p tcp --syn --dport порт_бедалага -m iplimit --iplimit-above 10 -j DROP Отключаем ответы на запросы ICMP ECHO: iptables -A INPUT -p icmp -j DROP --icmp-type 8 |
NAT
|
!!! В организация NAT не должно быть в принципе. !!! Доступ к интернету должен осуществляется через proxy сервер iptables -t nat -A POSTROUTING -o isp -j MASQUERADE iptables -t nat -A POSTROUTING -o isp -j SNAT --to-source 10.0.0.23 iptables -t nat -A PREROUTING -i eth1 -j DNAT --to-destination 192.168.1.25 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.10.15.50:3128 iptables -t nat -A PREROUTING -p tcp -d 192.168.3.124 --dport 3389 -j DNAT --to 10.70.70.105:3389 iptables -t nat -A PREROUTING -p tcp -d 192.168.3.124 --dport 5090 -j DNAT --to 10.70.70.101:5090 |
IP FORWARD / MASQUERADE / Включение IP Forward
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
FORWARD: !!! По умолчанию ip forward выключен !!! Если forward выключен то не будет работать маршрутизация между интерфейсами Проверяем текущие состояние: cat /proc/sys/net/ipv4/ip_forward - проверяем текущие состояние ip_forward Включение forward: !!! это будет работать до перезагрузки echo 1 > /proc/sys/net/ipv4/ip_forward !!! Для постоянного включения необходимо отредактировать файл /etc/sysctl.conf, найти строку net.ipv4.ip_forward=1 и убрать комментарий с неё nano /etc/sysctl.conf --------------------- # Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 --------------------- sysctl -p - выполняем для применения изменений без перезагрузки NAT: Примеры настройки MASQUERADE: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -o isp -j MASQUERADE iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE |
Пример работы своей цепочки(из wiki):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
!!!Например, предположим, что нам нужно обеспечить доступ к определенным портам нашего сервера для всех хостов из подсети 10.134.0.64/26, кроме 10.134.0.67 и 10.134.0.100. iptables -F # Очищаем все цепочки таблицы filter iptables -N our_subnet # Создаем специальную цепочку для проверки пакетов из нашей подсети iptables -A our_subnet -s 10.134.0.67 -j RETURN # Запрещенный хост — выходим iptables -A our_subnet -s 10.134.0.100 -j RETURN # Запрещенный хост — выходим # Всем остальным разрешаем доступ к нужным портам iptables -A our_subnet -p tcp -m multiport --dports 22,53,8080,139,445 -j ACCEPT iptables -A our_subnet -p udp -m multiport --dports 53,123,137,138 -j ACCEPT iptables -A our_subnet -p icmp --icmp-type 8 -j ACCEPT # Разрешаем пакеты по уже установленным соединениям iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Все пакеты из нашей подсети отправляем на проверку iptables -A INPUT -s 10.134.0.64/26 -j our_subnet iptables -P INPUT DROP # Что не разрешено — то запрещено iptables -P OUTPUT ACCEPT # На выход — можно все |
iptables ipset (списки)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
Пример правил: iptables -A INPUT -p tcp -m set --match-set whitelist src -m comment --comment WHITELIST -j ACCEPT iptables -A INPUT -p tcp -m set --match-set blacklist src -m comment --comment BLACKLIST -j DROP iptables -A INPUT -p udp -m set --match-set asterisk-blacklist src -m multiport --dports 5060,5038,2000,4569,2727,4520,5000,8088,10000:20000 -m comment --comment "::01-asterisk-blacklist:: Blacklist" -j DROP iptables -A INPUT -p tcp -m set --match-set asterisk-blacklist src -m multiport --dports 5060,5038,2000,4569,2727,4520,5000,8088,10000:20000 -m comment --comment "::01-asterisk-blacklist:: Blacklist" -j DROP iptables -A INPUT -p udp -m set --match-set sip src -m multiport --dports 10000:20000 -m comment --comment "::08-sip:: RTP" -j ACCEPT iptables -A INPUT -p udp -m set --match-set sip src -m multiport --dports 4000:4999 -m comment --comment "::08-sip:: T.38" -j ACCEPT iptables -A INPUT -p udp -m set --match-set sip src -m udp --dport 5060 -m comment --comment "::08-sip:: SIP" -j ACCEPT iptables -A INPUT -p tcp -m set --match-set asterisk-mgmt src -m tcp --dport 5038 -m comment --comment "::08-sip:: AMI" -j ACCEPT iptables -A INPUT -p tcp -m set --match-set ssh src -m tcp --dport 22 -m comment --comment "::99-system:: SSH" -j ACCEPT iptables -A INPUT -p tcp -m set --match-set sshttl src -m tcp --dport 22 -m comment --comment "::99-system:: SSH" -j ACCEPT iptables -A INPUT -p tcp -m set --match-set zabbix src -m tcp --dport 10050 -m comment --comment "::99-system:: Zabbix" -j ACCEPT iptables -A INPUT -p tcp -m set --match-set bareos src -m tcp --dport 9102 -m comment --comment "::99-system:: Bareos" -j ACCEPT iptables -A INPUT -p udp -m set --match-set tftp src -m udp --dport 69 -m comment --comment "::89-tftp:: TFTP" -j ACCEPT iptables -A INPUT -p tcp -m set --match-set web src -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT iptables -A INPUT -p tcp -m set --match-set web src -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT Пример списка: /etc/iptables/blacklist.ipset -! create blacklist hash:net family inet hashsize 131072 maxelem 262144 counters timeout 7200 -! add blacklist 10.100.2.50/32 -! add blacklist 192.168.100.0/24 |
Сохранение правил брандмауэра
|
Чтобы сохранить правила брандмауэра в CentOS / RHEL / Fedora Linux, введите: # service iptables save В других дистрибутивах iptables-save > /root/my.active.firewall.rules или iptables-save |
Восстановление правил брандмауэра
|
Для восстановление правил брандмауэра из файла /root/my.active.firewall.rules, введите: # iptables-restore < /root/my.active.firewall.rules # iptables-restore /root/my.active.firewall.rules Для восстановление правил брандмауэра в CentOS / RHEL / Fedora Linux, введите: # service iptables restart |
Остановка, перезапуск, запуск брандмауэра Если у Вас CentOS / RHEL / Fedora Linux, вводите:
|
# service iptables stop # service iptables start # service iptables restart |
Чтобы отчистить правила iptables его собственными средствами введите:
|
!!! F: Удаление всех правил (flushing) !!! X: Удаление цепочки !!! t <таблица>: Выбрать таблицу и удалить правила !!! P: Установить политику по умолчанию (например DROP, REJECT или ACCEPT) # iptables -F # iptables -X # iptables -t nat -F # iptables -t nat -X # iptables -t mangle -F # iptables -t mangle -X # iptables -P INPUT ACCEPT # iptables -P OUTPUT ACCEPT # iptables -P FORWARD ACCEPT |
Очистка таблицы filter:
|
iptables -F INPUT iptables -F OUTPUT iptables -F FORWARD |
Очистка таблицы nat:
|
iptables -t nat -F PREROUTING iptables -t nat -F POSTROUTING |
Очистка таблицы mangle:
|
iptables -t mangle -F PREROUTING |
Чистим ветки логов:
|
iptables -F undef_in iptables -F undef_out iptables -F undef_fw iptables -X undef_in iptables -X undef_out iptables -X undef_fw |
Разрешаем принимать трафик на loopback-интерфейсе:
|
iptables -A INPUT eth2 -j ACCEPT iptables -A INPUT -i eth1 -j ACCEPT iptables -A FORWARD -i lo -o eth1 -j ACCEPT$IPT -A FORWARD -i eth2 -o lo -j ACCEPT iptables -A FORWARD -i lo -o eth2 -j ACCEPT$IPT -A FORWARD -i eth1 -o lo -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT |
Разрешение исходящего трафика:
|
iptables -A OUTPUT -o eth0 -j ACCEPT iptables -A OUTPUT -o eth1 -j ACCEPT iptables -A OUTPUT -o eth2 -j ACCEPT |
Разрешить соединения, которые инициированы изнутри
|
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT |
Следующими правилами разрешаем коннекты на наш сервер из вне:
|
iptables -A INPUT -p udp --dport 33434:33523 -j ACCEPT - Разрешить traceroute iptables -A INPUT -p tcp --dport 22 -j ACCEPT - Разрешаем SSH iptables -A INPUT -p tcp --dport 10000 -j ACCEPT - Разрешаем webmin iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT - Доступ на http |
Проброс RDP на сервер терминалов:
|
iptables -t nat -A PREROUTING -p tcp --dport 3389 -i eth0 -j DNAT --to 192.168.0.100 iptables -A FORWARD -i eth0 -d 192.168.0.100 -p tcp --dport 3389 -j ACCEPT |
Выход из локалки на почтовые сервера
|
iptables -A FORWARD -d smtp.mail.ru -o eth0 -p tcp -m tcp --dport 25 -j ACCEPT iptables -A FORWARD -d smtp.masterhost.ru -o eth0 -p tcp -m tcp --dport 25 -j ACCEPT Входящий трафик на почтовые сервера iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT |
Заворачиваем трафик на порт сквида:
|
iptables -t nat -A PREROUTING -p tcp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -s 0/0 -d 0/0 -j REDIRECT --to-port 3128 iptables -t nat -A PREROUTING -p udp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -s 0/0 -d 0/0 -j REDIRECT --to-port 3128 |
Если прокси не установлена,либо нет нужды в использовании SQUID, то просто форвардим нужные порты:
|
iptables -A FORWARD -o eth0 -p tcp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -j ACCEPT |
Прячем NAT:
|
iptables -t mangle -A PREROUTING -j TTL --ttl-set 64 iptables -t mangle -A PREROUTING -j RETURN |
Все что не разрешено, но ломится отправим в цепочку undef:
|
iptables -N undef_in iptables -N undef_out iptables -N undef_fw iptables -A INPUT -i vlan2 -j undef_in iptables -A OUTPUT -j undef_out iptables -A FORWARD -j undef_fw |
Антибрут ssh:
|
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT После этого хосты, пытающиеся перебирать пароль, будут блокироваться: все IP из черного списка будут фиксироваться в файле /proc/net/ipt_recent/SSH |
Разрешаем некоторые ICMP-сообщения
|
https://ru.wikipedia.org/wiki/ICMP - icmp-type iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 3 -j ACCEPT iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 11 -j ACCEPT iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 12 -j ACCEPT |
open firewall:
|
iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT # Небольшая защита от DoS iptables -A INPUT -p all -m state --state RELATED,ESTABLISHED -j ACCEPT # Разрешаем уже установленные соединения iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # Разрешаем 22 порт iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT # Разрешаем 80 порт iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 3 -j ACCEPT # Разрешаем некоторые ICMP-сообщения iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 11 -j ACCEPT # Разрешаем некоторые ICMP-сообщения iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 12 -j ACCEPT # Разрешаем некоторые ICMP-сообщения iptables -A INPUT DROP |
sysctl \ conntrack
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
Итак, есть /proc/net/nf_conntrack, в нём можно найти наши проблемные записи, но напрямую их поправить не удастся (или можно, тогда как?). Timeout NAT. Информация о сессиях также может быть удалена по timeout. Т.е. если в течение долгого времени в рамках соединения обмена трафика нет - сессия закрывается и информация о ней так же удаляется из таблицы NAT. По умолчанию значения тайм-аутов стоят достаточно большие. Поэтому, при больших потоках трафика, даже если nf_conntrack_max установлен в максимальное значение, существует риск столкнуться с переполнением таблицы и разрывами соединений. apt install conntrack-tools - установка пакета conntrack -L conntrack conntrack -L conntrack -s 192.168.0.100 - список для нужного внутреннего IP conntrack -L conntrack -d 8.8.8.8 - на какой-то адрес conntrack -L conntrack -q 192.168.0.1 - коннекты, проходящие через старый gate conntrack -D conntrack -s 192.168.0.100 -q 192.168.0.1 - удалить проблемную запись conntrack -F conntrack - есть и "оружие последнего дня", полная очистка таблицы conntrack -h - помощь # sysctl net.netfilter.nf_conntrack_max - посмотреть текущий размер таблицы NAT net.netfilter.nf_conntrack_max = 65536 # sysctl -a | grep conntrack_max - посмотреть текущий размер таблицы NAT net.netfilter.nf_conntrack_max = 65536 net.ipv4.netfilter.ip_conntrack_max = 65536 net.nf_conntrack_max = 65536 # sysctl net.netfilter.nf_conntrack_count - посмотреть заполненность таблицы net.netfilter.nf_conntrack_count = 654 |
NAT tweak
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
# sysctl net.netfilter.nf_conntrack_max - посмотреть текущий размер таблицы NAT net.netfilter.nf_conntrack_max = 65536 # sysctl -a | grep conntrack_max - посмотреть текущий размер таблицы NAT net.netfilter.nf_conntrack_max = 65536 net.ipv4.netfilter.ip_conntrack_max = 65536 net.nf_conntrack_max = 65536 # sysctl net.netfilter.nf_conntrack_count - посмотреть заполненность таблицы net.netfilter.nf_conntrack_count = 654 Посмотреть установленные значения задержек (в секундах): # sysctl -a | grep conntrack | grep timeout net.netfilter.nf_conntrack_generic_timeout = 600 - NAT- сервер будет хранить информацию о сессии даже в том случае, если будет проходит 1 пакет в 10 минут. net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120 net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60 net.netfilter.nf_conntrack_tcp_timeout_established = 432000 - TCP- сессию NAT- сервер будет отслеживать 5 дней(!), если даже за это период пройдет только 1 пакет, это может привести к быстрому заполнению nf_conntrack_max net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close = 10 net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300 net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300 net.netfilter.nf_conntrack_udp_timeout = 30 net.netfilter.nf_conntrack_udp_timeout_stream = 180 net.netfilter.nf_conntrack_icmp_timeout = 30 net.netfilter.nf_conntrack_events_retry_timeout = 15 net.ipv4.netfilter.ip_conntrack_generic_timeout = 600 net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent2 = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 432000 net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 30 net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close = 10 net.ipv4.netfilter.ip_conntrack_tcp_timeout_max_retrans = 300 net.ipv4.netfilter.ip_conntrack_udp_timeout = 30 net.ipv4.netfilter.ip_conntrack_udp_timeout_stream = 180 net.ipv4.netfilter.ip_conntrack_icmp_timeout = 30 |
ipteplse-sex
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
vim /etc/systemd/system/sex-sec.service ---------------------------------------- [Unit] Description= add iptables and route After=syslog.target [Service] Type=simple TimeoutStartSec=10 ExecStart=/etc/iptables/sex_sec.sh [Install] WantedBy=multi-user.target ---------------------------------------- mkdir /etc/iptables vim /etc/iptables/sex_sec.sh ---------------------------- #!/bin/bash iptables-restore /etc/iptables/iptable.4 ip6tables-restore /etc/iptables/iptable.6 sleep 30 #!/bin/bash list_net_ip="192.168.55 192.168.80 192.168.88 10.12.88" ip_router="192.168.16.55" i=99 for x in ${list_net_ip} ; do i=$(ip route | grep "${x}" 1>/dev/null ; echo $?) if ((i > 0)) ; then #echo -e "ip route add ${x} via ${ip_router}" ip route add ${x}.0/24 via ${ip_router} fi done ----------------------------- chmod +x /etc/iptables/sex_sec.sh vim /etc/iptables/iptable.4 ---------------------------- *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :DOCKER - [0:0] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE -A POSTROUTING -s 172.18.0.0/16 ! -o br-6e31867864c0 -j MASQUERADE -A POSTROUTING -o ovsbr0 -j MASQUERADE -A POSTROUTING -s 172.18.0.2/32 -d 172.18.0.2/32 -p tcp -m tcp --dport 443 -j MASQUERADE -A POSTROUTING -s 172.18.0.5/32 -d 172.18.0.5/32 -p tcp -m tcp --dport 8080 -j MASQUERADE -A DOCKER -i docker0 -j RETURN -A DOCKER -i br-6e31867864c0 -j RETURN -A DOCKER ! -i br-6e31867864c0 -p tcp -m tcp --dport 8443 -j DNAT --to-destination 172.18.0.2:443 -A DOCKER ! -i br-6e31867864c0 -p tcp -m tcp --dport 32768 -j DNAT --to-destination 172.18.0.5:8080 COMMIT *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -i enp0s20f0u2 -j ACCEPT -A INPUT -i enp0s20f0u1u2 -j ACCEPT -A INPUT -i enp0s20f0u1u1 -j ACCEPT -A INPUT -i zthnhjuefn -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p udp -m udp --dport 5678 -j ACCEPT -A INPUT -s 192.168.16.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -s 192.168.15.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 100/sec -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 12 -j ACCEPT -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i zthnhjuefn -j ACCEPT -A FORWARD -i enp0s20f0u1u1 -j ACCEPT COMMIT ---------------------------- vim /etc/iptables/iptable.6 ------------------------ *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p ipv6-icmp -j ACCEPT COMMIT ------------------------ |