Обработка источника соединения
Идем дальше. соединение по определенным портам нам необходимо не со всем Интернетом, а с определенными машинами, с определенными IP-адресами. Поэтому мы можем немного усложнить правила, добавив в них адрес источника пакетов.
iptables -t filter -A INPUT -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT
Данное правило позволяет принимать пакеты на 22 порт по протоколу TCP только из источника с адресом 123.123.123.123, на это указывает параметр «-s» (source, источник). Таким образом вы можете ограничить соединения с сервером по SSH одним определенным IP-адресом, либо определенной подсетью, если укажете маску подсети, из которой разрешены соединения вместо отдельного IP-адреса.
Если у вас всегда используется один и тот же почтовый шлюз, через который ваш сервер отправляет почту, то вы можете, например, ограничить соединения с порта 25/tcp, указав этот шлюз в качестве источника.
Configuration on startup
WARNING: Iptables and NetworkManager can conflict. Also if you are concerned enough about security to install a firewall you might not want to trust NetworkManager. Also note NetworkManager and iptables have opposite aims. Iptables aims to keep any questionable network traffic out. NetworkManager aims to keep you connected at all times. Therefore if you want security all the time, run iptables at boot time. If you want security some of the time then NetworkManager might be the right choice.
WARNING: If you use NetworkManager (installed by default on Feisty and later) these steps will leave you unable to use NetworkManager for the interfaces you modify. Please follow the steps in the next section instead.
NOTE: It appears on Hardy, NetworkManager has an issue with properly on saving and restoring the iptable rules when using the method in the next section. Using this first method appears to work. If you find otherwise, please update this note.
Save your firewall rules to a file
sudo sh -c "iptables-save > /etc/iptables.rules"
At this point you have several options. You can make changes to /etc/network/interfaces or add scripts to /etc/network/if-pre-up.d/ and /etc/network/if-post-down.d/ to achieve similar ends. The script solution allows for slightly more flexibility.
Solution #1 — /etc/network/interfaces
(NB: be careful — entering incorrect configuration directives into the interface file could disable all interfaces, potentially locking you out of a remote machine.)
Modify the /etc/network/interfaces configuration file to apply the rules automatically. You will need to know the interface that you are using in order to apply the rules — if you do not know, you are probably using the interface eth0, although you should check with the following command first to see if there are any wireless cards:
iwconfig
If you get output similar to the following, then you do not have any wireless cards at all and your best bet is probably eth0.
lo no wireless extensions. eth0 no wireless extensions.
When you have found out the interface you are using, edit (using sudo) your /etc/network/interfaces:
sudo nano /etc/network/interfaces
When in the file, search for the interface you found, and at the end of the network related lines for that interface, add the line:
pre-up iptables-restore < /etc/iptables.rules
You can also prepare a set of down rules, save them into second file /etc/iptables.downrules and apply it automatically using the above steps:
post-down iptables-restore < /etc/iptables.downrules
A fully working example using both from above:
auto eth0 iface eth0 inet dhcp pre-up iptables-restore < /etc/iptables.rules post-down iptables-restore < /etc/iptables.downrules
You may also want to keep information from byte and packet counters.
sudo sh -c "iptables-save -c > /etc/iptables.rules"
The above command will save the whole rule-set to a file called /etc/iptables.rules with byte and packet counters still intact.
Solution #2 /etc/network/if-pre-up.d and ../if-post-down.d
NOTE: This solution uses iptables-save -c to save the counters. Just remove the -c to only save the rules.
Alternatively you could add the iptables-restore and iptables-save to the if-pre-up.d and if-post-down.d directories in the /etc/network directory instead of modifying /etc/network/interface directly.
NOTE: Scripts in if-pre-up.d and if-post-down.d must not contain dot in their names.
The script /etc/network/if-pre-up.d/iptablesload will contain:
#!/bin/sh iptables-restore < /etc/iptables.rules exit 0
and /etc/network/if-post-down.d/iptablessave will contain:
#!/bin/sh iptables-save -c > /etc/iptables.rules if [ -f /etc/iptables.downrules ]; then iptables-restore < /etc/iptables.downrules fi exit 0
Then be sure to give both scripts execute permissions:
sudo chmod +x /etc/network/if-post-down.d/iptablessave sudo chmod +x /etc/network/if-pre-up.d/iptablesload
Дополнительные правила
Удалённый доступ
# remote.ssh -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT # remote.rdp -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 3389 -j ACCEPT # remote.vnc -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5900 -j ACCEPT
Веб и файловые сервисы
# web.http, web.https -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 80,443 -j ACCEPT # web.ftp + необходима загрузка модуля nf_conntrack_ftp -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 21 -j ACCEPT
Почта и мгновенные сообщения
# mail.pop3, mail.pop3s -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 110,995 -j ACCEPT # mail.imap, mail.imaps -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 143,993 -j ACCEPT # mail.smtp, mail.smtps -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 25,465 -j ACCEPT # im.xmpp -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 5222,5223 -j ACCEPT # im.icq.oscar -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5190 -j ACCEPT
Сетевые службы
# network.openvpn.vpn -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 1194 -j ACCEPT # network.squid.proxy -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 3128 -j ACCEPT # network.dns -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 53 -j ACCEPT -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 53 -j ACCEPT # network.ntp -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 123 -j ACCEPT # network.tftp + необходима загрузка модуля nf_conntrack_tftp -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 69 -j ACCEPT # network.dhserver.dhcp.discover-request -A INPUT -p udp -m conntrack --ctstate NEW -m udp --sport 68 --dport 67 -j ACCEPT # network.dhclient.dhcp.discover-request #-A OUTPUT -p udp -m conntrack --ctstate NEW -m udp --sport 68 --dport 67 -j ACCEPT # network.dhserver.dhcp.offer-ack #-A OUTPUT -p udp -m conntrack --ctstate NEW -m udp --sport 67 --dport 68 -j ACCEPT
Просмотр текущей конфигурации для IPv4 и IPv6:
$ sudo iptables-save $ sudo ip6tables-save
Модули ядра
Просмотр загруженных модулей:
lsmod | grep -E '^ip|^nf' | sort
Для загрузки дополнительных модулей удобно применять автодополнение: 2xTab
$ sudo modprobe nf $ sudo modprobe ip
- Часто используемые модули: nf_conntrack_ftp, nf_conntrack_pptp, nf_conntrack_tftp, nf_nat_pptp.
- Автозагрузка модулей:
man modules-load.d
Журналирование событий iptables
Настройка журнала iptables в Debian производится в файле /etc/sysconfig/iptables
... -A INPUT -i eth1 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j LOG --log-prefix "**Hackers**" --log-level 4 --log-tcp-options -A INPUT -i eth1 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable ...
В Debian 4.0 iptables по умолчанию пишет логи в /var/log/kern.log, чтобы это изменить создаём файл /var/log/iptables.warn
(с правами доступа такими же как и /var/log/kern.log) и добавляем в /etc/syslog.conf (/etc/rsyslog.conf для Debian 5.0) строку «kern.warning -/var/log/iptables.warn»:
... kern.* -/var/log/kern.log kern.warning -/var/log/iptables.warn ...
Перезагружаем syslogd:
# /etc/init.d/sysklogd restart
или rsyslog в случае Debian 5:
# /etc/init.d/rsyslog restart
Полезные ссылки:
http://www.cyberciti.biz/tips/force-iptables-to-log-messages-to-a-different-log-file.html
Именованные наборы
Nftables также поддерживает мутабельные именованные наборы. Для их создания необходимо указать тип элементов, которые будут в них содержаться. Например, типы могут быть такими: ipv4_addr, inet_service, ether_addr.
Давайте создадим пустой набор.
Чтобы сослаться на набор в правиле используйте символ @ и имя набора после него. Следующее правило будет работать как черный список для IP-адресов в нашем наборе.
Конечно, это не особо эффективно, так как в наборе пусто. Давайте добавим в него несколько элементов.
Однако попытка добавить диапазон значений приведет к ошибке.
Чтобы использовать диапазоны в наборах, нужно создать набор с использованием флагов интервалов. Так нужно, чтобы ядро заранее знало, какой тип данных будет храниться в наборе, чтобы использовать соответствующую структуру данных.
Ubuntu и CentOS
В современных операционных системах Ubuntu и CentOS по умолчанию нет iptables. Необходимо его установить или пользоваться более новыми утилитами.
В CentOS
В качестве штатной программы управления брандмауэром используется firewall-cmd. Подробнее читайте инструкцию Как настроить firewalld в CentOS.
Если необходимо пользоваться iptables, устанавливаем пакет с утилитой:
yum install iptables-services
Отключаем firewalld:
systemctl stop firewalld
systemctl disable firewalld
Разрешаем и запускаем iptables:
systemctl enable iptables
systemctl start iptables
В Ubuntu
Для управления брандмауэром теперь используется ufw.
Для работы с iptables, устанавливаем следующий пакет:
apt-get install iptables-persistent
Отключаем ufw:
ufw disable
Минимальный набор правил iptables для шлюза
Задача: 1. Раздать интернет в локальную сеть при помощи NAT’а. 2. Разрешить обращение машин из локальной сети к внешним HTTP, HTTPS и DNS серверам 3. Пробросить порт на веб сервер, находящийся в этой локальной сети.
### Переменные # Интерфейс, смотрящий в интернет INET_IF="eth0" # Белый IP адрес, принадлежащий $INET_IF INET_IP="x.x.x.x" # TCP порты, по которым разрешено ходить в интернет машинам из локальной сети FORWARD_TCP_PORTS="53,80,443" # UDP порты, по которым разрешено ходить в интернет машинам из локальной сети FORWARD_UDP_PORTS="53" # Локальная сеть LOCAL_NET="192.168.0.0/24" # IP адрес локального веб сервера WEB_SERVER="192.168.0.10" # Путь до sysctl SYSCTL="/sbin/sysctl -w" # Включить в ядре форвард IPv4 пакетов if then echo "1" > /proc/sys/net/ipv4/ip_forward else $SYSCTL net.ipv4.ip_forward="1" fi ### Правила по умолчанию iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT ### INPUT # Разрешить входящие соединения с локалхоста iptables -A INPUT -i lo -j ACCEPT # Разрешить принимать уже установленные соединения iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить SSH iptables -A INPUT -p TCP --dport 22 -j ACCEPT ### FORWARD # Разрешить уже установленные пересылаемые соединения iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить машинам локальной сети ходить в интернет по указанным TCP портам iptables -A FORWARD -p TCP -s $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j ACCEPT iptables -A FORWARD -p TCP -d $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j ACCEPT # Разрешить машинам локальной сети ходить в интернет по указанным UDP портам iptables -A FORWARD -p UDP -s $LOCAL_NET -m multiport --dport $FORWARD_UDP_PORTS -j ACCEPT iptables -A FORWARD -p UDP -d $LOCAL_NET -m multiport --dport $FORWARD_UDP_PORTS -j ACCEPT ### NAT # Включить NAT для локальной подсети iptables -t nat -A POSTROUTING -s $LOCAL_NET -o $INET_IF -j SNAT --to-source $INET_IP # Пробросить порт на локальный веб сервер iptables -t nat -A PREROUTING -p TCP -d $INET_IP --dport 80 -j DNAT --to-destination $WEB_SERVER:80
Надо отметить, что если пробрасывается порт, отличный от списка $FORWARD_TCP_PORTS, то необходимо его туда добавить, т.к. он будет дропаться политикой по умолчанию.В итоге, скрипт iptables для шлюза будет выглядеть следующим образом. Отличается от предыдущих правил.
#!/bin/sh # Очистить все правила iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT 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 ### Переменные # Интерфейс, смотрящий в интернет INET_IF="eth0" # Белый IP адрес, принадлежащий $INET_IF INET_IP="x.x.x.x" # Локальная сеть LOCAL_NET="192.168.0.0/24" # IP адрес локального веб сервера WEB_SERVER="192.168.0.10" # Включить в ядре форвард IPv4 пакетов # Путь до sysctl SYSCTL="/sbin/sysctl -w" if then echo "1" > /proc/sys/net/ipv4/ip_forward else $SYSCTL net.ipv4.ip_forward="1" fi ### Правила по умолчанию iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT ### INPUT # Разрешить входящие соединения с локалхоста iptables -A INPUT -i lo -j ACCEPT # Разрешить принимать уже установленные соединения iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить SSH только из локальной сети iptables -A INPUT -p TCP -s $LOCAL_NET --dport 22 -j ACCEPT # Разрешить запросы к кэширующему DNS серверу только из локальной сети iptables -A INPUT -p TCP -s $LOCAL_NET --dport 53 -j ACCEPT iptables -A INPUT -p UDP -s $LOCAL_NET --dport 53 -j ACCEPT ### FORWARD # Разрешить уже установленные пересылаемые соединения iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # TCP порты, по которым разрешено ходить в интернет машинам из локальной сети FORWARD_TCP_PORTS="80,443" # Разрешить машинам локальной сети ходить в интернет по указанным TCP портам iptables -A FORWARD -p TCP -s $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j ACCEPT iptables -A FORWARD -p TCP -d $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j ACCEPT ### NAT # Включить NAT для локальной подсети iptables -t nat -A POSTROUTING -s $LOCAL_NET -o $INET_IF -j SNAT --to-source $INET_IP # Пробросить порт на локальный веб сервер на нестандартный порт iptables -t nat -A PREROUTING -p TCP -d $INET_IP --dport 80 -j DNAT --to-destination $WEB_SERVER:8090
Установка
Стандартное ядро Arch Linux скомпилировано с поддержкой iptables. Необходимо лишь установить набор пользовательских утилит, которые собраны в пакет . Поскольку данный пакет является косвенной зависимостью мета-пакета , то он по умолчанию должен быть установлен в системе.
Консольные
Arno’s firewall — безопасный межсетевой экран как для одиночной машины, так и для разрозненной сети. Лёгок в настройке, удобен в использовании, хорошо кастомизируется. Поддерживает: NAT и SNAT, проброс портов, ADSL ethernet-модемы со статическими и динамическими IP-адресами, фильтрацию MAC-адресов, обнаружение скрытого сканирования портов, DMZ и DMZ-2-LAN пересылку, защиту от SYN/ICMP флуда, обширное логирование с временными ограничениями для предотвращения засорения логов, все IP-протоколы и технологии VPN вроде IPsec, плагины для расширения функциональности.
ferm — инструмент для обслуживания комплексных межсетевых экранов, помогающий избежать необходимости переписывать сложные правила снова и снова. Позволяет сохранить целый набор правил в одном файле и загрузить его всего одной командой. Настройка экрана производится посредством специального языка, наподобие языка программирования, с помощью уровней и списков.
FireHOL — не только программа для создания межсетевого экрана, но и специальный язык для задания его настроек. Делает даже тонкую настройку экрана лёгкой — как вам бы и хотелось.
Firetable — инструмент для межсетевого экрана iptables. Каждый сетевой интерфейс настраивается отдельно в соответствии с собственным файлом настроек, синтаксис которого понятен и удобен.
firewalld (firewall-cmd) — демон и консольный интерфейс для настройки сети, зональной политики и правил межсетевого экрана.
Shorewall — высокоуровневый инструмент для настройки Netfilter. Требования к экрану/шлюзу описываются посредством записей в наборе файлов настроек.
Uncomplicated Firewall — простой интерфейс для iptables.
PeerGuardian (pglcmd) — ориентированное на приватность firewall-приложение. Занимается блокировкой входящих и исходящих подключений на основе огромного чёрного списка (тысячи или даже миллионы IP-диапазонов).
Vuurmuur — мощный менеджер сетевого экрана. Лёгкая в освоении настройка, которая позволяет создавать как простые, так и сложные конфигурации межсетевого экрана. Для настройки есть графический интерфейс на основе ncurses, который позволяет осуществлять безопасное удалённое администрирование через SSH или консоль. Vuurmuur поддерживает ограничение трафика, имеет мощную систему мониторинга, которая позволяет администратору следить за логами, подключениями и использованием пропускной способности в режиме реального времени.
Servicewall — простой адаптивный фронтенд для iptables; позволяет определять список служб, поторым разрешено устанавливать соединение с определённым доменом, а также автоматичеки переключать профили при необходимости. Использует определения служб, предоставляемые jhansonxi и используемые в том числе в ufw. При ведении логов journald со списком заблокированных пакетов полагается на ulogd; содержит фреймворк анализа пакетов с упором на ограничение доступа к логам.
Графические
Firewall Builder — графический интерфейс для настройки и управления межсетевыми экранами, работает с iptables (netfilter), ipfilter, pf, ipfw, Cisco PIX (FWSM, ASA), а также с маршрутизаторами Cisco с поддержкой Extended ACL. Запускается на Linux, FreeBSD, OpenBSD, Windows и macOS, может управлять как локальными, так и удалёнными межсетевыми экранами.
firewalld (firewall-config) — демон и графический интерфейс для настройки сети, зональной политики и правил межсетевого экрана.
Gufw — графический GTK-интерфейс для ufw, который, в свою очередь, является интерфейсом командной строки для iptables (gufw–>ufw–>iptables), лёгкий и простой в использовании.
PeerGuardian GUI (pglgui) — ориентированное на приватность firewall-приложение. Занимается блокировкой входящих и исходящих подключений на основе огромного чёрного списка (тысячи или даже миллионы IP-диапазонов).
Таблицы как пространства имен
Еще одна интересная вещь о таблицах в nftables – это то, что они также являются полноценными пространствами имен. То есть две таблицы могут создавать цепочки, наборы и другие объекты с одинаковыми именами.
Это свойство означает, что приложения могут организовывать правила в своих собственных цепочках, не затрагивая другие приложения. В iptables приложениям было тяжело вносить изменения в брандмауэр, не влияя на другие приложения.
Однако и тут есть один нюанс. Каждый хук таблицы или цепочки можно рассматривать как независимый и отдельный брандмауэр. То есть пакет должен пройти через все, чтобы в итоге быть принятым. Если table_one принимает пакет, его все еще может отклонить table_two. Именно здесь в игру вступает приоритезация хуков. Цепочка с более низким приоритетом гарантированно будет выполнена перед цепочкой с более высоким приоритетом. Если приоритеты равны, то поведение не определено.
Автозагрузка правил iptables
1. Загрузка правил с помощью скрипта
Сохраненные правила с помощью утилиты iptables-save можно восстанавливать с помощью скрипта, запускаемого при каждом запуске операционной системы. Для этого необходимо выполнить следующие действия:
Сохранить набор правил межсетевого экрана с помощью команды:
Для запуска набора правил при старте операционной системы перед включением сетевого интерфейса мы создаем новый файл с помощью команды:
Заметим — в сети есть много вариантов места размещения скрипта на локальной машине, но я считаю именно размещение в папке if-pre-up.d наиболее верным, так как при этом скрипт будет выполнятся перед включением сетевого интерфейса. Добавляем в данный файл следующий скрипт:
Сохраняем файл iptables Ctrl+O. Выходим из editor Ctrl+X. Устанавливаем необходимые права для созданного файла:
Перезагружаем компьютер и проверяем результат для таблицы filter с помощью команды:
Для обеспечения безопасности необходимо, чтобы конфигурация iptables применялась до запуска сетевых интерфейсов, сетевых служб и маршрутизации. Если данные условия не будут соблюдены — появляется окно уязвимости между загрузкой операционной системы и правил защиты межсетевого экрана. Для реализации такого варианта защиты можно использовать пакет iptables-persistent.
2. Автозагрузка правил iptables-persistent
По умолчанию данный пакет не установлен в операционной системе. Данный вариант реализации автозапуска конфигурации возможен в операционных системах Debian, Ubuntu. Для установки пакета требуется выполнить команду:
Этот пакет впервые стал доступен в Debian (Squeeze) и Ubuntu (Lucid). Используемые этим пакетом правила iptables хранятся в следующих директориях:
- /etc/iptables/rules.v4 для набора правил протокола IPv4;
- /etc/iptables/rules.v6 для набора правил протокола IPv6.
Но они должны быть сохранены в понятном утилите iptables-persistent виде.
Требования к формату данных файлах не задокументированны, что создает некоторые сложности для создания этих файлов вручную. Их можно создать с помощью dpkg-reconfigure:
Или можно использовать iptables-save и ip6tables-save:
Если мы были внимательны при установке пакета, то мы должны были заметить в Debian 10 и последних версиях Ubuntu пакет-зависимость для iptables-persistent: netfilter-persistent, устанавливаемых с нужным нам пакетом. Можно по адресу https://packages.ubuntu.com посмотреть содержимое пакета iptables-persistent, и мы заметим, что на текущий момент пакет называется iptables-persistent, а основные файлы уже относятся к пакету netfilter-persistent.
Утилита netfilter-persistent тоже позволяет управлять автозагрузкой правил. Вот её синтаксис:
sudo netfilter-persistent
Где может принимать следующие значения:
- start — вызывает все плагины с параметром start, для загрузки правил в netfilter;
- stop — если настроена конфигурация сброса настроек Netfilter при остановке плагина, сбрасывает все настройки firewall на значения по умолчанию. Иначе просто выдает предупреждение;
- flush — плагины вызываются с параметром flush, что приводит к сбросу правил межсетевого экрана на значения по умолчанию;
- save — вызывает плагины с параметром save, позволяя сохранить значения правил брандмауэра в файлы на диске;
- reload — не задокументированный параметр, возникали случаи когда параметр start не срабатывал, помогал вызов этого параметра для загрузки правил из файла на диске;
Значит, чтобы сохранить правила мы можем вызвать следующую команду:
Для загрузки же сохраненных правил мы можем использовать команду:
Замечание После установки netfilter-persistent система при использовании iptables и формата хранения файлов, связанного с ним, начинает при работе выдавать предупреждение
Это связано с наличием новой утилиты настройки и редактирования правил Netfilter — nftables, для миграцию на эту утилиту старых правил iptables можно использовать автоматический транслятор правил iptables-translate. Но это уже тема для отдельной статьи.
Настройка правил iptables
Перед настройкой правил, чтобы не заблокировать нужные сервисы, стоит посмотреть открытые порты на сервере при помощи команды:
# netstat -tulpn
Все правила iptables применяются сразу после выполнения команды по добавлению правила в firewall. Чтобы это проверить, можно сразу запретить доступ к 80 порту, если конечно на нем настроен web-сервер, для относительно безопасного наблюдения за действиями блокировки:
# iptables -A INPUT -p tcp -m tcp —dport 80 -j DROP
Теперь можно убедиться, что сайт, для доступа к которому используется 80 порт, стал недоступен. Флаг -A добавляет правило в самый конец выбранной цепочки. Поскольку в команде не указано имя таблицы правил (-t tablename), используется таблица по умолчанию: filter. Снять блокировку можно, как было описано ранее, путем запуска команды iptables -F, но что делать, если нужно удалить только одно правило, а все остальные оставить без изменений?
Удалить все правила из цепочки INPUT с параметром DROP:
# iptables -D INPUT -j DROP
Удалить только правило, заданное с помощью INPUT -p tcp -m tcp —dport 81 -j DROP
# iptables -D INPUT -p tcp -m tcp —dport 80 -j DROP
Ключ -D обозначает: удалить одно или более правил согласно следующему за ним условию.
Также, удалить правило, можно зная его номер. Просмотреть все правила с номерами строк, можно при помощи ключа —line-numbers, номер правила будет указан в колонке num:
# iptables -L -n -v —line-numbers
Флаги -L, -n и -v:
- -L: посмотреть список правил.
- -n: отображать IP адрес и порт числами, без этой опции IP-адреса будут по возможности переведены в имена доменов, что замедлит процесс отображения.
- -v: просмотр дополнительной информации, такой как: название интерфейса, суффиксы ‘K’, ‘M’ or ‘G’, опции и TOS маски.
Теперь удалить одно правило, зная его номер, можно так:
# iptables -D INPUT 1
Добавить правило на определенное место, например на первую строчку, можно, используя такой синтаксис:
# iptables -I INPUT 1 -s 4.4.4.4 -j ACCEPT
Все правила, записанные ранее, включая то, что было в строке 1, будут сдвинуты на строчку ниже.
Опция -Z сбрасывает в ноль счетчики пакетов и байт.
DROP или REJECT
DROP и REJECT отклоняют соединение, но REJECT еще дополнительно отправляет инициатору ICMP пакет, с сообщением, что попытка соединения отклонена. DROP — просто отбрасывает пришедший пакет, не отправляя никакого сообщения в ответ. В случае DoS-атаки, REJECT будет создавать избыточный трафик своими ответами, так что в случае отклонения соединения лучше всего использовать DROP.
В советуют использовать REJECT, для защиты от сканирования портов, поскольку DROP может оставлять открытые неиспользуемые сокеты на сервере.
Сброс правил: опция -F или -X
Во многих примерах для полной очистки правил используется сразу флаг -F и флаг -X:
# iptables -F
# iptables -X
И это правильно! Так как -F удаляет все пользовательские правила созданные в стандартных и пользовательских цепочках, а вот флаг -X удаляет пользовательские названия цепочек, созданные при помощи флага -N. Менять местами -F и -X не стоит, так как для удаления пользовательской цепочки, необходимо предварительно очистить её от правил, иначе цепочка удалена не будет и отобразиться сообщение об ошибке.
Tips
If you manually edit iptables on a regular basis
The above steps go over how to setup your firewall rules and presume they will be relatively static (and for most people they should be). But if you do a lot of development work, you may want to have your iptables saved everytime you reboot. You could add a line like this one in /etc/network/interfaces:
pre-up iptables-restore < /etc/iptables.rules post-down iptables-save > /etc/iptables.rules
The line «post-down iptables-save > /etc/iptables.rules» will save the rules to be used on the next boot.
Using iptables-save/restore to test rules
If you edit your iptables beyond this tutorial, you may want to use the iptables-save and iptables-restore feature to edit and test your rules. To do this open the rules file in your favorite text editor (in this example gedit).
sudo sh -c "iptables-save > /etc/iptables.rules" gksudo gedit /etc/iptables.rules
You will have a file that appears similiar to (following the example above):
# Generated by iptables-save v1.3.1 on Sun Apr 23 06:19:53 2006 *filter :INPUT ACCEPT :FORWARD ACCEPT :OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 -A INPUT -j DROP COMMIT # Completed on Sun Apr 23 06:19:53 2006
Notice that these are iptables commands minus the iptable command. Feel free to edit this to file and save when complete. Then to test simply:
sudo iptables-restore < /etc/iptables.rules
NOTE: With iptables 1.4.1.1-1 and above, a script allow you to test your new rules without risking to brick your remote server. If you are applying the rules on a remote server, you should consider testing it with:
sudo iptables-apply /etc/iptables.rules
After testing, if you have not added the iptables-save command above to your /etc/network/interfaces remember not to lose your changes:
sudo sh -c "iptables-save > /etc/iptables.rules"
More detailed Logging
For further detail in your syslog you may want create an additional Chain. This will be a very brief example of my /etc/iptables.rules showing how I setup my iptables to log to syslog:
# Generated by iptables-save v1.3.1 on Sun Apr 23 05:32:09 2006 *filter :INPUT ACCEPT :FORWARD ACCEPT :LOGNDROP - :OUTPUT ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -j LOGNDROP -A LOGNDROP -p tcp -m limit --limit 5/min -j LOG --log-prefix "Denied TCP: " --log-level 7 -A LOGNDROP -p udp -m limit --limit 5/min -j LOG --log-prefix "Denied UDP: " --log-level 7 -A LOGNDROP -p icmp -m limit --limit 5/min -j LOG --log-prefix "Denied ICMP: " --log-level 7 -A LOGNDROP -j DROP COMMIT # Completed on Sun Apr 23 05:32:09 2006
Note a new CHAIN called LOGNDROP at the top of the file. Also, the standard DROP at the bottom of the INPUT chain is replaced with LOGNDROP and add protocol descriptions so it makes sense looking at the log. Lastly we drop the traffic at the end of the LOGNDROP chain. The following gives some idea of what is happening:
-
--limit sets the number of times to log the same rule to syslog
-
--log-prefix "Denied..." adds a prefix to make finding in the syslog easier
-
--log-level 7 sets the syslog level to informational (see man syslog for more detail, but you can probably leave this)
Disabling the firewall
If you need to disable the firewall temporarily, you can flush all the rules using
sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -F
or create a script using text editor such as nano
sudo nano -w /root/fw.stop
echo "Stopping firewall and allowing everyone..." 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 FORWARD ACCEPT iptables -P OUTPUT ACCEPT
Make sure you can execute the script
sudo chmod +x /root/fw.stop
You can run the script
sudo /root/fw.stop