Руководство для начинающих по iptables, брандмауэру Linux

Iptables - чрезвычайно гибкая утилита межсетевого экрана, созданная для операционных систем Linux. Независимо от того, являетесь ли вы новичком в Linux или системным администратором, вероятно, есть какой-то способ, которым iptables может быть вам полезен. Читайте дальше, пока мы покажем вам, как настроить самый универсальный брандмауэр Linux.

Автор фото: ezioman .

О iptables

iptables - это служебная программа брандмауэра командной строки, которая использует цепочки политик для разрешения или блокировки трафика. Когда соединение пытается установить себя в вашей системе, iptables ищет в своем списке правило, которому оно соответствует. Если он не найдет его, он прибегает к действию по умолчанию.

iptables почти всегда предустановлен в любом дистрибутиве Linux. Чтобы обновить / установить его, просто загрузите пакет iptables:

sudo apt-get install iptables

Есть альтернативы iptables с графическим интерфейсом, такие как Firestarter, но iptables не так уж и сложен, если у вас есть несколько команд. Вы должны быть предельно осторожны при настройке правил iptables, особенно если вы подключены к серверу по SSH, потому что одна неверная команда может навсегда заблокировать вас, пока она не будет вручную исправлена ​​на физическом компьютере.

Типы цепей

iptables использует три разные цепочки: ввод, пересылка и вывод.

Вход - эта цепочка используется для управления поведением входящих соединений. Например, если пользователь пытается подключиться к вашему ПК / серверу по SSH, iptables попытается сопоставить IP-адрес и порт с правилом во входной цепочке.

Вперед - эта цепочка используется для входящих соединений, которые на самом деле не доставляются локально. Подумайте о маршрутизаторе - данные всегда отправляются на него, но редко на самом деле предназначены для самого маршрутизатора; данные просто пересылаются его цели. Если вы не выполняете какую-либо маршрутизацию, NAT или что-то еще в вашей системе, требующее пересылки, вы даже не будете использовать эту цепочку.

Есть один надежный способ проверить, использует ли ваша система прямую цепочку или нет.

iptables -L -v

На приведенном выше снимке экрана показан сервер, который работает несколько недель и не имеет ограничений на входящие и исходящие соединения. Как видите, входная цепочка обработала 11 ГБ пакетов, а выходная цепочка обработала 17 ГБ. С другой стороны, прямая цепочка не требует обработки одного пакета. Это связано с тем, что сервер не выполняет никакой пересылки и не используется в качестве сквозного устройства.

Выход - эта цепочка используется для исходящих соединений. Например, если вы попытаетесь проверить связь с howtogeek.com, iptables проверит свою цепочку вывода, чтобы узнать, какие правила касаются проверки связи и howtogeek.com, прежде чем принять решение о разрешении или отказе от попытки подключения.

Предостережение

Несмотря на то, что проверка связи с внешним хостом кажется чем-то, что нужно только для обхода выходной цепочки, имейте в виду, что для возврата данных также будет использоваться входная цепочка. При использовании iptables для блокировки вашей системы помните, что для многих протоколов потребуется двусторонняя связь, поэтому необходимо правильно настроить как входные, так и выходные цепочки. SSH - это распространенный протокол, который люди забывают разрешить в обеих цепях.

Поведение цепочки политик по умолчанию

Прежде чем приступить к настройке конкретных правил, вы захотите решить, каким должно быть поведение по умолчанию для трех цепочек. Другими словами, что вы хотите, чтобы iptables делал, если соединение не соответствует никаким существующим правилам?

Чтобы увидеть, что ваши цепочки политик в настоящее время настроены для работы с несогласованным трафиком, выполните iptables -Lкоманду.

Как видите, мы также использовали команду grep, чтобы получить более чистый результат. На этом скриншоте показано, что наши сети в настоящее время принимают трафик.

В большинстве случаев вам нужно, чтобы ваша система принимала соединения по умолчанию. Если вы ранее не меняли правила цепочки политик, этот параметр уже должен быть настроен. В любом случае, вот команда для приема соединений по умолчанию:

iptables --policy INPUT ACCEPT


iptables --policy OUTPUT ACCEPT


iptables --policy FORWARD ACCEPT

По умолчанию вы можете использовать iptables для запрета определенных IP-адресов или номеров портов, продолжая принимать все остальные соединения. Мы перейдем к этим командам через минуту.

Если вы предпочитаете отклонять все подключения и вручную указывать, какие из них вы хотите разрешить для подключения, вам следует изменить политику по умолчанию для ваших цепочек, чтобы отключить их. Это, вероятно, будет полезно только для серверов, которые содержат конфиденциальную информацию и к которым всегда подключены одни и те же IP-адреса.

iptables --policy INPUT DROP


iptables --policy OUTPUT DROP


iptables --policy FORWARD DROP

Ответы, связанные с подключением

Настроив политики цепочки по умолчанию, вы можете начать добавлять правила в iptables, чтобы он знал, что делать, когда он обнаруживает соединение с или с определенным IP-адресом или портом. В этом руководстве мы рассмотрим три самых основных и часто используемых «ответа».

Принять - разрешить соединение.

Отбросить - Отменить соединение, действовать так, как будто этого никогда не было. Это лучше всего, если вы не хотите, чтобы источник осознал, что ваша система существует.

Отклонить - не разрешать соединение, но отправить обратно ошибку. Это лучше всего, если вы не хотите, чтобы конкретный источник подключался к вашей системе, но вы хотите, чтобы они знали, что ваш брандмауэр заблокировал их.

Лучший способ показать разницу между этими тремя правилами - это показать, как это выглядит, когда ПК пытается проверить связь с компьютером Linux с iptables, настроенным для каждого из этих параметров.

Разрешение подключения:

Разрыв соединения:

Отклонение соединения:

Разрешение или блокировка определенных подключений

После настройки цепочек политик вы можете настроить iptables, чтобы разрешить или заблокировать определенные адреса, диапазоны адресов и порты. В этих примерах мы установим подключения на DROP, но вы можете переключить их на ACCEPTили REJECT, в зависимости от ваших потребностей и того, как вы настроили свои цепочки политик.

Примечание: в этих примерах мы собираемся 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-save

Red Hat / CentOS:

/sbin/service iptables save

Или же

/etc/init.d/iptables save

Прочие команды

Перечислите текущие настроенные правила iptables:

iptables -L

Добавление -vопции предоставит вам информацию о пакете и байтах, а добавление -nперечислит все в числовом виде. Другими словами, имена хостов, протоколы и сети указаны в виде чисел.

Чтобы очистить все настроенные в настоящее время правила, вы можете выполнить команду flush.

iptables -F