Iptables – это фаервол в ОС семейства Linux.
Управление фаерволом iptables
Для управления им (включение/отключение, перезагрузка, добавление в автозагрузку и др.), нужно установить пакет:
yum -y install iptables-services
Теперь можно включить и добавить в автозагрузку:
systemctl start iptables.service systemctl enable iptables.service
Редактирование iptables. Внесение правил
Для внесения правил можно либо изменять непосредственно сам оригинальный файл iptables, либо создать для него отдельный новый файл – скрипт, который будет ДОПИСЫВАТЬ в него нужные правила. Таким образом удобно переносить свои настройки с сервера на сервер.
Способ 1. Редактирование самого файла (не рекомендую)
В CentOS 7 конфиг фаервола iptables находится в папке /etc/sysconfig/
Отредактировать его можно командой:
vi /etc/sysconfig/iptables
И добавляем правила, которые нам нужны.
Например, для nginx, который работает на 80 порту, можно добавить правило:
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Сохраняем файл.
Перезапускаем фаервол:
systemctl restart iptables
Способ 2. Создание доп. скрипта (рекомендую)
Лучше создать новый файл-скрипт и редактировать именно его, чтобы все наши настройки были в этом одном файле без всякого лишнего, того, что по дефолту уже стоит в самом файле iptables.
Создаем его прямо в папке /etc/ с названием iptables_my выполнив команду:
mcedit /etc/iptables_my.sh
где .sh – это расширение файла, указывающее на то, что это скрипт.
Важно! После каждого редактирования этого скрипта, его нужно запускать каждый раз, чтобы он выполнился и ПЕРЕЗАПИСАЛ изменения.
Вносим нужные правила (о них чуть ниже).
Сохраняем.
Делаем файл исполняемым командой:
chmod 0740 /etc/iptables_my.sh
Запускаем скрипт:
/etc/iptables_my.sh
Проверяем, что скрипт дописал правила и они работают:
iptables -L -v -n
Для наглядности лучше запустить эту команду до запуска скрипта и после и потом сравнить выдачу в консоли, какие изменения вступили в силу.
Содержание файла-скрипта для iptables
#!/bin/bash # # Объявление переменных export IPT="iptables" # Интерфейс который смотрит в интернет export WAN=eth0 export WAN_IP=99.99.99.99(ip адрес своего сервера) # Очистка всех цепочек iptables $IPT -F $IPT -F -t nat $IPT -F -t mangle $IPT -X $IPT -t nat -X $IPT -t mangle -X # Установим политики по умолчанию для трафика, не соответствующего ни одному из правил $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP # разрешаем локальный траффик для loopback $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # Разрешаем исходящие соединения самого сервера $IPT -A OUTPUT -o $WAN -j ACCEPT # Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении. # Пропускать все уже инициированные соединения, а также дочерние от них $IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Пропускать новые, а так же уже инициированные и их дочерние соединения $IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить форвардинг для уже инициированных и их дочерних соединений $IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Включаем фрагментацию пакетов. Необходимо из за разных значений MTU $IPT -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # Отбрасывать все пакеты, которые не могут быть идентифицированы # и поэтому не могут иметь определенного статуса. $IPT -A INPUT -m state --state INVALID -j DROP $IPT -A FORWARD -m state --state INVALID -j DROP # Приводит к связыванию системных ресурсов, так что реальный # обмен данными становится не возможным, обрубаем $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP $IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP # Рзрешаем пинги $IPT -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT $IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT $IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT $IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # Открываем порт для ssh $IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT # Открываем порт для DNS #$IPT -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT # Открываем порт для NTP #$IPT -A INPUT -i $WAN -p udp --dport 123 -j ACCEPT #Открываем порт для NGINX $IPT -A INPUT -i $WAN -p tcp --dport 80 -j ACCEPT #Открываем порт для Apache(httpd) $IPT -A INPUT -i $WAN -p tcp --dport 8080 -j ACCEPT # Логирование # Все что не разрешено, но ломится отправим в цепочку undef $IPT -N undef_in $IPT -N undef_out $IPT -N undef_fw $IPT -A INPUT -j undef_in $IPT -A OUTPUT -j undef_out $IPT -A FORWARD -j undef_fw # Логируем все из undef $IPT -A undef_in -j LOG --log-level info --log-prefix "-- IN -- DROP " $IPT -A undef_in -j DROP $IPT -A undef_out -j LOG --log-level info --log-prefix "-- OUT -- DROP " $IPT -A undef_out -j DROP $IPT -A undef_fw -j LOG --log-level info --log-prefix "-- FW -- DROP " $IPT -A undef_fw -j DROP # Записываем правила /sbin/iptables-save > /etc/sysconfig/iptables
Взято с сайта https://serveradmin.ru/centos-7-nastroyka-servera/
Открываем порт для NGINX (как пример)
В нашем скрипте находим такую строку:
# Открываем порт для ssh $IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT
И по аналогии вставляем ниже нее нужную нам строчку:
# Открываем порт для nginx $IPT -A INPUT -i $WAN -p tcp --dport 80 -j ACCEPT
После этого снова запускаем скрипт, чтобы он перезаписал правила!
/etc/iptables_my.sh
export WAN_IP=149.154.71.205
Что это за IP адрес? Я же не должен копировать именно его? У меня должен быть свой. Это IP сайта что ли?
Не должен. Это айпи вашего сервера. Надо его убрать наверно с моего конфига