Iptables - чрезвычайно гибкая утилита межсетевого экрана, созданная для операционных систем Linux. Независимо от того, являетесь ли вы новичком в Linux или системным администратором, вероятно, есть какой-то способ, которым iptables может быть вам полезен. Читайте дальше, пока мы покажем вам, как настроить самый универсальный брандмауэр Linux.
О iptables
iptables - это служебная программа брандмауэра командной строки, которая использует цепочки политик для разрешения или блокировки трафика. Когда соединение пытается установить себя в вашей системе, iptables ищет в своем списке правило, которому оно соответствует. Если его не удается найти, используется действие по умолчанию.
iptables почти всегда предустановлен в любом дистрибутиве Linux. Чтобы обновить / установить его, просто загрузите пакет iptables:
sudo apt-get install iptables
Есть альтернативы iptables с графическим интерфейсом, например Поджигатель , но iptables не так уж и сложен, если у вас есть несколько команд. Будьте предельно осторожны при настройке правил iptables, особенно если вы подключены к серверу по SSH, потому что одна неверная команда может навсегда заблокировать вас, пока она не будет вручную исправлена на физическом компьютере.
Типы цепей
iptables использует три разные цепочки: ввод, пересылка и вывод.
Ввод - Эта цепочка используется для управления поведением входящих соединений. Например, если пользователь пытается подключиться к вашему ПК / серверу по SSH, iptables попытается сопоставить IP-адрес и порт с правилом во входной цепочке.
Вперед - Эта цепочка используется для входящих соединений, которые на самом деле не доставляются локально. Подумайте о маршрутизаторе - данные всегда отправляются на него, но редко предназначены для самого маршрутизатора; данные просто пересылаются его цели. Если вы не выполняете в своей системе какую-либо маршрутизацию, NAT или что-то еще, что требует пересылки, вы даже не будете использовать эту цепочку.
Есть один надежный способ проверить, использует ли ваша система прямую цепочку или нет.
иптавлес -Л -в
На скриншоте выше показан сервер, который работает несколько недель и не имеет ограничений на входящие или исходящие соединения. Как видите, входная цепочка обработала 11 ГБ пакетов, а выходная цепочка обработала 17 ГБ. С другой стороны, прямая цепочка не требует обработки одного пакета. Это связано с тем, что сервер не выполняет каких-либо переадресаций и не используется в качестве сквозного устройства.
Выход - Эта цепочка используется для исходящих соединений. Например, если вы попытаетесь проверить связь с howtogeek.com, iptables проверит свою выходную цепочку, чтобы узнать, какие правила касаются проверки связи и howtogeek.com, прежде чем принять решение о разрешении или отказе от попытки подключения.
Предостережение
Несмотря на то, что проверка связи с внешним хостом кажется чем-то, что нужно только для обхода выходной цепочки, имейте в виду, что для возврата данных также будет использоваться входная цепочка. При использовании iptables для блокировки вашей системы помните, что для многих протоколов потребуется двусторонняя связь, поэтому необходимо правильно настроить как входные, так и выходные цепочки. SSH - это распространенный протокол, который люди забывают разрешить в обеих цепях.
Поведение цепочки политик по умолчанию
Прежде чем приступить к настройке конкретных правил, вам нужно решить, каким должно быть поведение по умолчанию для трех цепочек. Другими словами, что вы хотите, чтобы iptables делал, если соединение не соответствует никаким существующим правилам?
Чтобы увидеть, что ваши цепочки политик в настоящее время настроены для работы с несопоставленным трафиком, запустите
iptables -L
команда.
Как видите, мы также использовали команду grep, чтобы получить более чистый результат. На этом скриншоте показано, что наши сети в настоящее время принимают трафик.
В большинстве случаев вам нужно, чтобы ваша система принимала соединения по умолчанию. Если вы ранее не меняли правила цепочки политик, этот параметр уже должен быть настроен. В любом случае, вот команда для приема соединений по умолчанию:
iptables --policy ВВОД ПРИНЯТЬ
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT
По умолчанию вы можете использовать iptables для запрета определенных IP-адресов или номеров портов, продолжая принимать все остальные соединения. Мы перейдем к этим командам через минуту.
Если вы предпочитаете отклонять все подключения и вручную указывать, какие из них вы хотите разрешить для подключения, вам следует изменить политику по умолчанию для ваших цепочек, чтобы отключить их. Это, вероятно, будет полезно только для серверов, которые содержат конфиденциальную информацию и к которым всегда подключены одни и те же IP-адреса.
iptables --policy INPUT DROP
iptables --policy ВЫПУСК ВЫВОДА
iptables --policy FORWARD DROP
Ответы, связанные с подключением
Настроив политики цепочки по умолчанию, вы можете начать добавлять правила в iptables, чтобы он знал, что делать, когда он обнаруживает соединение с или с определенным IP-адресом или портом. В этом руководстве мы рассмотрим три самых основных и часто используемых «ответа».
Принять - Разрешить соединение.
Падение - Разорвать связь, вести себя так, как будто этого никогда не было. Это лучше всего, если вы не хотите, чтобы источник осознал, что ваша система существует.
Отклонить - Не разрешать соединение, но отправлять обратно ошибку. Это лучше всего, если вы не хотите, чтобы конкретный источник подключался к вашей системе, но вы хотите, чтобы они знали, что ваш брандмауэр заблокировал их.
Лучший способ показать разницу между этими тремя правилами - это показать, как это выглядит, когда ПК пытается проверить связь с машиной Linux с iptables, настроенным для каждого из этих параметров.
Разрешение подключения:
Разрыв соединения:
Отклонение соединения:
Разрешение или блокировка определенных подключений
После настройки цепочек политик вы можете настроить iptables для разрешения или блокировки определенных адресов, диапазонов адресов и портов. В этих примерах мы установим соединения на
УДАЛИТЬ
, но вы можете переключить их на
ПРИНЯТЬ
или
ОТКАЗАТЬ
в зависимости от ваших потребностей и того, как вы настроили цепочки политик.
Примечание. В этих примерах мы будем использовать
iptables -A
чтобы добавить правила в существующую цепочку. iptables начинает с начала своего списка и просматривает каждое правило, пока не найдет подходящее. Если вам нужно вставить одно правило над другим, вы можете использовать
iptables -I [chain] [number]
чтобы указать номер, который должен быть в списке.
Подключения с одного IP-адреса
В этом примере показано, как заблокировать все подключения с IP-адреса 10.10.10.10.
iptables -A INPUT -s 10.10.10.10 -j DROP
Подключения с разных IP-адресов
В этом примере показано, как заблокировать все IP-адреса в диапазоне 10.10.10.0/24 сети. Вы можете использовать сетевую маску или стандартную косую черту, чтобы указать диапазон IP-адресов.
iptables -A INPUT -s 10.10.10.0/24 -j DROP
или
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
Подключения к определенному порту
В этом примере показано, как заблокировать SSH-соединения с 10.10.10.10.
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
Вы можете заменить «ssh» на любой протокол или номер порта. В
-p tcp
Часть кода сообщает iptables, какое соединение использует протокол. Если вы блокировали протокол, который использует UDP, а не TCP, тогда
-p UDP
было бы необходимо вместо этого.
В этом примере показано, как заблокировать SSH-соединения с любого IP-адреса.
iptables -A INPUT -p tcp --dport ssh -j DROP
Состояния подключения
Как мы упоминали ранее, для многих протоколов потребуется двусторонняя связь. Например, если вы хотите разрешить SSH-подключения к вашей системе, входные и выходные цепочки потребуют добавления к ним правила. Но что, если вы хотите, чтобы в вашу систему был разрешен только SSH? Разве добавление правила к выходной цепочке не разрешает исходящие попытки SSH?
Вот здесь-то и появляются состояния соединения, которые дают вам возможность разрешить двустороннюю связь, но позволяют устанавливать только односторонние соединения. Взгляните на этот пример, где SSH-соединения с 10.10.10.10 разрешены, а SSH-соединения с 10.10.10.10 - нет. Однако системе разрешено отправлять обратно информацию по SSH, пока сеанс уже установлен, что делает возможной связь SSH между этими двумя хостами.
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW, ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
Сохранение изменений
Изменения, внесенные вами в правила iptables, будут отменены при следующем перезапуске службы iptables, если вы не выполните команду для сохранения изменений. Эта команда может отличаться в зависимости от вашего дистрибутива:
Ubuntu:
sudo / sbin / iptables-сохранить
Red Hat / CentOS:
/ sbin / service iptables сохранить
Или
/etc/init.d/iptables сохранить
Прочие команды
Список текущих настроенных правил iptables:
iptables -L
Добавление
-в
опция предоставит вам информацию о пакете и байтах и добавит
-n
перечислю все в числовом виде. Другими словами, имена хостов, протоколы и сети указаны в виде чисел.
Чтобы очистить все настроенные в настоящее время правила, вы можете выполнить команду flush.
iptables -F