Статьи

Брандмауэр Linux

Существует несколько приложений брандмауэра для Linux, но вы, возможно, не понимаете, что в основе всех этих программ лежит одно мощное приложение, встроенное прямо в ядро ​​Linux: iptables. Это брандмауэр Linux. Независимо от того, какую программу вы используете для настройки брандмауэра в Linux, в конечном итоге все сводится к iptables. Все, что делают эти другие программы, это настраивает его.

Итак, возникает вопрос: если эти программы просто настраивают iptables, почему бы просто не настроить его самостоятельно? Это проще, чем вы думаете!


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

Обратите внимание, что приведенные ниже термины и определения были преднамеренно упрощены. Они предназначены для повседневных пользователей, а не для системных администраторов. Поэтому, если вы опытный системный администратор или у вас в кармане есть CCNA, прошу прощения за то, что не вдавался в детали.

TCP / IP — это протокол, который позволяет компьютерам взаимодействовать друг с другом через Интернет и сети Ethernet.

Неудача является последним средством.

Представьте себе сеть Ethernet как небольшую локальную сеть (ЛВС — локальная сеть), как ваш домашний ПК, ноутбук и смартфон. Это небольшая гетерогенная сеть, которая изолирована от остального мира. Сеть таких сетей — это то, что мы все знаем как Интернет : набор взаимосвязанных сетей.

TCP / IP представляет собой комбинацию двух протоколов, работающих на разных уровнях в иерархии цепочки сетевых коммуникаций. Мы не будем углубляться в детали этой иерархии. TCP означает « Протокол управления передачей» , и его основной обязанностью является обеспечение успешной связи. Он контролирует правильность отправляемых данных и обеспечивает их успешность. Он имеет различные алгоритмы для выполнения сложных контрольных сумм, автозамены и повторных попыток. Неудача является последним средством. Название, IP происходит от интернет-протокола. Лучше всего связать его с «номером телефона» вашего ПК. У каждой машины, способной обмениваться данными через Интернет, должен быть IP-адрес — уникальный номер телефона — чтобы пакеты связи могли найти своих адресатов. Пакет — это небольшой фрагмент данных в потоке связи, который самодостаточен и может быть проверен на правильность. По сути, мы можем сказать, что наши компьютеры отправляют TCP-пакеты через Интернет по протоколу IP.

Каждое сетевое соединение связано с конкретным портом . Сетевые порты варьируются от 0 до 2 ^ 16 (65536). Каждое сетевое соединение имеет исходящий порт для того, кто его инициирует, и входящий порт для того, кто прослушивает сообщения других компьютеров. Между несколькими компьютерами может быть несколько соединений через одинаковые порты. Компьютер может, однако, общаться через несколько портов одновременно. Так что, в основном, порты хороши для идентификации сервисов и определения каналов связи, но они не ограничивают объем данных или соединений.

Некоторые компьютеры могут иметь похожие IP-адреса. Возможно, вы заметили, что как на вашем компьютере, так и на работе есть IP-адреса, которые принимают форму чего-то вроде 192.168.something.something , или 10.0.something.something , или 172.16.something.something . Это так называемые частные IP-адреса, которые могут использоваться только внутри вашей локальной сети. Вы не можете выходить в Интернет с такими IP-адресами. Они сродни внутренним номерам телефонной сети вашей компании.

Мост — это то, что компьютеры с реальными (общедоступными) IP-адресами передаются в Интернет.

Мост

По сути, эти компьютеры имеют права и возможности общаться друг с другом через Интернет. Но, поскольку между всеми компьютерами в мире нет прямых соединений (что было бы довольно сложно осуществить), мосты отвечают за соединение сегментов Интернета.

Поддерживая нашу телефонную аналогию, вы можете представить, что эти мосты похожи на телефонные центры в вашем городе или районе. Если вы позвоните на другой местный номер (компьютеры слева в нашей схеме), связь могла быть осуществлена ​​непосредственно вашим телефонным центром, физически соединяя вашу линию с соседской. Однако, если вы вместо этого хотите позвонить своему дяде Бобу, ваш вызов должен быть перенаправлен через несколько телефонных центров, пока телефон вашего дяди не будет подключен. Они образуют мост между вашим городом и его городом.

Шлюз — это способ связи компьютеров из частной сети (локальной сети с частными IP-адресами) с другими компьютерами в Интернете.

шлюз

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

Компьютеры на самом деле функционируют аналогичным образом. Когда вы находитесь в частной сети, у вас есть так называемый компьютер-шлюз. Когда ваш компьютер пытается установить связь с другим компьютером в Интернете, он сначала автоматически свяжется со шлюзом и запросит «линию» для внешнего мира. Шлюз выполнит разговор с компьютером, найденным в Интернете, и перенаправит сообщение обратно на ваш компьютер. Вы, как обычный пользователь, не видите никакой разницы между мостом и шлюзом. Ваш компьютер будет знать, как с ними справиться.


