Перенаправление пакетов на другой порт
Перенаправление портов можно использовать для самых разных задач. Например, перенаправление пользователей из разных сетей на разные экземпляры веб-сервера, перенаправление порта на другой, если изменился порт какого-то сервиса, настройка прозрачного проксирования и так далее. Общая идея в том, что пакеты с определенного порта перенаправляются на другой порт на том же сетевом интерфейсе той же самой машины, либо на loopback’е.
Для перенаправления порта, например, 80, с внешнего интерфейса на порт 80 на loopback-интерфейсе мы можем использовать правило
iptables -t nat -A PREROUTING -d 192.168.0.1/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 127.0.0.1:80
Это правило позволит перенаправить пакеты на loopback, изменив назначение пакета путем трансляции адреса (Destination NAT), и после этого можно будет их отфильтровать в цепочке, которая будет задана для loopback-интерфейса. Естественно, нужно будет сделать и обратную трансляцию:
iptables -t nat -A POSTROUTING -s 127.0.0.1/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.1
Таким образом, происходит обратный процесс, при этом изменяется Source NAT, то есть, транслируется адрес источника соединения.
Открываем порты в Linux
Хоть во многих дистрибутивах по умолчанию присутствует встроенный инструмент по управлению сетями, все же такие решения часто не позволяют в полной мере осуществить настройку открытия портов. Инструкции данной статьи будут основаны на дополнительном приложении под названием Iptables — решение для редактирования параметров межсетевого экрана с использованием прав суперпользователя. Во всех сборках ОС на Линуксе она работает одинаково, разве что отличается команда для установки, но об этом мы поговорим ниже.
Шаг 1: Установка Iptables и просмотр правил
Утилита Iptables изначально не входит в состав операционной системы, из-за чего ее нужно самостоятельно инсталлировать из официального репозитория, а уже потом работать с правилами и всячески изменять их. Установка не занимает много времени и выполняется через стандартную консоль.
- Откройте меню и запустите «Терминал». Сделать это также можно, используя стандартную горячую клавишу Ctrl + Alt + T.
Активируйте права суперпользователя, написав пароль от своей учетной записи
Обратите внимание, что символы во время ввода не отображаются, сделано это для обеспечения безопасности
Ожидайте завершения инсталляции и можете убедиться в активности работы инструмента, просмотрев стандартный список правил, задействовав sudo iptables -L .
Как видите, в дистрибутиве теперь появилась команда iptables , отвечающая за управление одноименной утилитой. Еще раз напомним, что работает этот инструмент от прав суперпользователя, поэтому в строке обязательно должна содержаться приставка sudo , а уже потом остальные значения и аргументы.
Шаг 2: Разрешение обмена данными
Никакие порты не будут нормально функционировать, если утилита запрещает обмен информацией на уровне собственных правил межсетевого экрана. Кроме всего, отсутствие необходимых правил в дальнейшем может вызывать появление различных ошибок при пробросе, поэтому мы настоятельно советуем выполнить следующие действия:
- Убедитесь, что в конфигурационном файле отсутствуют какие-либо правила. Лучше сразу же прописать команду для их удаления, а выглядит она так: sudo iptables -F .
Теперь добавляем правило для вводимых данных на локальном компьютере, вставив строку sudo iptables -A INPUT -i lo -j ACCEPT .
Примерно такая же команда — sudo iptables -A OUTPUT -o lo -j ACCEPT — отвечает за новое правило для отправки информации.
Осталось только обеспечить нормальное взаимодействие указанных выше правил, чтобы сервер смог отправлять обратно пакеты. Для этого нужно запретить новые соединения, а старые — разрешить. Производится это через sudo iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT .
Благодаря указанным выше параметрам вы обеспечили корректную отправку и прием данных, что позволит без проблем взаимодействовать с сервером или другим компьютером. Осталось только открыть порты, через которые и будет осуществляться то самое взаимодействие.
Шаг 3: Открытие необходимых портов
Вы уже ознакомлены с тем, по какому принципу добавляются новые правила в конфигурацию Iptables. Существуют и несколько аргументов, позволяющих открыть определенные порты. Давайте разберем эту процедуру на примере популярных портов под номерами 22 и 80.
- Запустите консоль и введите туда две следующие команды поочередно:
sudo iptables -A INPUT -p tcp –dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp –dport 80 -j ACCEPT .
Теперь проверьте список правил, чтобы убедиться в том, что порты были успешно проброшены. Используется для этого уже знакомая команда sudo iptables -L .
Придать ей читабельный вид и вывести все детали можно с помощью дополнительного аргумента, тогда строка будет такой: sudo iptables -nvL .
Поменяйте политику на стандартную через sudo iptables -P INPUT DROP и можете смело приступать к работе между узлами.
В случае когда уже администратор компьютера внес свои правила в инструмент, организовал сброс пакетов при подходе к точке, например, через sudo iptables -A INPUT -j DROP , вам нужно использовать другую команду sudo iptables: -I INPUT -p tcp –dport 1924 -j ACCEPT , где 1924 — номер порта. Она добавляет необходимый порт в начало цепи, и тогда пакеты не сбрасываются.
Далее вы можете прописать все ту же строку sudo iptables -L и убедиться в том, что все настроено корректно.
Теперь вы знаете, как пробрасываются порты в операционных системах Linux на примере дополнительной утилиты Iptables. Советуем обязательно следить за появляющимися строками в консоли при вводе команд, это поможет вовремя обнаружить какие-либо ошибки и оперативно устранить их.
.mw-parser-output .vanchor>:target~.vanchor-text{background-color:#b1d2ff}Публичный адресс
Общедоступный IP-адрес — это глобально маршрутизируемый одноадресный IP-адрес, что означает, что этот адрес не является адресом, зарезервированным для использования в частных сетях , таких как те, которые зарезервированы RFC , или различными форматами адресов IPv6 с локальной областью или областью локального сайта, например, для локальной адресации. Общедоступные IP-адреса могут использоваться для связи между хостами в глобальной сети Интернет. В домашней ситуации общедоступный IP-адрес — это IP-адрес, назначенный домашней сети провайдером . В этом случае он также виден локально при входе в конфигурацию маршрутизатора.
Большинство общедоступных IP-адресов меняются, причем относительно часто. Любой тип изменяющегося IP-адреса называется динамическим IP-адресом. В домашних сетях провайдер обычно назначает динамический IP-адрес. Если интернет-провайдер предоставил домашней сети неизменный адрес, он с большей вероятностью подвергнется злоупотреблениям со стороны клиентов, которые размещают веб-сайты из дома, или хакеров, которые могут пробовать один и тот же IP-адрес снова и снова, пока они не взломают сеть.
Так как это вообще возможно?
Это потому, что нам нужен полный, общедоступный IP-адрес, только тогда когда нам требуется двусторонняя связь, например, когда нам нужно иметь возможность инициировать и получать входящие запросы на соединение из внешнего мира.
Однако большая часть нашей деятельности в Интернете идеально подходит только для одностороннего общения. Например, когда мы просматриваем Интернет, мы сами инициируем соединение и не ожидаем, что веб-сайты или другие поставщики веб-услуг будут активно подключаться к нашему устройству. Мы даже надеемся, что они этого не сделают, иначе это вызовет серьезные проблемы с безопасностью.
С другой стороны, поскольку веб-сайты не являются инициаторами соединений и доступны по большей части с использованием имени хоста, их можно поместить за общий IP-адрес.
Теоретически можно разместить все наши более 300 миллионов активных веб-сайтов по всему миру за одним anycast IP-адресом или лишь за несколькими из них для высокой доступности. Так будет еще эффективнее защитить их от кибератак. Cloudflare — отличный пример того, как это может работать.
Технически уже существует множество технологий для совместного использования IP-адреса при односторонней связи. Мы используем преобразование сетевых адресов (NAT) дома или в небольших офисах, прокси-серверы в более крупных организациях и виртуальный хостинг на основе имен для веб-сайтов, и это лишь некоторые из них.
Мы склонны классифицировать IP-адреса как статические (наш навсегда) или динамически выделяемые (наш в течение ограниченного времени). Однако мы часто не получаем эксклюзивный IP-адрес. Мы только временно используем его и, возможно, даже делимся им с другими удаленными узлами одновременно.
Например, операторы сотовой связи часто реализуют NAT уровня оператора (CGNAT) и используют небольшие блоки IP-адресов для обслуживания большой активной клиентской базы.
Технически они назначают диапазон доступных им IP-адресов для части своей сети, а мобильные пользователи используют IP-адрес только для доступа к Интернету, как, например, с прокси. Соединение является строго однонаправленным, IP-адрес внешнего мира не может инициировать соединение на мобильное устройство, используя этот адрес. Это обеспечивает надежную защиту и снижает количество требуемых общедоступных IP-адресов.
Поэтому, когда мы рассматриваем IP-геолокацию, мы должны сначала рассмотреть, как используется IP-адрес.
Маски сети
Маска сети позволяет определить, какая часть адреса является сетью, а какая часть адреса указывает на узел. Сети класса A, B и C имеют маски по умолчанию, также известные как естественные маски:
Class A: 255.0.0.0 Class B: 255.255.0.0 Class C: 255.255.255.0
IP-адрес в сети класса A, которая не была разделена на подсети, будет иметь пару «адрес/маска», аналогичную: 8.20.15.1 255.0.0.0. Чтобы понять, как маска помогает идентифицировать сетевую и узловую части адреса, преобразуйте адрес и маску в двоичный формат.
8.20.15.1 = 00001000.00010100.00001111.00000001 255.0.0.0 = 11111111.00000000.00000000.00000000
Когда адрес и маска представлены в двоичном формате, идентификацию сети и хоста выполнить гораздо проще. Все биты адреса, для которых соответствующие биты маски равны 1, представляют идентификатор сети. Все биты адреса, для которых соответствующие биты маски равны 0, представляют идентификатор узла.
8.20.15.1 = 00001000.00010100.00001111.00000001 255.0.0.0 = 11111111.00000000.00000000.00000000 ----------------------------------- net id | host id netid = 00001000 = 8 hostid = 00010100.00001111.00000001 = 20.15.1
Как посмотреть правила iptables
В данном случае для демонстрации возможностей iptables используется операционная система Debian 10.2. Для возможности выполнения команды iptables необходимо, чтобы пользователю были предоставлены привилегии суперпользователя с помощью команды sudo. В связи с этим все команды будут выглядеть как sudo iptables или sudo ip6tables для IPv6.
Примечание: Для того, чтобы пользователю было позволено предоставлять привилегии суперпользователя, этого пользователя надо добавить в файл sudoers с помощью специального редактора visudo. Посмотрим на скриншот с результатом выполнения команды:
Существуют две версии утилиты для настройки брандмауэра Linux: iptables и ip6tables. Iptables используется для протокола IPv4, а ip6tables для протокола IPv6. Соответственно команда вывести все цепочки правил для межсетевого экрана имеет два варианта синтаксиса.
Для протокола IPv4:
Для протокола IPv6:
В дальнейшем рассмотрим только вариант для протокола IPv4, вариант для протокола IPv6 использует такой же синтаксис.
Выводимая на экран информация разбита на столбцы и строки. У каждого столбца свое наименование. С помощью дополнительных параметров команды sudo iptables -L можно добавлять дополнительные столбцы в выводимой таблице правил iptables. Рассмотрим название столбцов в стандартном выводе sudo iptables -L:
- target – выполняемое действие с пакетом при соответствии его данному правилу
- prot – протокол передачи данных, при котором применяется данное правило
- opt – дополнительные опции для правила
- source – IP адрес, подсеть, домен узла источника пакета, попадающего под выполнение данного правила
- destination – IP адрес, подсеть, домен узла назначения пакета, попадающего под выполнение данного правила
1. Список правил из цепочки
Команда чтобы вывести на экран конкретную цепочку правил выглядит следующим образом:
sudo iptables
Например просмотр правил iptables из цепочки OUTPUT:
2. Список правил из таблицы
По умолчанию выводится содержимое таблицы фильтрации пакетов filter. Команда вывода содержимого конкретно указанной таблицы выглядит следующим образом:
sudo iptables
Например:
Вот список всех таблиц правил iptables:
- filter – таблица по умолчанию. Используется для фильтрации пакетов. Содержится в цепочках INPUT, FORWARD, OUTPUT
- raw – используется редко. Пакет проверяется на соответствие условиям данной таблицы до передачи системе определения состояний (conntrack), например, для того, чтобы не обрабатываться с помощью данной системы (действие NOTRACK). Система определения состояний позволяет фильтровать пакеты на уровне взаимодействия сеансов приложений. То есть фильтрует пакеты по сеансу связи – новый сеанс связи (NEW), уже установленный сеанс связи (ESTABLISHED), дополнительный сеанс связи к уже существующему (RELATED). Данная система позволяет реализовать высокоуровневый межсетевой экран, который вместо работы с пакетами работает с сеансами связи в рамках приложений. Содержится в цепочках PREROUTING и OUTPUT.
- mangle – содержит правила модификации обрабатываемых IP-пакетов. Например, изменение полей заголовков IP-пакетов, содержащих служебную информацию. Используется редко. Содержится в цепочках PREROUTING, INPUT, FORWARD, OUTPUT,
- nat – предназначена для подмены адреса отправителя или получателя. Данная таблица применяется только к первому пакету из потока протокола передачи данных по сети, к остальным пакетам потока пакетов выбранное действие применяется далее автоматически. Таблицу используют, например, для трансляции адресов отправителя и получателя, для маскировки адресов отправителя или получателя. Это делается в основном в двух случаях. Первый – когда необходимо организовать доступ к сети Интернет нескольким компьютерам, расположенным за данным компьютером. Второй – когда необходимо спрятать (замаскировать) в целях безопасности отправителя или получателя информации, передаваемой по сети Интернет. Содержится в цепочках PREROUTING, OUTPUT, POSTROUTING.
3. Номера правил в iptables
Следующая команда позволяет нам вывести номера правил iptables, которые потом можно использовать для управления ими на экран:
sudo iptables —line-numbers -n
Например:
4. Просмотр правил со статистикой пакетов
Чтобы посмотреть таблицу правил со счетчиком переданного (полученного) количества байтов (bytes) и пакетов (pkts) используется следующая команда:
sudo iptables -n -v
Например:
Setting Up the Web Server
We will begin with our web server host. Log in with your user to begin.
Install Nginx
The first process we will complete is to install on our web server host and lock it down so that it only listens to its private interface. This will ensure that our web server will only be available if we correctly set up port forwarding.
Begin by updating the local package cache and using to download and install the software:
Restrict Nginx to the Private Network
After Nginx is installed, we will open up the default server block configuration file to ensure that it only listens to the private interface. Open the file now:
Inside, find the directive. You should find it twice in a row towards the top of the configuration:
/etc/nginx/sites-enabled/default
At the first directive, add your web server’s private IP address and a colon just ahead of the to tell Nginx to only listen on the private interface. We are only demonstrating IPv4 forwarding in this guide, so we can remove the second listen directive, which is configured for IPv6.
In our example, we’d modify the listen directives to look like this:
/etc/nginx/sites-enabled/default
Save and close the file when you are finished. Test the file for syntax errors by typing:
If no errors are shown, restart Nginx to enable the new configuration:
Verify the Network Restriction
At this point, it’s useful to verify the level of access we have to our web server.
From our firewall server, if we try to access our web server from the private interface, it should work:
If we try to use the public interface, we will see that we cannot connect:
This is exactly what we expect to happen.
Статические IP-адреса
Правильно определить геолокацию статического IP-адреса проще всего.
Независимо от точного метода, который помогает поставщикам IP-геолокации получать свои данные, существует один общий всеобъемлющий принцип. IP-геолокация всегда основана на предварительно полученных данных. Это могут быть общедоступные данные RIR, самоизданные геофиды, измерения из активных источников, а так же пары IP и местоположения, предоставленные конечным пользователем или полученные иным образом.
Как не назови, это всегда данные подтверждающие или намекающие на использование IP-адреса в той или иной местности. К сожалению, не все данные могут быть верны, например из за ошибки в работе GPS. Качество сервиса IP-геолокации всегда зависит от того, к каким данным они имеют доступ и как они их обрабатывают.
Поэтому, когда у нас есть свежее, действительное и очень точное географическое местоположение статического IP-адреса, используемого стационарным устройством, результирующая точность IP-геолокации может быть пугающе точной — часто на расстоянии до нескольких метров.
Вот почему BigDataCloud намеренно слегка корректирует предоставленные координаты местоположения, округляя их до ближайшего километра — по сути, ограничивая максимальную точность до одного квадратного километра.
Кроме того, она не должна быть настолько точная, насколько может быть, потому что мы также должны уважать конфиденциальность конечных пользователей IP-адресов.
Расчет подсетей на основе максимального количества хостов в подсети
В этом примере мы собираемся вычислить, сколько хостов может поместиться в подсети, которая находится в более крупной сети. В сети 192.168.1.0/24 может поместиться в общей сложности 254 хоста, как мы видели ранее, хотя имеется 256 адресов, первый адрес — это сетевой адрес, а последний — широковещательный адрес, поэтому их нельзя использовать для хозяева. .
Предположим, мы хотим поместите в подсеть всего 40 хостов на основе верхней сети 192.168.1.0/24 , какую маску подсети следует использовать на разных хостах? Какой диапазон IP-адресов у нас есть для хостов? Каким будет сетевой IP-адрес и широковещательный IP-адрес? Первое, что мы должны знать, это то, что для выполнения этого упражнения всегда будут «лишние» IP-адреса хостов, в этом случае в каждой подсети будет не только 40 хостов, но и всего (2 ^ -2.
Шаги для выполнения расчета очень похожи на предыдущий, но с очень важное изменение на третьем шаге
- Преобразуйте 40 хостов в двоичный. Первое, что нам нужно сделать, это преобразовать 40 в двоичный, что составляет 101000, это означает, что у нас есть всего 6 бит для последующего расчета окончательной маски подсети.
- Маска подсети по умолчанию — / 24 или 255.255.255.0, если мы изменим эту маску на двоичную, мы получим: 11111111.11111111.11111111.00000000.
- Мы резервируем рассчитанные 6 бит (40 хостов) справа налево, помещая нули, и мы заполним их 1 до упора влево.
- Новая маска подсети будет следующей: 11111111.11111111.11111111. 11000000 ; следовательно, мы имеем дело с маской подсети / 26 (всего их 26) или 255.255.255.192. Если последняя часть маски (11000000) преобразована в десятичную, она дает нам число 192.
С этой информацией, чтобы вычислить различные подсети, которые мы можем создать в сети 192.168.1.0/24, мы должны сделать 2, возведенные в число нулей маски подсети, которое мы вычислили, если мы посмотрим, у нас есть окончательный часть маски — «11000000», у нас шесть нулей, поэтому 2 ^ 6, что равно 64. Эти 64 — это приращение, которое мы должны использовать для вычисления различных сетевых адресов разных подсетей.
Диапазон IP-адресов вычисленных подсетей будет следующим, логически во всех из них будет использоваться вычисленная нами маска подсети / 26 или 255.255.255.192.
- 192.168.1.0 — 192.168.1.63; первый IP-адрес — это сетевой адрес, а последний — широковещательный. IP-адреса, которые находятся «посередине», обращены к хостам.
- 192.168.1.64 – 192.168.1.127
- 192.168.1.128 – 192.168.1.191
- 192.168.1.192 – 192.168.1.255
Если мы хотим разместить 40 хостов в каждой сети, мы можем создать всего четыре подсети в сети 192.168.1.0/24, как мы видели.
Мы надеемся, что это руководство поможет вам рассчитать подсети на основе количества сетей и количества хостов, которые мы хотим разместить в подсети.
Пример 2: FORWARD с одного ip на другой (DNAT с MASQUERADE, меняется адрес источника и назначения)
Не всегда перенаправление совершается из/в локальную сеть. Бывает, что необходимо сделать проброс соединения на какой-то сервер, используя промежуточный. Это может быть необходимо для дополнительной фильтрации подключаемых клиентов, для разделения нагрузки и других задач.
Есть хост с публичным IP-адресом (1.1.1.1), ему может быть сопоставлено доменное имя, для которого могут быть выпущены SSL-сертификаты и прочее.
Нужно, чтобы клиенты, обращающиеся на 1.1.1.1:25, направлялись бы на 2.2.2.2:25, с 1.1.1.1:443 — на 3.3.3.3:443, а с ip 4.4.4.4 обращения на порт 3535 шли бы на 3.3.3.3:22.
1.1.1.1, 2.2.2.2, 3.3.3.3 — это публичные IP-адреса (а могут быть и внутренними, не важно, могут быть от разных ISP и вообще, в разных местах). Подключающимся клиентам это знать незачем, не придется ничего перенастраивать в почтовых программах и т.п
(!) Естественно, хосты 2.2.2.2 и 3.3.3.3 должны разрешать трафик на соответствующие порты!
Вот идея правил iptables на сервере 1.1.1.1:
#!/bin/sh IF_EXT="eth0" IPT="/sbin/iptables" # flush $IPT --flush $IPT -t nat --flush $IPT -t mangle --flush $IPT -X # loopback $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # default $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP # allow forwarding echo 1 > /proc/sys/net/ipv4/ip_forward # NAT $IPT -t nat -A PREROUTING -i $IF_EXT -p tcp --dport 25 -j DNAT --to 2.2.2.2:25 $IPT -t nat -A PREROUTING -i $IF_EXT -p tcp --dport 443 -j DNAT --to 3.3.3.3:443 $IPT -t nat -A PREROUTING -i $IF_EXT -p tcp -s 4.4.4.4 --dport 3535 -j DNAT --to 3.3.3.3:22 $IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE # FORWARD $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -i $IF_EXT -o $IF_EXT -s 4.4.4.4 -d 3.3.3.3 -j ACCEPT $IPT -A FORWARD -i $IF_EXT -o $IF_EXT -d 2.2.2.2 -j ACCEPT $IPT -A FORWARD -i $IF_EXT -o $IF_EXT -d 3.3.3.3 -j ACCEPT # log #$IPT -A FORWARD -j LOG --log-prefix " ---FORWARD-LOG--- " # INPUT $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ssh $IPT -A INPUT -p tcp --dport 22 -j ACCEPT # OUTPUT $IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Комментарии к скрипту:
1) INPUT разрешен только для 22/tcp, для ssh.
2) Несмотря на то, что интерфейс всего один, masquerade включен все равно
При переброске трафика все последующие сервера будут считать, что источник всего — это 1.1.1.1, а не реальные клиенты! Это важное отличие от предыдущего примера forward, когда менялся только адрес назначения!. 3) Пусть вас не смущает, что OUTPUT по дефолту DROP, а ниже — все ACCEPT
Привык всегда вначале ставить DROP на все, а потом по необходимости разрешаю. В данном случае нет необходимости фильтровать исходящие со шлюза пакеты
3) Пусть вас не смущает, что OUTPUT по дефолту DROP, а ниже — все ACCEPT. Привык всегда вначале ставить DROP на все, а потом по необходимости разрешаю. В данном случае нет необходимости фильтровать исходящие со шлюза пакеты.
Отладка
На удаленном компьютере-клиенте запустите что-то вроде «telnet 1.1.1.1 25». Пакет должен прийти на 1.1.1.1:25. Это можно контролировать, запустив на сервере 1.1.1.1 в консоли команду:
tcpdump -n port 25
Если все правильно, то на удаленном клиенте пойдет сеанс связи с SMTP-сервером 2.2.2.2.
Если что-то не так, вы должны понимать, что пакет все же пришел на 1.1.1.1:25. А вот потом не ушел. Он не должен попасть никуда, кроме FORWARD. Поэтому для отлова отбрасываемого трафика в цепочке FORWARD раскомментируйте правило лога (есть в примере) и просматривайте события в реальном времени (например, «tail -f /var/log/messages»). В соответствии с тем, что вы увидите в логе, испрвьте ваши правила iptables. Все должно получиться. Когда это произойдет, не забудьте выключить логирование (иначе размер лог-файла станет огромным).
Авторизуйтесь для добавления комментариев!
Настройка NAT (MASQUERADE)
Большинство организаций получает от своих интернет-провайдеров ограниченное количество публично доступных IP-адресов, поэтому администратору требуется разделять доступ к Интернету, не выдавая каждому узлу сети публичный IP-адрес. Для доступа к внутренним и внешним сетевым службам узлы локальной сети используют внутренний (частный) IP-адрес. Граничные маршрутизаторы (межсетевые экраны) могут получать входящие соединения из Интернета и передавать их нужным узлам локальной сети и наоборот, направлять исходящие соединения узлов удаленным интернет-службам. Такое перенаправление сетевого трафика может быть опасным, особенно учитывая доступность современных средств взлома, осуществляющих подмену внутренних IP-адресов и таким образом маскирующих машину злоумышленника под узел вашей локальной сети. Чтобы этого не случилось, в Iptables существуют политики маршрутизации и перенаправления, которые можно применять для исключения злонамеренного использования сетевых ресурсов. Политика FORWARD позволяет администратору контролировать маршрутизацию пакетов в локальной сети. Например, чтобы разрешить перенаправление всей локальной сети, можно установить следующие правила (в примере предполагается, что внутренний IP-адрес брандмауэра/шлюза назначен на интерфейсе eth1):
sudo iptables -A FORWARD -i eth1 -j ACCEPT sudo iptables -A FORWARD -o eth1 -j ACCEPT
Эти правила предоставляют системам за шлюзом доступ к внутренней сети. Шлюз направляет пакеты от узла локальной сети к узлу назначения и наоборот (опции -o и -i), передавая их через устройство eth1.
net.ipv4.ip_forward = 1
Разрешение перенаправления пакетов внутренним интерфейсом брандмауэра позволяет узлам локальной сети связываться друг с другом, но у них не будет доступа в Интернет. Чтобы обеспечить узлам локальной сети с частными IP-адресами возможность связи с внешними публичными сетями, нужно настроить на брандмауэре трансляцию сетевых адресов (NAT). Создадим правило:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
В этом правиле используется таблица NAT, поэтому она указывается в явном виде (-t nat) и указана встроенная цепочка этой таблицы POSTROUTING для внешнего сетевого интерфейса eth0 (-o eth0). POSTROUTING позволяет изменять пакеты, когда они выходят из внешнего интерфейса шлюза. Целевое действие -j MASQUERADE заменяет (маскирует) частный IP-адрес узла внешним IP-адресом шлюза. Это называется IP-маскарадингом.
Как закрыть порт Iptables
В этой статье я не стану подробно рассматривать все возможности Iptables, виды цепочек и как работает эта служба. Все это мы рассмотрели в статье настройка Iptables для начинающих. Вместо этого, перейдем ближе к делу. Чтобы заблокировать порт нам сначала нужно понять какие порты открыты в Linux и за что они отвечают. Чтобы посмотреть какие порты слушаются локально, можно использовать утилиту netstat:
Для анализа портов, доступных извне используется программа nmap:
Как видите, извне у нас, кроме стандартных портов веб-сервера, доступны mysql, ftp, dns и другие сервисы. Некоторые из них не должны быть доступны публично. Это не критично, но и нежелательно. Мы можем очень просто закрыть такие порты с помощью iptables. Общий синтаксис команды для блокировки порта будет выглядеть вот так:
$ iptables -A INPUT -p tcp —dport номер_порта -j DROP
Например, если мы хотим заблокировать порт iptables mysql, то необходимо выполнить:
Можно закрыть порт для определенного интерфейса, например, eth1:
Или даже для ip и целой подсети. Например, закрыть все подключения к порту 22 SSH кроме IP адреса 1.2.3.4:
Здесь знак восклицания означает инверсию, то есть применить ко всем кроме этого. Можно убрать этот знак и указать только IP, к которым нужно применить запрет. Мы рассмотрели как закрыть порт iptables в цепочке INPUT, которая отвечает за входящие соединения, это более применимо к серверам. Но что, если нужно закрыть подключение к удаленному порту из этого компьютера или нашей сети? Для этого существует цепочка OUTPUT.
Например, заблокируем попытки отправки почты подключением к любой машине по порту 25:
Также, как и раньше, вы можете указать исходящий сетевой интерфейс, только теперь он указывается опцией -o:
После того как вы завершите с настройкой портов нужно сохранить все созданные правила, чтобы они остались активными даже после перезагрузки. Для этого выполните:
Чтобы посмотреть текущие правила для каждой из цепочек выполните:
Такая команда покажет все правила, а если вы хотите только информацию о заблокированных портах, выполните:
Очистить все правила в случае возникновения проблем можно командой:
Что такое Iptables?
Подсистема iptables и Netfilter уже достаточно давно встроена в ядро Linux. Все сетевые пакеты, которые проходят через компьютер, отправляются компьютером или предназначены компьютеру, ядро направляет через фильтр iptables. Там эти пакеты поддаются проверкам и затем для каждой проверки, если она пройдена выполняется указанное в ней действие. Например, пакет передается дальше ядру для отправки целевой программе, или отбрасывается.
Виды пакетов
Все пакеты делятся на три типа: входящие, исходящие и проходящие. Входящие — это те, которые были отправлены на этот компьютер, исходящие — отправленные из этого компьютера в сеть. А проходящие — это пакеты, которые просто должны быть пересланы дальше, например, если ваш компьютер выступает в качестве маршрутизатора.
Соответственно в фильтре iptables все пакеты делятся на три аналогичные цепочки:
- Input — обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к вашему компьютеру по ssh или любой веб-сайт отправит вам свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;
- forward — эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели. Как я уже говорил, такое наблюдается на маршрутизаторах или, например, если ваш компьютер раздает wifi;
- output — эта цепочка используется для исходящих пакетов и соединений. Сюда попадают пакеты, которые были созданы при попытке выполнить ping losst.ru или когда вы запускаете браузер и пытаетесь открыть любой сайт.
Но если вы думаете что можно просто полностью закрыть цепочку Input для увеличения безопасности, то вы очень сильно ошибаетесь. При работе сети используются обе цепочки input и output. Например, вы пытаетесь выполнить ping, данные отправляются через output, но ответ приходит через input. То же самое происходит при просмотре сайтов и других действиях. А вот цепочка forward может вообще не использоваться если ваш компьютер не является маршрутизатором. Так что настройка iptables должна выполняться очень аккуратно.
Правила и действия
Перед тем как перейти к созданию списка правил iptables нужно рассмотреть как они работают и какие бывают. Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие. Правила образуют цепочку, поэтому input, output и forward называют цепочками, цепочками правил. Действий может быть несколько:
- ACCEPT — разрешить прохождение пакета дальше по цепочке правил;
- DROP — удалить пакет;
- REJECT — отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;
- LOG — сделать запись о пакете в лог файл;
- QUEUE — отправить пакет пользовательскому приложению.
Правила могут проверять любые соответствия, например, по ip, по порту получателя или отправителя, заголовкам пакета и многому другому. Если пакет не подходит ни одному из правил, то к нему применяется действие по умолчанию, обычно ACCEPT.
Когда мы разобрались с правилами, можно вернутся обратно к цепочкам. Кроме перечисленных выше, есть еще две дополнительные цепочки правил:
- prerouting — в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в input, output или forward;
- postrouting — сюда попадают все проходящие пакеты, которые уже прошли цепочку forward.
Но это еще не все. У нас еще есть таблицы iptables, с которыми тоже желательно разобраться.