Шаблон для выполнения работы

Для выполнения работы создайте новый файла в Obsidian, назовите его “Фамилия Имя Отчество Группа”, скопируйте и вставьте представленный ниже шаблон:

# Лабораторная работа №4

## Практическая часть

### Сервер 1

```bash
# Вывод команды 
sudo iptables -L -v
```

```bash
# Вывод команд 
curl http://192.168.1.151:80
curl http://192.168.1.151:81
```

```bash
# Результат команды
ssh -p 2222 i.ivanov@192.168.1.151
```

### Сервер 2

```bash
# Вывод команды 
sudo iptables -L -v
```

```bash
# Скриншоты подключения по ssh с сервера 1 и с вашей машины
```

```bash
# Выполните команду ping -c 4 192.168.1.152 с вашей машины и с сервера 1
```

```bash
# Выполните команду curl http://python.ivanov.local с сервера 1
```

## Вопросы для самопроверки

1. Какую роль выполняет iptables в Linux?
2. Какие существуют таблицы в iptables и для чего они используются?
3. В чём разница между цепочками INPUT, OUTPUT и FORWARD?
4. Какое назначение имеет таблица nat?
5. Какие действия может выполнять iptables над пакетами?
6. Что такое маскарадинг, и как его настроить с помощью iptables?
7. Какие команды позволяют сбросить текущие правила iptables?
8. Как запретить весь входящий трафик, кроме разрешённых правил?
9. Почему важно указывать правила для выхода (OUTPUT), если на сервере выполняются другие сетевые службы?
10. Как проверить работоспособность настроенного проброса портов?

Теоретическая часть

1. Ознакомление с принципами работы iptables

iptables — это инструмент командной строки для настройки сетевых экранов (firewall) в Linux. Он управляет правилами фильтрации сетевого трафика и позволяет контролировать, какие пакеты могут проходить через сетевой стек системы.


1. Таблицы в iptables

iptables организует правила в несколько таблиц. Каждая таблица отвечает за определенный тип операций с сетевыми пакетами:

  1. filter (по умолчанию):

    • Отвечает за фильтрацию трафика.
    • Основные цепочки:
      • INPUT — для обработки входящего трафика.
      • OUTPUT — для исходящего трафика.
      • FORWARD — для пересылаемого трафика между интерфейсами (маршрутизация).
  2. nat (Network Address Translation):

    • Используется для изменения IP-адресов или портов пакетов.
    • Основные цепочки:
      • PREROUTING — для изменения адресов/портов до маршрутизации.
      • POSTROUTING — для изменения адресов/портов после маршрутизации.
      • OUTPUT — для изменения исходящих пакетов, созданных на хосте.
  3. mangle:

    • Позволяет модифицировать заголовки пакетов, например, для настройки QoS (качества обслуживания).
    • Основные цепочки:
      • PREROUTING, POSTROUTING, FORWARD, INPUT, OUTPUT.
  4. raw:

    • Используется для низкоуровневой обработки пакетов, например, чтобы отключить отслеживание соединений (connection tracking).
    • Основные цепочки:
      • PREROUTING, OUTPUT.

2. Цепочки (chains)

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

  1. INPUT: обрабатывает входящие пакеты, адресованные локальной системе.
    Пример: разрешение доступа к SSH.

  2. OUTPUT: обрабатывает исходящие пакеты, отправленные локальной системой.
    Пример: разрешение исходящих HTTP-запросов.

  3. FORWARD: обрабатывает пакеты, перенаправляемые через хост.
    Пример: маршрутизация между двумя интерфейсами.

  4. PREROUTING: обрабатывает пакеты до маршрутизации.
    Пример: проброс портов через NAT.

  5. POSTROUTING: обрабатывает пакеты после маршрутизации.
    Пример: маскировка исходящих пакетов с помощью SNAT.


3. Правила

Каждое правило в цепочке состоит из:

  • Критериев соответствия: условия, которым должен соответствовать пакет (IP-адрес, порт, протокол и т.д.).
  • Действия (target): что делать с пакетом, если он соответствует критериям.

Примеры действий:

  1. ACCEPT — разрешить пакет.
  2. DROP — сбросить пакет (без уведомления отправителя).
  3. REJECT — отклонить пакет (с уведомлением отправителя).
  4. LOG — записать информацию о пакете в системный журнал.
  5. DNAT/SNAT — изменить IP-адрес/порт пакета.

4. Политики по умолчанию

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

iptables -P INPUT DROP   # Сброс всех входящих пакетов
iptables -P OUTPUT ACCEPT # Разрешение всех исходящих пакетов

5. Основные команды iptables

  1. Просмотр правил:

    iptables -L [-t <table>] -v
    
    • -t <table>: указать таблицу (по умолчанию filter).
    • -v: включить подробный вывод.
  2. Добавление правила:

    iptables -A <chain> -p <protocol> --dport <port> -j <action>
    
    • -A: добавить правило в конец цепочки.
    • -p: указать протокол (tcp, udp, icmp).
    • --dport: указать порт (например, 22 для SSH).
    • -j: действие (ACCEPT, DROP).
  3. Удаление правила:

    iptables -D <chain> <rule_number>
    
  4. Сохранение правил: После настройки правил необходимо сохранить их, чтобы они применялись после перезагрузки:

    sudo iptables-save > /etc/iptables/rules.v4
    