Брандмауэр — это программа, работающая на шлюзе, мосте или ПК / ноутбуке / смартфоне, которая способна фильтровать входящие, исходящие и пересылаемые сетевые пакеты. Брандмауэр — это, по сути, инструмент, который позволяет вам ограничить доступ вас или вашей сети к Интернету, а также доступ кого-либо еще из Интернета к вашей сети.

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


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

сеть

То, что мы имеем здесь, на самом деле довольно просто:

  • Несколько компьютеров и других сетевых устройств — зеленые ящики
  • Почтовый сервер — красная коробка
  • Сервер Microsoft Active Directory — синий ящик
  • Шлюз, который также является брандмауэром, для нашей сети под управлением Linux — черный ящик
  • Между всем этим простой сетевой коммутатор

В следующем разделе мы настроим iptables на этом шлюзе, чтобы он позволял всем устройствам в сети подключаться к Интернету. Это позволит нам подключаться к нему через SSH и позволит внешним почтовым серверам достигать почтового сервера в нашей сети — компьютера, который даже не имеет публичного IP-адреса; только частный.


Имя Iptables на самом деле имеет смысл в его функциональности. Это набор таблиц IP-адресов и портов с некоторыми привязанными действиями. В терминах iptable эти таблицы называются цепочками . Не сконфигурированные, пустые iptables могут выглядеть так:

1
2
3
4
5
6
7
8
9
csaba ~ # iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
 
Chain FORWARD (policy ACCEPT)
target prot opt source destination
 
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Вы можете заметить, что есть три основные цепи:

  • INPUT — все входящие соединения
  • FORWARD — соединения, проходящие через
  • ВЫХОД — соединения, отправляемые с этого сервера

Термин « политика ПРИНЯТЬ » в скобках означает, что ПРИНЯТЬ установлено в качестве политики по умолчанию для этой конкретной цепочки. Таким образом, если для соединения нет соответствия, это правило будет применено. При настройке брандмауэра можно использовать три основных понятия:

  • политика по умолчанию ПРИНЯТЬ & отрицать выборочно все, что вам нужно — может быть трудно указать все, что в нем отказано. Я не рекомендую этот подход.
  • политика по умолчанию DROP или REJECT & позволяет выборочно все, что вам нужно — это лучше, но есть проблема. Если вы допустили ошибку в конфигурации iptables, вы легко можете остаться с пустыми цепями, лишающими доступ ко всему и всем, включая вас. Поэтому, если у вас нет физического доступа к вашему серверу / компьютеру брандмауэра, я рекомендую вам использовать следующий подход.
  • политика по умолчанию ПРИНЯТЬ & явная политика DROP all & затем выборочно разрешить все, что вам нужно — это комбинированное решение между первыми двумя возможностями. Он будет использовать политику ПРИНЯТЬ по умолчанию, поэтому, если что-то пойдет не так, вы можете вернуться через SSH или любое другое удаленное соединение, которое вы используете для брандмауэра. В то же время, явное правило DROP для любых непревзойденных соединений гарантирует, что вы в безопасности. Предоставление только того, о чем вы знаете и что действительно нужно использовать, обеспечивает наилучшую защиту.

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

Важно: iptables проверяет правила в цепочке сверху вниз. Он остановит поиск при первом совпадении.

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

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

1
2
3
4
5
csaba ~ # iptables -I INPUT -i eth0 -p tcp —dport 22 -j ACCEPT
csaba ~ # iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp — anywhere anywhere tcp dpt:ssh

Я предположил, что IP-адрес в Интернете с общедоступным IP-адресом находится в сетевом интерфейсе, называемом eth0 . Давайте разберем эту команду:

  • Я — обозначает вставить правило
  • INPUT — указывает желаемую цепочку
  • -i — обозначает сетевой интерфейс — в нашем случае eth0
  • -p — для протокола (tcp или udp)
  • —dport 22 — для порта назначения 22 — имеет соответствующую версию --sport для проверки порта источника
  • -j — на самом деле происходит от «прыжка» и сопровождается действием — в нашем случае — действием, чтобы принять соединение

Тем не менее, вы, возможно, уже догадались, что это правило имеет небольшой эффект в настоящее время. Наша политика по умолчанию — ПРИНЯТЬ, поэтому принятие чего-либо явно не дает нам никакой дополнительной функциональности. Теперь запомните третий рекомендуемый способ настройки нашего брандмауэра: явное правило, запрещающее все несоответствие. Давайте добавим это правило.

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

Сначала мы добавим правило для приема входящего трафика для уже установленных соединений, например ответов на запросы.

1
2
3
4
5
6
csaba ~ # iptables -A INPUT -i eth0 -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT
csaba ~ # iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp — anywhere anywhere tcp dpt:ssh
ACCEPT all — anywhere anywhere ctstate RELATED,ESTABLISHED

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

1
2
3
4
5
6
7
csaba ~ # iptables -A INPUT -i eth0 -p tcp -j DROP
csaba ~ # iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp — anywhere anywhere tcp dpt:ssh
ACCEPT all — anywhere anywhere ctstate RELATED,ESTABLISHED
DROP tcp — anywhere anywhere

