Утилита iptables служит для управления правилами фаервола. Она не так проста в обращении как FirewallD, но имеет больше возможностей для гибкой настройки.
Публикую набор базовых команд, который выполняю на всех новых веб серверах (CentOS) для начальной конфигурации iptables:
iptables -P INPUT ACCEPT
iptables -F
iptables -t mangle -F
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o внешний_интерфейс -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s ваш_ip_адрес/32 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
>> по аналогии с предыдущей строкой открыть нужные tcp/udp порты
iptables -t mangle -A PREROUTING -p icmp -j DROP
iptables -t mangle -A PREROUTING -m state --state INVALID -j DROP
iptables -t mangle -A PREROUTING -p tcp ! --syn -m state --state NEW -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
Не забудьте изменить "ваш_ip_адрес" на свой ip! Эта строка разрешает доступ к SSH именно с этого ip. Если введёте неверный ip, то заблокируете себе доступ.
Если не указать "внешний_интерфейс" для доступа к интернету (OUTPUT), то перестанут работать cURL запросы с сайтов и обновления самого сервера. Название внешнего интерфейса можно посмотреть через ifconfig (блок со публичным ip адресом) или route (строка с "default").
Команды в этом списке нельзя менять местами, иначе можете заблокировать сервер (особенно первые две). В списке приведены только команды для базовой настройки. Они не открывают порты, к примеру, для MySQL или почтового клиента. Это только минимальный набор для веб сервера (открыты порты для http и https), от которого можно отталкиваться в дальнейшей настройке.
После чего сохраняем настройки iptables, чтобы после перезагрузки правила не были сброшены:
service iptables save
Перед выполнением этих команд стоит убедиться, что никаких сохранённых настроек нет. А то вдруг там есть ценные настройки. Проверяем что именно сохранилось с помощью вывода содержимого текстового файла настроек:
cat /etc/sysconfig/iptables
Рестартуем сервис и проверяем статус:
systemctl restart iptables
systemctl status iptables
Запрашиваем все правила и статистику по пакетам:
iptables -L -v
Полезные статьи
Рекомендую посмотреть полезные статьи по настройке iptables:
- https://wiki.centos.org/HowTos/Network/IPTables
- https://serveradmin.ru/nastroyka-iptables...
- https://sonikelf.ru/pervichnaya-nastrojka-iptables-.....
Домашним ПК на Linux
Для домашнего ПК можно использовать следующие настройки:
iptables -F
iptables -t mangle -F
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o внешний_интерфейс -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -t mangle -A PREROUTING -m state --state INVALID -j DROP
iptables -t mangle -A PREROUTING -p tcp ! --syn -m state --state NEW -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
Если указывать REJECT вместо DROP, то при DDOS атаке будет забит исходящий канал, потому что серверу придётся отвечать на каждый запрос. А если поставить DROP, то отвечать не надо.
В Ubuntu по умолчанию установлен фаервол ufw. Для его быстрой настройки на ПК можно использовать графическую утилиту gufw:
sudo apt install gufw
Она используется в LinuxMint из коробки.
Модуль state (используется в "-m state") является устаревшим. Лучше использовать "-m conntrack".
Обратите внимание, что правила "-m state" и "-m conntrack" не влияют друг на друга. Если разрешить что-то в "-m conntrack" и запретить в "-m state", то оно все равно будет доступно... Или мне так кажется? В любом случае, стоит использовать только один модуль, а не оба одновременно для одних и тех же портов.
Скоро соберусь с мыслями и перепишу полностью эту статью для "-m conntrack".
Следите за политиками. По ним можно догадаться существует ли ПО на сервере или нет. К примеру, если все порты сервера ничего не возвращают (используется DROP), а порт 3306 отвечает, что он unreachable (то есть установлено правило REJECT), то можно догадаться о существовании базы данных на сервере. Поэтому используйте везде DROP (предпочтительнее) либо REJECT. Но лучше не смешивать.
На чистой Centos8 для сохранения правил после перезагрузки выполнять:
iptables-save > /etc/sysconfig/iptables