2. Разбор основных действий в iptables

В iptables каждое правило содержит действие (target), которое определяет, что делать с пакетом, если он соответствует указанным условиям. Действия могут быть встроенными (предопределёнными) или пользовательскими.


1. Встроенные действия (targets)

  1. ACCEPT

    • Разрешает прохождение пакета дальше по сетевому стеку.
    • Используется для разрешения входящего или исходящего трафика.
    • Пример: Разрешить входящие соединения на порт 22 (SSH):
      iptables -A INPUT -p tcp --dport 22 -j ACCEPT
      
  2. DROP

    • Сбрасывает пакет без уведомления отправителя.
    • Используется для блокировки нежелательного трафика.
    • Пример: Заблокировать весь входящий трафик с IP-адреса 192.168.1.100:
      iptables -A INPUT -s 192.168.1.100 -j DROP
      
  3. REJECT

    • Отклоняет пакет и уведомляет отправителя об отказе.
    • Часто используется для диагностирования проблем в сети.
    • Пример: Отклонить входящие пакеты на порт 80 (HTTP):
      iptables -A INPUT -p tcp --dport 80 -j REJECT
      
  4. LOG

    • Записывает информацию о пакете в системный журнал.
    • Используется для мониторинга и отладки сетевого трафика.
    • Пример: Логировать все пакеты, не соответствующие другим правилам:
      iptables -A INPUT -j LOG --log-prefix "Dropped packet: "
      
  5. MASQUERADE

    • Используется в цепочке POSTROUTING для подмены исходного IP-адреса на адрес маршрутизатора (SNAT).
    • Пример: Подмена исходящего IP-адреса в локальной сети:
      iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      
  6. DNAT (Destination NAT)

    • Изменяет адрес назначения пакета.
    • Используется для проброса портов.
    • Пример: Перенаправить все входящие соединения на порт 8080 к локальному серверу на порт 80:
      iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
      
  7. SNAT (Source NAT)

    • Изменяет исходный IP-адрес пакета.
    • Используется для настройки статического NAT.
    • Пример: Изменить исходящий IP-адрес на 203.0.113.1:
      iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.1
      

2. Пользовательские цепочки

  • Вы можете создавать собственные цепочки, чтобы упростить управление правилами.
  • Пример создания цепочки для обработки входящих SSH-соединений:
    iptables -N SSH_FILTER
    iptables -A INPUT -p tcp --dport 22 -j SSH_FILTER
    iptables -A SSH_FILTER -s 192.168.1.0/24 -j ACCEPT
    iptables -A SSH_FILTER -j DROP
    

3. Сложные действия с использованием модулей

iptables позволяет использовать модули для более гибкого управления трафиком.

  1. Лимитирование трафика

    • Модуль limit позволяет ограничить количество пакетов за указанный период времени.
    • Пример: Разрешить не более 5 входящих пакетов в секунду:
      iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/sec -j ACCEPT
      
  2. Статистика

    • Модуль statistics распределяет пакеты по правилам равномерно.
    • Пример: Маршрутизация пакетов между двумя серверами поочерёдно:
      iptables -A FORWARD -m statistic --mode nth --every 2 -j DNAT --to-destination 192.168.1.2
      iptables -A FORWARD -j DNAT --to-destination 192.168.1.3
      
  3. Состояние соединения

    • Модуль conntrack позволяет фильтровать пакеты в зависимости от их состояния (NEW, ESTABLISHED, RELATED).
    • Пример: Разрешить только уже установленные соединения:
      iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
      
  4. Логирование с ограничением частоты

    • Уменьшает количество записей в логе для одинаковых пакетов:
      iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "Flood detected: "
      

4. Удаление действий

Для удаления правила можно использовать одну из следующих команд:

  1. Удалить конкретное правило по номеру:
    iptables -D INPUT 1
    
  2. Удалить все правила в цепочке:
    iptables -F INPUT
    

Практическая часть

Задание 1: Базовая настройка

В этом задании вы научитесь настраивать базовые правила firewall с использованием iptables, обеспечивая контроль над входящим и исходящим трафиком. Команды выполняются на ВТОРОЙ МАШИНЕ.


Шаг 1. Подготовка

  1. Убедитесь, что iptables установлен.
    Проверьте, установлен ли iptables на вашей системе:

    sudo iptables --version
    

    Если не установлен, выполните установку:

    sudo apt update && sudo apt install iptables
    
  2. Сброс существующих правил.
    Для начала мы очистим все текущие правила, чтобы не было конфликтов:

    sudo iptables -F        # Очистить все правила
    sudo iptables -X        # Удалить пользовательские цепочки
    sudo iptables -t nat -F # Очистить правила таблицы nat
    sudo iptables -t nat -X # Удалить пользовательские цепочки из nat
    
  3. Задание политики по умолчанию.
    Установите, как будут обрабатываться пакеты, не подходящие ни под одно правило:

    sudo iptables -P INPUT DROP   # Сброс входящих пакетов
    sudo iptables -P OUTPUT ACCEPT # Разрешение исходящих пакетов
    sudo iptables -P FORWARD DROP # Сброс пересылаемых пакетов
    