Мы добавили еще одну строку с правилом, чтобы УБРАТЬ все соединения, которые соответствуют. Помните: это правило будет применяться, только если ни одно из предыдущих не соответствует.

Есть два способа отказаться от подключения.

  1. Вы можете использовать DROP, что эквивалентно набору несуществующего телефонного номера с той разницей, что через некоторое время сетевое соединение истекает. По номеру телефона робот сообщает, что номер не существует. Но конечный результат с точки зрения звонящего такой же: он думает, что пункт назначения не существует.
  2. Второй способ отклонить соединение — это правило REJECT и необязательное сообщение. Это аналогично номеру, который вы пытаетесь назвать занятым. Вы можете знать, что есть номер, вы знаете, что его можно назвать, но он просто отказывается отвечать на ваши звонки. При желании вы можете предоставить сообщение с правилом REJECT; по умолчанию используется «ICMP-порт недоступен» или что-то подобное.

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

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

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

1
csaba ~ # iptables -t nat -A POSTROUTING -o eth0 -j SNAT —to-source 89.72.31.243

Эта команда добавляет правило POSTROUTING в таблицу NATing ( -t nat ). POSTROUTING, по сути, означает, что пакеты сначала проходят механизм маршрутизации на шлюзе и только после этого они модифицируются. Правило -j SNAT означает Source NAT; адрес источника пакетов будет изменен на адрес на интерфейсе, заданном параметром -o eth0 в нашем случае — на IP-адрес, указанный параметром --to-source . Таким образом, любой, с кем связался компьютер в вашей сети, предположит, что он общается напрямую с вашим шлюзом. Он не будет иметь абсолютно никакого представления о том, что пакеты предназначены для другого компьютера. Шлюз, использующий iptables, будет хранить внутренний список всех переведенных IP-адресов и, когда придет ответ, отменит изменение и передаст ответ на компьютер в сети.


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

Но наш почтовый сервер имеет только частный IP-адрес. Невозможно подключить к нему внешний компьютер напрямую. С другой стороны, у нашего шлюза есть внешний IP-адрес, к которому любой может подключиться. Решение? Откройте порт на нашем шлюзе, чтобы запрос из Интернета на этот порт фактически направлялся на наш почтовый сервер. Ответ, конечно, пройдет через шлюз обратно к клиенту. Хитрость заключается в том, чтобы использовать другой тип NAT, называемый NAT назначения. Это изменяет назначение пакетов и затем возвращает их обратно, когда происходит ответ. Думайте о DNAT как об обратном SNAT.

Совет: Вы можете знать эту функцию как «Виртуальный сервер», если вы когда-либо играли с маленькими домашними маршрутизаторами.

1
csaba ~ # iptables -t nat -A PREROUTING -i eth0 -p tcp —dport 25 -j DNAT —to-destination 192.168.1.2:25

Итак, что здесь происходит? Пакет поступает на наш шлюз через порт 25 (порт, используемый для SMTP, протокол электронной почты, используемый всем Интернетом). Приведенное выше правило перехватывает этот пакет из-за опции --dport 25 , которая в основном говорит: « Сопоставьте все, что идет с этим портом на интерфейсе, указанном -i eth0 . Теперь, когда пакет сопоставлен, измените его назначение с текущего компьютера (шлюз) к указанному параметром --to-destination . «Обратите внимание, что вы можете указать порт явно после IP-адреса, разделив его двоеточием.

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


Правила, которые вы вставляете или добавляете в iptables, хранятся в памяти. После перезагрузки подделать: все прошло! Чтобы сохранить вашу конфигурацию, вы должны поместить ее в файл, например так:

1
csaba ~ # iptables-save > /some/directory/my_rules.fw

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

1
iptables-restor < /some/directory/my_rules.fw

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


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

Используйте брандмауэр в Linux, когда вы настраиваете сервер (например, шлюз в нашем примере), или когда у вас есть компьютер с важной информацией, напрямую подключенный к Интернету. Прежде чем приступить к настройке iptables, рассмотрите потенциальную опасность. Спросите себя: мой компьютер известен в Интернете? Там есть несколько миллиардов компьютеров. Если у вас только один, шанс стать мишенью невероятно низок. Есть ли люди, непосредственно заинтересованные в вашей информации? Хакеры не тратят время на кражу случайных данных в надежде, что они что-нибудь найдут. Обычно они знают, что ищут, и затем выбирают компьютеры, содержащие нужную информацию. Конечно, существует бесчисленное множество атак на случайные компьютеры, которые пытаются установить своего рода червя или вируса, но в Linux вы неуязвимы.

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

Я думаю, что вы можете смело применять эти идеи и к Mac OSX. Если вы пользователь Windows, извините: брандмауэр — ваша первая линия защиты. Однако для Linux или MacOSX брандмауэр — это ваша последняя линия защиты. Тщательно выбранный пароль и неиспользуемые бесполезные сервисы должны обеспечивать защиту вашего компьютера.

Спасибо за прочтение. Вопросов?