Шаг 2. Настройка правил

1. Разрешение трафика на локальной машине

  • Разрешим трафик на интерфейсе lo (localhost), чтобы система могла нормально работать с внутренними запросами.
    sudo iptables -A INPUT -i lo -j ACCEPT
    sudo iptables -A OUTPUT -o lo -j ACCEPT
    

2. Разрешение входящих SSH-соединений

  • Разрешим подключение по SSH (порт 22) только с определённого IP-адреса, например с адреса первого сервера.
    sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.151 -j ACCEPT
    

3. Открытие нужных портов

  • Разрешим доступ к веб-серверу (порты 80 и 443):
    sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT   # HTTP
    sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
    
  • Разрешим доступ к dns серверу (порт 53):
    sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT   # DNS
    

4. Ограничение пинга (ICMP)

  • Разрешим ICMP (ping), но с ограничением частоты до 5 запросов в секунду, чтобы предотвратить DDoS-атаки:
    sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/sec -j ACCEPT
    sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
    

5. Блокировка всего остального входящего трафика

  • Убедимся, что все остальные пакеты, не подходящие под вышеуказанные правила, будут сброшены:
    sudo iptables -A INPUT -j DROP
    

Шаг 3. Проверка правил

  1. Просмотрите текущие правила, чтобы убедиться, что они настроены правильно:
    sudo iptables -L -v
    
  2. Проверьте, как правила работают:
    • Попробуйте подключиться к серверу через SSH с разрешённого IP-адреса.
    • Попробуйте открыть веб-сайт, размещённый на сервере.
    • Проверьте, работают ли ограничения на ping.

Шаг 4. Сохранение правил

  1. Сохраните правила, чтобы они применялись после перезагрузки системы.
    Для Ubuntu/Debian:

    sudo iptables-save > /etc/iptables/rules.v4
    
  2. Установите пакет iptables-persistent для автозагрузки правил.

    Для Ubuntu/Debian:

    sudo apt install iptables-persistent
    
  3. Убедитесь, что iptables включён в автозагрузку:

    sudo systemctl enable iptables
    

Задание 2: Проброс портов

В этом задании вы научитесь настраивать проброс портов с помощью iptables. Проброс портов (port forwarding) используется для перенаправления входящего трафика с одного порта на другой или с одного IP-адреса на другой. Это важно для настройки NAT, прокси и серверов. Команды выполняются на ПЕРВОЙ МАШИНЕ.


Шаг 1. Подготовка

  1. Проверьте таблицу nat.
    Проброс портов осуществляется через таблицу nat, поэтому убедитесь, что она активна:

    sudo iptables -t nat -L
    
  2. Включите пересылку пакетов (IP forwarding).
    Проброс портов требует включения пересылки пакетов на уровне ядра. Убедитесь, что эта функция включена:

    sudo sysctl -w net.ipv4.ip_forward=1
    

    Чтобы включить пересылку пакетов на постоянной основе, добавьте в файл /etc/sysctl.conf:

    net.ipv4.ip_forward = 1
    

    Затем примените настройки:

    sudo sysctl -p
    

Шаг 2. Настройка проброса портов

1. Перенаправление входящего трафика на другой порт

Например, перенаправим входящий HTTP-трафик (порт 80) на локальный порт 8080:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

2. Перенаправление трафика на другой IP-адрес

Перенаправим входящий HTTP-трафик (порт 81) на другой сервер с IP-адресом 192.168.1.152:

sudo iptables -t nat -A PREROUTING -p tcp --dport 81 -j DNAT --to-destination 192.168.1.152:80

3. Маскарадинг для пересылаемого трафика

Если ваш сервер выполняет роль шлюза (router), добавьте маскарадинг для исходящего трафика:

sudo iptables -t nat -A POSTROUTING -j MASQUERADE

4. Комбинирование правил

Для проброса трафика с порта 2222 на порт 22 (SSH) удалённого сервера:

sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.152:22
sudo iptables -A FORWARD -p tcp -d 192.168.1.152 --dport 22 -j ACCEPT

Шаг 3. Проверка проброса портов

  1. Просмотр правил в таблице nat:

    sudo iptables -t nat -L -v
    
  2. Тестирование:

    • Используйте команду curl или браузер, чтобы проверить доступность перенаправленного порта:
      curl http://<ваш_IP>:<порт>
      
    • Для проверки SSH:
      ssh -p 2222 <ваш_пользователь>@<ваш_IP>
      

Шаг 4. Сохранение настроек

Сохраните правила, чтобы они сохранялись после перезагрузки системы:

sudo iptables-save > /etc/iptables/rules.v4